<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Desired Output</title>
    <link>http://desiredoutput.com</link>
    <atom:link rel="self" href="http://desiredoutput.com/articles.rss" type="application/rss+xml"/>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Tips &amp;middot; Tricks &amp;middot; Snippets</description>
    <item>
      <title>Lowercase Filenames With Ruby</title>
      <description>&lt;p&gt;&lt;code&gt;ruby -e 'Dir.glob("*").each { |fn| File.rename(fn, fn.downcase) }'
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Obviously this would work with method #upcase as well. &lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;Credit goes to poster "Florian Gilcher",  here:&lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.eggheadcafe.com/software/aspnet/35719452/oneliner-for-lowercasing-files.aspx"&gt;http://www.eggheadcafe.com/software/aspnet/35719452/oneliner-for-lowercasing-files.aspx&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 28 Jan 2011 05:31:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:f524b56d-2773-44f9-a271-4113a4f590dc</guid>
      <comments>http://desiredoutput.com/2011/01/28/lowercase-filenames-with-ruby#comments</comments>
      <category>Command line</category>
      <category>Ruby</category>
      <category>lowercase</category>
      <category>filenames</category>
      <trackback:ping>http://desiredoutput.com/trackbacks?article_id=34</trackback:ping>
      <link>http://desiredoutput.com/2011/01/28/lowercase-filenames-with-ruby</link>
    </item>
    <item>
      <title>Which Process Is Using Port ?</title>
      <description>&lt;p&gt;For some reason,  the "-o" option is missing from netstat on OS X Snow Leopard (10.6.4,  anyway),  so if you need to know which processes are using a given port,  try:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo lsof -i -P | grep 36364&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Of course substitute your own port number (36364 is used by Skype,  btw).&lt;br/&gt;
&lt;/p&gt;</description>
      <pubDate>Wed, 28 Jul 2010 09:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:9c0f7de3-b8ad-4226-9ac6-0fdac75441fe</guid>
      <comments>http://desiredoutput.com/2010/07/28/which-process-is-using-port#comments</comments>
      <category>Command line</category>
      <category>OS</category>
      <category>X</category>
      <category>process</category>
      <category>using</category>
      <category>port</category>
      <category>netstat</category>
      <category>o</category>
      <category>lsof</category>
      <category>grep</category>
      <category>command</category>
      <category>line</category>
      <trackback:ping>http://desiredoutput.com/trackbacks?article_id=33</trackback:ping>
      <link>http://desiredoutput.com/2010/07/28/which-process-is-using-port</link>
    </item>
    <item>
      <title>Chuck + Ngrep:  Listening to the Network</title>
      <description>&lt;p&gt;chuck:  &lt;a href="http://chuck.cs.princeton.edu/"&gt;http://chuck.cs.princeton.edu/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ngrep:  &lt;a href="http://ngrep.sourceforge.net/"&gt;http://ngrep.sourceforge.net/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using chuck and ngrep, you can translate the ascii output of ngrep into midi sounds in real time by reading from a file with chuck which is being appended by ngrep:&lt;/p&gt;

&lt;p&gt;&lt;code&gt; sudo ngrep -d en1 '' &gt; network &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt; chuck listen.ck &amp;lt; network &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;listen.ck source:&lt;/p&gt;

&lt;div class="CodeRay"&gt;&lt;pre&gt;&lt;span class="CodeRay"&gt;&lt;span class="c"&gt;// computer key input, with sound&lt;/span&gt;
KBHit kb;

&lt;span class="c"&gt;// patch&lt;/span&gt;
Impulse i =&amp;gt; BiQuad f =&amp;gt; dac;
&lt;span class="c"&gt;// set the filter&#8217;s pole radius&lt;/span&gt;
&lt;span class="fl"&gt;.99&lt;/span&gt; =&amp;gt; f.prad;
&lt;span class="c"&gt;// set equal gain zeros&lt;/span&gt;
&lt;span class="i"&gt;1&lt;/span&gt; =&amp;gt; f.eqzs;
&lt;span class="c"&gt;// initialize float variable&lt;/span&gt;
&lt;span class="fl"&gt;0&lt;/span&gt;&lt;span class="fl"&gt;.0&lt;/span&gt; =&amp;gt; &lt;span class="pt"&gt;float&lt;/span&gt; v;
&lt;span class="c"&gt;// set filter gain&lt;/span&gt;
&lt;span class="fl"&gt;.5&lt;/span&gt; =&amp;gt; f.gain;

&lt;span class="c"&gt;// time-loop&lt;/span&gt;
&lt;span class="r"&gt;while&lt;/span&gt;( &lt;span class="pc"&gt;true&lt;/span&gt; )
{

    &lt;span class="c"&gt;// wait on event&lt;/span&gt;
    kb =&amp;gt; now;
    &lt;span class="c"&gt;// generate impulse&lt;/span&gt;
    &lt;span class="fl"&gt;1&lt;/span&gt;&lt;span class="fl"&gt;.0&lt;/span&gt; =&amp;gt; i.next;
    &lt;span class="c"&gt;// loop through 1 or more keys&lt;/span&gt;
    &lt;span class="r"&gt;while&lt;/span&gt;( kb.more() )
    {

        &lt;span class="c"&gt;// set filter freq&lt;/span&gt;
        kb.getchar() =&amp;gt; &lt;span class="pt"&gt;int&lt;/span&gt; c;
        &lt;span class="r"&gt;if&lt;/span&gt;(c &amp;lt; &lt;span class="i"&gt;58&lt;/span&gt;) &lt;span class="i"&gt;58&lt;/span&gt; %=&amp;gt; c;
        &lt;span class="r"&gt;if&lt;/span&gt;(c &amp;gt; &lt;span class="i"&gt;120&lt;/span&gt;) &lt;span class="i"&gt;120&lt;/span&gt; %=&amp;gt; c;
        c =&amp;gt; Std.mtof =&amp;gt; f.pfreq;
        &lt;span class="c"&gt;// print int value&lt;/span&gt;
        &amp;lt;&amp;lt;&amp;lt; &lt;span class="er"&gt;&#8220;&lt;/span&gt;ascii:&lt;span class="er"&gt;&#8221;&lt;/span&gt;, c &amp;gt;&amp;gt;&amp;gt;;

    }

}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sounds a bit like a colorful geiger counter.&lt;/p&gt;

&lt;p&gt;Maybe you can ngrep for something specific and learn to recognize the sound of it amongst other traffic.&lt;br/&gt;
&lt;/p&gt;</description>
      <pubDate>Sun, 11 Jul 2010 09:01:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:1093aedf-e103-4da7-9404-ae871ea82b0d</guid>
      <comments>http://desiredoutput.com/2010/07/11/chuck-ngrep-listening-to-the-network#comments</comments>
      <category>Command line</category>
      <category>Obscure</category>
      <category>chuck</category>
      <category>ngrep</category>
      <category>listen</category>
      <category>network</category>
      <category>ascii</category>
      <category>geiger</category>
      <category>bleep</category>
      <category>blorp</category>
      <category>boop</category>
      <category>BEEP</category>
      <category>audio</category>
      <category>monitoring</category>
      <category>to</category>
      <category>traffic</category>
      <category>listening</category>
      <category>internet</category>
      <trackback:ping>http://desiredoutput.com/trackbacks?article_id=29</trackback:ping>
      <link>http://desiredoutput.com/2010/07/11/chuck-ngrep-listening-to-the-network</link>
    </item>
    <item>
      <title>Ruby Import from CSV into Spree, Half The Rails Way and Half The Un-Rails Way</title>
      <description>&lt;p&gt;There are several useful aspects to this script for anyone who is using ruby for CSV import, especially if  using ActiveRecord in Rails,  and definitely if importing into Spree. &lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;Big thanks to Chadwick Wood for the imagemagick part,  which I borrowed from his post:  &lt;a href="http://coffeeshopped.com/2009/03/batch-image-resizing-with-ruby-and-imagemagick"&gt;
Batch Image Resizing with Ruby and ImageMagick&lt;/a&gt;.     Ran this locally on OS X  and remotely on FreeBSD 4.x/5.x without any hiccups.&lt;/p&gt;

&lt;p&gt;Here is the &lt;strong&gt;first line of the CSV file&lt;/strong&gt; (product_data.csv):&lt;/p&gt;

&lt;div class="CodeRay"&gt;&lt;pre&gt;&lt;span class="CodeRay"&gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;original_id&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;subtitle&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;sku&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;weight&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;category&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;category_group&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;category_name&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;image_attachments&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here is the &lt;strong&gt;CSV import script&lt;/strong&gt; (import_from_csv.rb):&lt;/p&gt;

&lt;div class="CodeRay"&gt;&lt;pre&gt;&lt;span class="CodeRay"&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;rubygems&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;csv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;csv-mapper&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;active_record&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;active_support&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;paperclip&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;spree&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;action_controller&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;action_controller/test_process&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;ftools&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;fileutils&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;open3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;


&lt;span class="c"&gt;# This is how you access your ActiveRecord objects in rails (referencing your database.yml),  specifying which database,  and logging all the database activity to a file:&lt;/span&gt;

&lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;.logger = &lt;span class="co"&gt;Logger&lt;/span&gt;.new(&lt;span class="co"&gt;File&lt;/span&gt;.dirname(&lt;span class="pc"&gt;__FILE__&lt;/span&gt;) + &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;/debug.log&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)
&lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;.configurations = &lt;span class="co"&gt;YAML&lt;/span&gt;::load(&lt;span class="co"&gt;IO&lt;/span&gt;.read(&lt;span class="co"&gt;File&lt;/span&gt;.dirname(&lt;span class="pc"&gt;__FILE__&lt;/span&gt;) + &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;/config/database.yml&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;))
&lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;.establish_connection(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;development&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)


&lt;span class="c"&gt;# It turned out I didn't need this,  but you might if you are going to attach on-the-fly with Paperclip:&lt;/span&gt;
&lt;span class="c"&gt;#Paperclip.options[:command_path] = '/opt/local/bin/'&lt;/span&gt;



&lt;span class="c"&gt;# Initialize ActiveRecord objects: &lt;/span&gt;
&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Product&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;
&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Variant&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;
&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Taxon&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;
&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Asset&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;
&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Image&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;Asset&lt;/span&gt;; &lt;span class="r"&gt;end&lt;/span&gt;


&lt;span class="c"&gt;# Do not reinvent wheel,  instead install the gem (http://csv-mapper.rubyforge.org/) and include this if you know what's good for you: &lt;/span&gt;

include &lt;span class="co"&gt;CsvMapper&lt;/span&gt;



&lt;span class="c"&gt;#  Read in the CSV file (name your attributes in the first line of the CSV file,  which is a normal thing to do):&lt;/span&gt;

results = import(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;./product_data.csv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;span class="r"&gt;do&lt;/span&gt;
  read_attributes_from_file
&lt;span class="r"&gt;end&lt;/span&gt;



&lt;span class="c"&gt;# FYI this destroy part destroys everything (drops all values in the tables `products`, `variants`, and `assets`):&lt;/span&gt;

&lt;span class="co"&gt;Product&lt;/span&gt;.all.each &lt;span class="r"&gt;do&lt;/span&gt; |j| j.destroy &lt;span class="r"&gt;end&lt;/span&gt;
&lt;span class="co"&gt;Variant&lt;/span&gt;.all.each &lt;span class="r"&gt;do&lt;/span&gt; |k| k.destroy &lt;span class="r"&gt;end&lt;/span&gt;
&lt;span class="co"&gt;Asset&lt;/span&gt;.all.each &lt;span class="r"&gt;do&lt;/span&gt; |a| a.destroy &lt;span class="r"&gt;end&lt;/span&gt;



&lt;span class="c"&gt;# Enter the loop where we iterate the records: &lt;/span&gt;

results.each &lt;span class="r"&gt;do&lt;/span&gt; |item|
  new_product = &lt;span class="co"&gt;Product&lt;/span&gt;.create(
    &lt;span class="sy"&gt;:name&lt;/span&gt; =&amp;gt; item.title, 
    &lt;span class="sy"&gt;:meta_description&lt;/span&gt; =&amp;gt; item.subtitle,
    &lt;span class="sy"&gt;:description&lt;/span&gt; =&amp;gt; item.description,
    &lt;span class="sy"&gt;:permalink&lt;/span&gt; =&amp;gt; item.title.downcase.gsub(&lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="ch"&gt;\/&lt;/span&gt;&lt;span class="k"&gt;.]&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;).split(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;).join(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;),
    &lt;span class="sy"&gt;:available_on&lt;/span&gt; =&amp;gt; &lt;span class="co"&gt;Time&lt;/span&gt;.now
  )
  new_variant = &lt;span class="co"&gt;Variant&lt;/span&gt;.create(
    &lt;span class="sy"&gt;:product_id&lt;/span&gt; =&amp;gt; new_product.id,
    &lt;span class="sy"&gt;:is_master&lt;/span&gt; =&amp;gt; &lt;span class="i"&gt;1&lt;/span&gt;, 
    &lt;span class="sy"&gt;:sku&lt;/span&gt; =&amp;gt; item.sku,
    &lt;span class="sy"&gt;:price&lt;/span&gt; =&amp;gt; item.price,
    &lt;span class="sy"&gt;:weight&lt;/span&gt; =&amp;gt; item.weight
  )

        &lt;span class="c"&gt;# Doesn't work:&lt;/span&gt;
  &lt;span class="c"&gt;#new_product.taxons &amp;lt;&amp;lt; Taxon.find_by_id(item.category_group.to_i + 999)&lt;/span&gt;
  

        &lt;span class="c"&gt;# For taxon assignment,  insert directly to the database:&lt;/span&gt;

  taxon_id = item.category_group.to_i + &lt;span class="i"&gt;1000&lt;/span&gt;
  sql_query_for_taxon_assignment = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;INSERT INTO `products_taxons` (product_id, taxon_id) VALUES (&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;new_product.id&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;, &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;taxon_id&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;);&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;.connection.execute(sql_query_for_taxon_assignment)
  
  
        &lt;span class="c"&gt;# Now we get into imagemagick and Paperclip and creating Asset objects of type Image  &lt;/span&gt;

  &lt;span class="c"&gt;# For some reason,  the previous developer put all the image filenames in rows of the category database as strings delimited by pipes (&amp;quot;|&amp;quot;).    Don't do that.  But if you have to deal with it: &lt;/span&gt;

  pics = item.image_attachments.split(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;|&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)


  
     &lt;span class="c"&gt;# Loop through the elements of the pics array and add image attachments&lt;/span&gt;
     pics.each &lt;span class="r"&gt;do&lt;/span&gt; |image_basename_part|

        &lt;span class="r"&gt;next&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; image_basename_part =~ &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;^&lt;/span&gt;&lt;span class="ch"&gt;\s&lt;/span&gt;&lt;span class="k"&gt;*$&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt; &lt;span class="c"&gt;# skip blank lines&lt;/span&gt;
       
      &lt;span class="c"&gt;# get the image filenames  &lt;/span&gt;
        image_file = &lt;span class="sh"&gt;&lt;span class="dl"&gt;`&lt;/span&gt;&lt;span class="k"&gt;find public/php/images/products/* | grep -i &amp;quot;/&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;image_basename_part&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;[.]&amp;quot;&lt;/span&gt;&lt;span class="dl"&gt;`&lt;/span&gt;&lt;/span&gt;.chomp
        puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Using file: &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;image_file&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; (found by grepping for &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;image_basename_part&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class="r"&gt;next&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; image_file.blank?
        mime = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;image/&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; + image_file.match(&lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="ch"&gt;\w&lt;/span&gt;&lt;span class="k"&gt;+$&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;).to_s
        image_file_basename = &lt;span class="co"&gt;File&lt;/span&gt;.basename(image_file, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;.jpg&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
        

      &lt;span class="c"&gt;# get the image dimensions  &lt;/span&gt;
      geometry = &lt;span class="co"&gt;Paperclip&lt;/span&gt;::&lt;span class="co"&gt;Geometry&lt;/span&gt;.from_file(image_file)
  
    
      &lt;span class="c"&gt;# add a record to the `assets` table&lt;/span&gt;
      new_asset = &lt;span class="co"&gt;Asset&lt;/span&gt;.create(
        &lt;span class="sy"&gt;:viewable_id&lt;/span&gt; =&amp;gt; new_product.id,
        &lt;span class="sy"&gt;:viewable_type&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Product&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,
        &lt;span class="sy"&gt;:attachment_content_type&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;image/jpeg&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,
        &lt;span class="sy"&gt;:attachment_file_name&lt;/span&gt; =&amp;gt; image_file_basename+&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,
        &lt;span class="sy"&gt;:type&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Image&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,
        &lt;span class="sy"&gt;:attachment_updated_at&lt;/span&gt; =&amp;gt; &lt;span class="co"&gt;Time&lt;/span&gt;.now,
        &lt;span class="sy"&gt;:attachment_width&lt;/span&gt; =&amp;gt; geometry.width,
        &lt;span class="sy"&gt;:attachment_height&lt;/span&gt; =&amp;gt; geometry.height
      )
  
            
      &lt;span class="c"&gt;# Resize each image and place in a new directory under assets in the structure and dimensions that spree expects&lt;/span&gt;
      
      sizes = [&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;mini&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;small&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;product&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;large&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;original&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;]      
      
      &lt;span class="iv"&gt;@mini_dimension&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;77x77&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
      &lt;span class="iv"&gt;@small_dimension&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;175x175&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
      &lt;span class="iv"&gt;@product_dimension&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;265x265&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
      &lt;span class="iv"&gt;@medium_dimension&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;425x425&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
      &lt;span class="iv"&gt;@large_dimension&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;870x870&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
      
      
      sizes.each &lt;span class="r"&gt;do&lt;/span&gt; |size|
      
        &lt;span class="r"&gt;case&lt;/span&gt; size
          &lt;span class="r"&gt;when&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;mini&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
            this_dimension = &lt;span class="iv"&gt;@mini_dimension&lt;/span&gt;
          &lt;span class="r"&gt;when&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;small&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
            this_dimension = &lt;span class="iv"&gt;@small_dimension&lt;/span&gt;
          &lt;span class="r"&gt;when&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;product&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
            this_dimension = &lt;span class="iv"&gt;@product_dimension&lt;/span&gt;
          &lt;span class="r"&gt;when&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
            this_dimension = &lt;span class="iv"&gt;@medium_dimension&lt;/span&gt;
          &lt;span class="r"&gt;when&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;large&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
            this_dimension = &lt;span class="iv"&gt;@large_dimension&lt;/span&gt;
          &lt;span class="r"&gt;when&lt;/span&gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;original&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
          this_dimension = geometry.to_s 
        &lt;span class="r"&gt;end&lt;/span&gt;
          
      
      new_image_file = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;public/assets/products/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;+new_asset.id.to_s+&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;+size+&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;+image_file_basename+&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
        
        
      &lt;span class="c"&gt;# make the new path&lt;/span&gt;
      &lt;span class="co"&gt;FileUtils&lt;/span&gt;.mkdir_p &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;public/assets/products/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;+new_asset.id.to_s+&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;+size+&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;
        
      &lt;span class="iv"&gt;@cmd&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;convert &lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;image_file&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; -resize &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;this_dimension&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; -quality 90 &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;new_image_file&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
        stdin, stdout, stderr = &lt;span class="co"&gt;Open3&lt;/span&gt;.popen3(&lt;span class="iv"&gt;@cmd&lt;/span&gt;)
        puts l &lt;span class="r"&gt;while&lt;/span&gt; l = stdout.gets
        puts l &lt;span class="r"&gt;while&lt;/span&gt; l = stderr.gets



      
      &lt;span class="r"&gt;end&lt;/span&gt;
      
     &lt;span class="r"&gt;end&lt;/span&gt;


&lt;span class="r"&gt;end&lt;/span&gt;

&lt;span class="c"&gt;# End of the record-iterating loop&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;


</description>
      <pubDate>Sat, 12 Jun 2010 03:47:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:aff40ff6-5af2-4ab2-85cf-dc043061d5bc</guid>
      <comments>http://desiredoutput.com/2010/06/12/ruby-import-from-csv-into-spree-half-the-rails-way-and-half-the-un-rails-way#comments</comments>
      <category>Ruby</category>
      <category>ruby</category>
      <category>rails</category>
      <category>spree</category>
      <category>import</category>
      <category>csv</category>
      <category>convert</category>
      <category>open3</category>
      <category>activerecord</category>
      <category>object</category>
      <category>dimension</category>
      <category>paperclip</category>
      <category>geometry</category>
      <category>basename</category>
      <category>attachment</category>
      <category>product</category>
      <category>variant</category>
      <category>asset</category>
      <category>image</category>
      <category>taxon</category>
      <category>inject</category>
      <category>directly</category>
      <category>csvmapper</category>
      <category>sku</category>
      <category>resize</category>
      <category>logger</category>
      <category>fileutils</category>
      <link>http://desiredoutput.com/2010/06/12/ruby-import-from-csv-into-spree-half-the-rails-way-and-half-the-un-rails-way</link>
    </item>
    <item>
      <title>List Filenames without Extensions</title>
      <description>&lt;p&gt;&lt;code&gt;ls -1 | sed 's/.[&lt;sup&gt;.]*$//'&lt;/code&gt;&lt;/sup&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 11 Jun 2010 11:42:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:4dc41e0d-e16a-43fc-9afd-83b3bbbf61a8</guid>
      <comments>http://desiredoutput.com/2010/06/11/list-filenames-without-extensions#comments</comments>
      <category>Command line</category>
      <category>list</category>
      <category>filenames</category>
      <category>without</category>
      <category>extensions</category>
      <category>suffixes</category>
      <link>http://desiredoutput.com/2010/06/11/list-filenames-without-extensions</link>
    </item>
    <item>
      <title>Quick and Dirty Ruby:  Struct core class</title>
      <description>&lt;ul&gt;
    &lt;li&gt;I have some chat logs full of xml that I want to parse with Ruby,  nevermind why.   &lt;/li&gt;

    &lt;li&gt;Each xml element has three attributes that I want to keep associated.   &lt;/li&gt;

    &lt;li&gt;I'll need to sort them using each attribute as a key to reference the others.   &lt;/li&gt;

    &lt;li&gt;A hash doesn't work because it only associates one attribute to one other attribute in each record.  I could do hashes of hashes or hashes of arrays or arrays of arrays and iterate everything in an obscenely procedural way,  but if I could avoid that...&lt;/li&gt;

&lt;/ul&gt;


&lt;p&gt;Enter Class::Struct.    With Struct I can have a fast and loose object which provides access to a record keyed by any of the attributes. &lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
Log = Struct.new(:time, :name, :xml)
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Next I'll parse the files and chuck the values from the xml tags into new Log (Struct) objects, then do whatever I want with them based on the values for the attributes that are now records in Struct objects...&lt;/p&gt;</description>
      <pubDate>Sun, 02 May 2010 19:26:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:2e1b5ec2-796c-45fc-a402-c8087611295a</guid>
      <comments>http://desiredoutput.com/2010/05/02/quick-and-dirty-ruby-struct-core-class#comments</comments>
      <category>Ruby</category>
      <link>http://desiredoutput.com/2010/05/02/quick-and-dirty-ruby-struct-core-class</link>
    </item>
    <item>
      <title>dos2unix didn't work</title>
      <description>&lt;p&gt;Fine,  then,  we'll use Perl.   OUTTA THA WAY!!!!!&lt;/p&gt;

&lt;p&gt;Remove pesky windows carriage returns:&lt;br/&gt;
&lt;code&gt;
perl -pi.bak -e 's/\r/\n/g;'  ./thefile&lt;/code&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 02 May 2010 10:47:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:e54f3e00-a071-4160-bf0f-7014dc482d91</guid>
      <comments>http://desiredoutput.com/2010/05/02/dos2unix-didnt-work#comments</comments>
      <category>Command line</category>
      <category>Perl</category>
      <category>perl</category>
      <category>one</category>
      <category>liner</category>
      <category>windows</category>
      <category>carriage</category>
      <category>returns</category>
      <category>linebreaks</category>
      <category>M</category>
      <link>http://desiredoutput.com/2010/05/02/dos2unix-didnt-work</link>
    </item>
    <item>
      <title>Practical Ruby for System Administration</title>
      <description>&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/1590598210?ie=UTF8&amp;tag=desire0a-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1590598210"&gt;&lt;img border="0" src="files/ruby_admin_book_cover.jpg"&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=desire0a-20&amp;l=as2&amp;o=1&amp;a=1590598210" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 02 May 2010 08:51:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:7b650b22-316d-417e-af88-0d59e1257ac2</guid>
      <comments>http://desiredoutput.com/2010/05/02/practical-ruby-for-system-administration#comments</comments>
      <category>practical</category>
      <category>ruby</category>
      <category>system</category>
      <category>administration</category>
      <link>http://desiredoutput.com/2010/05/02/practical-ruby-for-system-administration</link>
    </item>
    <item>
      <title>Line 1: One-Liner</title>
      <description>&lt;p&gt;
&lt;p&gt;Turn a list into quoted comma separated values for a perl array:&lt;br /&gt;
	&lt;br /&gt;
	&lt;code&gt;perl -i.bak -ne 's/^(.*?)\n$/\"$1\",/;print' ./list_of_bare_strings&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
	&amp;nbsp;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
	Oh,&amp;nbsp; but your list is just a bunch of filenames you copied from the output of &amp;#39;ls&amp;#39; and you need them one-per-line:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
	&lt;code&gt;printf "%s\n" $(&amp;gt;pasted_ls_output) &amp;lt; list_of_bare_strings&lt;/code&gt;&lt;/p&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 02 May 2010 08:12:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:5d154827-083e-431f-a9c7-1839767d3564</guid>
      <comments>http://desiredoutput.com/2010/05/02/one-liner-1#comments</comments>
      <category>Command line</category>
      <category>Perl</category>
      <category>perl</category>
      <category>one</category>
      <category>liner</category>
      <trackback:ping>http://desiredoutput.com/trackbacks?article_id=1</trackback:ping>
      <link>http://desiredoutput.com/2010/05/02/one-liner-1</link>
    </item>
  </channel>
</rss>

