<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>The Corrosion of Aaron Stone</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/" />
    <link rel="self" type="application/atom+xml" href="http://sodabrew.com/atom.xml" />
    <id>tag:sodabrew.com,2008-11-29://1</id>
    <updated>2010-02-26T19:14:56Z</updated>
    <subtitle>And now for something $_...</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.32-en</generator>

<entry>
    <title>Whole Wheat Oatmeal Teff Chocolate Chip Cookies</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2010/02/whole-wheat-oatmeal-teff-chocolate-chip-cookies.html" />
    <id>tag:sodabrew.com,2010://1.93</id>

    <published>2010-02-26T18:41:14Z</published>
    <updated>2010-02-26T19:14:56Z</updated>

    <summary>The title is quite a mouthful, and so are these cookies! Crunchy, soft, crumbly, textured, tasty, and as it happens, vegan and parve! I made this recipe up last weekend while it was raining in San Francisco, and had a...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    <category term="baking" label="baking" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cookies" label="cookies" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cooking" label="cooking" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="vegan" label="vegan" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<p>The title is quite a mouthful, and so are these cookies! Crunchy, soft, crumbly, textured, tasty, and as it happens, vegan and parve! I made this recipe up last weekend while it was raining in San Francisco, and had a hankering for cookies. Ate a bunch, and brought the rest in to work to share and meet my coworkers. We all knew it was a rainy weekend, because the company message board was full of "extra cookies in the break room!" messages :)</p>

<pre class='brush: plain'>
2/3 cup whole wheat flour
2/3 c. oatmeal
1/3 c. teff flour
1/2 c. sugar (white, demerara, brown, etc.)
1/3 c. olive oil
1/3 c. dark chocolate chips
2 tbsp. vanilla
1 tsp. baking soda
1 tsp. baking powder
</pre>

<p>Now you're probably looking through that list and thinking, "Ok, all that looks familiar, except for that teff stuff. What's that!?" Teff is a grain grown in Ethiopia. It's one of the most protein-dense grains, and also the smallest whole grain. Ethiopians use it to make their native style of bread, called <em>injera</em>, which I can best describe as a sourdough crêpe. Bob's Red Mill sells <a href="http://www.bobsredmill.com/teff-flour.html">teff flour</a>, available at most natural foods stores and Whole Foods.</p>

<p>Next time I make this recipe, I might also throw in some frozen concentrated orange juice to add a little bit more binding to the finished batter. Eggs would do the trick, too, but I didn't have any in the fridge when I whipped this up.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Ikea Hacking: Gorm Wine Rack</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2010/01/ikea-hacking-gorm-wine-rack.html" />
    <id>tag:sodabrew.com,2010://1.92</id>

    <published>2010-01-04T21:32:11Z</published>
    <updated>2010-01-06T20:13:51Z</updated>

    <summary>Gorm assembly hint: get a 10mm socket for your drill-driver. Ikea has at least half a dozen options for wine storage, but its Gorm shelf system takes the cake for versatility. The Gorm is made of solid, unfinished pine, allowing...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    <category term="ikea" label="ikea" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wine" label="wine" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<div class="aside"><em>Gorm assembly hint: get a 10mm socket for your drill-driver.</em><a href="http://amzn.com/B000T9U9JE"><img src="http://ecx.images-amazon.com/images/I/31G0beqf%2BML._SL500_SS75_.jpg" alt="10mm nut driver bit" class="right" /></a></div>

<p>Ikea has at least half a dozen options for wine storage, but its Gorm shelf system takes the cake for versatility. The Gorm is made of solid, unfinished pine, allowing you to hack it more easily than Ikea products made of cardboard, <strike>spit shine</strike> veneer, and plastic cams. Gorms can stand alone, be chained together, mixed-and-matched with any part in the series, and, because of its simple, solid wood construction, sawed, drilled, screwed, painted, or stained to your heart's content.</p>

<p><a href="http://www.flickr.com/photos/sodabrew/4251773978/" title="Gorm Wine and Glass Rack by sodabrew, on Flickr"><img src="http://farm3.static.flickr.com/2759/4251773978_abdac4dbf3_m.jpg" width="218" height="240" alt="Gorm Wine and Glass Rack" class="right" /></a> For this hack, I started with a <a href="http://www.ikea.com/us/en/catalog/products/30058508">Gorm 30"w x 13"d x 68"h kit</a>, using three of the four shelves, and mixed in three more <a href="http://www.ikea.com/us/en/catalog/products/10058514">Gorm wine rack shelves</a>. Before I left Ikea, I went over to the parts department and got eight more screws to match the ones that hold the backstays onto the Gorm.</p>

<p><a href="http://www.flickr.com/photos/sodabrew/4251786904/" title="Adding stemware hangers to a Gorm shelf by sodabrew, on Flickr"><img src="http://farm3.static.flickr.com/2748/4251786904_1256a74a7b_m.jpg" width="240" height="180" alt="Adding stemware hangers to a Gorm shelf" class="right" /></a> I picked up two <a href="http://www.bedbathandbeyond.com/product.asp?order_num=-1&SKU=14914927">chrome wine glass racks</a> and a <a href="http://www.bedbathandbeyond.com/product.asp?order_num=-1&SKU=103162&RN=59">dozen wine glasses</a> from Bed, Bath & Beyond, screwed the racks to the underside of the top Gorm shelf (with those extra screws from Ikea), and voilà, my very own wine bar! </p>]]>
        
    </content>
</entry>

<entry>
    <title>Python Meta Decorators</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/12/python-meta-decorators.html" />
    <id>tag:sodabrew.com,2009://1.91</id>

    <published>2009-12-08T20:08:16Z</published>
    <updated>2009-12-08T20:18:10Z</updated>

    <summary>Recently, I was working on a project in Python framework that was built around decorators. Each of my functions needed something like six decorators, each with its own arguments, but mostly all the same. I thought, &quot;This is a classic...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    <category term="python" label="python" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[Recently, I was working on a project in Python framework that was built around decorators. Each of my functions needed something like six decorators, each with its own arguments, but mostly all the same. I thought, "This is a classic case of cut-and-paste coding; there has to be a better way!" I toiled over decorators for a while, and finally came up with this pattern:

<pre class='brush: python'>
def monkey(arg):
  def outer(f):
    def inner(*args, **kwargs):
      print &quot;Monkey: %s&quot; % arg
      f(*args, **kwargs)
    return inner
  return outer

def zombie(arg):
  def outer(f):
    def inner(*args, **kwargs):
      print &quot;Zombie: %s&quot; % arg
      f(*args, **kwargs)
    return inner
  return outer

def wrapper(m, z):
  def outer(f):
    @monkey(m)
    @zombie(z)
    def inner(*args, **kwargs):
      f(*args, **kwargs)
    return inner
  return outer

@wrapper(&quot;coconut&quot;, &quot;brains&quot;)
def mytesta(foo):
  print foo

@wrapper(&quot;bacon&quot;, &quot;chainsaw&quot;)
def mytestb(foo):
  print foo

mytesta(&quot;Hello World&quot;)
mytestb(&quot;Hello World&quot;)
</pre>

What I'm doing here is first setting up two standard argument-taking decorators, @monkey and @zombie. Then I'm setting up a decorator that returns a decorated function, whose arguments are built at decoration time. This lets me template out a complex decoration pattern where only a few arguments need to change for each function, and pass just those arguments into my meta-decorator.

This is the output:

<pre class='brush: plain'>
Monkey: coconut
Zombie: brains
Hello World

Monkey: bacon
Zombie: chainsaw
Hello World
</pre>]]>
        
    </content>
</entry>

<entry>
    <title>The Globe</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/10/the-globe.html" />
    <id>tag:sodabrew.com,2009://1.86</id>

    <published>2009-10-21T01:54:31Z</published>
    <updated>2009-12-09T22:43:03Z</updated>

    <summary>Since it&apos;s my birthday, I&apos;ll share my new favorite drink: The Globe from the SFist 3 oz. 209 Gin 1 oz. St. Germain 1 oz. lime juice 1/2 oz. agave nectar Shake and serve up with a mint garnish....</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<p>Since it's my birthday, I'll share my new favorite drink:</p>

<p>The Globe<br />
<em>from the <a href="http://sfist.com/2009/04/17/sfist_drinks_the_globe_cocktail.php">SFist</a></em></p>

<p>3 oz. 209 Gin<br />
1 oz. St. Germain<br />
1 oz. lime juice <br />
1/2 oz. agave nectar</p>

<p>Shake and serve up with a mint garnish.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Convert a Postfix queue to mbox format</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/10/convert-postfix-queue-to-mbox.html" />
    <id>tag:sodabrew.com,2009://1.90</id>

    <published>2009-10-13T03:48:05Z</published>
    <updated>2009-10-13T04:36:41Z</updated>

    <summary>Today I wanted to convert the contents of my postfix &apos;deferred&apos; queue, which was all spam stuck in my MTA, to mbox format so that I could feed it into various spam-learning systems. First I converted my Postfix queue to...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<p>Today I wanted to convert the contents of my postfix 'deferred' queue, which was all spam stuck in my MTA, to mbox format so that I could feed it into various spam-learning systems.</p>

<p>First I converted my Postfix queue to human-readable format with postcat:</p>

<pre class='brush: bash'>
cd /var/spool/postfix/deferred
mkdir spam
for i in {0..9} {A..F}; do mkdir spam/$i; done
for i in `ls */*`; do postcat $i &gt; spam/$i; done
</pre>

<p>This made a copy of each file in postcat format, but that's only halfway there -- postcat has its own output format that isn't anything like an mbox or a maildir. Inspecting the output, and brushing up on my sed, I came up with this:</p>

<pre class='brush: text'>
sed -n '
  /^\*\*\* ENVELOPE/,/^\*\*\* MESSAGE CONTENTS/ {
    /^message_arrival_time:/ {
      s/^message_arrival_time: \(.*\)$/\1/
      h
    }
    /^sender:/ {
      s/^sender: \(.*\)$/\1/
      H
      g
      s/\(.*\)\n\(.*\)/From \2 \1/
      p
    }
  }
  /^\*\*\* MESSAGE CONTENTS/,/^\*\*\* HEADER EXTRACTED/ {
    /^\*\*\* MESSAGE CONTENTS/ d
    s/^\*\*\* HEADER EXTRACTED.*$//
    s/^\(&gt;*From \)/&gt;\1/
    p
}' -
</pre>

<p>A final pass over all of the messages, and I had my mbox file to train SpamAssassin with:</p>

<pre class='brush: bash'>
for i in `ls */*`; do sh mkmbox.sh &lt; $i &gt;&gt; spam.mbox; done
sa-learn --spam --mbox spam.mbox
</pre>]]>
        
    </content>
</entry>

<entry>
    <title>Recipe for Seitan Stew</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/10/seitan-stew-recipe.html" />
    <id>tag:sodabrew.com,2009://1.89</id>

    <published>2009-10-11T00:13:49Z</published>
    <updated>2009-10-13T04:35:56Z</updated>

    <summary>Found in a backcopy of Vegetarian Journal, March 1996: 1 cup of water plus 1/2 cup water 1 ounce dried wild mushrooms 1 Tablespoon oil 1 large onion, chopped 2 carrots, diced 3 small turnips, peeled and cut in quarters...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
        <category term="General" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="food" label="food" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="recipe" label="recipe" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<p>Found in a backcopy of Vegetarian Journal, March 1996:</p>

<pre class='brush: text'>
1 cup of water plus 1/2 cup water
1 ounce dried wild mushrooms
1 Tablespoon oil
1 large onion, chopped
2 carrots, diced
3 small turnips, peeled and cut in quarters
4-5 small potatoes, cut in half
1/2 pound mushrooms, halved
3 dried tomatoes, made into powder
8 ounces seitan, cut in small chunks
1 teaspoon dried rosemary
1 teaspoon dried thyme
1 teaspoon dried sage
1 Tablespoon miso
1 Tablespoon arrowroot
2 Tablespoons fresh chopped parsley
Black pepper to taste
</pre>

<p>Boil one cup of the water and soak the dried mushrooms (if they are morels or shiitake) for 30 minutes. Save soaking water. If using porcini add when recommended.</p>

<p>Heat oil in pan over medium heat. Add onion, carrot, turnips, and potatoes. Sauté for 3 to 5 minutes until onion begins to soften. Add fresh mushrooms, tomato powder, and 1/4 cup water. Cook for 5 more minutes. Then add seitan chunks, dried herbs, and rehydrated mushrooms that have been cut in pieces. Cook for 5 more minutes.</p>

<p>Add soaking water drained of any debris and porcini, if using them. Add the miso and stir. Cook for about 10 more minutes until vegetables are almost tender.</p>

<p>Combine the remaining 1/4 cup water with the arrowroot and add to the pan over medium heat, stirring until thickened. If too thick add water 1 tablespoon at a time. If too thin add arrowroot 1 teaspoon at a time. Season with black pepper. Add parsley just before serving.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Health care reform story spotlights selfish stupidity</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/10/health-care-reform-story-spotlights-selfish-stupidity.html" />
    <id>tag:sodabrew.com,2009://1.88</id>

    <published>2009-10-08T22:56:30Z</published>
    <updated>2009-10-08T23:05:34Z</updated>

    <summary>A recent AP story about health care spotlights the sort of close-minded, numb stupidity that fuels anti-reformers: Andrew Newcomb, 28, who works in sales and lives near Destin, Fla., said he doesn&apos;t think taxpayers should have to take on the...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    <category term="healthcare" label="healthcare" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="politics" label="politics" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<p>A <a href="http://news.yahoo.com/s/ap/20091007/ap_on_go_pr_wh/us_ap_poll_health_care">recent AP story</a> about health care spotlights the sort of close-minded, numb stupidity that fuels anti-reformers:</p>

<blockquote>Andrew Newcomb, 28, who works in sales and lives near Destin, Fla., said he doesn't think taxpayers should have to take on the costs of covering the uninsured.

<p>"I don't want my tax money to pay for some pill-popper to fake some injury and go to the hospital when I don't ever go to the hospital," said Newcomb, adding he can afford to go to the doctor and pay $60 for a checkup.</blockquote></p>

<p>Andrew, since you never go to the hospital, I'm sure it won't ever be a problem. But if you do get sick, be sure to <a href="http://video.google.com/videosearch?q=alan+grayson+die+quickly">die quickly</a>. Otherwise you might cost us taxpayers a lot of money at a taxpayer-funded emergency room.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Updating Soekris firmware using Kermit</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/09/updating-soekris-firmware-using-kermit.html" />
    <id>tag:sodabrew.com,2009://1.87</id>

    <published>2009-09-24T01:59:44Z</published>
    <updated>2009-12-09T22:45:39Z</updated>

    <summary>I&apos;ve had trouble getting minicom&apos;s xmodem to fully upload a Soekris firmware image over USB serial adapters, and I&apos;ve never been a big fan of minicom in the first place. I like good old Kermit. Recently I discovered how to...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[I've had trouble getting minicom's xmodem to fully upload a Soekris firmware image over USB serial adapters, and I've never been a big fan of minicom in the first place. I like good old Kermit. Recently I discovered how to get Kermit to speak xmodem, and used it to update the firmware on my Soekris Net4801.

<p>First, install kermit and lrzsz. Next, connect your Soekris box. Now fire up kermit and go!

<p>
<pre class='brush: text'>
$ kermit

set protocol xmodem-crc download {} {lsx %s} {} {lrx %s} {}
set line /dev/ttyUSB0
set speed 19200
set carrier-watch off
set flow none
connect

&gt; download -

send /binary firmware-file-name
connect

&gt; flashupdate
</pre>]]>
        
    </content>
</entry>

<entry>
    <title>Python&apos;s Lame Lexical Closures</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/08/python-lame-lexical-closures.html" />
    <id>tag:sodabrew.com,2009://1.85</id>

    <published>2009-08-12T14:14:08Z</published>
    <updated>2009-08-12T14:24:20Z</updated>

    <summary>Here&apos;s a simple generator function in Python that you can use in a test harness to find out how many times the function was called. Call the function once with an argument, and then each time you call the function...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    <category term="code" label="code" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="python" label="python" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[Here's a simple generator function in Python that you can use in a test harness to find out how many times the function was called. Call the function once with an argument, and then each time you call the function again it will return that argument and increment an internal counter. Call the function with the named argument 'got_called' and it will reset and return its current call count.

<pre class='brush: python'>
def GotCalled(ret):
  &quot;&quot;&quot;Stub that counts how many times it was called.&quot;&quot;&quot;
  count = [0]

  def _GotCalled(*unused_args, **kwargs):
    if kwargs.get('got_called'):
      lame = count[0]
      count[0] = 0
      return lame
    else:
      count[0] += 1
      return ret

  return _GotCalled
</pre>

But note how count is a list. And I'm incrementing and returning the first member of the list. Guess what -- you can't use a variable directly in this situation! It'll error out on the 'count += 1' because the act of assigning to the variable in the inner function <i>creates a new instance of that variable</i>, one that hasn't been used before and so fails the + part of the +=. LAME.]]>
        
    </content>
</entry>

<entry>
    <title>Perl Hash Slices</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/07/perl-hash-slices.html" />
    <id>tag:sodabrew.com,2009://1.84</id>

    <published>2009-07-17T22:56:58Z</published>
    <updated>2009-10-13T04:21:49Z</updated>

    <summary>One of my favorite things to do with Perl hashes is slice them with this incredibly concise syntax. The first time I saw this, I Just Got It (TM). Lifting a chunk of text from the excellent (though dated) online...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[One of my favorite things to do with Perl hashes is slice them with this incredibly concise syntax. The first time I saw this, I Just Got It (TM). Lifting a chunk of text from the excellent (though dated) online book <i><a href="http://www.ebb.org/PickingUpPerl/">Picking Up Perl</a></i>, here's how it works:

<h3>Slices</h3>

It turns out you can slice hashes just like you were able to slice arrays.
This can be useful if you need to extract a certain set of values out of a
hash into a list.

<pre class='brush: perl'>
use strict;
my %table = qw/schmoe joe smith john simpson bart/;
my @friends = @table{'schmoe', 'smith'};
# @friends has qw/joe john/
</pre>

Note the use of the <i>@</i> in front of the hash name.  This shows that we
are indeed producing a normal list, and you can use this construct in any
list context you would like.


<h3>Context Considerations</h3>

We have now discussed all the different ways you can use variables in
list and scalar context.  At this point, it might be helpful to review
all the ways we have used variables in different contexts.  The table
that follows identifies many of the ways variables are used in Perl.

<TABLE>
<TR><TD><STRONG>Expression</STRONG> </TD><TD> <STRONG>Context</STRONG> </TD><TD> <STRONG>Variable</STRONG> </TD><TD> <STRONG>Evaluates to</STRONG></TD>
</TR>

<TR><TD><CODE>$scalar</CODE> </TD><TD> scalar </TD><TD> <CODE>$scalar</CODE>, a scalar</TD>

</TD><TD> the value held in <CODE>$scalar</CODE>

</TR>

<TR><TD><CODE>@array</CODE> </TD><TD> list </TD><TD> <CODE>@array</CODE>, an array</TD>

</TD><TD> the list of values (in order) held in <CODE>@array</CODE>

</TR>
<TR><TD><CODE>@array</CODE> </TD><TD> scalar </TD><TD> <CODE>@array</CODE>, an array</TD>

</TD><TD> the total number of elements in <CODE>@array</CODE> (same as
<CODE>$#array + 1</CODE>)

</TR>
<TR><TD><CODE>$array[$x]</CODE> </TD><TD> scalar </TD><TD> <CODE>@array</CODE>, an array</TD>

</TD><TD> the <CODE>($x+1)</CODE>th element of <CODE>@array</CODE>

</TR>
<TR><TD><CODE>$#array</CODE> </TD><TD> scalar </TD><TD> <CODE>@array</CODE>, an array</TD>

</TD><TD> the subscript of the last element in <CODE>@array</CODE> (same as
<CODE>@array -1</CODE>)

</TR>
<TR><TD><CODE>@array[$x, $y]</CODE> </TD><TD> list </TD><TD> <CODE>@array</CODE>, an array</TD>

</TD><TD> a slice, listing two elements from <CODE>@array</CODE> (same as
<CODE>($array[$x], $array[$y])</CODE>)

</TR>
<TR><TD><CODE>"$scalar"</CODE> </TD><TD> scalar (interpolated) </TD><TD> <CODE>$scalar</CODE>, a scalar</TD>

</TD><TD> a string containing the contents of <CODE>$scalar</CODE>

</TR>
<TR><TD><CODE>"@array"</CODE> </TD><TD> scalar (interpolated) </TD><TD> <CODE>@array</CODE>, an array</TD>

</TD><TD> a string containing the elements of <CODE>@array</CODE>, separated by
spaces


</TR>
<TR><TD><CODE>%hash</CODE> </TD><TD> list </TD><TD> <CODE>%hash</CODE>, a hash</TD>

</TD><TD> a list of alternating keys and values from <CODE>%hash</CODE>

</TR>
<TR><TD><CODE>$hash{$x}</CODE> </TD><TD> scalar </TD><TD> <CODE>%hash</CODE>, a hash</TD>

</TD><TD> the element from <CODE>%hash</CODE> with the key of <CODE>$x</CODE>

</TR>
<TR><TD><CODE>@hash{$x, $y}</CODE> </TD><TD> list </TD><TD> <CODE>%hash</CODE>, a hash</TD>

</TD><TD> a slice, listing two elements from <CODE>%hash</CODE> (same as
<CODE>($hash{$x}, $hash{$y})</CODE>
</TR></TABLE>]]>
        
    </content>
</entry>

<entry>
    <title>On Republicans and Obama&apos;s healthcare plans</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/06/obama-healthcare-and-republicans.html" />
    <id>tag:sodabrew.com,2009://1.82</id>

    <published>2009-06-16T05:56:47Z</published>
    <updated>2009-12-08T20:07:39Z</updated>

    <summary>From this AP story on Obama pressing doctors to back health care overhaul: GOP Rep. Tom Price of Georgia -- a former orthopedic surgeon -- reacted preemptively to Obama&apos;s speech by accusing him of seeking a &quot;government takeover&quot; of health...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    <category term="politics" label="politics" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<p>From this AP story on <a href="http://news.yahoo.com/s/ap/20090616/ap_on_go_pr_wh/us_obama_doctors">Obama pressing doctors to back health care overhaul</a>:</p>

<blockquote>
GOP Rep. Tom Price of Georgia -- a former orthopedic surgeon -- reacted preemptively to Obama's speech by accusing him of seeking a "government takeover" of health care. Speaking to reporters on a conference call organized by the Republican National Committee, Price said a committee that Obama's administration has established to study the effectiveness of various medical treatments would turn into a "rationing board" to overrule doctors and deny patients care. Sen. Jon Kyl, R-Ariz., and other Republicans introduced legislation to ban the rationing of care on such a basis.</blockquote>

<p><em>Hello, pot? Yeah, this is kettle. You're black! </em>If these guys are going to draft legislation that prevents all insurance companies from denying coverage, awesome. If they allow private insurers to cut coverage but not a future public insurance, that's just one more scummy way that Republicans write laws specifically to doom government agencies to fail, then rail against those same agencies saying they shouldn't exist.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Back in the code days</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/04/back-in-the-code-days.html" />
    <id>tag:sodabrew.com,2009://1.80</id>

    <published>2009-04-14T21:13:32Z</published>
    <updated>2009-06-02T18:42:31Z</updated>

    <summary>Why, when I was a kid, we had to write code while walking 20 miles to the computer building, in 12 feet of snow in the middle of winter. And it was uphill both ways! Course we couldn&apos;t wear gloves,...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<p>Why, when I was a kid, we had to write code while walking 20 miles to the computer building, in 12 feet of snow in the middle of winter. And it was uphill both ways! Course we couldn't wear gloves, because it was too hard to line up the hole punch on the punched card. They didn't have knapsacks in those days, so we just had to keep our card stack on a string tied to our belt. Now, a hole punch cost a nickel, and in those days nickels had pictures of bumblebees on 'em. "Give me five bees for a quarter," you'd say. Now where were we? Oh yeah, the important thing was I had a stack of punch cards on my belt, was the style at the time. They didn't have standard 5081 cards in stock, because of the war. The only thing you could get was graph papyrus, and you had to draw all the tables by hand.</p>

<p>Best. Slashdot. <a href="http://ask.slashdot.org/comments.pl?sid=1197237&cid=27559751">Comment</a>. Evar.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Yemenite and Rhodes Haroset</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/04/yemenite-haroset.html" />
    <id>tag:sodabrew.com,2009://1.79</id>

    <published>2009-04-10T06:56:29Z</published>
    <updated>2009-04-10T18:31:14Z</updated>

    <summary> From The World of Jewish Cooking, by Gil Marks: Yemenite 15 dried figs, chopped 2 to 3 tablespoons sesame seeds, lightly toasted 1 teaspoon ground cinnamon 1 teaspoon ground ginger Dash of ground coriander or cardamom 1 small chili...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    <category term="cooking" label="cooking" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="passover" label="passover" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<p><span class="mt-enclosure mt-enclosure-image" class="mt-image-right" style="float: right; margin: 0 0 20px 20px; display: inline;" ><br />
<iframe src="http://rcm.amazon.com/e/cm?t=thecorofaarst-20&o=1&p=8&l=as1&asins=0684835592&md=10FE9736YVPPT7A0FBG2&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe><br />
</span></p>

<p>From The World of Jewish Cooking, by Gil Marks:</p>

<p><big>Yemenite</big></p>

<p>15 dried figs, chopped<br />
2 to 3 tablespoons sesame seeds, lightly toasted<br />
1 teaspoon ground cinnamon<br />
1 teaspoon ground ginger<br />
Dash of ground coriander or cardamom<br />
1 small chili or pinch of cayenne<br />
Dry red wine</p>

<p>Finely chop the figs, dates, sesame seeds, cinnamon, ginger, coriander or cardamom, and chili or cayenne. Stir in enough wine to make a paste. Storein the refrigerator. Serve at room temperature.</p>

<p><big>Rhodes</big></p>

<p>1/2 cup pitted dates, finely chopped<br />
1/2 cup raisins<br />
1 orange, peeled, seeded, and chopped<br />
1/4 cup honey<br />
1/2 cup almonds, finely chopped<br />
cinnamon<br />
about 1/4 cup sweet red wine </p>

<p>Cook dates, raisins, orange, and honey, stirring, until thick (about 20<br />
minutes). Remove from heat and add remaining ingredients.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Register.com teaches SSL customers how to phish</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/03/registercom-teaches-ssl-customers-how-to-phish.html" />
    <id>tag:sodabrew.com,2009://1.78</id>

    <published>2009-03-06T07:58:40Z</published>
    <updated>2009-03-06T08:16:19Z</updated>

    <summary> I just bought an SSL certificate for this domain from Register.com. The price was great ($38 for 3 years! Just Google for &quot;discount ssl certificate&quot; to get a Register.com AdWord banner discount), the process went really smoothly, the certificate...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    <category term="phishing" label="phishing" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ssl" label="ssl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<p> <span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://sodabrew.com/assets_c/2009/03/register.com-like-a-phish-7.html" onclick="window.open('http://sodabrew.com/assets_c/2009/03/register.com-like-a-phish-7.html','popup','width=554,height=691,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://sodabrew.com/assets_c/2009/03/register.com-like-a-phish-thumb-300x374-7.png" width="300" height="374" alt="register.com-like-a-phish.png" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></a></span> </p>

<p>I just bought an SSL certificate for this domain from Register.com. The price was great ($38 for 3 years! Just Google for "discount ssl certificate" to get a Register.com AdWord banner discount), the process went really smoothly, the certificate installed easily into Apache, and is working well for me so far.</p>

<p>In the middle of the process, while I was downloading the certs and reading their directions, I came across this doozy of a page. What Register.com is giving you are <b>static pictures of locks to make users feel safe</b>. In other words, <b>teaching people to trust the telltale signs of phishing tactics!</b> And I'm downright shocked at the favicon of a lock. That's a straight-up bald-faced attempt at making the site look like it's being seen by the browser as secured. Not cool!</p>]]>
        
    </content>
</entry>

<entry>
    <title>Multitouching more of New York</title>
    <link rel="alternate" type="text/html" href="http://sodabrew.com/2009/01/multitouching-more-of-new-york.html" />
    <id>tag:sodabrew.com,2009://1.77</id>

    <published>2009-01-22T18:45:15Z</published>
    <updated>2009-01-22T18:58:34Z</updated>

    <summary>This new Google New York project at nycgo.com, using Google Maps and Earth with lots of local data is neat. But where it gets really incredible is the touchscreen interface that reminds me of Minority Report. Specifically, I&apos;m thinking about...</summary>
    <author>
        <name>Aaron Stone</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://sodabrew.com/">
        <![CDATA[<p>This new Google New York project at <a href="http://nycgo.com">nycgo.com</a>, using Google Maps and Earth with lots of local data is neat. But where it gets really incredible is the touchscreen interface that reminds me of <a href="http://www.imdb.com/title/tt0181689/">Minority Report</a>. Specifically, I'm thinking about the large immersive gesture system that Tom Cruise uses to gather information about his situation.</p>

<p>Which is, of course, already something of a reality! Jeff Han <a href="http://www.ted.com/index.php/talks/jeff_han_demos_his_breakthrough_touchscreen.html">demonstrated a large multitouch screen</a> with correspondingly incredible user interface at TED in 2006. Now Art Lebedev of Optimus Maximus keyboard fame is working on the <a href="http://www.etre.com/blog/2008/01/optimus_tactus_artemy_lebedev/">Optimus Tactus</a>, a concept keyboard where the keys are replaced with a touch screen, and the "keyboard" itself becomes reconfigurable to suit the application -- keys for typing, mixer controls for audio, video jogs and patches, and so on.</p>]]>
        
    </content>
</entry>

</feed>
