<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>Mad, Beautiful Ideas</title>
    <link rel="alternate" type="text/html" href="http://blog.foxxtrot.net/" />
    
    <id>tag:blog.foxxtrot.net,2008-09-17://1</id>
    <updated>2009-06-26T19:03:28Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.21-en</generator>

<link rel="self" href="http://feeds.feedburner.com/MadBeautifulIdeas" type="application/atom+xml" /><entry>
    <title>Inclusively Take Elements using LINQ and Custom Extensions</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/tfl3UvrM8CE/inclusively-take-elements-using-linq-and-custom-extensions.html" />
    <id>tag:blog.foxxtrot.net,2009://1.341</id>

    <published>2009-06-26T18:59:47Z</published>
    <updated>2009-06-26T19:03:28Z</updated>

    <summary>I ran into an interesting LINQ problem recently, one which required me to extend LINQ in my own fashion. The problem was fairly simple. I’m trying to build a list of every day a course meets over the course of...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="c" label="C#" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="linq" label="LINQ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="programming" label="Programming" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;I ran into an interesting LINQ problem recently, one which required me to extend LINQ in my own fashion. The problem was fairly simple. I&amp;#8217;m trying to build a list of every day a course meets over the course of a term. I start by querying our Academic Calendar for every event in the calendar, then I skip all the events prior to the first day of class, taking all the events until the end of classes for the term. I couldn&amp;#8217;t just take those two events, because different events in the middle of the term affect if courses are offered. My first draft at this problem was simple:&lt;/p&gt;

&lt;pre class="code c-sharp"&gt;
IEnumerable&amp;lt;AcademicEvent&gt; _events = GetAcademicCalendarEvents
                            (data.Year, data.Term, data.Campus)
                .SkipWhile(c =&gt; c.EventType != "TermBegins")
                .TakeWhile(c =&gt; c.EventKey != "TermEnds");
&lt;/pre&gt;

&lt;p&gt;This code is broken. But the error is subtle. The TakeWhile method is &lt;em&gt;not&lt;/em&gt; inclusive. The resulting IEnumerable will not include the event with the Key &amp;#8220;TermEnds&amp;#8221;, resulting in my later code inadvertently not showing some days at the end of the term. Given that the event that follows the TermEnds event may not always be the same, I didn&amp;#8217;t really want to try to key off of the next possible event. What I really wanted to do was take items on the list until I reached the TermEnds event. Sounds like an easy enough extension method!&lt;/p&gt;

&lt;pre class="code c-sharp"&gt;
public static IEnumerable&amp;lt;T&gt; TakeUntil&amp;lt;T&gt;
    (this IEnumerable&amp;lt;T&gt; data, Func&amp;lt;T, bool&gt; predicate)
{
    return data.TakeWhile(c =&gt; !predicate(c));
}
&lt;/pre&gt;

&lt;p&gt;And since the messing around with the IEnumerable has already been done for me, I might as well take advantage of that work, and just reverse the predicate as I send it into the existing TakeWhile. Of course, this doesn&amp;#8217;t work either. Because TakeWhile (and by extension, TakeUntil) will not return the item which triggered the predicate, which I want. So, another extension method is required, TakeUntilInclusive.&lt;/p&gt;

&lt;pre class="code c-sharp"&gt;
public static IEnumerable&amp;lt;T&gt; TakeUntilInclusive&lt;T&gt;
        (this IEnumerable&amp;lt;T&gt; data, Func&amp;lt;T, bool&gt; predicate)
{
    int index = 0;
    var enumerator = data.GetEnumerator();
    while (enumerator.MoveNext())
    {
        index++;
        if (predicate(enumerator.Current)) { break; }
    }
    enumerator.Dispose();
    return data.Take(index);
}
&lt;/pre&gt;

&lt;p&gt;And while I&amp;#8217;m at it&amp;#8230;&lt;/p&gt;

&lt;pre class="code c-sharp"&gt;
public static IEnumerable&amp;lt;T&gt; TakeWhileInclusive&amp;lt;T&gt;
    (this IEnumerable&amp;lt;T&gt; data, Func&amp;lt;T, bool&gt; predicate)
{
    return data.TakeUntilInclusive(p =&gt; !predicate(p));
}
&lt;/pre&gt;

&lt;p&gt;I&amp;#8217;ve &lt;a href="http://blog.foxxtrot.net/2007/10/msdn-tech-session-vs-2008-and-silverlight.html"&gt;metioned extension methods before&lt;/a&gt;, but I can honestly say that they are the single best reason for using C# 3, and .NET 3/3.5. They&amp;#8217;re that good. Essentially, extension methods bring limited monkey-patching to the static compilation world, but do so in a really selective way. All the code above would be wrapped in a static class in a Namespace that would allow me to select when those methods were available or not. The only &lt;em&gt;weakness&lt;/em&gt; to extension methods is that they do not allow you to override methods that already exist with new behavior. Really, it&amp;#8217;s just a compiler hack, which is why it&amp;#8217;s a language feature and not a runtime feature, but it&amp;#8217;s a really good compiler hack.&lt;/p&gt;

&lt;p&gt;Breaking down the syntax is easy. Any static method, located in a static class, with a first argument prefixed with the &amp;#8216;this&amp;#8217; keyword, will be interpreted by the compiler as an extension method, and the compiler will allow the method to be called as object.Method(), instead of StaticClass.Method(object). Essentially, those two calls are functionally identical, but the extension method provides code that is cleaner and easier to read. However, it&amp;#8217;s real power is when paired with interfaces and generics, as with LINQ, which my code above just adds on to.&lt;/p&gt;

&lt;p&gt;The final version of the query looks like this:&lt;/p&gt;

&lt;pre class="code c-sharp"&gt;
IEnumerable&amp;lt;AcademicEvent&gt; _events = GetAcademicCalendarEvents
                        (data.Year, data.Term, data.Campus)
                .SkipWhile(c =&gt; c.EventType != "TermBegins")
                .TakeUntilInclusive(c =&gt; c.EventKey == "TermEnds");
&lt;/pre&gt;

&lt;p&gt;For clarity, I could create a SkipUntil wrapper around SkipWhile, but given that SkipWhile is doing what I want anyway, I didn&amp;#8217;t feel it was necessary. Now, this code works against an IEnumerable, not an IQueryable, so it can really only be used on data sets small enough to be handled in memory. I&amp;#8217;m not entirely sure how I&amp;#8217;d implement this in an IQueryable, as that object expects to be able to translate to SQL (or similar) at some point, and this isn&amp;#8217;t the sort of thing that I can think of how to do in a single query.&lt;/p&gt;

&lt;p&gt;Writing Extension methods is really easy, and LINQ is the best example of their power so far. The fact that you can so easily extend upon this existing work is fantastic, and I can think of a few other problems I&amp;#8217;m liable to have to solve in the coming months where I&amp;#8217;ll be using these extension methods, or some new ones.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/tfl3UvrM8CE" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/06/inclusively-take-elements-using-linq-and-custom-extensions.html</feedburner:origLink></entry>

<entry>
    <title>Sub-$20 Apartment-Friendly Clothesline</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/gW_MoQov49I/sub-20-apartment-friendly-clothesline.html" />
    <id>tag:blog.foxxtrot.net,2009://1.340</id>

    <published>2009-06-08T21:04:18Z</published>
    <updated>2009-06-08T21:13:01Z</updated>

    <summary>My wife loves the smell of air-dried clothing. Personally, I don’t particularly care, but I also don’t have any direct love of machine-dried clothing either (except for the feeling of fresh-from-the-drier pants). However, we live in an Apartment, second floor,...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Life" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="apartmentliving" label="Apartment Living" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="green" label="Green" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;My wife loves the smell of air-dried clothing. Personally, I don&amp;#8217;t particularly care, but I also don&amp;#8217;t have any direct love of machine-dried clothing either (except for the feeling of fresh-from-the-drier pants). However, we live in an Apartment, second floor, and while there is a lot of grass around our apartment (one of the many benefits of campus housing), the University had no interest in putting up a clothesline, particularly since my wife was probably the only person in our complex asking for it.  However, our apartment does have a small deck area, and Landlord-Tenant Law always has provisions for tenants making improvements to the property their renting. &lt;/p&gt;

&lt;p&gt;So, we had a small deck, covered from above by the deck of our upstairs neighbors. The design, therefore, was simple. Four eye-hooks and some cord is really all you need, but we found a ~$10 USD cinch that, while being half the cost of the project, was completely worth it. At the time I completed this project, I didn&amp;#8217;t have a power drill, only a &lt;a href="http://www.dremel.com/"&gt;Dremel&lt;/a&gt;, but for my needs that was plenty.&lt;/p&gt;

&lt;p&gt;Tools:
* Drill or Rotary Tool 
* Socket Wrench
* Sharp Knife/Scissors
* 4 Circular Hooks
* Clothesline or Rope
* Clothesline Cinch (optional)&lt;/p&gt;

&lt;p&gt;When deciding on Hooks and line, consider how big your space is, and how many clothes you think you&amp;#8217;ll be able to hang. For us, we went with hardware that would be able to support ~50 lbs. This was &lt;em&gt;seriously&lt;/em&gt; overkill for our purposes, as our deck was really small, but if we move, we plan to take this hardware with us, and to be honest, finding line that&amp;#8217;s much weaker that that is kind of hard. Consider the ratings of what you&amp;#8217;re buying, and how much you plan to hang up. At least with the ~50 lbs limit on our line, we can air-dry sweaters and stuff in the fall before it gets too cold. &lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Clothesline - DoubleHitch Knot" src="http://blog.foxxtrot.net/2009/06/08/S3010047.JPG" width="318" height="200" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Installation was simple. Drill very shallow holes for the circular hooks. These need to be big enough around for you to start the hooks into the wood, but the holes are mostly to keep the hardware going in the wall straight. Find a socket that fits the circular hook, and attach that to your socket wrench, and use that to drive the hooks all the way in. The socket wrench will provide you with the leverage you need to drive the hooks all the way in, and will save your hands from trying to turn them directly. Once all four hooks are in place, choose a corner to tie the line down to, and tie it down using a &lt;a href="http://projectpotpourri.blogspot.com/2009/03/infocard-useful-knots.html"&gt;simple knot&lt;/a&gt;. I&amp;#8217;d suggest either a bowline, or a double hitch.&lt;/p&gt;

&lt;p&gt;Once tied down, just run the line through your hooks, until you reach the other side. If not using the cinch, cut to length and tie down reasonably hard using the same sort of knot as on the other side. You don&amp;#8217;t want to pull so hard that your hooks (or line) fails, but the line should be as taut as possible. If using the cinch, simply attach the cinch with a short piece of line from the eye hook on the wall, then string the line from the opposite side through the cinch and pull it tight.&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Clothesline - Cinch Hardware" src="http://blog.foxxtrot.net/clothesline-cinch.jpg" width="304" height="186" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;So, why air dry? Well, the &lt;a href="http://www.energy.ca.gov/"&gt;California Energy Comission&lt;/a&gt; claims that a dryer is typically the &lt;a href="http://www.consumerenergycenter.org/home/appliances/dryers.html"&gt;second largest energy user in your household&lt;/a&gt;, second only the the Refrigerator. That site estimates the operating costs of a clothes dryer at around $85 per year, or $1500 over 18 years of operation. It adds up over time, no doubt. Plus, some clothing items shouldn&amp;#8217;t be machine-dried, and the clothesline is exactly what these items require.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not advocating completely forsaking the machine dryer. We certainly don&amp;#8217;t have room for enough line to make that even possible, and nearly half the year, the weather simply isn&amp;#8217;t compatible with the idea of the clothesline. But, it does save some energy, provides clothing a fresh clean smell you can&amp;#8217;t get any other way, and it&amp;#8217;s an inexpensive thing to do. That $20 price tag I put on this project includes the clothespins.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/gW_MoQov49I" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/06/sub-20-apartment-friendly-clothesline.html</feedburner:origLink></entry>

<entry>
    <title>.NET Strangeness: Generics and Casting</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/zu3snXwBnCs/net-strangeness-generics-and-casting.html" />
    <id>tag:blog.foxxtrot.net,2009://1.339</id>

    <published>2009-04-24T14:28:00Z</published>
    <updated>2009-04-24T14:29:39Z</updated>

    <summary>Ran into an interesting problem with .NET and it’s Generics earlier today that really, really surprised me. The problem that I was trying to solve was fairly straightforward. I’m working on porting a large collection of Classic ASP Web Applications...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="net" label=".NET" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="c" label="C#" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="casting" label="Casting" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="design" label="Design" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="generics" label="Generics" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="programming" label="Programming" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;Ran into an interesting problem with .NET and it&amp;#8217;s Generics earlier today that really, really surprised me. The problem that I was trying to solve was fairly straightforward. I&amp;#8217;m working on porting a large collection of Classic ASP Web Applications to a collection of ASP.NET MVC Web Applications, in the process upgrading the applications to more advanced web technology (and I&amp;#8217;m not just talking about .NET).&lt;/p&gt;

&lt;p&gt;One particular function that we deal with regularly is needing to authorize users for subsets of data, however, often the permissions of a user may differ between various applications. As such, I wanted to create a simple data type to help me display these authorizations. Now, I&amp;#8217;m simply going to call the app App1. It has a database table called App1Authorizations which manages the special authorizations for this app.&lt;/p&gt;

&lt;script src="http://gist.github.com/100873.js"&gt;&lt;/script&gt;

&lt;noscript&gt;&lt;a href="http://gist.github.com/100873"&gt;Click here for the Gist.&lt;/a&gt;&lt;/noscript&gt;

&lt;p&gt;This led to some an interesting compile-time type-casting error where .NET refused to upcast the App1Authorization class to the IAuthorization interface (a perfectly legal move). I fought this for about twenty minutes, trying to use LINQ to force the cast, before I finally &lt;a href="http://msdn.microsoft.com/en-us/library/ms379564(vs.80"&gt;found documentation describing why I was encountering the error&lt;/a&gt;.aspx#csharp&lt;em&gt;generics&lt;/em&gt;topic5).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The C# compiler only lets you implicitly cast generic type 
  parameters to Object, or to constraint-specified types, as 
  shown in Code block 5. Such implicit casting is type safe
  because any incompatibility is discovered at compile-time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essentially, this means that you can only cast to Objects (the most basic class), or a class which you&amp;#8217;ve explicitly told the compiler is a legitimate cast ahead of time, because (the article claims) that&amp;#8217;s the only way to provide type safe compile-time checking.&lt;/p&gt;

&lt;p&gt;I don&amp;#8217;t buy this line. The compiler should already know the relationships between the Interface I&amp;#8217;ve declared and it&amp;#8217;s child, and it should be able to handle that at compile time. Now, I&amp;#8217;m not trying to claim to be smarter than &lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;. It&amp;#8217;s highly likely I&amp;#8217;m missing something, but it seems to me that this should be a solvable problem.&lt;/p&gt;

&lt;p&gt;Okay, so I don&amp;#8217;t like that what appears like a perfectly reasonable use of generics doesn&amp;#8217;t work. But, what does it take to make it work? Well, we have to go back to Generics, and add generics where I really didn&amp;#8217;t want to.&lt;/p&gt;

&lt;script src="http://gist.github.com/100909.js"&gt;&lt;/script&gt;

&lt;noscript&gt;&lt;a href="http://gist.github.com/100909"&gt;Click here for the Gist.&lt;/a&gt;&lt;/noscript&gt;

&lt;p&gt;The only other alternative would be to implement a custom List class which would allow the IAuthorization cast. That&amp;#8217;s basically unreasonable. This works, but in my opinion it&amp;#8217;s harder to read and slightly confusing. In short, I &lt;a href="http://en.wikipedia.org/wiki/Code_smell"&gt;think this smells&lt;/a&gt;. It was non-obvious what was wrong, and then what the solution was.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s unclear to me whether this is an issue with the .NET Virtual Machine (like my problem with Java&amp;#8217;s Generics are), or with the C# compiler, but my hopes are that this is a correctable problem (maybe I should crack open the &lt;a href="http://www.mono-project.com/"&gt;Mono&lt;/a&gt; C# Compiler source).&lt;/p&gt;

&lt;p&gt;Now, because I&amp;#8217;m sure it will come up, there is a single reason supporting this that I can think of. As I said above, I am writing an MVC Application. The LINQ query is in my Model, which is called by my Controller, which is then passed via the ViewData to a view for display. By forcing me to do this extra bit of casting, I can ensure (with compile-time assurance) that the &lt;em&gt;right&lt;/em&gt; kind of IAuthorization object can make it into the View.&lt;/p&gt;

&lt;p&gt;As I said, there may be a perfectly good reason for this design decision that I&amp;#8217;m not aware of. If there is, I&amp;#8217;d love to hear it. Now that I&amp;#8217;ve seen this, I know to look out for it. Do I wish that it could be different? Absolutely. But hopefully this write-up can help someone else with this problem.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/zu3snXwBnCs" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/04/net-strangeness-generics-and-casting.html</feedburner:origLink></entry>

<entry>
    <title>DRM and eBooks</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/68g6owxzhlg/drm-and-ebooks.html" />
    <id>tag:blog.foxxtrot.net,2009://1.338</id>

    <published>2009-04-21T22:56:38Z</published>
    <updated>2009-04-21T22:57:45Z</updated>

    <summary>Cory Doctorow (sci-fi author, blogger, and technologist) is a well-known Anti-DRM speaker. He even released a book of his writings on the subject, which is available via a CC-BY-NC-SA download. Now, this book, Content, is one of Doctorow’s that I...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Computing" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="amazon" label="Amazon" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="doctorow" label="Doctorow" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="drm" label="DRM" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ebooks" label="eBooks" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="eff" label="EFF" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;&lt;a href="http://craphound.com/"&gt;Cory Doctorow&lt;/a&gt; (sci-fi author, blogger, and technologist) is a well-known Anti-DRM speaker. He even released a &lt;a href="http://craphound.com/content/"&gt;book of his writings on the subject&lt;/a&gt;, which is available via a &lt;a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;CC-BY-NC-SA&lt;/a&gt; download. Now, this book, Content, is one of Doctorow&amp;#8217;s that I haven&amp;#8217;t bought yet, but that&amp;#8217;s largely because I haven&amp;#8217;t found it yet (hey, I like to buy books in actual bookstores), but even though I&amp;#8217;ve read it, I still plan to buy the book to share, as well as support Mr. Doctorow.&lt;/p&gt;

&lt;p&gt;We finally won the DRM war in relation to the Music industry. I can&amp;#8217;t think of a single major player in the downloadable music game (except for game-related audio, like Rock Band Downloadable Content) who still uses DRM on any of their downloads. Now, the prices are still high, in my opinion, and the signs are not good in that respect, but the removal of the DRM is a huge win. &lt;/p&gt;

&lt;p&gt;But that victory is only one of many that is needed. In the Video industry, you have &lt;a href="http://www.techcrunch.com/2009/02/18/content-owners-force-hulu-to-kill-boxee-support/"&gt;Hulu trying to stop aggregators like Boxee from replaying their content&lt;/a&gt; (which would have still display Hulu ads), you&amp;#8217;ve got the &lt;a href="http://en.wikipedia.org/wiki/BBC_iPlayer"&gt;BBC using DRM on their iPlayer&lt;/a&gt;. But I don&amp;#8217;t think that&amp;#8217;s the next battle we&amp;#8217;re going to win. Video is great, but the people who control the content are, in my opinion, far more stubborn than the Music industry ever was.&lt;/p&gt;

&lt;p&gt;Like Doctorow, I believe the next front on this war that&amp;#8217;s we&amp;#8217;re likely to win is in the Publishing industry. eBooks are starting to become a really big deal. I think a large part of this is due to the fact that for a long time, eBooks simply weren&amp;#8217;t convenient. They&amp;#8217;re not portable, the displays for reading them were relatively low contrast compared to the printed page, and eyestrain was common. That&amp;#8217;s changed in recent years with the advent of the &lt;a href="http://www.eink.com/"&gt;e-ink display&lt;/a&gt; which powers (among other things), the &lt;a href="http://www.amazon.com/kindle"&gt;Amazon Kindle&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The Kindle is a great piece of technology. Great high-contrast display. It&amp;#8217;s light. It&amp;#8217;s battery lasts for weeks. And it&amp;#8217;s got a built-in cellular modem for over-the-air purchases and updates (all without a monthly fee). However, all these great features are, in my opinion, outshone by one rather ugly feature. It&amp;#8217;s DRM. Recently, &lt;a href="http://arstechnica.com/gadgets/news/2009/04/amazon-kindle-incidents-highlight-drm-limitations-once-again.ars"&gt;Amazon disabled the accounts of several users Amazon felt were returning books too often&lt;/a&gt;. Not only did this deny the users access to buying new Kindle books, but it also denied them access to &lt;em&gt;already purchased materials that were already on the device&lt;/em&gt;. It&amp;#8217;s unclear exactly what happened, but it seems likely that these users were downloading content, reading a few pages to decide if they wanted it or not (browsing, essentially) and returning some of it because they decided they weren&amp;#8217;t interested at the time.&lt;/p&gt;

&lt;p&gt;Now, the returns issue is an interesting one for the digital media world. On the iPhone, it&amp;#8217;s almost impossible for a user to &amp;#8216;return&amp;#8217; an app that they decided they don&amp;#8217;t like, while on Android, if I buy an app, I can &amp;#8220;return&amp;#8221; it to Google within 24 hours. I actually really like how comic publisher &lt;a href="http://www.iversecomics.com/"&gt;iVerse&lt;/a&gt; has handled this on Android. Each comic runs about 7-8 MiB, which is a fair amount of the App storage on an Android phone (unfortunately). Due to customer complaints about not being able to have very many comics on their phones (since Apps can&amp;#8217;t be stored on the SD Card), iVerse put together an application that allows you to &amp;#8216;save&amp;#8217; your comics to the SD Card, and read them back using a separate, tiny app. &lt;/p&gt;

&lt;p&gt;Of course, with Android&amp;#8217;s 24-hour return policy, there was the fear that users would simply download the 99-cent comic, save it to their SD-card and &amp;#8216;return&amp;#8217; the app, which would not include the content they&amp;#8217;d saved out. As a compromise, the iVerse comics disable the save functionality for the first day you purchase them, allowing you to read them to your hearts content, but not letting you save them until you&amp;#8217;ve passed your return window. Does this prevent you from reading and returning? No. But it at least prevents on-going access to the media if you do choose to return it. Now, I don&amp;#8217;t know how iVerse&amp;#8217;s solution to this problem stands up to piracy, and I&amp;#8217;ll be investigating that soon, but it shows a reasonable compromise on the part of iVerse.&lt;/p&gt;

&lt;p&gt;Back to eBooks, Cory Doctorow recently presented at &lt;a href="http://toccon.blip.tv/"&gt;O&amp;#8217;Reilly&amp;#8217;s &amp;#8220;Tools of Change for Publishing&amp;#8221;&lt;/a&gt; Conference about why DRM is a bad idea for eBooks. Below, is the embedded video of this presentation.&lt;/p&gt;

&lt;p&gt;&lt;embed src="http://blip.tv/play/Afq8JYa7aQ" type="application/x-shockwave-flash" width="640" height="390" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/p&gt;

&lt;p&gt;What I think the takeaway message from Cory&amp;#8217;s talk is what he calls Doctorow&amp;#8217;s Law:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Anytime someone puts a lock on something you own, against your wishes, and doesn't give you the key; They're not doing it for your benefit.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ultimately, the DRM companies, who push the idea of piracy are trying really damn hard to lock you, and your customers, into &lt;em&gt;their&lt;/em&gt; product. Up until recently, this was my problems with the iPod as a music platform (note: this is stil a problem with the iPod as a video platform). And more and more, the vendors are using this to promote lock-in. I don&amp;#8217;t believe Steve Jobs when he says that he never wanted DRM on the iTunes Music Store. iTunes became big because it was easy and provided strong integration with the players, but iTunes was able to &lt;em&gt;stay&lt;/em&gt; big because the DRM locked the users into iTunes. And Amazon is today trying to do the same thing with the Kindle. And Audible (an Amazon subsidiary) is doing the same thing with audio books. Don&amp;#8217;t fall into this trap.&lt;/p&gt;

&lt;p&gt;Doctorow ends his talk reasonably, beseeching the listeners to make sure the choice to use DRM on their content is &lt;em&gt;their&lt;/em&gt; choice, and not the vendor they&amp;#8217;re working with&amp;#8217;s choice. In the end, I think that DRM will &lt;em&gt;always&lt;/em&gt; be the wrong decision long term, and the decision to use DRM will &lt;em&gt;always&lt;/em&gt; negatively impact my decision to do business with a company. I may still end up doing business with them, but if I can find the same (or at least similar enough) media from a non-DRM provider, I will always go with the non-DRM solution.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/68g6owxzhlg" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/04/drm-and-ebooks.html</feedburner:origLink></entry>

<entry>
    <title>Gardening Season Begins</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/ljkLHM-29gE/gardening-season-begins.html" />
    <id>tag:blog.foxxtrot.net,2009://1.337</id>

    <published>2009-04-21T01:19:44Z</published>
    <updated>2009-04-21T01:20:32Z</updated>

    <summary>Saturday marked the beginning of our Gardening Season with the first public work day at the Pullman Community Gardens. Catherine and I went for a couple of hours and helped clear weeds from the main path, and go through the...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Food" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="garden" label="Garden" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;Saturday marked the beginning of our Gardening Season with the first public work day at the &lt;a href="http://sites.google.com/site/koppelfarm/"&gt;Pullman Community Gardens&lt;/a&gt;. Catherine and I went for a couple of hours and helped clear weeds from the main path, and go through the new gardener&amp;#8217;s orientation we didn&amp;#8217;t get last year. &lt;/p&gt;

&lt;p&gt;We also discovered to our chagrin that our plot was not where we thought it was, since it turned out our neighbors from last year. Who were good neighbors, didn&amp;#8217;t have a 20&amp;#8217;x20&amp;#8217; lot, but rather they were using a 20&amp;#8217;x30&amp;#8217; lot (not to mention the roughly 5 square foot melon mound in our plot), so we had to remeasure. Luckily, we are getting ground that was worked last year, so aside from the weeds, it&amp;#8217;s proved fairly easy to work.&lt;/p&gt;

&lt;p&gt;Our plan this year is to dig our our beds lower than our paths, so that we can practice flood irrigation on our beds. Our hope is that will make the watering not only easier, but also require less water. However, this is a fairly large change from last year, so it is requiring a fair amount of soil moving. I expect many more days of sore muscles before we&amp;#8217;re done.&lt;/p&gt;

&lt;p&gt;In other Garden News, we&amp;#8217;ve started our first set of seeds in our apartment. Plenty of salad greens and chard, some tomatoes, peppers, a bit of corn, and a few other things. We&amp;#8217;re hoping to have the salad greens in the dirt before the end of the week, but I&amp;#8217;m not sure when we&amp;#8217;ll get everything out, since frosts can hit at the garden until late March, but even if we can&amp;#8217;t plant everything, we should have a really good start this year, and once we get the beds built, I think our workload should be fairly light this year, save for waterings.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/ljkLHM-29gE" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/04/gardening-season-begins.html</feedburner:origLink></entry>

<entry>
    <title>Crappy Customer Service</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/RlXYoXTRSOg/crappy-customer-service.html" />
    <id>tag:blog.foxxtrot.net,2009://1.336</id>

    <published>2009-04-13T23:26:33Z</published>
    <updated>2009-04-13T23:27:24Z</updated>

    <summary>Okay, this may be stretching the definition of sustainability a bit, but it is probably the single most important considerations for business’ continued success. Below are two stories of particularly heinous customer service experiences I’ve had recently. I’m going to...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Business" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="customerservice" label="Customer Service" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="food" label="Food" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="restaurant" label="Restaurant" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="service" label="Service" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="subscription" label="Subscription" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;Okay, this may be stretching the definition of sustainability a bit, but it is probably the single most important considerations for business&amp;#8217; continued success. Below are two stories of particularly heinous customer service experiences I&amp;#8217;ve had recently. I&amp;#8217;m going to try to make this more than simply a ranting post, but you&amp;#8217;ve been warned about the content to come, and I won&amp;#8217;t begrudge anyone for giving up on this post. The two organizations I&amp;#8217;m planning to drag through the mud today are the Restaurant, &lt;a href="http://cub.wsu.edu/foodvendors_dupusboomers.aspx"&gt;Dupus Boomer&amp;#8217;s&lt;/a&gt;, and the Magazine &lt;a href="http://www.organicgardening.com/"&gt;Organic Gardening&lt;/a&gt; (and their publisher &lt;a href="http://www.rodaleinc.com/"&gt;Rodale&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First, Dupus Boomer&amp;#8217;s. Dupus is a fairly local chain restaurant that opened up a location in the &lt;a href="http://cub.wsu.edu/"&gt;Compton Union Building&lt;/a&gt; at WSU. It&amp;#8217;s the only non-fast food option in the CUB, and while it&amp;#8217;s a bit more expensive, I would occasionally like to go up there for lunch. However, since the first two weeks of them being open, the service has been consistently degrading. It&amp;#8217;s long been the case that to get faster service, you&amp;#8217;d want to go grab a seat in the bar area, and generally you&amp;#8217;d fairly quickly get some member of the waitstaff to take an order. However, as the last few months have gone by, every time I&amp;#8217;ve been in the service has gotten consistently worse. &lt;/p&gt;

&lt;p&gt;This came to a head last week. I sat down just after noon, knowing that I had a meeting to be at by 1pm. This is normally plenty of time. The Waitress approaches me immediately after I sit down, and I ask for water, and a few minutes to read through the menu. Fifteen minutes later, the waitress finally returns to take my order, but not deliver my water. That happened to be the last time I saw my waitress.&lt;/p&gt;

&lt;p&gt;Now, it was reasonably busy in the restaurant that day. Almost every table was full, but due to the relatively slow kitchen, the turnaround was not such that the waitstaff should have had a lot of trouble keeping up with the crowd. Perhaps it&amp;#8217;s because I used to work the lunch rush at a bar about the same size as Dupus, but I really have no sympathy for waitstaff feeling rushed during lunch. Most people only have an hour for lunch, that&amp;#8217;s the way it works, and those people need to get in and out of the restaurant as quickly as possible.&lt;/p&gt;

&lt;p&gt;My food finally arrived with about ten minutes before one. I ate, quicker than I really wanted to, and tried to get the attention of a member of the wait staff so I could get my bill. Oh, and that water which hadn&amp;#8217;t arrived yet. A few minutes passed, I was unsuccessful, and I was forced to leave without paying. This is the first time I&amp;#8217;ve &lt;em&gt;ever&lt;/em&gt; walked out of a restaurant without paying. Even at my least happy with the food and/or service, I&amp;#8217;ve never been forced to leave without paying. Some might argue that I shouldn&amp;#8217;t have gone if I had a deadline, but I&amp;#8217;ve always been of the opinion that a restaurant needs to be able to get a customer in and out within about thirty minutes. If you can&amp;#8217;t manage that, you shouldn&amp;#8217;t be open for lunch. Period.&lt;/p&gt;

&lt;p&gt;This was, for me, the last straw in terrible service. I will not be returning to the restaurant, and I&amp;#8217;ve been vocal in my being fed up with their lousy service. I already know others that were growing tired of Dupus Boomer&amp;#8217;s, and I hope that they figure out a way to improve their lousy service, because a full-service restaurant in the heart of campus should be a &lt;em&gt;lot&lt;/em&gt; better idea than it&amp;#8217;s turned out to be.&lt;/p&gt;

&lt;p&gt;I almost feel bad going after this second business, Rodale Publishing. They publish a lot of health related magazines and books, and honestly there seemed to be lot to like about the Organic Gardening magazine that I&amp;#8217;d ordered a free trial issue of for my wife. Please note that this was a &lt;em&gt;&lt;a href="https://secure.rodale.com/webapp/wcs/stores/servlet/OaeEntryPage?storeId=10057&amp;amp;mktOfferId=OGD20234&amp;amp;keycode=I9BP2012"&gt;Free Trial Issue&lt;/a&gt;&lt;/em&gt;, which in my experience has always meant that if I decided I didn&amp;#8217;t want the subscription, they&amp;#8217;d stop harassing me about it. Sure, I&amp;#8217;d probably get a few statements in the mail, but they&amp;#8217;d give up within two or three months. Since I wasn&amp;#8217;t entirely sure when I placed the order that we would subscribe, I just put in for the &lt;/p&gt;

&lt;p&gt;This didn&amp;#8217;t happen with Rodale and Organic Gardening. Now, mind you, we did fully intend to subscribe to the magazine. It probably didn&amp;#8217;t help that it was the middle of winter, but we just didn&amp;#8217;t get back to Rodale right away. We continued to get statements about once a month, and I&amp;#8217;d continue to remind my wife that she should send in a check if she wanted to subscribe (which she did). Then, we started getting bills marked with things like &amp;#8216;final notice&amp;#8217;, culminating in an actual letter from what appeared to be a collections agency (it didn&amp;#8217;t quite pass the smell test, so we&amp;#8217;re unsure if it was a real collections letter).&lt;/p&gt;

&lt;p&gt;A Collections Letter because we hadn&amp;#8217;t paid for a subscription on the back of our &lt;em&gt;free&lt;/em&gt; trial issue? Are you serious?&lt;/p&gt;

&lt;p&gt;Needless to say, what had orignally been a subscription we just hadn&amp;#8217;t gotten around to paying for yet, has now become a magazine, and a publisher, that we intend not to do business with. Unfortunately, this means that Catherine is currently in the market for a gardening magazine that actively discourages the use of chemical fertilizers and pesticides. If anyone has any suggestions, please suggest away, we&amp;#8217;re in the market.&lt;/p&gt;

&lt;p&gt;So, here are two companies that have lost my business. And, I don&amp;#8217;t doubt, won&amp;#8217;t have their reputations tarnished by me telling of these experiences. In the case of Dupus Boomer&amp;#8217;s, it was due to continued poor service on the part of the waitstaff. Having worked the back of house at a restaurant before, I sympathize with the problems a bad front of house can cause, but ultimately utter failure on both sides of that equation can cause major problems for a restaurant. As for Rodale&amp;#8230; threatening me as a customer is the fastest way to cause me to drop my service with you. I&amp;#8217;m not talking about cutting of my service because I haven&amp;#8217;t paid. I earned that. But it&amp;#8217;s like stores that have a no backpack policy. I understand the reason for the policy, but I&amp;#8217;ll still leave the store without buying anything if I&amp;#8217;m asked to turn over my bag. Respect me as the customer, and if you don&amp;#8217;t think you can for whatever reason, be prepared to lose me.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/RlXYoXTRSOg" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/04/crappy-customer-service.html</feedburner:origLink></entry>

<entry>
    <title>YUI Now on TaskSpeed Benchmark</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/jCdQmLhn6Hw/yui-now-on-taskspeed-benchmark.html" />
    <id>tag:blog.foxxtrot.net,2009://1.335</id>

    <published>2009-04-10T22:25:23Z</published>
    <updated>2009-04-10T22:29:17Z</updated>

    <summary>This last two weeks involved some work by a few YUI community members, and the YUI team to bring YUI to the TaskSpeed JavaScript benchmark. TaskSpeed is based off of SlickSpeed, and both are designed to test the CSS Selector...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="benchmark" label="Benchmark" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jquery" label="JQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="yui" label="YUI" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;This last two weeks involved some work by a few &lt;a href="http://yuilibrary.com/"&gt;YUI community&lt;/a&gt; members, and the YUI team to bring YUI to the &lt;a href="http://dante.dojotoolkit.org/taskspeed/"&gt;TaskSpeed&lt;/a&gt; JavaScript benchmark. TaskSpeed is based off of &lt;a href="http://github.com/kamicane/slickspeed/tree/master"&gt;SlickSpeed&lt;/a&gt;, and both are designed to test the CSS Selector engines used by popular JavaScript libraries, but TaskSpeed adds basic DOM manipulation tasks in an attempt to determine the speed of that JavaScript Framework for common operations. &lt;/p&gt;

&lt;p&gt;I was asked to lend a hand with the TaskSpeed tests for YUI, and while I did contribute &lt;em&gt;some&lt;/em&gt; code, the bulk of the work was done by &lt;a href="http://github.com/eferraiuolo"&gt;Eric Ferraiuolo&lt;/a&gt;, with some performance cleanups offered by &lt;a href="http://github.com/lsmith"&gt;Luke Smith&lt;/a&gt; of Yahoo!. The YUI 2.7.0 version is already up on the TaskSpeed site, and we&amp;#8217;re waiting on some fixes to land in the &lt;a href="http://github.com/yui/yui3/tree"&gt;YUI 3 branch on GitHub&lt;/a&gt;, namely a few weaknesses surrounding YUI 3&amp;#8217;s CSS Selectors that need to be addressed. The small amount of work I did was around the YUI 3 tests.&lt;/p&gt;

&lt;p&gt;What I found to be greatly impressive was how well YUI 2 holds up compared to, say, &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt;. YUI has a reputation among a lot of web developers for being really bloated. At least with YUI 2, this seems to have little basis. The YUI-270.js filed used in TaskSpeed weighs in at only 44K, easily the most compact of the frameworks (JQuery 1.3.2, comes in second at 56K). Not only that, but in several cases it significantly outperforms the other frameworks (to be fair, in a few tests, it&amp;#8217;s beaten out by JQuery handily).&lt;/p&gt;

&lt;p&gt;This is probably one of the most significant comparisons of Framework performance that I&amp;#8217;ve seen, since it&amp;#8217;s one of the only benchmarks I&amp;#8217;m familiar with that specifically targets the Frameworks, and not the underlying browser engine. Due to this, it serves as a good benchmark for decided what kind of DOM operations are most important to your app, and what engine will likely do best under those circumstances. On the other hand, the tests are somewhat contrived as they usually involve a significant number of repititions on a test, which is somewhat less realistic, but still interesting.&lt;/p&gt;

&lt;p&gt;Ultimately, should you choose your JavaScript library based on this test? Probably not. All of the libraries featured in TaskSpeed perform fast enough that under normal circumstances you&amp;#8217;d probably not notice major differences in application performance. More important, is if the engine enables you to write what you consider to be &amp;#8216;good&amp;#8217; code. Plus, these tests aren&amp;#8217;t always consistent. I ran TaskSpeed on my workstation on Windows Server 2008 in Workstation Mode on Firefox 3.0.8, and on an Ubuntu 8.10 VMWare VM on the same workstation on Firefox 3.0.3. The removeclass test for the &lt;a href="http://qooxdoo.org/"&gt;qooxdoo 0.8.2&lt;/a&gt; library took 20 ms in the VM, and 181 ms on my workstation. And yes, normally the workstation was 25-40% faster than the VM. I&amp;#8217;m on an quad core machine which isn&amp;#8217;t doing a whole hell of a lot, so all I can figure was that the browser got swapped away from for some reason at an inopportune time or something. &lt;/p&gt;

&lt;p&gt;It will be interesting to see how YUI 3 fares as some of the bugs in the framework (which is still alpha) get worked out, and the speed improved. YUI 3 is definitely a syntactic improvement over YUI 2, but I hope that the YUI team, and the Community surrounding them (particularly now that code can be more &lt;a href="http://github.com/yui"&gt;easily contributed to via github&lt;/a&gt;), will work to make YUI 3 a faster and better product than YUI 2 is today. While I may be downplaying the significance of benchmarks in general, I do feel this is significant because it shows that YUI really does hold it&amp;#8217;s own among other frameworks.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/jCdQmLhn6Hw" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/04/yui-now-on-taskspeed-benchmark.html</feedburner:origLink></entry>

<entry>
    <title>Software and Copyright Law</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/MuPdiTpaayw/software-and-copyright-law.html" />
    <id>tag:blog.foxxtrot.net,2009://1.334</id>

    <published>2009-04-07T23:47:08Z</published>
    <updated>2009-04-07T23:47:53Z</updated>

    <summary>One of the meetings I attended at Boise Code Camp this year was Brad Frazer’s talk on Copyright Law as it applies to Software. This was an interesting session, at least in part because it was presented, not by a...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Life" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="copyright" label="Copyright" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="law" label="Law" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="programming" label="Programming" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="software" label="Software" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;One of the meetings I attended at &lt;a href="http://www.boisecodecamp.org/"&gt;Boise Code Camp&lt;/a&gt; this year was &lt;a href="http://twitter.com/bfrazjd"&gt;Brad Frazer&lt;/a&gt;&amp;#8217;s talk on Copyright Law as it applies to Software. This was an interesting session, at least in part because it was presented, not by a software guy, but by a lawyer, which for many, seemed to be a different take on the issue than most people are familiar with. Having followed the Open Source world for so long, and having a mind which finds Law somewhat interesting, I got the impression I was more prepared than many, but even then, it was interested to hear Mr. Frazer&amp;#8217;s take on these issues.&lt;/p&gt;

&lt;p&gt;The discussion began with defining Copyright. Beginning of course with the fact that Copyright, is not a verb. You don&amp;#8217;t &amp;#8220;copyright&amp;#8221; something. You can &amp;#8220;create copyright&amp;#8221; on something, like I am as I write these words right now. You can &amp;#8220;register&amp;#8221; copyrights, like I would if I sent the contents of my Blog to the Federal Copyright Office. But Copyright is not a verb. And Copyright can apply in interesting ways. These words are copyrighted because I am writing them in a &lt;em&gt;tangible form&lt;/em&gt;. However, if I was simply delivering a lecture on these issues, and not actually even writing it down, it wouldn&amp;#8217;t, because air is not a tangible medium.&lt;/p&gt;

&lt;p&gt;So, anytime you write a code, and commit it to a tangible medium (aka, you&amp;#8217;re hard disk), you&amp;#8217;re creating copyright around that material. However, who owns that Copyright? This issue is a lot less clear. Generally speaking, when I create copyright, I&amp;#8217;m the sole holder of that copyright. Even if I create code for a client, on a for-pay arrangement, that copyright is absolutely mine (unless, of course, I&amp;#8217;ve assigned the copyright to them). However, if I write the code for my employer, the copyright belongs to &lt;em&gt;them&lt;/em&gt;. So, the copyright to any code I write for my current employer is automatically held by Washington State University, and I have zero claim to that copyright.&lt;/p&gt;

&lt;p&gt;This can be tricky, becuase if I were to get a job at, say, University of Washington, doing the same things that I&amp;#8217;ve done here at WSU, I could get my new employer in trouble for implementing code too similarly to how I&amp;#8217;d implemented it at my old employer, because the copyright that my previous employer held on a particular method of implementing an idea. Which is another good point, copyright does not cover ideas. It only covers particular representations of ideas. So, if I develop a new algorithm, anyone can implement that algorithm as long as they don&amp;#8217;t implement it the same way I did, and not run afoul of copyright law. If I want to protect the idea, I&amp;#8217;d have to patent it. Please, I&amp;#8217;m not trying to start an argument about Software Patents, I happen to dislike the current state of software patents, I&amp;#8217;m just making a point.&lt;/p&gt;

&lt;p&gt;What was more interesting was Frazer&amp;#8217;s claim that if you don&amp;#8217;t register your copyrights, you&amp;#8217;re basically completely unable to defend them. I wasn&amp;#8217;t sure I bought that, so I made a comment on not sure I believed that to Frazer on Twitter. He directed me to the the US Code, specifically &lt;a href="http://www4.law.cornell.edu/uscode/17/usc_sec_17_00000411----000-.html"&gt;Title 17, Chapter 4, Section 411&lt;/a&gt;, which basically states that if you don&amp;#8217;t register your copyright, you&amp;#8217;re basically unable to sue to defend it. Huh.&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s even more strange to me is how Copyright applies to Open Source projects. Some Open Source projects, generally those which are corporately backed, do require Contributor License Agreements (CLA), which generally contains a clause which assigns your copyright to the project when you contribute to it. How many of those projects register these copyrights? I have no idea, though I&amp;#8217;d be curious to see. However, I know that most projects never bother. When Frazer first talked about this registration thing, I got the impression that he felt that FLOSS was not defensible in court, a statement which I know to be untrue. &lt;/p&gt;

&lt;p&gt;Frazer did also address this issue on twitter, referencing a Federal Appeals Court case &lt;a href="http://www.cafc.uscourts.gov/opinions/08-1001.pdf"&gt;Jacobsen v Katzer&lt;/a&gt;, which addresses the defensibility and protection of Open Source Software rather well. In short, Open Source software is defensible in court, and don&amp;#8217;t let anyone tell your otherwise. &lt;/p&gt;

&lt;p&gt;Copyright is a serious issue, and one which has become increasingly confusing over the last several decades. If you really think you may need to (or hell, even &lt;em&gt;want&lt;/em&gt; to) defend a copyright in court, make sure you register it. It&amp;#8217;s likely to be the only way you&amp;#8217;ll ever successfully defend it.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/MuPdiTpaayw" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/04/software-and-copyright-law.html</feedburner:origLink></entry>

<entry>
    <title>Beef Alternatives</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/Rv4v_QVniug/beef-alternatives.html" />
    <id>tag:blog.foxxtrot.net,2009://1.333</id>

    <published>2009-04-06T22:36:43Z</published>
    <updated>2009-04-06T22:37:24Z</updated>

    <summary>A few weeks ago, there was a ton of discussion in the blogosphere about a recent study that suggested that grass-fed beef produced 50% more carbon emissions than grain-finished beef. With all the discussion regarding the environmental damage of the...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Food" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="beef" label="Beef" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="environment" label="Environment" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="environmentalism" label="Environmentalism" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="food" label="Food" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;A few weeks ago, there was a &lt;a href="http://civileats.com/2009/03/02/surprising-news-about-grass-finished-beef/"&gt;ton of discussion&lt;/a&gt; in the &lt;a href="http://civileats.com/2009/03/17/another-take-on-the-grass-fed-controversy/"&gt;blogosphere&lt;/a&gt; about a &lt;a href="http://www.sciencenews.org/view/generic/id/40934/title/AAAS_Climate-friendly_dining_%25E2%2580%25A6_meats"&gt;recent study that suggested that grass-fed beef produced 50% more carbon emissions than grain-finished beef&lt;/a&gt;. With all the discussion regarding the environmental damage of the feed-lot system, this news really surprised a lot of people. The reason of course, was simple. Grass-fed cows live longer, and therefore fart more. It doesn&amp;#8217;t help that Cows are particularly awful at the task of converting feed into meat. &lt;/p&gt;

&lt;p&gt;Of course, in my opinion to look at the CO2 and methane emissions of a single cow over it&amp;#8217;s lifetime woefully oversimplifies the environmental picture of the food system. The vast lagoons of animal waste so toxic that no one would dream of spreading them on food crops. The relatively high-acid rumens of grain-fed cattle which encourages the growth of acid-tolerant strains of bacteria (E.coli in particular), the high levels of antibiotics present in feedlot beef. At least with grass-finished cattle, they tend to be raised in smaller herds and can therefore provide a closer-to-real-nature ecosystem.&lt;/p&gt;

&lt;p&gt;However, when compared to other animals, perhaps the real problem is simply stated: There are simply too many cows. Go to your local supermarket, and you&amp;#8217;ll generally see three main kinds of land-based meat prominently displayed: beef, pork, and chicken. And it&amp;#8217;s not uncommon for the beef section to be larger than the pork and chicken sections &lt;em&gt;combined&lt;/em&gt;. Now, I love beef. And we eat a fair amount of it. Compared to chicken and pork (and the wide variety of other animals we could choose to eat), we eat more beef than any other meat. However, we are looking at converting our beef to locally raised heritage cattle (&lt;a href="http://en.wikipedia.org/wiki/Belted_Galloway"&gt;Belted Galloway&lt;/a&gt;&amp;#8217;s), which will support a healthier poly-culture in the beef world, as well as &lt;em&gt;hopefully&lt;/em&gt; having less environmental impact than the meat-factory breeds favored by most cattlemen today.&lt;/p&gt;

&lt;p&gt;Still we need to be looking at other sources of meat as well. I&amp;#8217;ve yet to find a local source of Pork, but the same person who sells the Belted Galloway&amp;#8217;s also sells chickens at reasonable prices. When we have our own house, my wife and I certainly plan to raise chickens (mostly for eggs), and have also discussed raising rabbits for meat as well. The rabbits thing is particularly interesting, not because I&amp;#8217;ve been told I would be the one responsible for the actual slaughter, but rather because it wasn&amp;#8217;t terribly long ago that rabbit was a reasonably common meat. My father remembers raising rabbits for food when he was young, but my only experience with rabbit was in the form of a cassoulet I had at a Pullman restaurant over a year ago. Luckily for me (I think), my University offers a &lt;a href="http://cru.cahe.wsu.edu/CEPublications/eb0975/eb0975.pdf"&gt;helpful document&lt;/a&gt; on raising rabbits in Washington State, which actually mentions raising Rabbits to supplement your family&amp;#8217;s meat supply. Not surprisingly, the document is originally dated 1914.&lt;/p&gt;

&lt;p&gt;Like I said, most people these days have never really thought about these animals as food, I guess.&lt;/p&gt;

&lt;p&gt;I understand a lot of people would have a mental block with eating rabbit meat. I would have some trouble being comfortable with eating dog or cat. For me, the greater point, is that we need to diversify our meat production. Personally, I think it&amp;#8217;s worth doing some of this raising on our own, but then I think that most people are simply too far removed from their food.&lt;/p&gt;

&lt;p&gt;Above all, just look at different alternatives. Rabbit, Lamb, Pork, Game, so much more. There are so many tastes our there that we&amp;#8217;re potentially missing out on, and frankly, the more diverse our food system is, the healthier both ourselves, and quite possibly our planet, is likely to be.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/Rv4v_QVniug" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/04/beef-alternatives.html</feedburner:origLink></entry>

<entry>
    <title>Daemon by Daniel Suarez</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/KBgsVdBrp6U/daemon-by-daniel-suarez.html" />
    <id>tag:blog.foxxtrot.net,2009://1.332</id>

    <published>2009-04-03T21:51:48Z</published>
    <updated>2009-04-03T21:53:00Z</updated>

    <summary>A few months back, I heard a few people going on about a book by a new novelist, who just happened to be a software developer by trade. Suarez wrote his first novel about our world, but with a computer...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Books" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="books" label="Books" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="reviews" label="Reviews" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="security" label="Security" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="technology" label="Technology" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;A few months back, I heard a few people going on about a book by a new novelist, who just happened to be a software developer by trade. Suarez wrote his first novel about our world, but with a computer program written by a dead genius who is putting into action a plan he&amp;#8217;d generated before his death. &lt;/p&gt;

&lt;p&gt;Daemon opens with Detective Sargent Peter Sebeck, who works in a sleepy Southern California town, responding to a suspicious death at a mostly vacant lot. A programmer at CyberStorm Entertainment was going on his normal motorcycle ride through a field in Thousand Oaks, California, when suddenly, he catches his neck under his helmet on a steel cable, cutting his carotid artery. As Sebeck investigates this, another CyberStorm programmer is killed by an electrified door frame as he leaves CyberStorm&amp;#8217;s server room. Something is clearly going on with CyberStorm, who&amp;#8217;s CEO Matthew Sobol has recently died of Cancer.&lt;/p&gt;

&lt;p&gt;It is soon revealed that Sobol wrote a Daemon, a piece of software which sits waiting for a certain thing to occur before taking a particular action, which is carrying out an unknown will of his. What&amp;#8217;s most impressive, is that Suarez writes each individual piece of the Daemon such that it&amp;#8217;s actions seem possible given today&amp;#8217;s technology. Could one person write a large scale distributed process like this that infiltrated systems all over the world without anyone noticing? &lt;em&gt;Probably&lt;/em&gt; not. But then, like I said, each individual piece is wholly plausible.&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s really amazing is that as technologically advanced as the Daemon is, using really advanced Text-to-Speech to communicate with people most of the time, it&amp;#8217;s limitations are really apparent as well. The Daemon generally offers choices, but it can only accept Yes or No responses, and constantly through the story, people get confused and try to communicate with the Daemon as if it were another person, and it constant has to remind people it can only accept Yes or No answers. Astonishingly, this idea, which is repeated often, never really gets annoying, because it&amp;#8217;s hard to fault the characters for the error.&lt;/p&gt;

&lt;p&gt;The only thing is the book that really required me to suspend my disbelief was Sobol&amp;#8217;s amazing ability to have seemingly planned for a nearly infinite number of possibilities. While this didn&amp;#8217;t ruin my ability to enjoy the book, at times it is a fairly painful source of disbelief. As the story goes on, the Daemon&amp;#8217;s resources grow and the Daemon&amp;#8217;s Operatives get access to some very, very cool technology. Some of which I don&amp;#8217;t believe is available today, though if any of it is, it&amp;#8217;s clearly unreasonably expensive.&lt;/p&gt;

&lt;p&gt;If I have one problem with this book, it&amp;#8217;s that it&amp;#8217;s clearly a setup to future novels. In fact, Suarez has another book, Freedom, coming out next year. Because of this, the ending sort of leaves you hanging. It&amp;#8217;s basically a huge To Be Continued at the end of the novel. I&amp;#8217;m fine with more books coming. Hell, I&amp;#8217;m glad there are. But I really wish that the ending of this had been just a little more complete and satisfying for this novel. As it stands, Daemon doesn&amp;#8217;t quite stand on it&amp;#8217;s own, and I&amp;#8217;d have been more satisfied had I felt better about the ending. Maybe if the last chapter had been an Afterword instead of a chapter, that small disconnect would have fixed it for me&amp;#8230;&lt;/p&gt;

&lt;p&gt;Daemon is a great book, and a great first novel for a new author. It&amp;#8217;s really nice having a novel that deals with technology in an immensely realistic way. Even the things that I&amp;#8217;m not sure exist today, had reasonable explanations based on modern scientific research. If you&amp;#8217;re interested in a good modern thriller, I honestly don&amp;#8217;t think you could do much better than Daemon. It&amp;#8217;s well researched and written, and it&amp;#8217;s a fun read. Pick it up, it&amp;#8217;s worth it.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/KBgsVdBrp6U" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/04/daemon-by-daniel-suarez.html</feedburner:origLink></entry>

<entry>
    <title>Confusing Code And Data Is Dangerous</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/OkhXKEjC0lg/confusing-code-and-data-is-dangerous.html" />
    <id>tag:blog.foxxtrot.net,2009://1.331</id>

    <published>2009-04-02T20:32:18Z</published>
    <updated>2009-04-03T21:50:19Z</updated>

    <summary>At Code Camp last weekend, I attended a session on the Spark View Engine for ASP.NET MVC (which was just released under the MS-PL!). Actually, there were a lot of things I liked about the look of Spark, and I...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="code" label="Code" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="json" label="JSON" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="programming" label="Programming" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="psychology" label="Psychology" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="security" label="Security" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;At Code Camp last weekend, I attended a session on the &lt;a href="http://sparkviewengine.com/"&gt;Spark View Engine&lt;/a&gt; for &lt;a href="http://asp.net/mvc"&gt;ASP.NET MVC&lt;/a&gt; (&lt;a href="http://haacked.com/archive/2009/04/01/aspnetmvc-open-source.aspx"&gt;which was just released under the MS-PL!&lt;/a&gt;). Actually, there were a lot of things I liked about the look of Spark, and I might consider using it on future projects. I plan to talk a little more about Spark later, but this post is more about something I heard time and again from the Presenter, which, while I understand why he was saying it, I consider to be a dangerous mistake in that it promotes dangerous thinking.&lt;/p&gt;

&lt;p&gt;The thing that bothered me when he started talking about handling JSON data. The example he presented involved a simple table of names that could be updated dynamically via JavaScript, essentially he&amp;#8217;d send JSON data which would be used to build new table rows. The JSON data resembled the following:&lt;/p&gt;

&lt;p&gt;&lt;textarea class="code javascript"&gt;
[
    { firstName: &amp;#8220;Bill&amp;#8221;, lastName: &amp;#8220;Paxton&amp;#8221; },
    { firstName: &amp;#8220;John&amp;#8221;, lastName: &amp;#8220;Doe&amp;#8221; },
    { firstName: &amp;#8220;Malcolm&amp;#8221;, lastName: &amp;#8220;Reynolds&amp;#8221; }
]
&lt;/textarea&gt;&lt;/p&gt;

&lt;p&gt;The problem I had, was that he kept referring to the JSON data as &amp;#8220;JavaScript&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Okay, I know that JSON is short for the JavaScript Object Notation. I know that JSON can be eval&amp;#8217;d inside of a JavaScript engine to result in the data object that it represents. But, JSON is not JavaScript. And thinking that is such is incredibly dangerous.&lt;/p&gt;

&lt;p&gt;Why is JSON &lt;em&gt;not&lt;/em&gt; JavaScript? For one, the &lt;a href="http://json.org/"&gt;JSON Specfication&lt;/a&gt; does not allow code. It is a pure data format. For another, while JSON may have originally been borne out of the JavaScript world, it has grown into a common data representation used for data transfer from any number of languages. But most importantly, executing JSON without verifying it follows the specification is amazingly dangerous. There is a reason why all the major JavaScript frameworks I&amp;#8217;m aware of offer special JSON parsers. JSON is data, and treating it as code opens you up to any number of attack vectors.&lt;/p&gt;

&lt;p&gt;JavaScript is a Programming Language. JSON is merely a data format. Yes, JSON is a subset of JavaScript, but it is far more strict than JavaScript is. Use a library to parse your JSON, instead of just eval&amp;#8217;ing it, and remember to keep a strong mental distinction between your code and your data. Just because they might resemble each other, doesn&amp;#8217;t mean you should treat them the same.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/OkhXKEjC0lg" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/04/confusing-code-and-data-is-dangerous.html</feedburner:origLink></entry>

<entry>
    <title>Boise Code Camp 2009</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/bUpplXH9Vto/boise-code-camp-2009.html" />
    <id>tag:blog.foxxtrot.net,2009://1.330</id>

    <published>2009-03-31T22:16:12Z</published>
    <updated>2009-03-31T22:16:54Z</updated>

    <summary><![CDATA[Boise Code Camp &amp; Tech Fest was this last weekend, and while I didn&#8217;t present this year (they had claimed to be full before I put together a presentation), I really enjoyed the presentations, and feel like I was able...]]></summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Computing" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="boise" label="Boise" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="codecamp" label="Code Camp" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;&lt;a href="http://boisecodecamp.com/"&gt;Boise Code Camp &amp;amp; Tech Fest&lt;/a&gt; was this last weekend, and while I didn&amp;#8217;t present this year (they had claimed to be full before I put together a presentation), I really enjoyed the presentations, and feel like I was able to contribute, even though I was not a presenter. I attended quite a few sessions, many of which I&amp;#8217;ll be talking about in greater detail in the coming weeks here, but I figured I&amp;#8217;d give my impression of the event here, before I dive into the technical details.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve only been able to attend three Code Camps in the last few years. Two in Boise, and one is Seattle. Of the two cities, I&amp;#8217;ve found that Boise consistently puts on the better events. This isn&amp;#8217;t a put-down to Seattle per se. Boise&amp;#8217;s event is simply a larger one, and despite it&amp;#8217;s size, it&amp;#8217;s very well run. However, this year was definitely a shadow of last years event, the economic downturn having (unsurprisingly) significantly reduced the corporate sponsorship of the event. &lt;/p&gt;

&lt;p&gt;I attended a variety of sessions on subjects ranging from WPF, to ASP.NET MVC, to Mono, to Map-Reduce, to Android, to Unit Testing. This particular Code Camp is incredibly Microsoft-centric, which is another reason I wish I&amp;#8217;d put together a presentation on YUI, git or something similar. Still, I picked up som pretty cool information, which I intend to share here.&lt;/p&gt;

&lt;p&gt;We have once again raised the issue of trying to do a Code Camp in Pullman, trying to pull in the Moscow/Pullman crowd, as well as Spokane (which lacks a code-camp of it&amp;#8217;s own). It&amp;#8217;s an exciting proposition, but we&amp;#8217;re unsure how easily we can simply pull the event together. I bring this up here, merely to gauge interest, particularly of those in the Moscow/Pullman/Lewiston/Clarkston/Spokane/Coeur D&amp;#8217;Alene areas who would be our primary targets.&lt;/p&gt;

&lt;p&gt;Lastly, I just want to congratulate the Boise Code Camp team on an excellent event, and I&amp;#8217;m definitely looking forward to next year.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/bUpplXH9Vto" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/03/boise-code-camp-2009.html</feedburner:origLink></entry>

<entry>
    <title>Semantic HTML</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/-yKRSfWRn-4/semantic-html.html" />
    <id>tag:blog.foxxtrot.net,2009://1.329</id>

    <published>2009-03-24T18:54:55Z</published>
    <updated>2009-03-24T18:56:38Z</updated>

    <summary>The last couple of weeks have featured some really excellent videos from Yahoo!’s Nate Koechley on Semantic HTML and Unobtrusive JavaScript. One was at MIX in Vegas, a Microsoft conference, but the other was at Yahoo!, and has been put...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Internet" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="accessibilty" label="Accessibilty" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="html" label="HTML" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="video" label="Video" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="yahoo" label="Yahoo!" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;The last couple of weeks have featured some really excellent videos from Yahoo!&amp;#8217;s Nate Koechley on Semantic HTML and Unobtrusive JavaScript. One was at MIX in Vegas, a Microsoft conference, but the other was at Yahoo!, and has been put on YUI Theater. I&amp;#8217;ve gone ahead and embedded the video below.&lt;/p&gt;

&lt;p&gt;&lt;div&gt;&lt;object width="512" height="322"&gt;&lt;param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.40" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="AllowScriptAccess" VALUE="always" /&gt;&lt;param name="bgcolor" value="#000000" /&gt;&lt;param name="flashVars" value="id=12486762&amp;amp;vid=4671445&amp;amp;lang=en-us&amp;amp;intl=us&amp;amp;thumbUrl=http%3A//l.yimg.com/a/p/i/bcst/videosearch/7843/81860441.jpeg&amp;amp;embed=1" /&gt;&lt;embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.40" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=12486762&amp;amp;vid=4671445&amp;amp;lang=en-us&amp;amp;intl=us&amp;amp;thumbUrl=http%3A//l.yimg.com/a/p/i/bcst/videosearch/7843/81860441.jpeg&amp;amp;embed=1" &gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://video.yahoo.com/watch/4671445/12486762"&gt;Nate Koechley: &amp;quot;Professional Frontend Engineering&amp;quot;&lt;/a&gt; @ &lt;a href="http://video.yahoo.com" &gt;Yahoo! Video&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Utlimately, I&amp;#8217;ve always been a fan of semantic HTML. Was I not simply using default templates for this blog, I&amp;#8217;d have strived to do them in a semantic fashion. I am working on this upgrade, but other things have taken their priority. However, in the code that I design, I strive for a meaningful layout and semantic accuracy. It probably helps that with my recent return to MUDding, and therefore to hanging out online with Blind-folks, the ability of the Semantic Web to aid Screen Readers is more apparent to me.&lt;/p&gt;

&lt;p&gt;This video was nothing I&amp;#8217;d never seen from Yahoo!, but it underscores part of why I&amp;#8217;m so in love with Yahoo!&amp;#8217;s attitude toward the web. The feeling that you always need to offer &lt;em&gt;some&lt;/em&gt; experience, even if it&amp;#8217;s not the prettiest experience, is a powerful one particular when paired with the principle of Progressive Enhancement. Now, admittedly, there are other companies that also follow this tenet, but I know of plenty of websites, including those I use regularly, that simply won&amp;#8217;t function without JavaScript (and fairly modern JavaScript at that), and I&amp;#8217;m unsure how they function for the blind.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s an interesting choice, to choose not to support a given demographic for whatever reason, and while I fully support people&amp;#8217;s ability to do so, I also believe it&amp;#8217;s not terribly difficult to simply do things in a standards compliant and semantic fashion, which can certainly ease the process of offering more universal support.&lt;/p&gt;

&lt;p&gt;There is one place where my benevolence doesn&amp;#8217;t extend however. Recently, &lt;a href="http://wsu.edu/"&gt;Washington State University re-did their homepage&lt;/a&gt;, which I think is a major improvement. The flash-object in the center of the screen is dynamically loaded at runtime using the &lt;a href="http://code.google.com/p/swfobject/"&gt;swfobject&lt;/a&gt; library to detect flash, and provide good content even if Flash isn&amp;#8217;t available. I&amp;#8217;ve been working on a JavaScript widget that would support my video embeds more cleanly on this blog using swfobject, but again, other things&amp;#8230;&lt;/p&gt;

&lt;p&gt;This did raise the ire of a web developer or two on campus who had installed flash-blocking add-ons into Firefox. The issue is that SwfObject detected that Flash was available, but the Extension stepped in and prevented the flash from loading, replacing the nice noscript/noflash version of the page with ugly &amp;#8216;click here to play flash&amp;#8217; mechanisms. My argument, and the opinion held by the head of the team that designed the site, is that people who&amp;#8217;ve chosen to handicap their web browsers in this sort of way (which isn&amp;#8217;t to say there aren&amp;#8217;t reasons you&amp;#8217;d want to), can deal with the consequences of such decisions. Ideally, these extensions would provide some mechanism to detect their presence, and if they&amp;#8217;d object to Flash being loaded (given that most of these extensions allow whitelisting), but until such a time as that happens, I believe the implementation we have is the best we can. However, I am open to suggestions.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/-yKRSfWRn-4" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/03/semantic-html.html</feedburner:origLink></entry>

<entry>
    <title>Budget Hosting Woes</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/jbQ17WdfH1k/budget-hosting-woes.html" />
    <id>tag:blog.foxxtrot.net,2009://1.328</id>

    <published>2009-03-17T22:27:26Z</published>
    <updated>2009-03-17T22:27:54Z</updated>

    <summary>As I no doubt suspect a few people other than myself noted last week, my site was basically completely down for the last week. This was, to say the least, incredibly inconvenient, since I was without e-mail, unable to post...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Internet" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="hosting" label="Hosting" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="web" label="Web" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;As I no doubt suspect a few people other than myself noted last week, my site was basically completely down for the last week. This was, to say the least, incredibly inconvenient, since I was without e-mail, unable to post to this blog, among other things. &lt;/p&gt;

&lt;p&gt;My hosting is currently through &lt;a href="http://www.mjzhosting.net/main.php"&gt;MJZ Hosting&lt;/a&gt;, a very small company with pretty amazingly low rates. I&amp;#8217;m paying less than a dollar a week for 1 GiB of storage and 30 GiB of traffic every month. An extra five dollars a year, grants me SSH access. I have as many Databases as I want. As many subdomains as I want. And as many e-mail addresses I want. It&amp;#8217;s an amazing deal. And it works.&lt;/p&gt;

&lt;p&gt;Most of the time.&lt;/p&gt;

&lt;p&gt;Apparently, the story is that Matthew, the owner of MJZ Hosting, has been in the hospital for a few weeks (I share this, because he did). While he had people who should have been able to reboot the server, they were apparently completely incommunicado all last week, costing Matt several customers. Now, I&amp;#8217;ve not left MJZ Hosting yet. But, I did have a potential client that had tried to contact me last week. While I don&amp;#8217;t expect that bridge to have been burnt, it was still a bit of a wake-up call. &lt;/p&gt;

&lt;p&gt;My website has been up somewhere around 99.9% of the time since I started hosting it with MJZ back around 2004. This is more than acceptable to me, when the downtime is spread out, but this last week has left me questioning whether I&amp;#8217;m going to be continuing with MJZ when my contract is up in a few months. On the one hand, reliability is important, particularly when I&amp;#8217;m beholden to someone else (even if they have been really good to me over the years), so I&amp;#8217;m going to at least be considering other options.&lt;/p&gt;

&lt;p&gt;In the meantime, I&amp;#8217;m going to pick up where I left off. With roughly four posts a week, of things that I hope my readership finds useful and interesting. With any luck, we won&amp;#8217;t see any more substantial downtime.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/jbQ17WdfH1k" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/03/budget-hosting-woes.html</feedburner:origLink></entry>

<entry>
    <title>Quality Shoes</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MadBeautifulIdeas/~3/2wLzrdcim08/quality-shoes.html" />
    <id>tag:blog.foxxtrot.net,2009://1.327</id>

    <published>2009-03-16T21:31:40Z</published>
    <updated>2009-03-16T21:32:19Z</updated>

    <summary>For years, I was the kind of person who would only own one or two pairs of shoes, and more than that, I’d very rarely spend more than maybe $40 on a pair. Even ten years ago, this didn’t seem...</summary>
    <author>
        <name>Jeff Craig</name>
        
    </author>
    
        <category term="Life" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="local" label="Local" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="repair" label="Repair" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="reuse" label="Reuse" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="shoes" label="Shoes" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sustainability" label="Sustainability" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.foxxtrot.net/">
        &lt;p&gt;For years, I was the kind of person who would only own one or two pairs of shoes, and more than that, I&amp;#8217;d very rarely spend more than maybe $40 on a pair. Even ten years ago, this didn&amp;#8217;t seem like such a bad deal. Shoes used to consistently last at least a year for me, and that was with them being worn nearly every day. These days, a normal pair of shoes is lucky to last six months, and after that they&amp;#8217;re pretty much relegated to spending the rest of their days in some landfill somewhere. These days, when I&amp;#8217;ve begun to focus more on long-term use and reuse, it was time to begin looking for better options.&lt;/p&gt;

&lt;p&gt;When we rewind the clock, even a century, we find a world where people treated shoes differently. They were necessary, but unlike most clothing, the tools (and skills) to make quality shoes were not commonplace. Enter the &lt;a href="http://en.wikipedia.org/wiki/Cordwainer"&gt;cordwainer&lt;/a&gt; and the &lt;a href="http://en.wikipedia.org/wiki/Shoemaker"&gt;cobbler&lt;/a&gt;. While these days, the only true cordwainers make extremely high quality, one off, pairs of shoes, in the not-so-distant past even the relatively industialized process of shoe-making still put out a product that a cobbler could repair as the shoes got damaged over time.&lt;/p&gt;

&lt;p&gt;However, there are still shoe companies that put out shoes that can be repaired, generally at a fraction of the cost of a new pair. My wife recently let a pair of her &lt;a href="http://www.birkenstockusa.com/"&gt;Birkenstocks&lt;/a&gt; wear down to the point where both the footbed and the sole needed replacing. Total cost: about $60. Far better than the $120+ those sandals would have cost new. But there are other manufacturers that put out these sorts of quality shoes as well. Just search you local listings for &amp;#8216;Shoe Repair&amp;#8217;, and you&amp;#8217;ll find a place like our Moscow, ID local &lt;a href="http://www.yellowpages.com/info-11922598/Pecks-Shoe-Clinic?from=qpibp-nonmi"&gt;Pecks Shoe Clinic&lt;/a&gt;. Look at the brands they sell, and that should give you an idea of the longevity of your shoes.&lt;/p&gt;

&lt;p&gt;Currently, I&amp;#8217;m just about in the market for some new Dress Shoes, and I&amp;#8217;ve been really eyeing the &lt;a href="http://www.birkenstockusa.com/products/men/shoes"&gt;Birkenstock Alabama&lt;/a&gt; line. Yeah, they&amp;#8217;re almost $200, but they shoud be really comfortable, and most importantly, I can make them like new using a skilled cobbler and less than half of a new pair of shoes. Unlike a lot of clothing items, I think it&amp;#8217;s a lot easier to tell the difference between good- and poor-quality shoes. Even if the shoes were easily repaired, thus saving money and resources over the long term. Plus, it creates jobs, since quality shoe repair is a skilled trade, and there are more people involved in making quality shoes than mass market shoes. Sure, more hands leads to more cost, but over the long term, quality shoes have a lot more value.&lt;/p&gt;

        

    &lt;img src="http://feeds.feedburner.com/~r/MadBeautifulIdeas/~4/2wLzrdcim08" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.foxxtrot.net/2009/03/quality-shoes.html</feedburner:origLink></entry>

</feed>
