<?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; Administration</title>
	<atom:link href="http://www.spicylogic.com/allenday/blog/category/computing/administration/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>EveryDNS &#8211; free DNS service</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/12/10/everydns-free-dns-service/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/12/10/everydns-free-dns-service/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 20:47:54 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/12/10/everydns-free-dns-service/</guid>
		<description><![CDATA[http://www.everydns.com
Found this today, and it works as advertised.  Need to look more closely, but with this I think I can stop paying dyndns.com $30/year/domain for custom DNS.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.everydns.com">http://www.everydns.com</a></p>
<p>Found this today, and it works as advertised.  Need to look more closely, but with this I think I can stop paying <a href="http://dyndns.com">dyndns.com</a> $30/year/domain for custom DNS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/12/10/everydns-free-dns-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress &#8211; collapse redundant tags</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/10/19/wordpress-collapse-redundant-tags/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/10/19/wordpress-collapse-redundant-tags/#comments</comments>
		<pubDate>Sun, 19 Oct 2008 08:27:10 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/?p=75</guid>
		<description><![CDATA[I&#8217;ve been experimenting with automation of WordPress posts.  Probably I&#8217;m doing something wrong with the way I make the XML RPC calls, but I find that I end up with redundant tags in my database.  For instance, if I tagged two separate, RPC-posted posts with &#8220;orange&#8221;, I get two different tags both called [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been experimenting with automation of WordPress posts.  Probably I&#8217;m doing something wrong with the way I make the XML RPC calls, but I find that I end up with redundant tags in my database.  For instance, if I tagged two separate, RPC-posted posts with &#8220;orange&#8221;, I get two different tags both called &#8220;orange&#8221;.  Until I figure out how to fix this properly, here&#8217;s a little script that will clean up the database by consolidating all redundantly named tags to one tag.  You might want to back up your database before using this&#8230;</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> DBI;
&nbsp;
<span style="color: #808080; font-style: italic;">######configuration</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$PREFIX</span> = <span style="color: #ff0000;">'wp_h5otpn_'</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$DB</span> = <span style="color: #ff0000;">''</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$HOST</span> = <span style="color: #ff0000;">''</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$USER</span> = <span style="color: #ff0000;">''</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$PASS</span> = <span style="color: #ff0000;">''</span>;
<span style="color: #808080; font-style: italic;">######</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dbh</span> = DBI-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">connect</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">qq</span><span style="color: #66cc66;">&#40;</span>dbi:mysql:database=<span style="color: #0000ff;">$DB</span>;host=<span style="color: #0000ff;">$HOST</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$USER</span>, <span style="color: #0000ff;">$PASS</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">or</span> <span style="color: #000066;">die</span> $<span style="color: #66cc66;">!</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$term_sth</span>   = <span style="color: #0000ff;">$dbh</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">prepare</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">qq</span><span style="color: #66cc66;">&#40;</span>SELECT <span style="color: #66cc66;">*</span> FROM <span style="color: #66cc66;">&#40;</span>SELECT name, count<span style="color: #66cc66;">&#40;</span>name<span style="color: #66cc66;">&#41;</span> AS c FROM $<span style="color: #66cc66;">&#123;</span>PREFIX<span style="color: #66cc66;">&#125;</span>terms GROUP BY name<span style="color: #66cc66;">&#41;</span> AS d WHERE d.c <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$name_sth</span>   = <span style="color: #0000ff;">$dbh</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">prepare</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">qq</span><span style="color: #66cc66;">&#40;</span>SELECT term_id FROM $<span style="color: #66cc66;">&#123;</span>PREFIX<span style="color: #66cc66;">&#125;</span>terms WHERE name = ?<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$update_sth</span> = <span style="color: #0000ff;">$dbh</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">prepare</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">qq</span><span style="color: #66cc66;">&#40;</span>UPDATE $<span style="color: #66cc66;">&#123;</span>PREFIX<span style="color: #66cc66;">&#125;</span>term_relationships SET term_taxonomy_id = <span style="color: #66cc66;">&#40;</span>SELECT term_taxonomy_id FROM $<span style="color: #66cc66;">&#123;</span>PREFIX<span style="color: #66cc66;">&#125;</span>term_taxonomy WHERE term_id = ?<span style="color: #66cc66;">&#41;</span> WHERE term_taxonomy_id = <span style="color: #66cc66;">&#40;</span>SELECT term_taxonomy_id FROM $<span style="color: #66cc66;">&#123;</span>PREFIX<span style="color: #66cc66;">&#125;</span>term_taxonomy WHERE term_id = ?<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$delete1_sth</span> = <span style="color: #0000ff;">$dbh</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">prepare</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">qq</span><span style="color: #66cc66;">&#40;</span>DELETE FROM $<span style="color: #66cc66;">&#123;</span>PREFIX<span style="color: #66cc66;">&#125;</span>term_taxonomy WHERE term_id = ?<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$delete2_sth</span> = <span style="color: #0000ff;">$dbh</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">prepare</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">qq</span><span style="color: #66cc66;">&#40;</span>DELETE FROM $<span style="color: #66cc66;">&#123;</span>PREFIX<span style="color: #66cc66;">&#125;</span>terms WHERE term_id = ?<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0000ff;">$term_sth</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">execute</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: #66cc66;">&#40;</span> <span style="color: #0000ff;">$name</span>, <span style="color: #0000ff;">$count</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">$term_sth</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">fetchrow_array</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;">$name_sth</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">execute</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$name</span> <span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$new</span> = <span style="color: #000066;">undef</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;">$term_id</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">$name_sth</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">fetchrow_array</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;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">!</span> <span style="color: #0000ff;">$new</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #0000ff;">$new</span> = <span style="color: #0000ff;">$term_id</span>;
      <span style="color: #b1b100;">next</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;$name<span style="color: #000099; font-weight: bold;">\t</span>$term_id<span style="color: #000099; font-weight: bold;">\t</span>-&gt;<span style="color: #000099; font-weight: bold;">\t</span>$new&quot;</span>;
    <span style="color: #0000ff;">$update_sth</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">execute</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$new</span>, <span style="color: #0000ff;">$term_id</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$delete1_sth</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">execute</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$term_id</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$delete2_sth</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">execute</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$term_id</span> <span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__DATA__</span>
SELECT t.term_id, t.name, r.<span style="color: #66cc66;">*</span>, <span style="color: #000066;">s</span>.<span style="color: #66cc66;">*</span> FROM wp_h5otpn_terms AS t, wp_h5otpn_term_taxonomy AS r, wp_h5otpn_term_relationships AS <span style="color: #000066;">s</span> WHERE <span style="color: #000066;">s</span>.term_taxonomy_id = r.term_taxonomy_id AND r.term_id = t.term_id AND r.taxonomy = <span style="color: #ff0000;">'post_tag'</span> AND t.name = <span style="color: #ff0000;">'whatever'</span>;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/10/19/wordpress-collapse-redundant-tags/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>Sun Grid Engine SGE state letter symbol codes meanings</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/07/19/sun-grid-engine-sge-state-letter-symbol-codes-meanings/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/07/19/sun-grid-engine-sge-state-letter-symbol-codes-meanings/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 00:20:24 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Distributed Systems]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/?p=42</guid>
		<description><![CDATA[Adapted from here.


Category
State
SGE Letter Code


Pending
pending
qw


pending, user hold
qw


pending, system hold
hqw


pending, user and system hold
hqw


pending, user hold, re-queue
hRwq


pending, system hold, re-queue
hRwq


pending, user and system hold, re-queue
hRwq


Running
running
r


transferring
t


running, re-submit
Rr


transferring, re-submit
Rt


Suspended
job suspended
s, ts


queue suspended
S, tS


queue suspended by alarm
T, tT


all suspended with re-submit
Rs, Rts, RS, RtS, RT, RtT


Error
all pending states with error
Eqw, Ehqw, EhRqw


Deleted
all running and suspended states with deletion
dr, dt, [...]]]></description>
			<content:encoded><![CDATA[<p>Adapted from <a href="http://gridengine.sunsource.net/nonav/source/browse/~checkout~/gridengine/source/libs/japi/jobstates.html?content-type=text/html">here</a>.</p>
<table border="1" cellpadding="4">
<tr>
<th>Category</th>
<th>State</th>
<th>SGE Letter Code</th>
</tr>
<tr>
<td valign="top" rowspan="7">Pending</td>
<td>pending</td>
<td>qw</td>
</tr>
<tr>
<td>pending, user hold</td>
<td>qw</td>
</tr>
<tr>
<td>pending, system hold</td>
<td>hqw</td>
</tr>
<tr>
<td>pending, user and system hold</td>
<td>hqw</td>
</tr>
<tr>
<td>pending, user hold, re-queue</td>
<td>hRwq</td>
</tr>
<tr>
<td>pending, system hold, re-queue</td>
<td>hRwq</td>
</tr>
<tr>
<td>pending, user and system hold, re-queue</td>
<td>hRwq</td>
</tr>
<tr>
<td valign="top" rowspan="4">Running</td>
<td>running</td>
<td>r</td>
</tr>
<tr>
<td>transferring</td>
<td>t</td>
</tr>
<tr>
<td>running, re-submit</td>
<td>Rr</td>
</tr>
<tr>
<td>transferring, re-submit</td>
<td>Rt</td>
</tr>
<tr>
<td valign="top" rowspan="4">Suspended</td>
<td>job suspended</td>
<td>s, ts</td>
</tr>
<tr>
<td>queue suspended</td>
<td>S, tS</td>
</tr>
<tr>
<td>queue suspended by alarm</td>
<td>T, tT</td>
</tr>
<tr>
<td>all suspended with re-submit</td>
<td>Rs, Rts, RS, RtS, RT, RtT</td>
</tr>
<tr>
<td>Error</td>
<td>all pending states with error</td>
<td>Eqw, Ehqw, EhRqw</td>
</tr>
<tr>
<td>Deleted</td>
<td>all running and suspended states with deletion</td>
<td>dr, dt, dRr, dRt, ds, dS, dT, dRs, dRS, dRT</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/07/19/sun-grid-engine-sge-state-letter-symbol-codes-meanings/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>
