<?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>Allen Day's Blog &#187; Perl</title>
	<atom:link href="http://www.spicylogic.com/allenday/blog/category/computing/software/perl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.spicylogic.com/allenday/blog</link>
	<description>♥data♥</description>
	<lastBuildDate>Mon, 21 Jun 2010 23:28:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How to fix the meetup.com broken exported calendars.</title>
		<link>http://www.spicylogic.com/allenday/blog/2010/01/15/how-to-fix-the-meetupcom-broken-exported-calendars/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2010/01/15/how-to-fix-the-meetupcom-broken-exported-calendars/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 08:57:12 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/?p=112</guid>
		<description><![CDATA[I&#8217;m a big fan of meetup.com, but they&#8217;re so tragically unhip when it comes to mashups/integration/web 2.0.  One of my biggest gripes until about 6 months ago was that they had no facility (besides API) for exporting a calendar of meetups to my calendar app (I use Google Calendar), or any other calendar app for [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a big fan of <a href="http://meetup.com">meetup.com</a>, but they&#8217;re so tragically unhip when it comes to mashups/integration/web 2.0.  One of my biggest gripes until about 6 months ago was that they had no facility (besides API) for exporting a calendar of meetups to my calendar app (I use Google Calendar), or any other calendar app for that matter.</p>
<p>They introduced an export feature recently, but it&#8217;s pretty useless.  Here&#8217;s why: they offer two calendars</p>
<ul>
<li>[Calendar A] contains all upcoming items in all your meetup groups</li>
<li>[Calendar B] contains upcoming items which you have RSVP&#8217;d with &#8220;yes&#8221; or &#8220;maybe&#8221;.</li>
</ul>
<p>That&#8217;s it.  The calendars exported don&#8217;t even contain links that allow you to RSVP from directly inside your calendar &#8212; you have click through to the meetup.com site, log in, then RSVP.  Ugh.</p>
<p> </p>
<p>Come on, product guys.  What&#8217;s really called for is 4 separate calendars.</p>
<ul>
<li>[Calendar "yes"] All groups, &#8220;yes&#8221; events</li>
<li>[Calendar "maybe"] All groups, &#8220;maybe&#8221; events</li>
<li>[Calendar "no"] All groups, &#8220;no&#8221; events</li>
<li>[Calendar "none"] All groups, events to which I have not yet submitted an RSVP.</li>
</ul>
<p>I was finally just pissed off enough about the status quo that I fixed it for myself, and below I share the code.  You can try it out here: <a href="http://spicylogic.com/allenday/cgi-bin/mu.cgi?key=&lt;your_api_key&gt;&amp;cal=&lt;calendar&gt;">http://spicylogic.com/allenday/cgi-bin/mu.cgi?key=&lt;your_api_key&gt;&amp;cal=&lt;calendar&gt;</a> </p>
<p>where &lt;your_api_key&gt; can be found <a href="http://www.meetup.com/account/oauth_apps/">here</a> and &lt;calendar&gt; is one of &#8220;yes&#8221;, &#8220;no&#8221;, &#8220;none&#8221;, &#8220;maybe&#8221;.</p>
<p>Okay, here&#8217;s the code.  Install it on your own machine if possible, my ISP will appreciate it.  If you find fuckups, let me know and I&#8217;ll update the post.</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #808080; font-style: italic;">#!/usr/bin/perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict;
<span style="color: #000000; font-weight: bold;">use</span> CGI <span style="color: #000066;">qw</span><span style="color: #66cc66;">&#40;</span>:standard<span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">use</span> Date::<span style="color: #006600;">Manip</span> <span style="color: #000066;">qw</span><span style="color: #66cc66;">&#40;</span>ParseDate ParseDateString ParseDateDelta DateCalc UnixDate<span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">use</span> Date::<span style="color: #006600;">Parse</span>;
<span style="color: #000000; font-weight: bold;">use</span> HTML::<span style="color: #006600;">Entities</span>;
<span style="color: #000000; font-weight: bold;">use</span> LWP::<span style="color: #006600;">Simple</span> <span style="color: #000066;">qw</span><span style="color: #66cc66;">&#40;</span>get<span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">use</span> XML::<span style="color: #006600;">DOM</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> constant URL_EVENTS =<span style="color: #66cc66;">&amp;</span>gt; <span style="color: #ff0000;">'http://api.meetup.com/events?key=%s&amp;amp;member_id=%d&amp;amp;format=xml'</span>;
&nbsp;
<span style="color: #000066;">print</span> header<span style="color: #66cc66;">&#40;</span><span style="color: #000066;">q</span><span style="color: #66cc66;">&#40;</span>text<span style="color: #66cc66;">/</span>calendar<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$parser</span> = <span style="color: #000000; font-weight: bold;">new</span> XML::<span style="color: #006600;">DOM</span>::<span style="color: #006600;">Parser</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$mode</span> = param<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'cal'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$key</span>  = param<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'key'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$user</span> = param<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'user'</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">!</span> <span style="color: #0000ff;">$mode</span> <span style="color: #66cc66;">||</span> <span style="color: #66cc66;">!</span> <span style="color: #0000ff;">$key</span> <span style="color: #66cc66;">||</span> <span style="color: #66cc66;">!</span> <span style="color: #0000ff;">$user</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000066;">die</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$events_url</span> = <span style="color: #000066;">sprintf</span><span style="color: #66cc66;">&#40;</span> URL_EVENTS, <span style="color: #0000ff;">$key</span>, <span style="color: #0000ff;">$user</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">#warn $events_url;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$events_txt</span> = get<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$events_url</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">#warn $events_txt;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$events_dom</span> = <span style="color: #0000ff;">$parser</span>-<span style="color: #66cc66;">&amp;</span>gt;parse<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$events_txt</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">#warn $events_dom;</span>
&nbsp;
<span style="color: #000066;">print</span> <span style="color: #000066;">qq</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">BEGIN</span>:VCALENDAR\nPRODID:-<span style="color: #66cc66;">//</span>Meetup Inc<span style="color: #66cc66;">//</span>RemoteApi<span style="color: #66cc66;">//</span>EN\nVERSION:<span style="color: #cc66cc;">2.0</span>\nMETHOD:PUBLISH\nCALSCALE:GREGORIAN\nX-ORIGINAL-URL:http:<span style="color: #66cc66;">//</span>www.meetup.com<span style="color: #66cc66;">/</span>\nX-WR-CALNAME:mu <span style="color: #0000ff;">$mode</span>\n<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$events</span> = <span style="color: #0000ff;">$events_dom</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'item'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$i</span> = <span style="color: #cc66cc;">0</span> ; <span style="color: #0000ff;">$i</span> <span style="color: #66cc66;">&amp;</span>lt; <span style="color: #0000ff;">$events</span>-<span style="color: #66cc66;">&amp;</span>gt;getLength<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> ; <span style="color: #0000ff;">$i</span>++ <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$event</span> = <span style="color: #0000ff;">$events</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$i</span> <span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_id</span>    = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'id'</span>             <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_rsvp</span>  = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'myrsvp'</span>         <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_addr0</span> = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'venue_name'</span>     <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_addr1</span> = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'venue_address1'</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_addr2</span> = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'venue_address2'</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_addr3</span> = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'venue_address3'</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_addr4</span> = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'venue_city'</span>     <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_addr5</span> = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'venue_state'</span>    <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_addr6</span> = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'venue_zip'</span>      <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_desc</span>  = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'description'</span>    <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_link</span>  = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'event_url'</span>      <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_name</span>  = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'name'</span>           <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_lat</span>   = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'venue_lat'</span>      <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_lon</span>   = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'venue_lon'</span>      <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$n_start_time</span>  = <span style="color: #0000ff;">$event</span>-<span style="color: #66cc66;">&amp;</span>gt;getElementsByTagName<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'time'</span>           <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;item<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&amp;</span>gt;getFirstChild<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$start_time</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$end_time</span>;
&nbsp;
  <span style="color: #808080; font-style: italic;">#my $dummy_time = &quot;20000101T000000Z&quot;;</span>
  <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$sec</span>,<span style="color: #0000ff;">$min</span>,<span style="color: #0000ff;">$hour</span>,<span style="color: #0000ff;">$mday</span>,<span style="color: #0000ff;">$mon</span>,<span style="color: #0000ff;">$year</span>,<span style="color: #0000ff;">$wday</span>,<span style="color: #0000ff;">$yday</span>,<span style="color: #0000ff;">$isdst</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #000066;">localtime</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dummy_time</span> = <span style="color: #000066;">sprintf</span><span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">q</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">%</span>04d<span style="color: #66cc66;">%</span>02d<span style="color: #66cc66;">%</span>02dT<span style="color: #66cc66;">%</span>02d<span style="color: #66cc66;">%</span>02d<span style="color: #66cc66;">%</span>02dZ<span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$year</span> + <span style="color: #cc66cc;">1900</span>, <span style="color: #0000ff;">$mon</span> + <span style="color: #cc66cc;">1</span>, <span style="color: #0000ff;">$mday</span>, <span style="color: #0000ff;">$hour</span>, <span style="color: #0000ff;">$min</span>, <span style="color: #0000ff;">$sec</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$n_start_time</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$ss</span>,<span style="color: #0000ff;">$mm</span>,<span style="color: #0000ff;">$hh</span>,<span style="color: #0000ff;">$day</span>,<span style="color: #0000ff;">$month</span>,<span style="color: #0000ff;">$year</span>,<span style="color: #0000ff;">$zone</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$ss</span>,<span style="color: #0000ff;">$mm</span>,<span style="color: #0000ff;">$hh</span>,<span style="color: #0000ff;">$day</span>,<span style="color: #0000ff;">$month</span>,<span style="color: #0000ff;">$year</span>,<span style="color: #0000ff;">$zone</span><span style="color: #66cc66;">&#41;</span> = strptime<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$n_start_time</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$start_time</span> = <span style="color: #000066;">sprintf</span><span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">q</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">%</span>04d<span style="color: #66cc66;">%</span>02d<span style="color: #66cc66;">%</span>02dT<span style="color: #66cc66;">%</span>02d<span style="color: #66cc66;">%</span>02d<span style="color: #66cc66;">%</span>02dZ<span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$year</span> + <span style="color: #cc66cc;">1900</span>, <span style="color: #0000ff;">$month</span> + <span style="color: #cc66cc;">1</span>, <span style="color: #0000ff;">$day</span>, <span style="color: #0000ff;">$hh</span>, <span style="color: #0000ff;">$mm</span>, <span style="color: #0000ff;">$ss</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$eday</span> = <span style="color: #0000ff;">$day</span>;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$hh</span> == <span style="color: #cc66cc;">23</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #0000ff;">$eday</span> = <span style="color: #0000ff;">$day</span> + <span style="color: #cc66cc;">1</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$ehh</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$hh</span> + <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">%</span> <span style="color: #cc66cc;">24</span>;
    <span style="color: #0000ff;">$end_time</span>   = <span style="color: #000066;">sprintf</span><span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">q</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">%</span>04d<span style="color: #66cc66;">%</span>02d<span style="color: #66cc66;">%</span>02dT<span style="color: #66cc66;">%</span>02d<span style="color: #66cc66;">%</span>02d<span style="color: #66cc66;">%</span>02dZ<span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$year</span> + <span style="color: #cc66cc;">1900</span>, <span style="color: #0000ff;">$month</span> + <span style="color: #cc66cc;">1</span>, <span style="color: #0000ff;">$eday</span>, <span style="color: #0000ff;">$ehh</span>, <span style="color: #0000ff;">$mm</span>, <span style="color: #0000ff;">$ss</span> <span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$start_time</span> = <span style="color: #ff0000;">''</span>;
    <span style="color: #0000ff;">$end_time</span> = <span style="color: #ff0000;">''</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$mode</span> eq <span style="color: #0000ff;">$n_rsvp</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$id</span>   = <span style="color: #0000ff;">$n_id</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$name</span> = <span style="color: #0000ff;">$n_name</span> ? <span style="color: #0000ff;">$n_name</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #ff0000;">&quot;&quot;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$desc</span> = <span style="color: #0000ff;">$n_desc</span> ? <span style="color: #0000ff;">$n_desc</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #ff0000;">&quot;&quot;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$addr</span> = <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$n_addr0</span> ? <span style="color: #0000ff;">$n_addr0</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">', '</span> : <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">&#41;</span>
             . <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$n_addr1</span> ? <span style="color: #0000ff;">$n_addr1</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">', '</span> : <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">&#41;</span>
             . <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$n_addr2</span> ? <span style="color: #0000ff;">$n_addr2</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">', '</span> : <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">&#41;</span>
             . <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$n_addr3</span> ? <span style="color: #0000ff;">$n_addr3</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">', '</span> : <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">&#41;</span>
             . <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$n_addr4</span> ? <span style="color: #0000ff;">$n_addr4</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">', '</span> : <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">&#41;</span>
             . <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$n_addr5</span> ? <span style="color: #0000ff;">$n_addr5</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">', '</span> : <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">&#41;</span>
             . <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$n_addr6</span> ? <span style="color: #0000ff;">$n_addr6</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #808080; font-style: italic;">#$desc =~ s/(.)/(ord($1) &amp;gt; 127) ? &quot;&quot; : $1/egs;</span>
&nbsp;
    <span style="color: #0000ff;">$name</span> = HTML::<span style="color: #006600;">Entities</span>::<span style="color: #006600;">decode_entities</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$name</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$desc</span> = HTML::<span style="color: #006600;">Entities</span>::<span style="color: #006600;">decode_entities</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$desc</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$addr</span> = HTML::<span style="color: #006600;">Entities</span>::<span style="color: #006600;">decode_entities</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$addr</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$name</span> =~ <span style="color: #000066;">s</span><span style="color: #66cc66;">/</span>,<span style="color: #66cc66;">/</span>\\,<span style="color: #66cc66;">/</span>g;
    <span style="color: #0000ff;">$desc</span> =~ <span style="color: #000066;">s</span><span style="color: #66cc66;">/</span>,<span style="color: #66cc66;">/</span>\\,<span style="color: #66cc66;">/</span>g;
    <span style="color: #0000ff;">$addr</span> =~ <span style="color: #000066;">s</span><span style="color: #66cc66;">/</span>,<span style="color: #66cc66;">/</span>\\,<span style="color: #66cc66;">/</span>g;
&nbsp;
    <span style="color: #0000ff;">$desc</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#</span>
<span style="color: #808080; font-style: italic;">#\\n#gs;</span>
    <span style="color: #0000ff;">$desc</span> .= <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>n<span style="color: #000099; font-weight: bold;">\\</span>n<span style="color: #000099; font-weight: bold;">\\</span>nGoing?<span style="color: #000099; font-weight: bold;">\\</span>n<span style="color: #000099; font-weight: bold;">\\</span>n&quot;</span>;
    <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$response</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">qw</span><span style="color: #66cc66;">&#40;</span> yes <span style="color: #000066;">no</span> maybe <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #0000ff;">$desc</span> .= <span style="color: #000066;">uc</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$response</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #000066;">qq</span><span style="color: #66cc66;">&#40;</span>: http:<span style="color: #66cc66;">//</span>api.meetup.com<span style="color: #66cc66;">/</span>rsvp?event_id=<span style="color: #0000ff;">$id</span><span style="color: #66cc66;">&amp;</span>amp;key=<span style="color: #0000ff;">$key</span><span style="color: #66cc66;">&amp;</span>amp;rsvp=<span style="color: #0000ff;">$response</span>\\n<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$geo</span> = <span style="color: #0000ff;">$n_lat</span> <span style="color: #66cc66;">&amp;</span>amp;<span style="color: #66cc66;">&amp;</span>amp; <span style="color: #0000ff;">$n_lon</span> ? <span style="color: #ff0000;">&quot;GEO:&quot;</span> . <span style="color: #0000ff;">$n_lat</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> . <span style="color: #ff0000;">&quot;;&quot;</span> . <span style="color: #0000ff;">$n_lon</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> . <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> : <span style="color: #000066;">undef</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">#print sprintf( qq(BEGIN:VEVENT\nSUMMARY:%s\nDESCRIPTION:%s\nLAST-MODIFIED:%s\nUID:%s\nCLASS:%s\nCREATED:%s\nDTSTAMP:%s\nDTSTART:%s\nDTEND:%s\nLOCATION:%s\n\nURL:%s\nEND:VEVENT\n),</span>
    <span style="color: #000066;">print</span> <span style="color: #000066;">sprintf</span><span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">qq</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">BEGIN</span>:VEVENT\nSUMMARY:<span style="color: #0000ff;">%s</span>\nDESCRIPTION:<span style="color: #0000ff;">%s</span>\nLAST-MODIFIED:<span style="color: #0000ff;">%s</span>\nUID:<span style="color: #0000ff;">%s</span>\nCLASS:<span style="color: #0000ff;">%s</span>\nCREATED:<span style="color: #0000ff;">%s</span>\nDTSTAMP:<span style="color: #0000ff;">%s</span>\nDTSTART:<span style="color: #0000ff;">%s</span>\nDTEND:<span style="color: #0000ff;">%s</span>\n<span style="color: #0000ff;">%sLOCATION</span>:<span style="color: #0000ff;">%s</span>\nURL:<span style="color: #0000ff;">%s</span>\nEND:VEVENT\n<span style="color: #66cc66;">&#41;</span>,
      <span style="color: #0000ff;">$name</span>,
      <span style="color: #0000ff;">$desc</span>,
      <span style="color: #0000ff;">$start_time</span>,
      <span style="color: #ff0000;">&quot;event_$id<span style="color: #000099; font-weight: bold;">\@</span>meetup.com&quot;</span>,
      <span style="color: #ff0000;">&quot;PUBLIC&quot;</span>,
      <span style="color: #0000ff;">$dummy_time</span>,
      <span style="color: #0000ff;">$dummy_time</span>,
      <span style="color: #0000ff;">$start_time</span>,
      <span style="color: #0000ff;">$end_time</span>,
      <span style="color: #0000ff;">$geo</span>,
      <span style="color: #0000ff;">$addr</span>,
      <span style="color: #0000ff;">$n_link</span> ? <span style="color: #0000ff;">$n_link</span>-<span style="color: #66cc66;">&amp;</span>gt;toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #ff0000;">&quot;&quot;</span>,
    <span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000066;">print</span> <span style="color: #000066;">qq</span><span style="color: #66cc66;">&#40;</span>END:VCALENDAR\n<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2010/01/15/how-to-fix-the-meetupcom-broken-exported-calendars/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Synthetic GFF Dataset for Genome Browser Benchmark</title>
		<link>http://www.spicylogic.com/allenday/blog/2009/04/07/synthetic-gff-dataset-for-genome-browser-benchmark/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2009/04/07/synthetic-gff-dataset-for-genome-browser-benchmark/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 08:01:52 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Genomics]]></category>
		<category><![CDATA[Informatics]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Science]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2009/04/07/synthetic-gff-dataset-for-genome-browser-benchmark/</guid>
		<description><![CDATA[I deployed a Gbrowse/Chado installation last week at Dow Agrosciences.  It got me thinking about how slow and basic the searches are with the Bio::DB::Das::Chado* adaptor, and wouldn&#8217;t it be nice to use SOLR here?
I made up a test dataset of gene/mRNA/exon 3-tiered feature groups by permuting some gene model data from the knownGene annotation [...]]]></description>
			<content:encoded><![CDATA[<p>I deployed a Gbrowse/Chado installation last week at <a href="http://www.dowagro.com/">Dow Agrosciences</a>.  It got me thinking about how slow and basic the searches are with the Bio::DB::Das::Chado* adaptor, and wouldn&#8217;t it be nice to use <a href="http://lucene.apache.org/solr/">SOLR</a> here?</p>
<p>I made up a test dataset of gene/mRNA/exon 3-tiered feature groups by permuting some gene model data from the <a href="http://hgdownload.cse.ucsc.edu/goldenPath/hg18/database/">knownGene annotation set</a> of the Hg18 build of the human genome.  You can grab the data set and script used to generate it <a href="http://www.spicylogic.com/allenday/images/knownGene/">here</a>.  There are several files mRNA.E<strong>N</strong>.txt.gz that contain gzipped gene models, where <strong>N</strong>=3..7 indicates there are 10^<strong>N</strong> models in the file, uniformly distributed across a 500-megabase reference sequence.</p>
<p>I&#8217;m planning to load these data into a couple of different systems and then compare performance on some of the typical Bio::DB::GFF API calls.  I can personally test on:</p>
<ul>
<li>Chado</li>
<li>The default Bio::DB::GFF schema (does it have a name?)</li>
<li>The SOLR backend I&#8217;m about to implement</li>
</ul>
<p>I know there are other feature DBs out there.  It would be good to include them as well in a later pass or to have someone else contribute the data once I get the benchmarking script written.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2009/04/07/synthetic-gff-dataset-for-genome-browser-benchmark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZIP code demographic data with Perl</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/10/29/zip-code-demographic-data-with-perl/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/10/29/zip-code-demographic-data-with-perl/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 07:45:04 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Analytics]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Science]]></category>
		<category><![CDATA[Statistics]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/10/29/zip-code-demographic-data-with-perl/</guid>
		<description><![CDATA[I needed some demographics data earlier this week and tried using the SF3 files from census.gov&#8217;s &#8220;Census 2000&#8243; data set.
What a time sink.  Ugh.
The methods used are very well documented, and I learned a lot about the census.  What I was not able to learn, however, was how to actually extract the data [...]]]></description>
			<content:encoded><![CDATA[<p>I needed some demographics data earlier this week and tried using the SF3 files from <a href="http://census.gov">census.gov</a>&#8217;s &#8220;Census 2000&#8243; data set.</p>
<p>What a time sink.  Ugh.</p>
<p>The methods used are very well documented, and I learned a lot about the census.  What I was not able to learn, however, was how to <i>actually extract the data</i> from the flat files.  Look at what <a href="http://www.rdfabout.com/demo/census/">Joshua Tauberer</a> went through to get some idea of the pain level.</p>
<p>Finally I got fed up and wrote a screen scraper for <a href="http://zipskinny.com">ZIPskinny.com</a> in Perl.  It&#8217;s one-off crappy code.  You can get it from CPAN under namespace <a href="http://search.cpan.org/~allenday/Geo-Demo-Zipskinny-0.01/">Geo::Demo::Zipskinny</a>.</p>
<p>Hope it saves you some time.  Leave me a comment if you have <i>working code</i> that can deal with SF3 files.</p>
<p>Here&#8217;s a little ZIP code to rich-vs-poor plot I made earlier.<br />
<img src='http://img362.imageshack.us/img362/9338/incomeeu3.png' alt='' width='600' class='alignnone' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/10/29/zip-code-demographic-data-with-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>aggregate &#8211; report event counts from a stream</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/10/13/aggregate-report-event-counts-from-a-stream/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/10/13/aggregate-report-event-counts-from-a-stream/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 23:05:06 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Analytics]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/10/13/aggregate-report-event-counts-from-a-stream/</guid>
		<description><![CDATA[Another shell utility.  This one is useful for, e.g. counting 404, 500, 200, 302 HTTP codes from a log file.

#!/usr/bin/perl
$&#124;++;
use strict;
use Getopt::Long;
&#160;
my $mode = 'line';
my $tick = 100;
my $help = undef;
my $keysfile = undef;
my %keys = &#40;&#41;;
&#160;
GetOptions&#40;
  'mode&#124;m=s' =&#62; \$mode,
  'tick&#124;t=i' =&#62; \$tick,
  'help&#124;h'   =&#62; \$help,
  'keys&#124;k=f' =&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Another shell utility.  This one is useful for, e.g. counting 404, 500, 200, 302 HTTP codes from a log file.</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #808080; font-style: italic;">#!/usr/bin/perl</span>
$<span style="color: #66cc66;">|</span>++;
<span style="color: #000000; font-weight: bold;">use</span> strict;
<span style="color: #000000; font-weight: bold;">use</span> Getopt::<span style="color: #006600;">Long</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$mode</span> = <span style="color: #ff0000;">'line'</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$tick</span> = <span style="color: #cc66cc;">100</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$help</span> = <span style="color: #000066;">undef</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$keysfile</span> = <span style="color: #000066;">undef</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">%keys</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
GetOptions<span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">'mode|m=s'</span> =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$mode</span>,
  <span style="color: #ff0000;">'tick|t=i'</span> =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$tick</span>,
  <span style="color: #ff0000;">'help|h'</span>   =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$help</span>,
  <span style="color: #ff0000;">'keys|k=f'</span> =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$keysfile</span>,
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$help</span> <span style="color: #66cc66;">||</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$mode</span> <span style="color: #b1b100;">ne</span> <span style="color: #ff0000;">'line'</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #0000ff;">$mode</span> <span style="color: #b1b100;">ne</span> <span style="color: #ff0000;">'time'</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span> <span style="color: #0000ff;">$tick</span> <span style="color: #66cc66;">&lt;</span>= <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">||</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">defined</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$keysfile</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #66cc66;">!</span>-f <span style="color: #0000ff;">$keysfile</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$USAGE</span> = <span style="color: #000066;">join</span> <span style="color: #ff0000;">''</span>, <span style="color: #009999;">&lt;DATA&gt;</span>;
  <span style="color: #000066;">print</span> <span style="color: #000000; font-weight: bold;">STDERR</span> <span style="color: #0000ff;">$USAGE</span> <span style="color: #b1b100;">and</span> <span style="color: #000066;">exit</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$keysfile</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000066;">open</span><span style="color: #66cc66;">&#40;</span>K, <span style="color: #0000ff;">$keysfile</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">or</span> <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;Couldn't open keys file '$keysfile': $!&quot;</span>;
  <span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$line</span> = <span style="color: #009999;">&lt;K&gt;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000066;">chomp</span> <span style="color: #0000ff;">$line</span>;
    <span style="color: #0000ff;">$keys</span><span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$line</span> <span style="color: #66cc66;">&#125;</span>++;
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #000066;">close</span><span style="color: #66cc66;">&#40;</span>K<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">%count</span> = <span style="color: #0000ff;">%keys</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$offset</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$mark</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$offset</span> = <span style="color: #cc66cc;">0</span>;
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$mode</span> eq <span style="color: #ff0000;">'time'</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #0000ff;">$mark</span> = <span style="color: #000066;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$element</span> = <span style="color: #66cc66;">&lt;&gt;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000066;">chomp</span> <span style="color: #0000ff;">$element</span>;
  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">%keys</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$count</span><span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$element</span> <span style="color: #66cc66;">&#125;</span>++ <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$keys</span><span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$element</span> <span style="color: #66cc66;">&#125;</span>;
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$count</span><span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$element</span> <span style="color: #66cc66;">&#125;</span>++;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$mode</span> eq <span style="color: #ff0000;">'line'</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$offset</span>++;
    <span style="color: #0000ff;">$mark</span>++;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$mark</span> <span style="color: #66cc66;">&gt;</span>= <span style="color: #0000ff;">$tick</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #0000ff;">$mark</span> = <span style="color: #cc66cc;">0</span>;
      flush<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #b1b100;">elsif</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$mode</span> eq <span style="color: #ff0000;">'time'</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$mark</span> + <span style="color: #0000ff;">$tick</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #000066;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #0000ff;">$offset</span> = <span style="color: #000066;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #0000ff;">$mark</span> = <span style="color: #000066;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
      flush<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
flush<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> flush <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;summary/$tick @ $offset<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
  <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$k</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">sort</span> <span style="color: #000066;">keys</span> <span style="color: #0000ff;">%count</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>, <span style="color: #0000ff;">$count</span><span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$k</span> <span style="color: #66cc66;">&#125;</span>, <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>, <span style="color: #0000ff;">$k</span>, <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #0000ff;">%count</span> = <span style="color: #0000ff;">%keys</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__DATA__</span>
Usage: aggregate <span style="color: #66cc66;">&#91;</span>-h<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#91;</span>-<span style="color: #000066;">m</span> <span style="color: #66cc66;">&lt;</span>time<span style="color: #66cc66;">|</span>line<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#91;</span>-t <span style="color: #66cc66;">&lt;</span><span style="color: #808080; font-style: italic;"># of seconds or lines&gt;] [-k &lt;keys file&gt;]</span>
&nbsp;
Read lines from <span style="color: #000000; font-weight: bold;">STDIN</span>.  Print lines by frequency per input lines <span style="color: #b1b100;">or</span> <span style="color: #000066;">time</span>.
&nbsp;
  -h    show help <span style="color: #66cc66;">&#40;</span>this message<span style="color: #66cc66;">&#41;</span>
  -<span style="color: #000066;">m</span>    mode.  one of <span style="color: #ff0000;">'time'</span> <span style="color: #b1b100;">or</span> <span style="color: #ff0000;">'line'</span>.  defaults to <span style="color: #ff0000;">'line'</span>.
  -t    aggregation size.  an integer.  value is <span style="color: #808080; font-style: italic;"># of lines ('line' mode) or # of</span>
        seconds <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'time'</span> mode<span style="color: #66cc66;">&#41;</span> after which an aggregation is triggered.  defaults to <span style="color: #cc66cc;">100</span>.
  -k    <span style="color: #000066;">keys</span> file.  a text file of strings to <span style="color: #66cc66;">*</span>exactly<span style="color: #66cc66;">*</span> match in the input, one per line.
        <span style="color: #b1b100;">if</span> a <span style="color: #000066;">keys</span> file is provided, lines <span style="color: #b1b100;">not</span> present in the <span style="color: #000066;">keys</span> file will be silently
        ignored.</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/10/13/aggregate-report-event-counts-from-a-stream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>shuffle &#8211; randomize a stream of data</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/10/10/shuffle-randomize-a-stream-of-data/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/10/10/shuffle-randomize-a-stream-of-data/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 18:20:47 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Analytics]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/10/10/shuffle-randomize-a-stream-of-data/</guid>
		<description><![CDATA[Here&#8217;s another little shell utility I&#8217;ve been sitting on for a while.  This one shuffles the line-oriented data read from a pipe.  It has the notion of buffering and partial flushing so we can handle streams / very large data sets.

#!/usr/bin/perl
$&#124;++;
use strict;
use Getopt::Long;
&#160;
my $USAGE = join '', &#60;DATA&#62;;
&#160;
my $B = 0;
my $D = [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s another little shell utility I&#8217;ve been sitting on for a while.  This one shuffles the line-oriented data read from a pipe.  It has the notion of buffering and partial flushing so we can handle streams / very large data sets.</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #808080; font-style: italic;">#!/usr/bin/perl</span>
$<span style="color: #66cc66;">|</span>++;
<span style="color: #000000; font-weight: bold;">use</span> strict;
<span style="color: #000000; font-weight: bold;">use</span> Getopt::<span style="color: #006600;">Long</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$USAGE</span> = <span style="color: #000066;">join</span> <span style="color: #ff0000;">''</span>, <span style="color: #009999;">&lt;DATA&gt;</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$B</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$D</span> = <span style="color: #cc66cc;">1</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$H</span> = <span style="color: #cc66cc;">0</span>;
&nbsp;
GetOptions <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;buffer|b=i&quot;</span>   =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$B</span>,
            <span style="color: #ff0000;">&quot;draw|d=i&quot;</span>     =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$D</span>,
            <span style="color: #ff0000;">&quot;help|h&quot;</span>       =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$H</span>,
           <span style="color: #66cc66;">&#41;</span>; 
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$D</span> == <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #0000ff;">$B</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #0000ff;">$D</span> = <span style="color: #0000ff;">$B</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$B</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$D</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$B</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$D</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$H</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000066;">print</span> <span style="color: #0000ff;">$USAGE</span> <span style="color: #b1b100;">and</span> <span style="color: #000066;">exit</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@buf</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$element</span> = <span style="color: #66cc66;">&lt;&gt;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #808080; font-style: italic;">#buffer whole stream</span>
  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$B</span> == <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000066;">push</span> <span style="color: #0000ff;">@buf</span>, <span style="color: #0000ff;">$element</span>;
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #808080; font-style: italic;">#no-op</span>
  <span style="color: #b1b100;">elsif</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$B</span> == <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000066;">print</span> <span style="color: #0000ff;">$element</span>;
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #808080; font-style: italic;">#buffer window</span>
  <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000066;">push</span> <span style="color: #0000ff;">@buf</span>, <span style="color: #0000ff;">$element</span>;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@buf</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&gt;</span>= <span style="color: #0000ff;">$D</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@buf</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$B</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      flush<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
flush<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> flush <span style="color: #66cc66;">&#123;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$j</span> = <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@buf</span> <span style="color: #66cc66;">&#41;</span> - <span style="color: #cc66cc;">1</span> ; <span style="color: #0000ff;">$j</span> <span style="color: #66cc66;">&gt;</span>= <span style="color: #cc66cc;">0</span> ; <span style="color: #0000ff;">$j</span>-- <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$swap</span> = <span style="color: #000066;">int</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">rand</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$j</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$swap</span> <span style="color: #66cc66;">!</span>= <span style="color: #0000ff;">$j</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$j</span> <span style="color: #66cc66;">&#93;</span>, <span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$swap</span> <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$swap</span> <span style="color: #66cc66;">&#93;</span>, <span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$j</span> <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@buf</span> <span style="color: #66cc66;">&#41;</span> - <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$B</span> - <span style="color: #0000ff;">$D</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000066;">print</span> <span style="color: #000066;">shift</span> <span style="color: #0000ff;">@buf</span>;
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">__DATA__</span>
Usage: shuffle <span style="color: #66cc66;">&#91;</span>-h<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#91;</span>-b <span style="color: #66cc66;">&lt;</span>buffer size<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#91;</span>-d <span style="color: #66cc66;">&lt;</span>draw size<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#93;</span>
&nbsp;
Shuffle lines from a stream on <span style="color: #000000; font-weight: bold;">STDIN</span>.  Write lines to <span style="color: #000000; font-weight: bold;">STDOUT</span>.
&nbsp;
  -h    show help <span style="color: #66cc66;">&#40;</span>this message<span style="color: #66cc66;">&#41;</span>
  -b    buffer size
        <span style="color: #66cc66;">&#40;</span>default <span style="color: #cc66cc;">0</span>.  indicates shuffle whole stream, <span style="color: #b1b100;">then</span> <span style="color: #000066;">write</span><span style="color: #66cc66;">&#41;</span>
        range: <span style="color: #cc66cc;">1</span>..
  -d    draw size
        <span style="color: #66cc66;">&#40;</span>defaults to value of -b.  number of items to remove from the
        buffer when it fills<span style="color: #66cc66;">&#41;</span>
        range: <span style="color: #cc66cc;">1</span>..buffer size
&nbsp;
You have to parameters available <span style="color: #66cc66;">&#40;</span>besides -h <span style="color: #b1b100;">for</span> help<span style="color: #66cc66;">&#41;</span>.
&nbsp;
<span style="color: #66cc66;">*</span> buffer size <span style="color: #66cc66;">&#40;</span>-b<span style="color: #66cc66;">&#41;</span>.  Determines how many elements to temporarily hold
before shuffling.  The advantage of this buffer is to allow shuffling on
very long streams that would <span style="color: #b1b100;">not</span> fit into <span style="color: #000066;">system</span> memory.  The
disadavantage is that it is <span style="color: #b1b100;">not</span> a truly random shuffle, as <span style="color: #000066;">each</span> input
element can appear at most buffer-size positions away from the original
position.  Buffer size defaults to zero, so make sure to set it <span style="color: #b1b100;">if</span> your
data set size is large.
&nbsp;
<span style="color: #66cc66;">*</span> draw size <span style="color: #66cc66;">&#40;</span>-d<span style="color: #66cc66;">&#41;</span>.  Determines how frequently the buffer is shuffled <span style="color: #b1b100;">and</span>
flushed.  Rather than shuffling<span style="color: #66cc66;">/</span>flushing all elements in the buffer, only
<span style="color: #b1b100;">do</span> D elements.  The advantage here is elements can appear more than
buffer-size positions away from the original position.  The disadvantage
is that shuffling is done B<span style="color: #66cc66;">/</span>D <span style="color: #000066;">times</span> more frequently.  Draw size defaults
to buffer size, <span style="color: #b1b100;">and</span> has <span style="color: #000066;">no</span> effect.  Set it to <span style="color: #cc66cc;">1</span> to maximize randomness.
&nbsp;
Copyright<span style="color: #66cc66;">/</span>License:
&nbsp;
  Allen Day <span style="color: #66cc66;">&lt;</span>allenday<span style="color: #0000ff;">@ucla</span>.edu<span style="color: #66cc66;">&gt;</span>, licensed under GPL <span style="color: #cc66cc;">2006</span><span style="color: #cc66cc;">-2008</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/10/10/shuffle-randomize-a-stream-of-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sample &#8211; probabilistic sampling from a stream of lines</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/10/09/sample-probabilistic-sampling-from-a-stream-of-lines/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/10/09/sample-probabilistic-sampling-from-a-stream-of-lines/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 01:33:31 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Analytics]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/10/09/sample-probabilistic-sampling-from-a-stream-of-lines/</guid>
		<description><![CDATA[I&#8217;m frequently monitoring webservers, cache servers, database servers, etc by tailing their log files.  See my previous post on making logs easier to monitor by color.
Sometimes you also have too much data, and you don&#8217;t want to look at all of it.  Use this to sample.
sample source:

#!/usr/bin/perl
$&#124;++;
use strict;
use Getopt::Long;
&#160;
my $USAGE = join '', [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m frequently monitoring webservers, cache servers, database servers, etc by tailing their log files.  See my previous post on <a href="/blog/2008/07/05/pcoc-piped-command-output-colorizer/">making logs easier to monitor by color</a>.</p>
<p>Sometimes you also have too much data, and you don&#8217;t want to look at all of it.  Use this to sample.</p>
<p>sample source:</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #808080; font-style: italic;">#!/usr/bin/perl</span>
$<span style="color: #66cc66;">|</span>++;
<span style="color: #000000; font-weight: bold;">use</span> strict;
<span style="color: #000000; font-weight: bold;">use</span> Getopt::<span style="color: #006600;">Long</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$USAGE</span> = <span style="color: #000066;">join</span> <span style="color: #ff0000;">''</span>, <span style="color: #009999;">&lt;DATA&gt;</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$T</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$K</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$P</span> = <span style="color: #cc66cc;">1</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$H</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$N</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$S</span> = <span style="color: #cc66cc;">0</span>;
&nbsp;
GetOptions <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;time|t=i&quot;</span>     =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$T</span>,
            <span style="color: #ff0000;">&quot;number|n=i&quot;</span>   =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$N</span>,
            <span style="color: #ff0000;">&quot;count|k=i&quot;</span>    =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$K</span>,
            <span style="color: #ff0000;">&quot;prob|p=f&quot;</span>     =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$P</span>,
            <span style="color: #ff0000;">&quot;shuffle|s&quot;</span>    =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$S</span>,
            <span style="color: #ff0000;">&quot;help|h&quot;</span>       =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">$H</span>,
           <span style="color: #66cc66;">&#41;</span>; 
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$T</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #0000ff;">$P</span> <span style="color: #66cc66;">!</span>= <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$K</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #0000ff;">$P</span> <span style="color: #66cc66;">!</span>= <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$K</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">||</span> <span style="color: #0000ff;">$P</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">||</span> <span style="color: #0000ff;">$T</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">||</span> <span style="color: #0000ff;">$N</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">||</span> <span style="color: #0000ff;">$P</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$T</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #0000ff;">$N</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$H</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000066;">print</span> <span style="color: #0000ff;">$USAGE</span> <span style="color: #b1b100;">and</span> <span style="color: #000066;">exit</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$position</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@buf</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$before</span> = <span style="color: #000066;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$element</span> = <span style="color: #66cc66;">&lt;&gt;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #808080; font-style: italic;"># sample full stream, report at the end</span>
  <span style="color: #808080; font-style: italic;"># sample K elements every T seconds</span>
  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$K</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@buf</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #0000ff;">$K</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #000066;">push</span> <span style="color: #0000ff;">@buf</span>, <span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$position</span>, <span style="color: #0000ff;">$element</span><span style="color: #66cc66;">&#93;</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #b1b100;">elsif</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$K</span><span style="color: #66cc66;">/</span><span style="color: #0000ff;">$position</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #000066;">rand</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$index</span> = <span style="color: #000066;">int</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">rand</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$K</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$index</span> <span style="color: #66cc66;">&#93;</span> = <span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$position</span>, <span style="color: #0000ff;">$element</span><span style="color: #66cc66;">&#93;</span>; <span style="color: #808080; font-style: italic;">#save position for sort</span>
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #808080; font-style: italic;">#time-based K-sampling</span>
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$T</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #000066;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$before</span> + <span style="color: #0000ff;">$T</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      flush<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #808080; font-style: italic;">#event-based K-sampling</span>
    <span style="color: #b1b100;">elsif</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$N</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #0000ff;">$position</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$N</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      flush<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #808080; font-style: italic;"># sample with probability</span>
  <span style="color: #b1b100;">elsif</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$P</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&amp;&amp;</span> <span style="color: #000066;">rand</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #0000ff;">$P</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000066;">print</span> <span style="color: #0000ff;">$element</span>;
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #0000ff;">$position</span>++;
<span style="color: #66cc66;">&#125;</span>
flush<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> flush <span style="color: #66cc66;">&#123;</span>
  <span style="color: #0000ff;">$before</span> = <span style="color: #000066;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #808080; font-style: italic;">#Knuth shuffle</span>
  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$S</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$j</span> = <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@buf</span> <span style="color: #66cc66;">&#41;</span> - <span style="color: #cc66cc;">1</span> ; <span style="color: #0000ff;">$j</span> <span style="color: #66cc66;">&gt;</span>= <span style="color: #cc66cc;">0</span> ; <span style="color: #0000ff;">$j</span>-- <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$swap</span> = <span style="color: #000066;">int</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">rand</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$j</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$swap</span> <span style="color: #66cc66;">!</span>= <span style="color: #0000ff;">$j</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$j</span> <span style="color: #66cc66;">&#93;</span>, <span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$swap</span> <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$swap</span> <span style="color: #66cc66;">&#93;</span>, <span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$j</span> <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #66cc66;">&#125;</span>
      <span style="color: #000066;">print</span> <span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$j</span> <span style="color: #66cc66;">&#93;</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#91;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#93;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$b</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">sort</span> <span style="color: #66cc66;">&#123;</span><span style="color: #0000ff;">$a</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&lt;</span>=<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$b</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#125;</span> <span style="color: #0000ff;">@buf</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #000066;">print</span> <span style="color: #0000ff;">$b</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #0000ff;">@buf</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #0000ff;">$position</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">__DATA__</span>
Usage: sample -<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#91;</span>h<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span>p<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span>t<span style="color: #66cc66;">&#91;</span>k<span style="color: #66cc66;">&#91;</span>n<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>
&nbsp;
Sample lines from a stream on <span style="color: #000000; font-weight: bold;">STDIN</span>.  Write lines to <span style="color: #000000; font-weight: bold;">STDOUT</span>.
&nbsp;
  -h    show help <span style="color: #66cc66;">&#40;</span>this message<span style="color: #66cc66;">&#41;</span>
  -k    sample K elements from stream
        <span style="color: #66cc66;">&#40;</span>default <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
        range: <span style="color: #cc66cc;">0</span>..
  -p    sample elements from stream with probability
        <span style="color: #66cc66;">&#40;</span>default <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
        range: <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&lt;</span>= p <span style="color: #66cc66;">&lt;</span>= <span style="color: #cc66cc;">1</span>
  -n    sample over windows of N elements
        <span style="color: #66cc66;">&#40;</span>default <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
        range: <span style="color: #cc66cc;">0</span>..
  -t    sample over windows of T seconds
        <span style="color: #66cc66;">&#40;</span>default <span style="color: #cc66cc;">0</span>, instantaneous with -p, infinity with -k<span style="color: #66cc66;">&#41;</span>
        range: <span style="color: #cc66cc;">0</span>..
  -<span style="color: #000066;">s</span>    shuffle outputs
        <span style="color: #66cc66;">&#40;</span>default false<span style="color: #66cc66;">&#41;</span>
&nbsp;
There are two modes of sampling:
&nbsp;
  <span style="color: #66cc66;">*</span> sample with probability <span style="color: #66cc66;">&#40;</span>-p<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">*</span> sample a fixed number of elements <span style="color: #66cc66;">&#40;</span>-k<span style="color: #66cc66;">&#41;</span>
&nbsp;
Both modes sample over a given <span style="color: #000066;">time</span> interval in seconds <span style="color: #66cc66;">&#40;</span>-t<span style="color: #66cc66;">&#41;</span>.
-t defaults to zero <span style="color: #66cc66;">&#40;</span>process full stream<span style="color: #66cc66;">&#41;</span>.  -p can only be
used alone.  -n can only be used with -k
&nbsp;
Examples:
&nbsp;
  <span style="color: #66cc66;">*</span> sample K elements from a stream:
    cat <span style="color: #66cc66;">/</span>etc<span style="color: #66cc66;">/</span>passwd <span style="color: #66cc66;">|</span> sample -k <span style="color: #cc66cc;">5</span>
&nbsp;
  <span style="color: #66cc66;">*</span> sample <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">%</span> of elements from a stream:
    tail -f <span style="color: #66cc66;">/</span>var<span style="color: #66cc66;">/</span>logs<span style="color: #66cc66;">/</span>httpd<span style="color: #66cc66;">/</span>access_log <span style="color: #66cc66;">|</span> sample -p <span style="color: #cc66cc;">0.01</span>
&nbsp;
  <span style="color: #66cc66;">*</span> sample K elements from a stream every <span style="color: #cc66cc;">30</span> seconds:
    tail -f <span style="color: #66cc66;">/</span>var<span style="color: #66cc66;">/</span>logs<span style="color: #66cc66;">/</span>httpd<span style="color: #66cc66;">/</span>access_log <span style="color: #66cc66;">|</span> sample -k <span style="color: #cc66cc;">5</span> -t <span style="color: #cc66cc;">30</span>
&nbsp;
  <span style="color: #66cc66;">*</span> sample K elements from a stream every <span style="color: #cc66cc;">30</span> seconds, shuffled:
    tail -f <span style="color: #66cc66;">/</span>var<span style="color: #66cc66;">/</span>logs<span style="color: #66cc66;">/</span>httpd<span style="color: #66cc66;">/</span>access_log <span style="color: #66cc66;">|</span> sample -k <span style="color: #cc66cc;">5</span> -t <span style="color: #cc66cc;">30</span> -<span style="color: #000066;">s</span>
&nbsp;
  <span style="color: #66cc66;">*</span> sample K elements from a stream every <span style="color: #cc66cc;">100</span> elements:
    tail -f <span style="color: #66cc66;">/</span>var<span style="color: #66cc66;">/</span>logs<span style="color: #66cc66;">/</span>httpd<span style="color: #66cc66;">/</span>access_log <span style="color: #66cc66;">|</span> sample -k <span style="color: #cc66cc;">5</span> -n <span style="color: #cc66cc;">100</span>
&nbsp;
Copyright<span style="color: #66cc66;">/</span>License:
&nbsp;
  Allen Day <span style="color: #66cc66;">&lt;</span>allenday<span style="color: #0000ff;">@ucla</span>.edu<span style="color: #66cc66;">&gt;</span>, licensed under GPL <span style="color: #cc66cc;">2006</span><span style="color: #cc66cc;">-2008</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/10/09/sample-probabilistic-sampling-from-a-stream-of-lines/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MogileFS + FUSE + Bigfile support</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/07/14/mogilefs-fuse-bigfile-support/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/07/14/mogilefs-fuse-bigfile-support/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 10:31:52 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Distributed Systems]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/?p=41</guid>
		<description><![CDATA[Jordan and I have been migrating all the TinyTube data over to a MogileFS storage system.
Seems to be a very easy-to-use solution for scalable storage of lots of little files.  Basically just works out of the box, including the alpha-quality mount-filepaths FUSE adapter available for MogileFS in the SixApart SVN.
I have two problems with [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jordan.spicylogic.com/blog/">Jordan</a> and I have been migrating all the <a href="http://tinytube.net/">TinyTube</a> data over to a <a href="http://www.danga.com/mogilefs">MogileFS</a> storage system.</p>
<p>Seems to be a very easy-to-use solution for scalable storage of lots of little files.  Basically just works out of the box, including the alpha-quality <code>mount-filepaths</code> <a href="http://fuse.sourceforge.net/">FUSE</a> adapter available for MogileFS in the <a href="http://code.sixapart.com/trac/mogilefs/browser/trunk/fuse">SixApart SVN</a>.</p>
<p>I have two problems with <code>mount-filepaths</code> though:</p>
<ol>
<li>Doesn&#8217;t recognize data loaded outside FUSE.  It assumes I want to see/read files that were loaded via its mapping of FUSE directory/file names to MogileFS keys, and it doesn&#8217;t show other keys at all.  I have lots of preloaded data, so this is a dealbreaker.</li>
<li>Doesn&#8217;t support large files.  MogileFS has a 64MB limit per file, and if you want to load a bigger file, it splits it into chunks.  This FUSE adapter is not aware of how to deal with big files.</li>
</ol>
<p>So I did some heavy modification of the script.  Here&#8217;s my version.  No directory support, but it lets me read my big files by the original key (i.e. a stat on &#8220;bigfile1.mpg&#8221; may trigger a stat on &#8220;_big_info:bigfile1.mpg&#8221;), and any other file I&#8217;ve loaded outside of FUSE (e.g. with <code>mogtool</code>).</p>
<p>You can name it as <code>myfuse.pl</code> and then, assuming the script is in the current directory, use it to mount a filesystem like so: <code>mkdir ./myfuse; perl ./myfuse.pl ./myfuse</code>.</p>
<p>Maybe I&#8217;ll get around to re-formatting this as a patch for SixApart &#8212; but probably not.</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #808080; font-style: italic;">#!/usr/bin/perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict;
<span style="color: #000000; font-weight: bold;">use</span> warnings;
<span style="color: #000000; font-weight: bold;">use</span> threads;
<span style="color: #000000; font-weight: bold;">use</span> threads::<span style="color: #006600;">shared</span>;
<span style="color: #000000; font-weight: bold;">use</span> Fuse;
<span style="color: #000000; font-weight: bold;">use</span> LWP::<span style="color: #006600;">UserAgent</span>;
<span style="color: #000000; font-weight: bold;">use</span> LWP::<span style="color: #006600;">Simple</span>;
<span style="color: #000000; font-weight: bold;">use</span> List::<span style="color: #006600;">MoreUtils</span> <span style="color: #000066;">qw</span><span style="color: #66cc66;">&#40;</span>uniq<span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">use</span> MogileFS::<span style="color: #006600;">Client</span>;
<span style="color: #000000; font-weight: bold;">use</span> Path::<span style="color: #006600;">Class</span>;
<span style="color: #000000; font-weight: bold;">use</span> POSIX <span style="color: #000066;">qw</span><span style="color: #66cc66;">&#40;</span>ENOENT EISDIR EINVAL<span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$DEBUG</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #b1b100;">our</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">%FILE_CACHE</span>, <span style="color: #0000ff;">$CACHE_SIZE</span>, <span style="color: #0000ff;">$CACHE_AGE</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#123;</span>size =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span>, age =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;"># create client object w/ server-configured namespace and IPs of trackers</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$ua</span> = LWP::<span style="color: #006600;">UserAgent</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">new</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> = <span style="color: #ff0000;">'default'</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$mogilefs</span> = MogileFS::<span style="color: #006600;">Client</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">new</span><span style="color: #66cc66;">&#40;</span>
  domain =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'ifap'</span>,
  hosts  =<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#91;</span> <span style="color: #ff0000;">'10.10.0.100:6001'</span>, <span style="color: #ff0000;">'10.10.0.101:6001'</span> <span style="color: #66cc66;">&#93;</span>,
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mountpoint</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #ff0000;">&quot;&quot;</span>;
<span style="color: #0000ff;">$mountpoint</span> = <span style="color: #000066;">shift</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">@ARGV</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">@ARGV</span>;
Fuse::<span style="color: #006600;">main</span><span style="color: #66cc66;">&#40;</span>
    debug      =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$DEBUG</span>,
    mountpoint =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$mountpoint</span>,
    threaded   =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span>,
&nbsp;
    getattr    =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_getattr&quot;</span>,
    getdir     =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_getdir&quot;</span>,
    mknod      =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_mknod&quot;</span>,
    <span style="color: #000066;">open</span>       =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_open&quot;</span>,
    <span style="color: #000066;">read</span>       =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_read&quot;</span>,
    <span style="color: #000066;">rename</span>     =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_rename&quot;</span>,
    statfs     =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_statfs&quot;</span>,
    <span style="color: #000066;">unlink</span>     =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_unlink&quot;</span>,
    <span style="color: #000066;">write</span>      =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_write&quot;</span>,
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_getattr <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$filename</span> = <span style="color: #000066;">shift</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#^.*/##;</span>
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_getattr $filename<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$size</span>, <span style="color: #0000ff;">$modes</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$dev</span>, <span style="color: #0000ff;">$ino</span>, <span style="color: #0000ff;">$rdev</span>, <span style="color: #0000ff;">$blocks</span>, <span style="color: #0000ff;">$gid</span>, <span style="color: #0000ff;">$uid</span>, <span style="color: #0000ff;">$nlink</span>, <span style="color: #0000ff;">$blksize</span> <span style="color: #66cc66;">&#41;</span>
        = <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1024</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$atime</span>, <span style="color: #0000ff;">$ctime</span>, <span style="color: #0000ff;">$mtime</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">time</span>, <span style="color: #000066;">time</span>, <span style="color: #000066;">time</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span> <span style="color: #66cc66;">!</span>~ <span style="color: #000066;">m</span><span style="color: #66cc66;">&#123;</span>\.<span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;">#        warn &quot;directory!&quot;;</span>
        <span style="color: #0000ff;">$size</span>  = <span style="color: #cc66cc;">0</span>;
        <span style="color: #0000ff;">$modes</span> = <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0040</span> <span style="color: #66cc66;">&lt;&lt;</span> <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #cc66cc;">0755</span>;
    <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;">#        warn &quot;file!&quot;;</span>
        <span style="color: #0000ff;">$size</span>  = <span style="color: #cc66cc;">123</span>;
        <span style="color: #0000ff;">$modes</span> = <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0100</span> <span style="color: #66cc66;">&lt;&lt;</span> <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #cc66cc;">0644</span>;
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$content_type</span>, <span style="color: #0000ff;">$document_length</span>, <span style="color: #0000ff;">$modified_time</span>, <span style="color: #0000ff;">$expires</span>, <span style="color: #0000ff;">$server</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$content_type</span>, <span style="color: #0000ff;">$document_length</span>, <span style="color: #0000ff;">$modified_time</span>, <span style="color: #0000ff;">$expires</span>, <span style="color: #0000ff;">$server</span> <span style="color: #66cc66;">&#41;</span> = head<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$paths</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span>;
            <span style="color: #0000ff;">$size</span> = <span style="color: #0000ff;">$document_length</span>;
            <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$atime</span>, <span style="color: #0000ff;">$ctime</span>, <span style="color: #0000ff;">$mtime</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$modified_time</span><span style="color: #66cc66;">&#41;</span> x <span style="color: #cc66cc;">3</span>;
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'_big_info:'</span> . <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
            <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$data</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_file_data</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'_big_info:'</span> . <span style="color: #0000ff;">$filename</span> <span style="color: #66cc66;">&#41;</span>;
                <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$_des</span>, <span style="color: #0000ff;">$_type</span>, <span style="color: #0000ff;">$_compress</span>, <span style="color: #0000ff;">$_filename</span>, <span style="color: #0000ff;">$_chunks</span>, <span style="color: #0000ff;">$_size</span>, <span style="color: #000066;">undef</span>, <span style="color: #0000ff;">@_parts</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #000066;">split</span> <span style="color: #66cc66;">/</span>\n<span style="color: #66cc66;">/</span>, <span style="color: #0000ff;">$$data</span>;
                <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$size</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">$_size</span> =~ <span style="color: #000066;">m</span><span style="color: #808080; font-style: italic;">#^size (\d+)$#;</span>
                OUTER: <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$_part</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@_parts</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                    <span style="color: #0000ff;">$_part</span> =~ <span style="color: #000066;">m</span><span style="color: #808080; font-style: italic;">#paths: (.+?)$#;</span>
                    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@_paths</span> = <span style="color: #000066;">split</span> <span style="color: #ff0000;">', '</span>, <span style="color: #0000ff;">$_part</span>;
                    <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$_path</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@_paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                        <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$content_type</span>, <span style="color: #0000ff;">$document_length</span>, <span style="color: #0000ff;">$modified_time</span>, <span style="color: #0000ff;">$expires</span>, <span style="color: #0000ff;">$server</span> <span style="color: #66cc66;">&#41;</span> = head<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$paths</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span>;
                        <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$atime</span>, <span style="color: #0000ff;">$ctime</span>, <span style="color: #0000ff;">$mtime</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$modified_time</span><span style="color: #66cc66;">&#41;</span> x <span style="color: #cc66cc;">3</span>;
                        <span style="color: #b1b100;">last</span> OUTER <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$server</span>;
                    <span style="color: #66cc66;">&#125;</span>
                <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #000066;">return</span> -ENOENT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">@paths</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000066;">warn</span><span style="color: #66cc66;">&#40;</span>
        <span style="color: #000066;">join</span><span style="color: #66cc66;">&#40;</span>
            <span style="color: #ff0000;">&quot;,&quot;</span>,
            <span style="color: #66cc66;">&#40;</span>   <span style="color: #0000ff;">$dev</span>,   <span style="color: #0000ff;">$ino</span>,     <span style="color: #0000ff;">$modes</span>, <span style="color: #0000ff;">$nlink</span>, <span style="color: #0000ff;">$uid</span>,
                <span style="color: #0000ff;">$gid</span>,   <span style="color: #0000ff;">$rdev</span>,    <span style="color: #0000ff;">$size</span>,  <span style="color: #0000ff;">$atime</span>, <span style="color: #0000ff;">$mtime</span>,
                <span style="color: #0000ff;">$ctime</span>, <span style="color: #0000ff;">$blksize</span>, <span style="color: #0000ff;">$blocks</span>
            <span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#41;</span>,
        <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
    <span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #66cc66;">&#40;</span>
        <span style="color: #0000ff;">$dev</span>,  <span style="color: #0000ff;">$ino</span>,   <span style="color: #0000ff;">$modes</span>, <span style="color: #0000ff;">$nlink</span>, <span style="color: #0000ff;">$uid</span>,     <span style="color: #0000ff;">$gid</span>, <span style="color: #0000ff;">$rdev</span>,
        <span style="color: #0000ff;">$size</span>, <span style="color: #0000ff;">$atime</span>, <span style="color: #0000ff;">$mtime</span>, <span style="color: #0000ff;">$ctime</span>, <span style="color: #0000ff;">$blksize</span>, <span style="color: #0000ff;">$blocks</span>
    <span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_getdir <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$prefix</span> = <span style="color: #000066;">shift</span>;
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_getdir $prefix<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@filenames</span>;
    <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">foreach_key</span><span style="color: #66cc66;">&#40;</span>
<span style="color: #808080; font-style: italic;">#        prefix =&gt; $prefix,</span>
        <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #66cc66;">&#123;</span>
          <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$filename</span> = <span style="color: #000066;">shift</span>;
          <span style="color: #000066;">push</span> <span style="color: #0000ff;">@filenames</span>, <span style="color: #0000ff;">$filename</span>;
          <span style="color: #000066;">push</span> <span style="color: #0000ff;">@filenames</span>, file<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">parent</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #0000ff;">@filenames</span> = uniq <span style="color: #0000ff;">@filenames</span>;
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;returning: @filenames<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
    <span style="color: #000066;">return</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@filenames</span>, <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_mknod <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$filename</span> = <span style="color: #000066;">shift</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
&nbsp;
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_mknod $filename<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$fh</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">new_file</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span>, <span style="color: #000066;">undef</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$fh</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000066;">print</span> <span style="color: #0000ff;">$fh</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
&nbsp;
        <span style="color: #b1b100;">unless</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$fh</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">close</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$code</span>, <span style="color: #0000ff;">$str</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">errcode</span> <span style="color: #66cc66;">||</span> <span style="color: #cc66cc;">-1</span>, <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">errstr</span> <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
            <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;Error creating file:$code: $str&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
            $<span style="color: #66cc66;">!</span> = <span style="color: #0000ff;">$str</span>;
            $? = <span style="color: #0000ff;">$code</span>;
            <span style="color: #000066;">return</span> <span style="color: #cc66cc;">-1</span>;
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000066;">return</span> <span style="color: #cc66cc;">-1</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_open <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$filename</span> = <span style="color: #000066;">shift</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_open $filename<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #000066;">return</span> -EISDIR<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">m</span><span style="color: #66cc66;">&#123;</span>\.<span style="color: #66cc66;">&#125;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">!</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'_big_info:'</span> . <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #000066;">return</span> -ENOENT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">@paths</span>;
    <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_read <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span>, <span style="color: #0000ff;">$length</span>, <span style="color: #0000ff;">$offset</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_read $filename $length $offset<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #000066;">return</span> -EISDIR<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">m</span><span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">/</span>$<span style="color: #66cc66;">&#125;</span>;
&nbsp;
&nbsp;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$maxoff</span> = <span style="color: #0000ff;">$offset</span> + <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$length</span> - <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;requested offset=$offset length=$length bytes=$maxoff&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$size</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$content_type</span>, <span style="color: #0000ff;">$document_length</span>, <span style="color: #0000ff;">$modified_time</span>, <span style="color: #0000ff;">$expires</span>, <span style="color: #0000ff;">$server</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;it's a small file&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
        <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$content_type</span>, <span style="color: #0000ff;">$document_length</span>, <span style="color: #0000ff;">$modified_time</span>, <span style="color: #0000ff;">$expires</span>, <span style="color: #0000ff;">$server</span> <span style="color: #66cc66;">&#41;</span> = head<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$paths</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0000ff;">$size</span> = <span style="color: #0000ff;">$document_length</span>;
        <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$offset</span> == <span style="color: #0000ff;">$document_length</span>;
&nbsp;
        <span style="color: #0000ff;">$maxoff</span> = <span style="color: #0000ff;">$document_length</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$maxoff</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$document_length</span>;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$range</span> = <span style="color: #0000ff;">$offset</span> . <span style="color: #ff0000;">&quot;-&quot;</span> . <span style="color: #0000ff;">$maxoff</span>;
        <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;  Range: bytes=$range<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$response</span> = <span style="color: #0000ff;">$ua</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$paths</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #ff0000;">&quot;Range&quot;</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;bytes=$range&quot;</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$response</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">is_success</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000066;">return</span> <span style="color: #0000ff;">$response</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">content</span>;
        <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000066;">warn</span> <span style="color: #0000ff;">$response</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">as_string</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'_big_info:'</span> . <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #000066;">return</span> -ENOENT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">@paths</span>;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;it's a big file&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$data</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_file_data</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'_big_info:'</span> . <span style="color: #0000ff;">$filename</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$_des</span>, <span style="color: #0000ff;">$_type</span>, <span style="color: #0000ff;">$_compress</span>, <span style="color: #0000ff;">$_filename</span>, <span style="color: #0000ff;">$_chunks</span>, <span style="color: #0000ff;">$_size</span>, <span style="color: #000066;">undef</span>, <span style="color: #0000ff;">@_parts</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #000066;">split</span> <span style="color: #66cc66;">/</span>\n<span style="color: #66cc66;">/</span>, <span style="color: #0000ff;">$$data</span>;
        <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$size</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">$_size</span> =~ <span style="color: #000066;">m</span><span style="color: #808080; font-style: italic;">#^size (\d+)$#;</span>
        <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$offset</span> == <span style="color: #0000ff;">$size</span>;
&nbsp;
        <span style="color: #0000ff;">$maxoff</span> = <span style="color: #0000ff;">$size</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$maxoff</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$size</span>;
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$part_min</span> = <span style="color: #cc66cc;">-1</span>;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$part_max</span> = <span style="color: #cc66cc;">-1</span>;
<span style="color: #808080; font-style: italic;">#part 2 bytes=23080964 md5=af45f7ac80ca34328db3c90de1db1ab0 paths: http://10.10.0.100:7500/dev8/0/000/119/0000119969.fid, http://10.10.0.101:7500/dev2/0/000/119/0000119969.fid</span>
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$buf</span> = <span style="color: #ff0000;">''</span>;
        <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$_part</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@_parts</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$_bytes</span>, <span style="color: #0000ff;">$_paths</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">$_part</span> =~ <span style="color: #000066;">m</span><span style="color: #808080; font-style: italic;">#bytes=(\d+) .+? paths: (.+?)$#;</span>
&nbsp;
            <span style="color: #0000ff;">$part_min</span> = <span style="color: #0000ff;">$part_max</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> ? <span style="color: #0000ff;">$part_max</span> + <span style="color: #cc66cc;">1</span> : <span style="color: #cc66cc;">0</span>;
            <span style="color: #0000ff;">$part_max</span> += <span style="color: #0000ff;">$_bytes</span>;
&nbsp;
&nbsp;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;examining part $part_min -&gt; $part_max&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
            <span style="color: #808080; font-style: italic;">#chunk too early</span>
            <span style="color: #b1b100;">next</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$part_max</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #0000ff;">$offset</span> <span style="color: #66cc66;">&#41;</span>;
            <span style="color: #808080; font-style: italic;">#chunk too late;</span>
            <span style="color: #b1b100;">next</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$part_min</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$maxoff</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;using part $part_min -&gt; $part_max&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
            <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@_paths</span> = <span style="color: #000066;">split</span> <span style="color: #ff0000;">', '</span>, <span style="color: #0000ff;">$_paths</span>;
            <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$_path</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@_paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;offset=$offset part_min=$part_min maxoff=$maxoff part_max=$part_max&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
                <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$range</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$offset</span>-<span style="color: #0000ff;">$part_min</span><span style="color: #66cc66;">&#41;</span> . <span style="color: #ff0000;">&quot;-&quot;</span> . <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$maxoff</span>-<span style="color: #0000ff;">$part_min</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;getting Range: bytes=$range&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
                <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$response</span> = <span style="color: #0000ff;">$ua</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$_path</span>, <span style="color: #ff0000;">&quot;Range&quot;</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;bytes=$range&quot;</span> <span style="color: #66cc66;">&#41;</span>;
                <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$response</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">is_success</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                    <span style="color: #0000ff;">$buf</span> .= <span style="color: #0000ff;">$response</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">content</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;data length=&quot;</span>.<span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
                    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$buf</span> <span style="color: #66cc66;">&#41;</span> == <span style="color: #0000ff;">$length</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;got all the data (1)!&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
                        <span style="color: #000066;">return</span> <span style="color: #0000ff;">$buf</span>;
                    <span style="color: #66cc66;">&#125;</span>
                    <span style="color: #b1b100;">elsif</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$offset</span> + <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$buf</span> <span style="color: #66cc66;">&#41;</span> == <span style="color: #0000ff;">$maxoff</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;got all the data (2)!&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
                        <span style="color: #000066;">return</span> <span style="color: #0000ff;">$buf</span>;
                    <span style="color: #66cc66;">&#125;</span>
                    <span style="color: #0000ff;">$offset</span> += <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$buf</span> <span style="color: #66cc66;">&#41;</span>;
                    <span style="color: #b1b100;">last</span>;
                <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$buf</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">!</span>= <span style="color: #0000ff;">$length</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000066;">return</span> -ENOENT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000066;">return</span> <span style="color: #0000ff;">$buf</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_rename <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$old</span>, <span style="color: #0000ff;">$new</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
    <span style="color: #0000ff;">$old</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
    <span style="color: #0000ff;">$new</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
&nbsp;
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_rename: $old -&gt; $new&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;"># Rename this file</span>
    <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">rename</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$old</span>, <span style="color: #0000ff;">$new</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_statfs <span style="color: #66cc66;">&#123;</span> <span style="color: #000066;">return</span> <span style="color: #cc66cc;">255</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_unlink <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$filename</span> = <span style="color: #000066;">shift</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
&nbsp;
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_unlink: $filename&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">delete</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_write <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span>, <span style="color: #0000ff;">$buf</span>, <span style="color: #0000ff;">$offset</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
&nbsp;
    <span style="color: #000066;">warn</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;main::e_write: $filename pos=$offset len=&quot;</span>.<span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$finfo</span> = get_file_info<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">return</span> -ENOENT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">$finfo</span>;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cont</span> = get_file_data<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">substr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$$cont</span>, <span style="color: #0000ff;">$offset</span>, <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">store_content</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span>, <span style="color: #000066;">undef</span>, <span style="color: #0000ff;">$cont</span><span style="color: #66cc66;">&#41;</span>;
    rm_file_cache<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#################################################</span>
<span style="color: #000000; font-weight: bold;">sub</span> logmsg <span style="color: #66cc66;">&#123;</span> <span style="color: #000066;">warn</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">join</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>,<span style="color: #0000ff;">@_</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span> <span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> get_file_data <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$entry</span> = <span style="color: #0000ff;">$FILE_CACHE</span><span style="color: #66cc66;">&#123;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$meta</span>  = <span style="color: #0000ff;">$FILE_CACHE</span><span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#125;</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$entry</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;"># See if this data is too old</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">time</span> - <span style="color: #0000ff;">$entry</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>created<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #0000ff;">$CACHE_AGE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            logmsg<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #ff0000;">&quot;-- get_file_data: hit&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #808080; font-style: italic;"># If its still valid, return it</span>
            <span style="color: #000066;">return</span> <span style="color: #0000ff;">$entry</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>data<span style="color: #66cc66;">&#125;</span>;
        <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
            logmsg<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #ff0000;">&quot;-- get_file_data: miss - expired&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            rm_file_cache<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cont</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_file_data</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$size</span> = <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$$cont</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$meta</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>size<span style="color: #66cc66;">&#125;</span> + <span style="color: #0000ff;">$size</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$CACHE_SIZE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;"># If adding this would go beyond our max cache size, delete things until</span>
        <span style="color: #808080; font-style: italic;"># we can fit it</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$f</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">sort</span> <span style="color: #66cc66;">&#123;</span><span style="color: #0000ff;">$a</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>age<span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&lt;</span>=<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$b</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>age<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#125;</span> <span style="color: #000066;">keys</span> <span style="color: #0000ff;">%FILE_CACHE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100;">next</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$f</span> eq <span style="color: #ff0000;">'/'</span>;
&nbsp;
            <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$rm_size</span> = rm_file_cache<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$f</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            logmsg<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #ff0000;">&quot;-- get_file_data: purging - $rm_size bytes&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #b1b100;">last</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$meta</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>size<span style="color: #66cc66;">&#125;</span> + <span style="color: #0000ff;">$size</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #0000ff;">$CACHE_SIZE</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    logmsg<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #ff0000;">&quot;-- get_file_data: added - $size bytes&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;"># Create a new entry</span>
    <span style="color: #0000ff;">$FILE_CACHE</span><span style="color: #66cc66;">&#123;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#125;</span> = <span style="color: #66cc66;">&#123;</span>created =<span style="color: #66cc66;">&gt;</span> <span style="color: #000066;">time</span>,
                          size    =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$size</span>,
                          data    =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$cont</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #0000ff;">$meta</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>size<span style="color: #66cc66;">&#125;</span> += <span style="color: #0000ff;">$size</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$cont</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> get_file_info <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$path</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$path</span> eq <span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000066;">return</span> <span style="color: #66cc66;">&#123;</span>name         =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'/'</span>,
                is_directory =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$f</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">list_keys</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$path</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000066;">return</span> <span style="color: #0000ff;">$f</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$f</span> eq <span style="color: #0000ff;">$path</span>;
      <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #000066;">return</span> <span style="color: #000066;">undef</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> rm_file_cache <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$entry</span> = <span style="color: #000066;">delete</span> <span style="color: #0000ff;">$FILE_CACHE</span><span style="color: #66cc66;">&#123;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #000066;">return</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">$entry</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;"># Decrement how large our cache size is</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$size</span> = <span style="color: #0000ff;">$entry</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>size<span style="color: #66cc66;">&#125;</span>;
    <span style="color: #0000ff;">$FILE_CACHE</span><span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#125;</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>size<span style="color: #66cc66;">&#125;</span> -= <span style="color: #0000ff;">$size</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$size</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__DATA__</span>
<span style="color: #808080; font-style: italic;">#des no description</span>
<span style="color: #808080; font-style: italic;">#type file</span>
<span style="color: #808080; font-style: italic;">#compressed 0</span>
<span style="color: #808080; font-style: italic;">#filename somefile.mpeg</span>
<span style="color: #808080; font-style: italic;">#chunks 2</span>
<span style="color: #808080; font-style: italic;">#size 90189828</span>
<span style="color: #808080; font-style: italic;">#</span>
<span style="color: #808080; font-style: italic;">#part 1 bytes=67108864 md5=8066369552b71fd49cfbe9ccdce74051 paths: http://10.10.0.100:7500/dev6/0/000/119/0000119968.fid, http://10.10.0.101:7500/dev2/0/000/119/0000119968.fid</span>
<span style="color: #808080; font-style: italic;">#part 2 bytes=23080964 md5=af45f7ac80ca34328db3c90de1db1ab0 paths: http://10.10.0.100:7500/dev8/0/000/119/0000119969.fid, http://10.10.0.101:7500/dev2/0/000/119/0000119969.fid</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/07/14/mogilefs-fuse-bigfile-support/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>pcoc &#8211; Piped Command Output Colorizer</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/07/05/pcoc-piped-command-output-colorizer/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/07/05/pcoc-piped-command-output-colorizer/#comments</comments>
		<pubDate>Sun, 06 Jul 2008 01:37:09 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Analytics]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/07/05/pcoc-piped-command-output-colorizer/</guid>
		<description><![CDATA[I&#8217;m frequently monitoring webservers, cache servers, database servers, etc by tailing their log files, e.g.

tail -f /etc/httpd/logs/access_log

I like the &#8211;color option provided by grep, but found it to be too limited (only one allowed, no wildcard support).  After a bit of searching to see if a tool existed for doing arbitrary colorizing, I found
acoc, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m frequently monitoring webservers, cache servers, database servers, etc by tailing their log files, e.g.</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span style="color: #c20cb9; font-weight: bold;">tail</span> -f <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>httpd<span style="color: #000000; font-weight: bold;">/</span>logs<span style="color: #000000; font-weight: bold;">/</span>access_log</pre></div></div>

<p>I like the &#8211;color option provided by grep, but found it to be too limited (only one allowed, no wildcard support).  After a bit of searching to see if a tool existed for doing arbitrary colorizing, I found<br />
<a href="http://www.caliban.org/ruby/acoc.shtml">acoc, the Arbitrary Command Output Colourer</a>.</p>
<p>&#8230;which almost did what I needed, but couldn&#8217;t read from a pipe.  So I wrote pcoc, the Piped Command Output Colorizer.  I&#8217;m only publishing this because I&#8217;ve been using it for about 1 1/2 years, and still find it useful.</p>
<p>Source code at the end of this post.  Here&#8217;s an example that highlights iPhone/iPod user agents and requests with a 500/400/404 HTTP response:</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span style="color: #c20cb9; font-weight: bold;">tail</span> -f .<span style="color: #000000; font-weight: bold;">/</span>logs<span style="color: #000000; font-weight: bold;">/</span>access_log <span style="color: #000000; font-weight: bold;">|</span> pcoc -f <span style="color: #ff0000;">'(iPod)=bold cyan'</span> -f <span style="color: #ff0000;">'(iPhone)=bold magenta'</span> -f <span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\b</span>(500|404|400)<span style="color: #000099; font-weight: bold;">\b</span>=red on_black'</span></pre></div></div>

<p>Sorry, no screenshots <img src='http://www.spicylogic.com/allenday/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> .</p>
<p>pcoc source:</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #808080; font-style: italic;">#!/usr/bin/perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict;
<span style="color: #000000; font-weight: bold;">use</span> Getopt::<span style="color: #006600;">Long</span>;
<span style="color: #000000; font-weight: bold;">use</span> Term::<span style="color: #006600;">ANSIColor</span> <span style="color: #000066;">qw</span><span style="color: #66cc66;">&#40;</span>colored<span style="color: #66cc66;">&#41;</span>;
$<span style="color: #66cc66;">|</span>++;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">%format</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
GetOptions<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;format|f=s&quot;</span> =<span style="color: #66cc66;">&gt;</span> \<span style="color: #0000ff;">%format</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">!</span> <span style="color: #000066;">keys</span> <span style="color: #0000ff;">%format</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000066;">print</span> <span style="color: #66cc66;">&lt;&lt;</span><span style="color: #ff0000;">&quot;EOF&quot;</span>;
Synopsis:
        pcoc - Piped Command Output Colorizer.  Inspired by acoc.
&nbsp;
Usage:
&nbsp;
        $<span style="color: #cc66cc;">0</span> -f <span style="color: #ff0000;">'&lt;regex1&gt;=&lt;color1&gt;'</span> -f <span style="color: #ff0000;">'&lt;regex2&gt;=&lt;color2&gt;'</span>
&nbsp;
$<span style="color: #cc66cc;">0</span> reads from a <span style="color: #000066;">pipe</span> <span style="color: #b1b100;">and</span> colorizes <span style="color: #000066;">each</span> line based on <span style="color: #000066;">format</span> <span style="color: #66cc66;">&#40;</span>-f<span style="color: #66cc66;">&#41;</span> parameters.
&nbsp;
Arguments:
&nbsp;
-f <span style="color: #ff0000;">'&lt;regex&gt;=&lt;color&gt;'</span>  Required, multiple <span style="color: #000066;">values</span> okay. 
&nbsp;
        <span style="color: #009999;">&lt;regex&gt;</span>: A regular expression from which \$<span style="color: #cc66cc;">1</span> will be colorized
&nbsp;
        <span style="color: #009999;">&lt;color&gt;</span>: One <span style="color: #b1b100;">or</span> more colorization keywords, see perldoc
        Term::<span style="color: #006600;">ANSIColor</span>, but briefly they are:
&nbsp;
        boldness:
                bold
        foreground:
                red yellow green blue magenta cyan black white
        background:
                on_red on_yellow on_green on_blue on_magenta on_cyan
                on_black on_white
&nbsp;
Examples:
&nbsp;
        <span style="color: #808080; font-style: italic;">#highlight the account's shell in bold green</span>
        cat <span style="color: #66cc66;">/</span>etc<span style="color: #66cc66;">/</span>passwd <span style="color: #66cc66;">|</span> $<span style="color: #cc66cc;">0</span> -f <span style="color: #ff0000;">'.+:([^:]+)\$=bold green'</span>
&nbsp;
        <span style="color: #808080; font-style: italic;">#... and the username in red with black background</span>
        cat <span style="color: #66cc66;">/</span>etc<span style="color: #66cc66;">/</span>passwd <span style="color: #66cc66;">|</span> $<span style="color: #cc66cc;">0</span> -f <span style="color: #ff0000;">'([^:]+)=red on_black'</span> -f <span style="color: #ff0000;">'.+:([^:]+)\$=bold green'</span>
&nbsp;
Copyright<span style="color: #66cc66;">/</span>License:
&nbsp;
        Allen Day <span style="color: #66cc66;">&lt;</span>allenday\<span style="color: #0000ff;">@ucla</span>.edu<span style="color: #66cc66;">&gt;</span>, licensed under GPL <span style="color: #cc66cc;">2006</span><span style="color: #cc66cc;">-2008</span>
&nbsp;
EOF
  <span style="color: #000066;">exit</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$line</span> = <span style="color: #66cc66;">&lt;&gt;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000066;">chomp</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$line</span> <span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$f</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">keys</span> <span style="color: #0000ff;">%format</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@c</span> = <span style="color: #000066;">split</span> <span style="color: #ff0000;">','</span>, <span style="color: #0000ff;">$format</span><span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$f</span> <span style="color: #66cc66;">&#125;</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$line</span> =~ <span style="color: #000066;">qr</span><span style="color: #66cc66;">/</span><span style="color: #0000ff;">$f</span><span style="color: #66cc66;">/</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$s</span>, <span style="color: #0000ff;">$t</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">$f</span> =~ <span style="color: #000066;">m</span><span style="color: #66cc66;">/</span>^<span style="color: #66cc66;">&#40;</span>.<span style="color: #66cc66;">*</span>?<span style="color: #66cc66;">&#41;</span>\<span style="color: #66cc66;">&#40;</span>+<span style="color: #66cc66;">&#40;</span>.+?<span style="color: #66cc66;">&#41;</span>\<span style="color: #66cc66;">&#41;</span>+<span style="color: #66cc66;">/</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$c</span> = <span style="color: #000066;">pop</span> <span style="color: #0000ff;">@c</span> <span style="color: #66cc66;">||</span> <span style="color: #b1b100;">last</span>;
        <span style="color: #0000ff;">$line</span> =~ <span style="color: #000066;">s</span><span style="color: #66cc66;">/</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$s</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$t</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>$<span style="color: #cc66cc;">1</span>.colored<span style="color: #66cc66;">&#40;</span>$<span style="color: #cc66cc;">2</span>,<span style="color: #0000ff;">$c</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>e;
        <span style="color: #0000ff;">$f</span> =~ <span style="color: #000066;">s</span><span style="color: #66cc66;">/</span>^<span style="color: #66cc66;">&#40;</span>.<span style="color: #66cc66;">*</span>?<span style="color: #66cc66;">&#41;</span>\<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>.+?<span style="color: #66cc66;">&#41;</span>\<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>$<span style="color: #cc66cc;">1</span>$<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">/</span>;
      <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;$line<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/07/05/pcoc-piped-command-output-colorizer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
