<?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"
	>

<channel>
	<title>One Mo' Gin - Sometimes Once Isn't Enough</title>
	<atom:link href="http://www.onemogin.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.onemogin.com/blog</link>
	<description>Sometimes once isn't enough.</description>
	<pubDate>Sun, 08 Jun 2008 19:56:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Announcing Osgood: An Event Repository</title>
		<link>http://www.onemogin.com/blog/579-announcing-osgood-an-event-repository.html</link>
		<comments>http://www.onemogin.com/blog/579-announcing-osgood-an-event-repository.html#comments</comments>
		<pubDate>Sat, 01 Mar 2008 14:04:01 +0000</pubDate>
		<dc:creator>gphat</dc:creator>
		
		<category><![CDATA[Catalyst]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[Languages]]></category>

		<category><![CDATA[Perl]]></category>

		<category><![CDATA[Useless Information]]></category>

		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.onemogin.com/blog/579-announcing-osgood-an-event-repository.html</guid>
		<description><![CDATA[Yesterday I released Osgood::Client and today, after realizing I had botched the upload, Osgood::Server.  Unfortunately the documentation is a little thin, so I&#8217;ll take this opportunity to both inform the world and the module of it&#8217;s purpose.

Osgood is a passive, persistent, stateless event repository.  The current docs say queue rather than repository but [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I released <a href="http://search.cpan.org/perldoc?Osgood::Client">Osgood::Client</a> and today, after realizing I had botched the upload, Osgood::Server.  Unfortunately the documentation is a little thin, so I&#8217;ll take this opportunity to both inform the world and the module of it&#8217;s purpose.</p>

<p>Osgood is a passive, persistent, stateless event repository.  The current docs say <em>queue</em> rather than repository but we&#8217;ve decided it&#8217;s a bit of a misnomer.  A primer on the aforementioned explanation:</p>

<ul>
<li>Passive: Osgood doesn&#8217;t seek out your events, it only waits for notification and query</li>
<li>Stateless: Querying an event does not change it</li>
<li>Repository: Once you&#8217;ve inserted an event it stays there forever</li>
</ul>

<p>So what&#8217;s that mean?  Osgood (::Server) is a system wherein you record the fact that something happened.  A client library is provided that allows you to do just that (::Client).  You can also query the server to ask it what has happened and it will inform you.  I believe an example is in order.</p>

<p>Magazines.com&#8217;s backend is basically a big order pipeline after the order is taken.  We are phasing out an AS/400 which is currently handling fulfillment of orders.  If a customer calls us and wants to cancel a magazine, our our order entry system cancels the order and then needs to notify the AS/400.  We have an audit table for order line items, so we would query that table for fresh cancels and send them to the 400 to finish the process.</p>

<p>All was well!  Then our Marketing team approached us with a good idea: Send customers who&#8217;ve canceled an email enticing them back!  It was a great idea until we released that we basically had one shot in our aforementioned setup to send a cancel, and we were using it.  There was no way to keep up with the status.  Had we sent it to the 400?  What about to our email service provider?  Were there other things we might do in the future?  Osgood was born.</p>

<p>Osgood is based around Events.  You use ::Client to send an event to the Osgood server, like so:</p>


<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$event</span> = <span style="color: #000000; font-weight: bold;">new</span> Osgood::<span style="color: #006600;">Event</span><span style="color: #66cc66;">&#40;</span>
	object =&gt; <span style="color: #ff0000;">'Moose'</span>,
	action =&gt; <span style="color: #ff0000;">'farted'</span>,
	date_occurred =&gt; DateTime-&gt;<span style="color: #006600;">now</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
	params =&gt; <span style="color: #66cc66;">&#123;</span>
		name =&gt; <span style="color: #ff0000;">'Hector'</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>


<p>Events are composed of an object, an action and a time.  These fields are all stored as <code>VARCHAR(64)</code>s, so you can put anything you like up to that size. </p>

<p>The optional <code>params</code> accepts a hashref of name value pairs.  This allows storage of information that doesn&#8217;t fit Osgood&#8217;s Object/Event setup, but that you might need when using the event.  A good example would be the primary key of the specific Moose that farted.  Note that you can also use <code>get&#95;param</code> and <code>set&#95;param</code> on an Event object.</p>


<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$list</span> = <span style="color: #000000; font-weight: bold;">new</span> Osgood::<span style="color: #006600;">EventList</span><span style="color: #66cc66;">&#40;</span>events =&gt; <span style="color: #66cc66;">&#91;</span> <span style="color: #0000ff;">$event</span> <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$client</span> = <span style="color: #000000; font-weight: bold;">new</span> Osgood::<span style="color: #006600;">Client</span><span style="color: #66cc66;">&#40;</span>
	url =&gt; <span style="color: #ff0000;">'http://localhost'</span>,
	list =&gt; <span style="color: #0000ff;">$list</span>
<span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$retval</span> = <span style="color: #0000ff;">$client</span>-&gt;<span style="color: #006600;">send</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$list</span>-&gt;<span style="color: #006600;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #0000ff;">$retval</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Success :)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Failure :(<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>


<p>You can put as many events into an EventList as you like.  Then you create a Client and send it!  Above we check that <code>send</code> returned a number that matches the events we sent.</p>

<p>That&#8217;s all well and good, but how do you <strong>use</strong> what you&#8217;ve stored?  The client also works the other way around:</p>


<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$retval</span> = <span style="color: #0000ff;">$client</span>-&gt;<span style="color: #006600;">query</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span>
     object =&gt; <span style="color: #ff0000;">'Moose'</span>,
     action =&gt; <span style="color: #ff0000;">'farted'</span>,
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$retval</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #808080; font-style: italic;"># Gets an EventList</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$list</span> = <span style="color: #0000ff;">$client</span>-&gt;<span style="color: #006600;">list</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$iterator</span> = <span style="color: #0000ff;">$list</span>-&gt;<span style="color: #006600;">iterator</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">while</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$iterator</span>-&gt;<span style="color: #006600;">has_next</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;">$event</span> = <span style="color: #0000ff;">$iterator</span>-&gt;<span style="color: #006600;">next</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #000066;">print</span> <span style="color: #0000ff;">$event</span>-&gt;<span style="color: #006600;">get_param</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'name'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">&quot; farted at &quot;</span>.<span style="color: #0000ff;">$event</span>-&gt;<span style="color: #006600;">date_occurred</span><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: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Oh noes!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>


<p>We asked Osgood for all the Moose/farted events and we got them back.  One note of interest is that Events are assigned an ID when they are stored, and that ID is present when you get them in a query.  This will come in useful later.</p>

<p>The <code>query</code> method supports many other options as of this writing: </p>

<ul>
<li>date_after: date after the specified one</li>
<li>date_before: date before the specified one</li>
<li>id: all events with an id greater than the one specified</li>
<li>limit: only return the specified number of events</li>
</ul>

<p>So back to our original problem.  Rather than make our internal cancel process complex, we simply create a row in a queue table which is emptied frequently and sent to Osgood.  Our backend processing jobs then query Osgood using the <code>id</code> parameter to query to find every event that was created <em>since the last one it processed</em>.  Now we can create an unlimited number of backend jobs that work from the same event.  Our email sending and publisher notification of cancels happen independently.</p>

<p>This work was inspired by past work with Publisher/Subscriber systems and message queues like the venerable JMS.  It bears very little resemblance to those ideas, but one might be able to squint a bit and see the similarity.</p>

<p>Osgood::Server is a Catalyst application using the XML::REST plugin and ::Client is Moose based with some help from MooseX::Iterator and some XML::XPath and XML::DOM magic for serializing and deserializing the eventlist.</p>

<p>If you have any questions, feel free to drop me an email or hit me up on irc.perl.org as <code>gphat</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onemogin.com/blog/579-announcing-osgood-an-event-repository.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Hanging Antlers On Your ResultSets</title>
		<link>http://www.onemogin.com/blog/578-hanging-antlers-on-your-resultsets.html</link>
		<comments>http://www.onemogin.com/blog/578-hanging-antlers-on-your-resultsets.html#comments</comments>
		<pubDate>Fri, 29 Feb 2008 00:50:59 +0000</pubDate>
		<dc:creator>gphat</dc:creator>
		
		<category><![CDATA[Catalyst]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.onemogin.com/blog/578-hanging-antlers-on-your-resultsets.html</guid>
		<description><![CDATA[At some point in the not too distant future, the intarweb&#8217;s magazine consumers will be perusing a new magazines.com.  I&#8217;ve got the responsibility of building it.  One of the requirements is to allow our Merchandising and Marketing folk to get their jobs done without too much fuss.  The system they use will [...]]]></description>
			<content:encoded><![CDATA[<p>At some point in the not too distant future, the intarweb&#8217;s magazine consumers will be perusing a new <a href="http://www.magazines.com">magazines.com</a>.  I&#8217;ve got the responsibility of building it.  One of the requirements is to allow our Merchandising and Marketing folk to get their jobs done without too much fuss.  The system they use will consume sets of products.  They might want to build a set of magazines in a certain category, under a certain price.  What kind of tool am I talking about?</p>

<p>A Query Builder.</p>

<p>I can hear your eyes rolling already.  We&#8217;ve all written them.  But I&#8217;m going to share an extra-cool method for doing so.</p>

<p>Here&#8217;s the list of ingredients you&#8217;ll need.</p>

<ul>
<li>Your existing DBIC application.</li>
<li>Experience with <a href="http://search.cpan.org/~jrobinson/DBIx-Class-0.08009/lib/DBIx/Class/ResultSource.pm#resultset_class">custom resultsets</a>.</li>
<li>An understanding of <a href="http://www.onemogin.com/blog/528-chained-searches-the-beauty-of-dbixclass-and-catalyst.html">chained resultset usage</a>.</li>
<li><a href="http://search.cpan.org/perldoc?Moose">Moose</a></li>
<li><a href="http://search.cpan.org/perldoc?MooseX::Method">MooseX::Method</a></li>
</ul>

<p>Now that you&#8217;ve collected your ingredients, let&#8217;s prepare them.</p>

<p>First, note that we aren&#8217;t allowing our end users to build <em>literal queries</em> in this recipe.  We are going to allow them to chain <em>calls to our resultset</em>.  This is a much better option, in my opinion.  A lot of the complexity can be removed by simplifying some heinous or dangerous SQL into a simple resultset method.  With the help of Moose we will create a custom resultset that allows us to introspect the methods available for building and show them to the user automatically.</p>

<p>Now, we&#8217;ll be working on a Product example.  Our end user needs to build a query that finds all the products in a price range, of a certain type and in a certain category.</p>

<p>Since you&#8217;re already versed in custom resultsets I&#8217;ll just show you the finished product:</p>


<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #000066;">package</span> Our::<span style="color: #006600;">ResultSet</span>;
<span style="color: #000000; font-weight: bold;">use</span> Moose;
<span style="color: #000000; font-weight: bold;">use</span> MooseX::<span style="color: #006600;">Method</span>;
<span style="color: #000000; font-weight: bold;">use</span> MooseX::<span style="color: #006600;">Util</span>::<span style="color: #006600;">TypeConstraints</span>;
&nbsp;
extends <span style="color: #ff0000;">'DBIx::Class::ResultSet'</span>;
&nbsp;
subtype <span style="color: #ff0000;">'Currency'</span>
	=&gt; as <span style="color: #ff0000;">'Object'</span>
	=&gt; where <span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$_</span>-&gt;<span style="color: #006600;">isa</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Math::Currency'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#125;</span>;
&nbsp;
coerce <span style="color: #ff0000;">'Currency'</span>
	=&gt; from <span style="color: #ff0000;">'Num'</span>
		=&gt; via <span style="color: #66cc66;">&#123;</span> Math::<span style="color: #006600;">Currency</span>-&gt;<span style="color: #006600;">new</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#125;</span>;
&nbsp;
method price =&gt; named <span style="color: #66cc66;">&#40;</span>
	operator =&gt; <span style="color: #66cc66;">&#123;</span> isa =&gt; <span style="color: #ff0000;">'Comparator'</span>, required =&gt; <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span>,
	amount	=&gt; <span style="color: #66cc66;">&#123;</span> isa =&gt; <span style="color: #ff0000;">'Currency'</span>, required =&gt; <span style="color: #cc66cc;">1</span>, coerce =&gt; <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#41;</span> =&gt; <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$self</span>, <span style="color: #0000ff;">$args</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;">$args</span>-&gt;<span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'operator'</span><span style="color: #66cc66;">&#125;</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: #0000ff;">$self</span>-&gt;<span style="color: #006600;">search</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span> price =&gt; <span style="color: #0000ff;">$args</span>-&gt;<span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'amount'</span><span style="color: #66cc66;">&#125;</span>-&gt;<span style="color: #006600;">as_float</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>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000066;">return</span> <span style="color: #0000ff;">$self</span>-&gt;<span style="color: #006600;">search</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span>
		price =&gt; <span style="color: #66cc66;">&#123;</span>
			<span style="color: #0000ff;">$args</span>-&gt;<span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'operator'</span><span style="color: #66cc66;">&#125;</span> =&gt; <span style="color: #0000ff;">$args</span>-&gt;<span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'amount'</span><span style="color: #66cc66;">&#125;</span>-&gt;<span style="color: #006600;">as_float</span><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;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>;</pre></div></div>


<p>That&#8217;s a lot of code, but the concept is very simple:  Create your resultset&#8217;s methods with MooseX::Method and then you can do the following magic:</p>


<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$rs</span> = <span style="color: #0000ff;">$schema</span>-&gt;<span style="color: #006600;">resultset</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Product'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$map</span> = <span style="color: #0000ff;">$rs</span>-&gt;<span style="color: #006600;">meta</span>-&gt;<span style="color: #006600;">get_method_map</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$method</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">keys</span><span style="color: #66cc66;">&#40;</span>%<span style="color: #66cc66;">&#123;</span> <span style="color: #0000ff;">$map</span> <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #808080; font-style: italic;"># See MooseX::Method docs for what to do with this.</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$signature</span> = <span style="color: #0000ff;">$method</span>-&gt;<span style="color: #006600;">signature</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #808080; font-style: italic;"># Profit!</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>


<p>Having the method&#8217;s &#8217;signature&#8217; allows you to get a list of the parameters that the method expects, as well as the types and &#8216;required&#8217; status.  That sounds like the recipe for some go-getting developer to construct a query building tool!</p>

<p><strong>One warning.</strong>  MooseX::Method currently lacks a permanent API for acquiring this information.  The current API is to call <code>export</code> on the signature.  You can <code>Dumper</code> the resulting hashref and see pretty easily how to get what you need.  Keep an eye on The CPAN or in irc.perl.org&#8217;s #moose for updates.</p>

<p>So to use this recipe, you&#8217;ll have to construct your own mechanism for taking the above information and generating a UI for your application.  I got my Catalyst based query-builder working this afternoon.</p>

<p>If you have any questions feel free to drop into irc.perl.org and shoot a message to <code>gphat</code>.  You can find me in <code>#moose</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onemogin.com/blog/578-hanging-antlers-on-your-resultsets.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>What&#8217;s In A Name?</title>
		<link>http://www.onemogin.com/blog/577-whats-in-a-name.html</link>
		<comments>http://www.onemogin.com/blog/577-whats-in-a-name.html#comments</comments>
		<pubDate>Thu, 21 Feb 2008 03:06:24 +0000</pubDate>
		<dc:creator>gphat</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Useless Information]]></category>

		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.onemogin.com/blog/577-whats-in-a-name.html</guid>
		<description><![CDATA[One of the most precious responsibilities afforded to me as a developer is the ability to name my projects.  Moreover, as Development Manager I could &#8212; theoretically &#8212; dictate the names of all the projects done in my department.  That&#8217;d be dictatorial and I don&#8217;t do it&#8230; but I do reserve the right [...]]]></description>
			<content:encoded><![CDATA[<p>One of the most precious responsibilities afforded to me as a developer is the ability to name my projects.  Moreover, as Development Manager I could &#8212; theoretically &#8212; dictate the names of all the projects done in my department.  That&#8217;d be dictatorial and I don&#8217;t do it&#8230; but I do reserve the right to veto or break non-majority ties.</p>

<p>Here&#8217;s a listing of the projects names used on our &#8216;current&#8217; projects:</p>

<ul>
<li>Greenspan (parent project of the others)</li>
<li>Lockhart</li>
<li>Kayhill</li>
<li>Hopkins</li>
<li>Osgood</li>
<li>Downham</li>
<li>Holbrooke</li>
</ul>

<p>Greenspan was the &#8216;first&#8217; in the new generation of projects we&#8217;ve done at $work.  It established the system used to name others.  I regret choosing a name that is so obvious to anyone who knows what the <a href="http://en.wikipedia.org/wiki/Federal_Reserve_Board">Federal Reserve Board</a>, but it established the general rules we use:</p>

<ul>
<li>Words that break down into two words well (Os-Good, Down-Uhm, etc)</li>
<li>Words that would seem at home when naming English cities</li>
<li>Words that aren&#8217;t in people&#8217;s general lexicon</li>
</ul>

<p>Since I also wear the hat of System Administrator, I get to pick names for the servers we run.  The current naming scheme is based on the <em>Greenspan</em> project.   We use the names of currencies for our servers: peseta, drachma, lira, pound, euro.  We made a list of names on our wiki of prospective names so that when a new box arrives, we have a queue of names we can choose from.  We usually vote unless the box is going to primarily serve a single person&#8217;s interest.  In that case, they name it on their own.</p>

<p>It is said that to name a thing is the power to control it.  I&#8217;m not sure if that is the underlying principal, but I can say that project naming and releasing procedures have always been extremely interesting to me.  I love reading <a href="http://en.wikipedia.org/wiki/Changelog">ChangeLogs</a> and reading about the process that companies use to push out shiny new toys.</p>

<p>I think that codenames say something about the ideology of group that uses them.  I&#8217;ve always been impressed by the huge <a href="http://en.wikipedia.org/wiki/List_of_Intel_codenames">list of codenames</a> used by Intel for their products.  We could use a scheme that generates informational names like fra0132 for &#8220;Franklin location, Rack 01, Position 32&#8243;.  If we had a hundred boxes I&#8217;d consider it.  But in a smaller installation all of these machines have a personality and to treat them like anonymous slaves would be a disservice.</p>

<p>These names are often difficult to get consensus on.  I might love a name only to have another developer loathe it.  It takes a lot of effort to cook them up.  But it&#8217;s all worth it in the end.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onemogin.com/blog/577-whats-in-a-name.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Festina Lente</title>
		<link>http://www.onemogin.com/blog/576-festina-lente.html</link>
		<comments>http://www.onemogin.com/blog/576-festina-lente.html#comments</comments>
		<pubDate>Wed, 06 Feb 2008 03:49:41 +0000</pubDate>
		<dc:creator>gphat</dc:creator>
		
		<category><![CDATA[Code]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[Useless Information]]></category>

		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.onemogin.com/blog/576-festina-lente.html</guid>
		<description><![CDATA[Hasten Slowly, in the Latin.

A conversation with Jaxn tonight got me thinking: How &#8216;fast&#8217; are the sites of the top 10 &#8217;shopping&#8217; sites (per Alexa)?

So I measured them.  At first, it was a simple matter of emptying my cache and loading each site.  But many sites, understanding how important it is to get [...]]]></description>
			<content:encoded><![CDATA[<p><em>Hasten Slowly</em>, in the Latin.</p>

<p>A conversation with <a href="http://www.jaxn.org">Jaxn</a> tonight got me thinking: How &#8216;fast&#8217; are the sites of the top 10 &#8217;shopping&#8217; sites (per <a href="http://www.alexa.com">Alexa</a>)?</p>

<p>So I measured them.  At first, it was a simple matter of emptying my cache and loading each site.  But many sites, understanding how important it is to get things moving quickly, used some sort of onLoad function to do some more loading without screwing up the user&#8217;s experience.  To facilitate those, and not penalize them, I took a screenshot of the measurements as soon as the progress bar filled and the site was useable.</p>

<p><a href="http://www.onemogin.com/blog/stuff/sitespeed/total-load.png"><img src="http://www.onemogin.com/blog/stuff/sitespeed/total-load-thumb.png" alt="Total Load"/></a>
<a href="http://www.onemogin.com/blog/stuff/sitespeed/total-load-breakdown.png"><img src="http://www.onemogin.com/blog/stuff/sitespeed/total-load-breakdown-thumb.png" alt="Total Load Time, Breadown"/></a>
<a href="http://www.onemogin.com/blog/stuff/sitespeed/total-size.png"><img src="http://www.onemogin.com/blog/stuff/sitespeed/total-size-thumb.png" alt="Total Size"/></a>
<a href="http://www.onemogin.com/blog/stuff/sitespeed/total-size-breakdown.png"><img src="http://www.onemogin.com/blog/stuff/sitespeed/total-size-breakdown-thumb.png" alt="Total Size, Breakdown"/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.onemogin.com/blog/576-festina-lente.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ayalike: Content Management using Catalyst</title>
		<link>http://www.onemogin.com/blog/574-ayalike-content-management-using-catalyst.html</link>
		<comments>http://www.onemogin.com/blog/574-ayalike-content-management-using-catalyst.html#comments</comments>
		<pubDate>Sun, 03 Feb 2008 07:49:21 +0000</pubDate>
		<dc:creator>gphat</dc:creator>
		
		<category><![CDATA[Catalyst]]></category>

		<category><![CDATA[Code]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[Languages]]></category>

		<category><![CDATA[Perl]]></category>

		<category><![CDATA[Useless Information]]></category>

		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.onemogin.com/blog/574-ayalike-content-management-using-catalyst.html</guid>
		<description><![CDATA[UPDATE: The demo and trac links are down atm, as Ayalike is being moved to new hosting.

I&#8217;ve been hacking away for the last week or so on a content management system (henceforth CMS).  We are going to need a CMS for some future $work projects and I&#8217;m generally unhappy with all that I&#8217;ve reviewed. [...]]]></description>
			<content:encoded><![CDATA[<p>UPDATE: The demo and trac links are down atm, as Ayalike is being moved to new hosting.</p>

<p>I&#8217;ve been hacking away for the last week or so on a content management system (henceforth CMS).  We are going to need a CMS for some future $work projects and I&#8217;m generally unhappy with all that I&#8217;ve reviewed.  So many of the existing &#8217;solutions&#8217; seem to be more in the business of providing you with a &#8216;platform&#8217;.  Most of the folks I know build platforms for a living, we need only find a way to <em>manage the content</em>.</p>

<p>So with that in mind, Ayalike (pronounced like &#8216;a uh like&#8217;) aims to provide the following features:</p>

<ul>
<li>Multisite, multiuser, multirole</li>
<li>Output agnostic</li>
<li>Versioning</li>
<li>Pluggable publishing</li>
<li>Output processing</li>
</ul>

<p>Three of those features are complete.  Publishing works, but is currently not pluggable.  Output processing is there as well, but I&#8217;ve yet to hook it into anything but unit tests.</p>

<p>That&#8217;s all kind of abstract, here&#8217;s what I&#8217;ve done in a more concrete form:  This week I modified one of our internal applications to use a custom <a href="http://search.cpan.org/dist/Template-Toolkit/">Template Toolkit</a> provider that communicated with Ayalike and provided &#8216;preview&#8217; functionality on the live site <em>without changes to the application itself</em>.  The application functioned normally, rendering compiled templates from the filesystem, unless given a special parameter.  In that case it requested the entry from Ayalike over HTTP using it&#8217;s wiki-esque page viewing feature.  Obviously real apps would protect this feature with logins.</p>

<p>I&#8217;m not quite ready to tout it on the mailing lists or in IRC yet, but I&#8217;m very excited about the project and I hope that it might become the solution for my future work projects.  Regardless, Catalyst needs a CMS.</p>

<p>Are you interested?  Visit the <a href="http://trac.oneforthehustle.com/ayalike">Trac site</a>.  There&#8217;s even a <a href="http://ayalike.oneforthehustle.com">working demo</a>, cleared every half hour.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onemogin.com/blog/574-ayalike-content-management-using-catalyst.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>What I Learned This Week</title>
		<link>http://www.onemogin.com/blog/572-what-i-learned-this-week-4.html</link>
		<comments>http://www.onemogin.com/blog/572-what-i-learned-this-week-4.html#comments</comments>
		<pubDate>Sun, 27 Jan 2008 19:12:35 +0000</pubDate>
		<dc:creator>gphat</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Useless Information]]></category>

		<guid isPermaLink="false">http://www.onemogin.com/blog/572-what-i-learned-this-week-4.html</guid>
		<description><![CDATA[Oops.   A bit late with this one.


BPM 37093 is a white dwarf that, as it has cooled, has turned into a diamond.  Our sun will do the same in about 5 billion years, as a hard crystalline core forms in it&#8217;s center.
Planting 300,000 new trees and allowing them a full life would [...]]]></description>
			<content:encoded><![CDATA[<p>Oops.   A bit late with this one.</p>

<ul>
<li><a href="http://en.wikipedia.org/wiki/BPM_37093">BPM 37093</a> is a white dwarf that, as it has cooled, has turned into a diamond.  Our sun will do the same in about 5 billion years, as a hard crystalline core forms in it&#8217;s center.</li>
<li>Planting 300,000 new trees and allowing them a full life would offset the carbon dioxide emissions of one 500-megawatt coal-fired power plant operating for a little more than a week.</li>
<li>The brass ring on the end of a pencil that holds the eraser is called a <a href="http://en.wikipedia.org/wiki/Ferrule">ferrule</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.onemogin.com/blog/572-what-i-learned-this-week-4.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Things I Learned This Week</title>
		<link>http://www.onemogin.com/blog/571-things-i-learned-this-week-7.html</link>
		<comments>http://www.onemogin.com/blog/571-things-i-learned-this-week-7.html#comments</comments>
		<pubDate>Sat, 19 Jan 2008 00:36:48 +0000</pubDate>
		<dc:creator>gphat</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Useless Information]]></category>

		<guid isPermaLink="false">http://www.onemogin.com/blog/571-things-i-learned-this-week-7.html</guid>
		<description><![CDATA[It&#8217;s back.  A little short this week, but I have to get back into the habit.


Baby blue whales can gain up to up to 200lbs a day by drinking about 100 gallons of milk.  Whale milk is 40-50% fat whereas cow&#8217;s milk is appromixately 4% fat.
India is the world&#8217;s largest butter consumer.  [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s back.  A little short this week, but I have to get back into the habit.</p>

<ul>
<li>Baby blue whales <a href="http://en.wikipedia.org/wiki/Blue_Whale#Size">can gain</a> up to up to 200lbs a day by drinking about 100 gallons of milk.  Whale milk is 40-50% fat whereas cow&#8217;s milk is appromixately 4% fat.</li>
<li>India is the world&#8217;s largest butter consumer.  It&#8217;s people eat roughly 46% of the annual global supply &#8212; that&#8217;s over seven billion pounds.</li>
<li>The darkest substance ever known was <a href="http://news.bbc.co.uk/2/hi/science/nature/7190107.stm">made</a> this week.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.onemogin.com/blog/571-things-i-learned-this-week-7.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Let&#8217;s Try Something</title>
		<link>http://www.onemogin.com/blog/570-lets-try-something.html</link>
		<comments>http://www.onemogin.com/blog/570-lets-try-something.html#comments</comments>
		<pubDate>Tue, 15 Jan 2008 02:18:15 +0000</pubDate>
		<dc:creator>gphat</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Life]]></category>

		<category><![CDATA[Useless Information]]></category>

		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.onemogin.com/blog/570-lets-try-something.html</guid>
		<description><![CDATA[My day to day responsibilities have changed pretty drastically in the last two years.  I&#8217;ve gone from being the sole developer on a small, focused project to a manager over a department that is creating some some fairly large projects.  

On second thought, it&#8217;s not so different.  The challenges of the projects [...]]]></description>
			<content:encoded><![CDATA[<p>My day to day responsibilities have changed pretty drastically in the last two years.  I&#8217;ve gone from being the sole developer on a small, focused project to a manager over a department that is creating some some fairly large projects.  </p>

<p>On second thought, it&#8217;s not so different.  The challenges of the projects are the same.  The wrinkle is the addition of more entities into the equation.</p>

<p>I do <em>so much</em> in a day that it takes me hours to decompress.  I often cook up posts on my trip home only to succumb to the soothing caress of a game, T.V. show or conversation with the girlfriend.  Today I:</p>

<ul>
<li>Spent time discussing project and development workflow.</li>
<li>Finished setting up <a href="http://www.nagios.org/">Nagios</a> to monitor a bunch of machines.</li>
<li>Added a requested feature to our order entry / customer service app.</li>
<li>Tidied up some failing tests.</li>
<li>Tested tomorrow&#8217;s shipping software.</li>
<li>Played <a href="http://www.weewar.com">Weewar</a>.</li>
</ul>

<p>Tomorrow I intend to continue the process discussion.  Having had some time to digest the information proposed I&#8217;ve got some ideas.  With my current monitoring project wrapping up a few weeks early I can set my sights on the next one: automated testing of our codebase.  I&#8217;m excited to spend some time with <a href="http://search.cpan.org/perldoc?Verby">Verby</a> made by my friend Yuval.  It&#8217;s eerily similar to some code I had begun working on when I started thinking through this project.  More on that in the future I hope.</p>

<p>I&#8217;m going to breath some life into my old <em>What I Learned This Week</em> posts, but marry them to my daily adventures in the development management world. I&#8217;m hoping that some upcoming projects will yield some post-worthy nuggets.  If I&#8217;m lucky maybe I can come up with a talk to give at <a href="http://conferences.mongueurs.net/yn2008/">YAPC::NA 2008</a> in the next few months.</p>

<p>As a closing I&#8217;d like to thank <a href="http://www.mushinnoshin.com/blog/">Jon</a> for suggesting <a href="http://www.sierranevada.com/beers/porter.html">Sierra Nevada Porter</a> and my beautiful girlfriend  for bringing pint glasses when she moved in.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onemogin.com/blog/570-lets-try-something.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Obligatory Christmas-Slash-Year-End Superpost</title>
		<link>http://www.onemogin.com/blog/568-obligatory-christmas-slash-year-end-superpost.html</link>
		<comments>http://www.onemogin.com/blog/568-obligatory-christmas-slash-year-end-superpost.html#comments</comments>
		<pubDate>Sat, 29 Dec 2007 01:59:45 +0000</pubDate>
		<dc:creator>gphat</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.onemogin.com/blog/568-obligatory-christmas-slash-year-end-superpost.html</guid>
		<description><![CDATA[Two months since my last post.  It&#8217;s not really that I haven&#8217;t had anything to say, I assure you.  I just don&#8217;t remember it long enough to write it out or I haven&#8217;t felt compelled to write about it in public.  I guess.  Who knows?  

Imagine that I&#8217;m summarizing fanciful [...]]]></description>
			<content:encoded><![CDATA[<p>Two months since my last post.  It&#8217;s not really that I haven&#8217;t had anything to say, I assure you.  I just don&#8217;t remember it long enough to write it out or I haven&#8217;t felt compelled to write about it in public.  I guess.  Who knows?  </p>

<p>Imagine that I&#8217;m summarizing fanciful adventures and bracing, hard-fought lessons in this post.  Go ahead, I&#8217;ll wait.</p>

<p>With that out of the way, we can quickly douse the fires of interest by describing the months of software development that culminated the creating of an order entry system for $work.  That aspect of my life is harrowing and exciting.  It&#8217;s a work in progress.  More on that some other time, perhaps?</p>

<p>I&#8217;ve been&#8230; disconnected for a month or two.  I rarely open NetNewsWire and I keep Twitterific closed.  I&#8217;m not really sure why I&#8217;ve shunned the torrent of information I normally subject myself to.  There was a spell of time &#8212; from September to mid November &#8212; where i struggled to produce a modicum of giveashit.  This time was terribly busy and shutting down the founts of information was a requirement to maintain my sanity.  My enthusiasm to reenter the &#8216;normal&#8217; information overload has been tepid at best.  I just trimmed 25 blogs out of my feed list and it still feels too big.  Ok, another 20 more.  Down to 80.  That feels better.</p>

<p>I&#8217;d try and summarize the year, but I have some type of malady that muddies my memory past about 30 days.  My girlfriend moved in, I shipped a big software project, nearly went insane and attended a Perl conference.  All that&#8217;s happened in the last few months so it&#8217;s a poor summary.</p>

<p>So fuck that noise.  Lets talk about what is going to happen in aught-eight:</p>

<ul>
<li>Be a good daddy</li>
<li>Be a good boyfriend</li>
<li>Enjoy my job more (working on managing up, delegating, componentizing and more)</li>
<li>Go on vacation (Disney World for my brother&#8217;s wedding, March 30 - April 5)</li>
<li>More</li>
</ul>

<p>I&#8217;ve tried to write this post mutiple times.  I finally succeeded.  I&#8217;m not sure why my desire to talk to the world in this way has dried up.  Surely I have things to say&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onemogin.com/blog/568-obligatory-christmas-slash-year-end-superpost.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Laundry List of Leisure</title>
		<link>http://www.onemogin.com/blog/567-laundry-list-of-leisure.html</link>
		<comments>http://www.onemogin.com/blog/567-laundry-list-of-leisure.html#comments</comments>
		<pubDate>Thu, 04 Oct 2007 00:45:37 +0000</pubDate>
		<dc:creator>gphat</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Perl]]></category>

		<category><![CDATA[Useless Information]]></category>

		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.onemogin.com/blog/567-laundry-list-of-leisure.html</guid>
		<description><![CDATA[Things have been hectic as of late.  Two weeks ago or so I began the rather stressful experience of converting the call center at work from an ancient terminal based order entry system to a fancy, modern Web 2.0-ified one.  Many years of data was converted, and dozens of processes had to be [...]]]></description>
			<content:encoded><![CDATA[<p>Things have been hectic as of late.  Two weeks ago or so I began the rather stressful experience of converting the call center at work from an ancient terminal based order entry system to a fancy, modern Web 2.0-ified one.  Many years of data was converted, and dozens of processes had to be rejiggered to work.  We are still dealing with them today, actually.  I&#8217;m watching the DEBUG messages scream by for a fulfillment run.  </p>

<p>There are always things I want to do in my spare time, but there are a few that have been staring longingly at me from outside my cage lately.  Being fettered to my desk working out the various problems that have arisen has made me long for these outside projects&#8230;  </p>

<ul>
<li>A WeeWar clone that is more strategy and less Heavy Arty / Heavy Tank zerging</li>
<li>Update my blog entries about DBIx::Class::QueryLog</li>
<li>My Cat/DBIC based charting app</li>
<li>Chart::Clicker</li>
<li>Site Redesign</li>
</ul>

<p>I&#8217;m attending the <a href="http://pghpw.org/ppw2007/">Pittsburgh Perl Workshop</a> next week.  My time there may give me some time to hack on these projects in my fave language.  I also might take some time off to hack on them.  I&#8217;ve earned it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.onemogin.com/blog/567-laundry-list-of-leisure.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
