<?xml version="1.0" encoding="UTF-8" ?>
















<?xml-stylesheet type="text/xsl" href="/blogs/knutaf//bloginx.xsl" ?>
<!DOCTYPE KnutafBlog [
   <!ENTITY % xhtml1-symbol SYSTEM
     "http://www.w3.org/2003/entities/xhtml1/xhtml1-symbol.ent"
   >
   %xhtml1-symbol;
]>

<kb:KnutafBlog
   xmlns:kb="http://fallenearth.org/blogs/knutaf"
>
   <kb:CommonData>
  <kb:Title>The Stillness of the Woods</kb:Title>
  <kb:Subtitle>the Breath of the Air Hangs Sharp and Pure</kb:Subtitle>
  <kb:Identifier>9</kb:Identifier>

    <kb:ContactInfo>
       <kb:EmailContact>
          <kb:Identifier>&#0112;&#0121;&#0116;&#0104;&#0111;&#0108;&#0121;&#0120;&#64;&#0102;&#0097;&#0108;&#0108;&#0101;&#0110;&#0101;&#0097;&#0114;&#0116;&#0104;&#46;&#0111;&#0114;&#0103;</kb:Identifier>
          <kb:Image>
             <kb:Href>IMG_URL_REL/yeemayw.png</kb:Href>
          </kb:Image>
       </kb:EmailContact>
       <kb:Contact>
          <kb:Type>ICQ</kb:Type>
          <kb:Identifier>2875622</kb:Identifier>
       </kb:Contact>
       <kb:Contact>
          <kb:Type>Yahoo!</kb:Type>
          <kb:Identifier>pytholyx</kb:Identifier>
       </kb:Contact>
       <kb:Contact>
          <kb:Type>MSN</kb:Type>
          <kb:Identifier>gadzook12@hotmail.com</kb:Identifier>
       </kb:Contact>
    </kb:ContactInfo>

  <kb:Buddays>
   <kb:Budday>
      <kb:Name>Kirill (Infamous)</kb:Name>
      <kb:Href>http://www.people.virginia.edu/~ko4a/</kb:Href>
   </kb:Budday>
   <kb:Budday>
      <kb:Href>http://www.sccs.swarthmore.edu/users/05/fwph/main.php</kb:Href>
      <kb:Name>Fritz</kb:Name>
   </kb:Budday>
   <kb:Budday>
      <kb:Href>http://www.livejournal.com/users/nishmael/</kb:Href>
      <kb:Name>Nish</kb:Name>
   </kb:Budday>
   <kb:Budday>
      <kb:Href>http://www.freeopendiary.com/entrylist.asp?authorcode=A306174</kb:Href>
      <kb:Name>GoldenFool</kb:Name>
   </kb:Budday>
   <kb:Budday>
      <kb:Href>http://www.people.virginia.edu/~aad3q/</kb:Href>
      <kb:Name>Rupa</kb:Name>
   </kb:Budday>
   <kb:Budday>
      <kb:Href>http://www.livejournal.com/users/netherben/</kb:Href>
      <kb:Name>Netherben</kb:Name>
   </kb:Budday>
   <kb:Budday>
      <kb:Href>http://www.yade.de/</kb:Href>
      <kb:Name>G</kb:Name>
   </kb:Budday>
   <kb:Budday>
      <kb:Href>http://www.tcnj.edu/~lee23/</kb:Href>
      <kb:Name>Rita</kb:Name>
   </kb:Budday>
</kb:Buddays>


  <kb:Links>
   <kb:Link>
      <kb:Title>Double Trouble</kb:Title>
      <kb:Href>http://www.gamegate.com/games/doubletroubleclassic/</kb:Href>
   </kb:Link>
   <kb:Link>
      <kb:Title>Greek-English Dictionary</kb:Title>
      <kb:Href>http://www.kypros.org/cgi-bin/lexicon</kb:Href>
   </kb:Link>
   <kb:Link>
      <kb:Title><h2>Fallenearth Blogs</h2></kb:Title>
      <kb:Href>/blogs/blogs.php</kb:Href>
   </kb:Link>
</kb:Links>


  <kb:Powered>
         <a href="http://creativecommons.org/licenses/by-nd/1.0/">
         <img src="http://creativecommons.org/images/public/somerights.gif" alt="cc license" />
         </a>
      <kb:Powering>
      <kb:Title>Creative Commons License</kb:Title>
      <kb:Href>http://creativecommons.org/licenses/by-nd/1.0/</kb:Href>
      <kb:Image>
         <kb:Href>http://creativecommons.org/images/public/somerights.gif</kb:Href>
      </kb:Image>
   </kb:Powering>
   

   <kb:Powering>
      <kb:Title>Spam Gourmet</kb:Title>
      <kb:Href>http://www.spamgourmet.com</kb:Href>
      <kb:Image>
         <kb:Href>http://www.spamgourmet.com/stuff/sgbutton1.gif</kb:Href>
         <kb:Width>150</kb:Width>
         <kb:Height>40</kb:Height>
      </kb:Image>
   </kb:Powering>

   <kb:Powering>
      <kb:Title>Valid CSS!</kb:Title>
      <kb:Href>http://jigsaw.w3.org/css-validator/check/referer</kb:Href>
      <kb:Image>
         <kb:Href>http://jigsaw.w3.org/css-validator/images/vcss</kb:Href>
         <kb:Style>border:0;width:88px;height:31px</kb:Style>
      </kb:Image>
   </kb:Powering>

   <kb:Powering>
      <kb:Title>Valid XHTML 1.0!</kb:Title>
      <kb:Href>http://validator.w3.org/check/referer</kb:Href>
      <kb:Image>
         <kb:Href>http://www.w3.org/Icons/valid-xhtml10</kb:Href>
         <kb:Width>88</kb:Width>
         <kb:Height>31</kb:Height>
      </kb:Image>
   </kb:Powering>
</kb:Powered>

</kb:CommonData>

   <kb:MonthlyArchives>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2005/07/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>07</kb:Month>
        <kb:Year>2005</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2005/06/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>06</kb:Month>
        <kb:Year>2005</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2005/05/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>05</kb:Month>
        <kb:Year>2005</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2005/04/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>04</kb:Month>
        <kb:Year>2005</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2005/02/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>02</kb:Month>
        <kb:Year>2005</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2005/01/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>01</kb:Month>
        <kb:Year>2005</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2004/12/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>12</kb:Month>
        <kb:Year>2004</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2004/11/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>11</kb:Month>
        <kb:Year>2004</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2004/10/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>10</kb:Month>
        <kb:Year>2004</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2004/06/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>06</kb:Month>
        <kb:Year>2004</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2004/05/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>05</kb:Month>
        <kb:Year>2004</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2004/04/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>04</kb:Month>
        <kb:Year>2004</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2004/03/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>03</kb:Month>
        <kb:Year>2004</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2004/02/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>02</kb:Month>
        <kb:Year>2004</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2004/01/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>01</kb:Month>
        <kb:Year>2004</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/12/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>12</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/11/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>11</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/10/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>10</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/09/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>09</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/08/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>08</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/07/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>07</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/06/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>06</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/05/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>05</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/04/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>04</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/03/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>03</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/02/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>02</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2003/01/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>01</kb:Month>
        <kb:Year>2003</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2002/12/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>12</kb:Month>
        <kb:Year>2002</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2002/11/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>11</kb:Month>
        <kb:Year>2002</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2002/10/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>10</kb:Month>
        <kb:Year>2002</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2002/09/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>09</kb:Month>
        <kb:Year>2002</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2002/08/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>08</kb:Month>
        <kb:Year>2002</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2002/07/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>07</kb:Month>
        <kb:Year>2002</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2002/06/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>06</kb:Month>
        <kb:Year>2002</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2002/05/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>05</kb:Month>
        <kb:Year>2002</kb:Year>
     </kb:Date>
  </kb:Archive>
    <kb:Archive>
     <kb:Href>/blogs/knutaf/archives/2002/04/index.xml</kb:Href>
     <kb:Date>
        <kb:Month>04</kb:Month>
        <kb:Year>2002</kb:Year>
     </kb:Date>
  </kb:Archive>
  
</kb:MonthlyArchives>

   <kb:CategoryArchives>
    <kb:Archive>
     <kb:Category>Abditor</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/abditor/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Ayequall</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/ayequall/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Commentaries</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/commentaries/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Delibis</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/delibis/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Essko</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/essko/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Gaius Calumitius Victor</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/gaius_calumitius_victor/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Iritei</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/iritei/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Knutaf</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/knutaf/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Lysus</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/lysus/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Other</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/other/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>School</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/school/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Sicus</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/sicus/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>The Domestic Rogue</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/the_domestic_rogue/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Virtual Beacon</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/virtual_beacon/index.xml</kb:Href>
  </kb:Archive>
    <kb:Archive>
     <kb:Category>Yumemi</kb:Category>
     <kb:Href>/blogs/knutaf/archives/cat/yumemi/index.xml</kb:Href>
  </kb:Archive>
  
</kb:CategoryArchives>


         <kb:Entry type="recent">
         <kb:Identifier>007605</kb:Identifier>
         <kb:Title>Ruby -- Sparkles and Impurities</kb:Title>
         <kb:Href>/blogs/knutaf/archives/2005/07/14/ruby_sparkles_and_impurities/index.xml</kb:Href>
         <kb:Date>
            <kb:Month>07</kb:Month>
            <kb:Day>14</kb:Day>
            <kb:Year>2005</kb:Year>
            <kb:Hour>12</kb:Hour>
            <kb:Minute>55</kb:Minute>
         </kb:Date>

         <kb:Category>Virtual Beacon</kb:Category>

         <kb:Body xmlns="http://www.w3.org/TR/xhtml1">
         <p>So in case you haven't <a href="/blogs/knutaf/archives//2005/07/02/mud_creation_pressured/">read about it</a>, I've been starting to code in <a href="http://www.rubycentral.com">Ruby</a>. It's a fine language in its own right, and I'm having a good deal of fun using it. For ages I've been a serious <a href="http://www.perl.com">Perl</a> junkie. I've used it extensively at my last two jobs, and I totally dig it, because <em>I love punctuation</em>. It was sometime during last year that <a href="/blogs/caiuschen">Caius</a> and npj7y bugged me to learn it, so now I am. I read the fabulous (but badly indexed) <a href="http://www.ruby-doc.org/docs/ProgrammingRuby/">Pragmatic Guide to Programming Ruby</a>, written by the same jokers who wrote <a href="http://www.pragmaticprogrammer.com/ppbook/index.shtml">The Pragmatic Programmer</a> (an excellent book to read if you aspire to programming).</p>

<p>Some parts of the language seemed fairly straightforward. Loops can be done as usual, conditionals (if-else) are normal, functions actually take a parameter list (as opposed to Perl, where they're both passed and returned through a variable called <code>@_</code>). I was pleased at first to see that Ruby is fully object oriented. Fully? As opposed to what? As opposed to Perl's hacked-in excuse for object oriented programming in a blatantly scripted language. Ruby's object orientation is not bad. It has a lot of features, but it also has what I think are its biggest flaws.</p>

<p>Ruby's concept of objects is related mostly to message-passing. When you want to invoke a member function of an object, say, make a bike shift gears, you send a message to the bike, saying, "switch to gear 5." In code-speak, <code>myGaryFisher.changeGear(5)</code>. In strongly typed Object Oriented languages such as Java, C#, and C++, at compile-time, the compiler checks your source code to make sure that the object named <code>myGaryFisher</code> really does have a method called <code>changeGear()</code>. It won't let you run your program unless that's true.</p>

<p>More specifically, those languages attach a type to every object reference encountered in the program. So if you ever encounter the <code>myGaryFisher</code> object, it will actually be declared as <code>Bicycle myGaryFisher</code> a bit earlier (if anyone is thinking about polymorphism at this point, hang on; I'm getting there). This means that the compiler rigorously enforces not invoking methods on objects that it knows they do not have. If you try to call <code>myGaryFisher.jointAround()</code>, the compiler will check the type of <code>myGaryFisher</code>, see that it is of type <code>Bicycle</code>, then check the <code>Bicycle</code> class for a method called <code>jointAround()</code>. Of course since that method is not present in that class, the compiler will not produce machine code that tries to do that method invocation.</p>

<p>In Ruby, references are never declared with a type, so there is no type information checked at "compile time." Since Ruby is interpreted, this "compile time" would take place when the interpreter runs through the file and does a syntax check. Without the information that <code>myGaryFisher</code> is a <code>Bicycle</code>, all Ruby does is attempt to send the <code>jointAround()</code> message to the object and throw up its hands in disgust when it doesn't work. Though I believe that this kind of checking, done at compile time, can help eliminate buggy code, there's a more sinister issue behind it. After all, doing a typecast in Java always has the threat of a <code>ClassCastException</code>, which is the same kind of trouble.</p>

<p>The real trouble of this loose typing comes from the polymorphism features of the language. Here's a quick review for those of you who can't remember all those fancy <acronym title="Object Oriented">OO</acronym> words. <code>myGaryFisher</code> is a <code>Bicycle</code>, but if properly defined is also a <code>Vehicle</code>. In view of this, there are two ways in OO programming to consider the bicycle: as a bicycle, a two-wheeled thing with handlebars, a frame, foot pedals, derailleurs, a chain, gears, and <em>everything</em> that makes a bicycle what it is--all in all, a very specific view of the bike; or, as a vehicle, which has as its only real defining factors that it carries a certain number of passengers and that it is moving at some velocity.</p>

<p>In most (all?) OO languages, this is implemented via some kind of inheritance mechanism. In a strongly typed language, every time you see a reference to an object, the type determines what view of the object you have access to. If you get <code>Bicycle myGaryFisher</code>, because the compiler knows you have a <code>Bicycle</code>, you get access to a whole ton of descriptive functionality pertaining to a bicycle. If, instead, you get <code>Vehicle myGenericPersonnelTransport</code>, you instead have access only to a function that tells you how many people the thing can carry, and how fast it's going.</p>

<p>This is an information hiding tool; it allows you to give certain parts of the code access only to specific information that it is allowed to "know about." In a strongly typed language, the compiler checks this and generates code that conforms to these type restrictions. In Ruby, it does not. The <em>only</em> thing enforcing these type rules is <strong>you</strong>, and that, in my opinion, is just asking for trouble. When you call a function in some library, the only way you know what kind of object exactly the function is expecting is by reading the function's documentation... and we all know how keen programmers in general are about writing complete, up-to-date documentation (or can infer from the tone of this sentence).</p>

<p>I like the inheritance mechanism. It works well, and "mixins" are a good analog to interfaces (abstract base classes) found in Java, C#, and C++. Though I still have the benefit of code reuse through inheritance in Ruby, I lose the benefit of polymorphism. As far as I'm concerned, each of those makes up 50% of the value of inheritance. So I continue to make mixins and superclasses and things, but every once in a while I have to take a deep breath and do some type checking: this function is expecting an instance of this mixin; I must be very careful not to call any methods of the object, only methods of the mixin. I have to be cautious, because it's easy to forget, <strong>and the code will still work for the time being</strong>.</p>

<p>Moving on to other topics gripe-worthy, the <a href="http://www.ruby-doc.org/stdlib/">standard library</a> bothers me, because it appears to be hacked together quite randomly. It doesn't help that half the classes in there are lacking documentation. It doesn't help that some classes very much step on each others' toes.</p>

<p>For example, there is a <a href="http://www.ruby-doc.org/core/classes/Mutex.html">Mutex</a> class and also a <a href="http://www.ruby-doc.org/stdlib/libdoc/monitor/rdoc/classes/Monitor.html">Monitor</a> class. The difference? The former does not allow a single thread to lock the mutex multiple times (why not?), but the latter does. The former is part of the <a href="http://www.ruby-doc.org/core">Core API</a>, and the latter is part of the standard libraries. I think they should be swapped.</p>

<p>I don't like that there isn't a Collection mixin or superclass or something, so that I can have a uniform way of adding and deleting elements from a <a href="http://www.ruby-doc.org/core/classes/Set.html">Set</a>, <a href="http://www.ruby-doc.org/core/classes/Array.html">Array</a>, and <a href="http://www.ruby-doc.org/core/classes/Hash.html">Hash</a>.</p>

<p>I've always had a problem with operator overloading, and Ruby takes this to a whole new level. The <code>|</code> (pipe) operator for a number does a bitwise OR operation, but the same operator for an Array does a set union. Yes, these things are somewhat related, but doing this just seems like obfuscation, not convenience. Your goal should be to make code that's wrong look <a href="http://www.joelonsoftware.com/articles/Wrong.html">obviously wrong</a> (this is one of the most brilliant programming articles I've read).</p>

<p>Similarly, Ruby's (and C#'s, for that matter) thing for "properties", that is, statements that look like you're setting a member variable of an object to a value, but actually are calling a function with the right-hand-side as a parameter,  bother me. I don't like deception like that. I want to know when I'm doing a simple assignment operation and when I'm calling a function. This is all about performance, isn't it? With the advent of harder, faster, stronger computers, this won't matter! Right? Wrong: what if the function that is secretly called has side effects in the object? Assignment is a relatively simple operation, and I want to know when something that I think is assignment actually is some O(n<sup>2</sup>) function.</p>

<p>Your response to this may be that I ought to open my eyes and read the docs, but the docs aren't there or are incomplete, half the time. I don't trust this kind of detail to documentation, only to enforcement by the language.</p>

<p>Despite all this, I think any of you programmers out there should learn some of this language. It allows you to do certain things very elegantly, which gives you insight about elegant ways to program in other languages you'll probably use more. Iterators and blocks (Procs), in particular, are very cool.</p>

<p>A Proc is basically a block of code that is stored as an object and can be passed around and used later. What's amazingly convenient about it is that the block can be returned from a function and still work. Normally, all the local variables would go out of scope once that function had returned, but a Proc always has access to all its local variables, even if those variables have gone out of scope.</p>

<p>I'm pleased that working with files and other I/O is just as simple in Ruby as it is in Perl. I am pleased that they have a fully function regular expression library that's integrated into the language (via <code>/pattern/</code> type of expressions). I'm glad that hashtables have language support as well--for creating and accessing. It really is kind of nice that everything, including numbers, is an object. It saves me the time of considering whether I'm passing a primitive type or an object reference (Java, I'm looking at you).</p>

<p>Finally, I like two interesting naming conventions I've seen so far. For member functions that are queries, such as whether an object is equal to another, or whether some flag is set to true or not, the convention is to make use of a ? in the function name. For example, the equality test between two objects is <code>Object.eql?()</code>. Some member functions come in two flavors: one that does some processing on the object, but returns a new copy that reflects the changes; and one that directly modifies the object. For the latter, the convention is to append a ! on the function name. For example, the function that returns a new copy of a string with all the letters in losercase is <code>String.downcase()</code>, but one that modifies the string is <code>String.downcase!()</code>. It seems intuitive. The exclam alerts you that you're making a change--a potentially unsafe thing to do.</p>

<p>That's all for now. If I find anything else substantial, I guess I have to make a new post. Hope this was informative, and that you're all inspired to go out and try Ruby!</p>

<p>-- Virtual Beacon, &#953;&#788;&#963;&#964;&#945;&#769;&#956;&#949;&#957;&#959;&#962;, likes precious gems and some languages --</p>
         </kb:Body>

         

                  <kb:CommentCount>1</kb:CommentCount>
         

                  <kb:TrackbackCount>0</kb:TrackbackCount>
         
      </kb:Entry>
         <kb:Entry type="recent">
         <kb:Identifier>007599</kb:Identifier>
         <kb:Title>MUD Creation, Pressured</kb:Title>
         <kb:Href>/blogs/knutaf/archives/2005/07/02/mud_creation_pressured/index.xml</kb:Href>
         <kb:Date>
            <kb:Month>07</kb:Month>
            <kb:Day>02</kb:Day>
            <kb:Year>2005</kb:Year>
            <kb:Hour>23</kb:Hour>
            <kb:Minute>00</kb:Minute>
         </kb:Date>

         <kb:Category>Virtual Beacon</kb:Category>

         <kb:Body xmlns="http://www.w3.org/TR/xhtml1">
         <p>I'm not in a very good position at this time. In spurts, I've had to contain myself quite severely to keep from blabbing a lot about my latest programming project. As such, I've been meaning to write a blog entry about it as soon as I had made what I considered to be considerable progress. A few things keep me from gladly writing that entry right now. I don't feel like I've made the progress I want yet. I'm writing this suddenly, so I don't think I can write the kind of entry I'd usually like to make. On the other hand, today might be the last time I'll be able to work on it, let alone write about it, for as long as a month. Time and circumstances force my hand.</p>

<p>I've been working on a <acronym title="Multi-User Dungeon">MUD</acronym>. Surely you've heard some of the people on the blogs mention them before. They're basically text-based RPG games. Yes, text-based. No graphics. You type in commands to say stuff, move around, fight, etc. You interact with other people, fight monsters, etc. Yes, it's often like <acronym title="Dungeons and Dragons">D&amp;D</acronym>. Yes, it's fairly dorky. Yes, it can be sickeningly addictive to play.</p>

<p>I am building a MUD from the ground up, from scratch. Across the Internet, only a handful of "codebases" account for most of the MUDs you might find: <a href="http://www.dikumud.com/">Diku</a>, <a href="http://www.circlemud.org/">Circle</a>, <a href="http://www.lpmud.com/">LP MUD</a>, <a href="http://www.rom.org/">Rivers of MUD</a>, and <a href="http://www.game.org/smaug/">Smaug</a>, to name a few. A codebase is a basic package for starting a MUD. If you wanted to start one, you could download a codebase, say, Rivers of MUD, install it on a computer, and you'd be ready to go!</p>

<p>Now, your MUD would be very, well, generic, because it's essentially out of the box. So you'd want to customize it: change its name, add some new races, new skills, build areas, etc. The point of a codebase is to give people something to modify to make a new mud. Most well-developed muds are <em>extensively</em> modified codebases. <a href="http://www.daedalmacabre.org">Daedal Macabre</a>, for instance (one I used to play), is nearly unrecognizable <acronym title="Rivers of MUD">ROM</acronym>.</p>

<p>So, to get back to the main discussion, I think my project is to make a MUD codebase that resembles ROM in some respects (since I am most familiar with it), and has some of my own ideas thrown in. It is being made in a fairly new language called <a href="http://www.rubycentral.com/">Ruby</a> that some of my friends (ahem, <a href="http://fallenearth.org/blogs/caiuschen/">Caius</a> and <a href="http://manjac.ath.cx/nick/">npj7y</a>) pestered me to learn. It's a pretty good language, with some very convenient features, and some other features that lend themselves exclusively to bad programming practices.</p>
         </kb:Body>

                  <kb:HasExtended/>
         

                  <kb:CommentCount>3</kb:CommentCount>
         

                  <kb:TrackbackCount>0</kb:TrackbackCount>
         
      </kb:Entry>
         <kb:Entry type="recent">
         <kb:Identifier>007587</kb:Identifier>
         <kb:Title>For the Sake of Itself</kb:Title>
         <kb:Href>/blogs/knutaf/archives/2005/06/28/for_the_sake_of_itself/index.xml</kb:Href>
         <kb:Date>
            <kb:Month>06</kb:Month>
            <kb:Day>28</kb:Day>
            <kb:Year>2005</kb:Year>
            <kb:Hour>00</kb:Hour>
            <kb:Minute>44</kb:Minute>
         </kb:Date>

         <kb:Category>Virtual Beacon</kb:Category>

         <kb:Body xmlns="http://www.w3.org/TR/xhtml1">
         <p>OK, so I was asked to stop all the "filler" and write a real entry. That's actually an outright lie, but I read it on <a href="http://www.xanga.com/home.aspx?user=anikarshak">someone else's journal</a> and it seemed like as good an introduction as any to a new entry. So here it is, an entry without all the "filler."</p>

<p>gsd4x sent me an email today in which he asked me, "what are you becoming?" My immediate reply, also by email, was to ask him what on earth he was talking about, what kind of question that was, and that I didn't follow what he was asking. Upon closer inspection, I find that I'm slipping into a (shallow) rut. It's lucky that within three weeks I'll be in a much different sort of rut.</p>

<p>Once work starts, after I've taken care of all the things that need to be done with relocation, I'm most likely going to settle into a routine. Unless I am circumspect and mildly cautious, I am going to lose flavor. For years I've been anticipating this long stretch of "stable life" in a vague, far-off way. It's not necessarily that I'm scared of doing boring things for the rest of my life, letting my life slip by me, as they say, but rather I'm afraid I won't notice it if it happens, or until it's too late.</p>

<p>I tend to worry too much. <a href="/blogs/leiapico">Leia</a> could tell you that [Currently listening: The Calling -- Anything]. See, I think that's a much better format than the little space in the heading of your entry that says what you're listening to. Hopefully you know where I'm going with this: I take longer than an average of four minutes to write an entry! Several songs elapse. I haven't explored the psyche behind this, but I would imagine that the song currently listened to has some effect on the writing, either or both in content and in style. It seems like the sort of thing that can't be observed very accurately introspectively, because introspection is intrusive.</p>

<p>That's another thing I'm worrying about, [Currently listening: skipped Carol of the Bells, skipped Finger Eleven - Above, skipped Tawu Iwasaki - half pain (Witch Hunter Robin OST), settled on Seatbelts - Tank (Bebop OST, come on, fools)], a lack of introspection in my daily life. I used to consider introspection to be something (at this point I hit the "save" button, because crashes wait for nothing, especially not a good sentence) I did almost constantly [Currently listening: Ozric Tentacles - Xingu], but now I think back on myself and feel like I haven't done it at all lately.</p>

<p>In a way, that's introspective in itself, isn't it? Maybe there's hope for me yet. I can't remember what exactly made me more introspective, but blogging helped, and before that MUDding helped. It might also be because my self esteem has gone up a lot on its own over the last year or two. I imagine Leia had a lot to do with that too, but it's not like I ever had a real <em>problem</em> with it.</p>

<p>I have a long list of things to blog about, both technical and non-technical, but I have a rule that I rarely violate that says that I must write entries that are concise, self-contained, properly developed, and focused on a single topic. For this reason, many of my "smaller" thoughts [Currently listening: Welbilt - Everything's Alright] are hard to write a whole, self-respecting entry about. It's a shame, really, but it can't be helped (shouganai) [Currently listening: Andromeda - In the Deepest of Waters].</p>

<p>I'm done writing. I'll write something else later on. Oh, when I said this entry didn't have any filler, I was totally lying.</p>

<p>-- Virtual Beacon, &iota;&#788;&sigma;&tau;&alpha;&#x0301;&mu;&epsilon;&nu;&omicron;&sigmaf;, writes about daily life --</p>
         </kb:Body>

         

                  <kb:CommentCount>2</kb:CommentCount>
         

                  <kb:TrackbackCount>0</kb:TrackbackCount>
         
      </kb:Entry>
         <kb:Entry type="recent">
         <kb:Identifier>007500</kb:Identifier>
         <kb:Title>DMA and the Horrors of PIO</kb:Title>
         <kb:Href>/blogs/knutaf/archives/2005/05/22/dma_and_the_horrors_of_pio/index.xml</kb:Href>
         <kb:Date>
            <kb:Month>05</kb:Month>
            <kb:Day>22</kb:Day>
            <kb:Year>2005</kb:Year>
            <kb:Hour>00</kb:Hour>
            <kb:Minute>32</kb:Minute>
         </kb:Date>

         <kb:Category>Virtual Beacon</kb:Category>

         <kb:Body xmlns="http://www.w3.org/TR/xhtml1">
         <p>This has come up enough times for me recently that it's worth writing something about. This is a short, shallow article about the problems of <acronym title="Programmed I/O">PIO</acronym> and a solution, <acronym title="Direct Memory Access">DMA</acronym>. Yes, this has to do with computers. Yes, the fixes on Windows require registry munging. Still, it's fairly safe anyway. Yes, your computer can get a <em>phenomenal speedup</em> (10x) in many situations from doing this. This article does not apply to SATA drives, as far as I know. </p>

<h1>What is PIO?</h1>
<p>PIO stands for Programmed Input/Output. It is a method of transferring data to or from a device in your computer, such as a hard disk, CDROM drive, DVDROM drive, CD burner, Zip drive, and so on. By using this method, the CPU, your processor issues a request for every byte of data that needs to be transferred. Depending on which PIO mode your device is operating in, the processor may issue a request for several bytes to move at once. The data is transferred either to the device or from the device into memory or to another device, depending on what's going on. In the case of, for example, playing an MP3, data moves from the device into memory (and later out your speakers).</p>

<h1>What is DMA?</h1>
<p>DMA stands for Direct Memory Access. It's a method by which access to data on a peripheral device, such as a hard drive, etc. (see list above) is accessed via a special "DMA controller" that is not part of the processor. The CPU initiates the transfer of data, but the DMA controller takes care of the rest of the moving of data, so that the CPU is meanwhile free to take care of other tasks.</p>

<h1>DMA is better than PIO. Here's why.</h1>
<p>Say that you're copying a 5MB music file from one place to another on your hard drive. 5MB = 5 * 2<sup>20</sup> = 5242880 bytes. Suppose the processor is operating in PIO mode, which means it has to move each of those bytes individually. Before anything can happen, the CPU has to be <em>interrupted</em> from whatever it was doing before--drawing your mouse cursor, making some funny little buddy icon animate, whatever--and that takes some amount of time. Then it issues a move request for the first byte, from the hard drive to an internal register. Then it issues another move request from the internal register to the destination on the hard drive. That's two instructions per byte. Multiply that by the number of bytes, and you're looking at 10,485,760 instructions. That's not a small amount!</p>

<p>But wait, you say, my CPU runs at 4GHz. That's 4 <em>billion</em> instructions per second. What's a measly 10 mil instructions to me? A few things. Firstly, the CPU runs at 4 billion cycles per second. Only on a very good day will that mean 4 billion instructions per second. Next and more importantly, those would be 4 billion instructions of arithmetic that hits the cache. Those of you who know things about operating systems will realize that the CPU will be in a busy state while most of the move instructions go out not to L2 cache, not to memory, but to DISK to fetch the data. I don't I know enough to do the math to calculate just how bad that is, but it's very bad.</p>

<p>A modern hard drive performing badly looks something like this. Note the final number, the speed transferring from disk.</p>

<pre>
/dev/hda:
 Timing buffer-cache reads:   128 MB in  0.80 seconds =160.02 MB/sec
 Timing buffered disk reads:  64 MB in 32.05 seconds =  2.00 MB/sec
</pre>

<p>The same hard drive, after it was set into Ultra DMA Mode 2, looks like this. Note, again, the transfer speed. Uh, that's a speedup by a factor of 11!</p>

<pre>
/dev/hda:
 Timing buffer-cache reads:   128 MB in  0.87 seconds =147.66 MB/sec
 Timing buffered disk reads:  64 MB in  2.92 seconds = 21.95 MB/sec
</pre>

<h1>So shouldn't my hard drives be in DMA mode all the time?</h1>
<p>Answer: yes. Reality: no, they may not be. On any system, if DMA mode is disabled in your <acronym title="Basic Input Output System">BIOS</acronym> (the computer configuration that you can bring up right about when the memory test goes on when your computer is booting up), then the operating system cannot enable it.</p>

<p>On any system, if your drives are old they may not support DMA mode. Also, if your hard drive controller is old, it may not support DMA modes properly or at all. Usually your hard drive controller is old if your motherboard is old. Usually that in turn is synonymous with your computer is old. How old is old? I'm not sure, but I'd guess at six or seven years old. Don't laugh! I'm using all old parts in my Linux box!</p>

<p>On Windows, there is <a href="http://support.microsoft.com/kb/817472/">a KB article that describes this behavior</a>. If the device currently in DMA mode receives six read errors EVER, it is reduced to the next lower DMA mode. If this occurs again, its mode is reduced again, and so on until it hits rock bottom, PIO mode. Playing a scratched CD that skips for a long time? Your CDROM drive may have just gone into PIO mode. This <em>shouldn't</em> happen with hard drives, but you never know, I guess, since I've found some of my friends with their hard drives in PIO mode.</p>

<p>On Linux this should only happen if you do not have support for your hard drive controller in your kernel (either built-in or as a module). This happened to me, and I'll talk more about it later.</p>

<h1>Windows XP/2003 Diagnosis and Solution</h1>
<h2>Diagnosing the Problem</h2>
<p>I'm providing you with step-by-step instructions. Be happy.</p>

<ol>
<li>Right-click <span class="code">My Computer</span>. Select <span class="code">Properties</span>.</li>
<li>Select the <span class="code">Hardware</span> tab.</li>
<li>Click on <span class="code">Device Manager</span>.</li>
<li>Expand the list (click the + sign) next to <span class="code">IDE ATA/ATAPI controllers</span>.</li>
<li>For both <span class="code">Primary IDE Channel</span> and <span class="code">Secondary IDE Channel</span>, right-click and select <span class="code">Properties</span>.</li>
<li>Go to the <span class="code">Advanced Settings</span> tab.</li>
<li>If either Device 0 or 1 has <span class="code">Transfer Mode</span> set to <span class="code">PIO Only</span>, change it to DMA if available.</li>
<li>Note whether either device on either channel has <span class="code">Current Transfer Mode</span> set to something including the word PIO.</li>
</ol>

<h2>Fixing the problem on Windows</h2>
<p>If you made any changes to the <span class="code">Transfer Mode</span> or if PIO was set on any of your devices, you need to get Windows to re-detect the settings on the next reboot. This requies some Registry hacking. In general, what I'm telling you to do cannot cause any permanent damage, but perhaps you should back up your registry anyway before doing this. Once you've done that, read on.</p>

<p>Follow these instructions to get Windows to re-detect the DMA settings of your devices.</p>

<ol>
<li>Start Menu &rarr; Run...</li>
<li>Type in <span class="code">regedit</span> and hit enter.</li>
<li>Keep expanding levels (hit the + sign) for the following key:<span class="code">HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{4D36E96A-E325-11CE-BFC1-08002BE10318}</span></li>
<li>Within that key, you'll see keys such as <span class="code">0000</span>, <span class="code">0001</span>, and so on.</li>
<li>Click on them and look on the right pane for the value of <span class="code">DriveDesc</span> that is "Primary IDE Channel" or "Secondary IDE Channel."</li>
<li>In both Primary and Secondary, right-click in the right pane and select <span class="code">New &rarr; DWORD Value</span>. Call it <span class="code">ResetErrorCountersOnSuccess</span>. If the value already exists, do not create a new value, but go on to the next step.</li>
<li>Double-click the value you just created, and set its value to <span class="code">1</span>.</li>
<li>Select the value called <span class="code">MasterIdDataCheckSum</span>. Delete it.</li>
<li>Select the value called <span class="code">SlaveIdDataCheckSum</span>. Delete it.</li>
</ol>

<h2>Explanation of what you just did</h2>
<p>Adding the <span class="code">ResetErrorCountersOnSuccess=1</span> value says to Windows that if you successfully read data from a device, reset the six-strikes-you're-out counter back to six. So if you have a few read errors on a CD, but then successfully read, you're still safe. It's not a complete fix, but it helps a lot.</p>

<p>Deleting the data checksums forces Windows on the next reboot to redetect your DMA settings instead of using what it was using before. Check in your IDE Channel properties (see about diagnosing the problem, above) to see if your current transfer mode is now DMA. Several-year-old hard drives should be able to manage Ultra DMA Mode 2. Newer hard drives can get to Ultra DMA mode 6. More on this later.</p>

<h1>Diagnosing and Fixing Linux</h1>
<h2>Diagnosing the problem</h2>
<p>Use the <a href="http://sourceforge.net/projects/hdparm/">hdparm</a> utility: <span class="code">hdparm -i /dev/hda</span> will tell you all about your hda. You're set at PIO mode if you have a * next to one of the PIO modes or the absence of a *.</p>

<p>Also, test your hard drive's speed, with: <span class="code">hdparm -tT /dev/hda</span>. If your numbers are looking like mine above, then you're probably in PIO mode. If they're above 20MB/sec, then there may be no need to twiddle with your settings unless you find your processor pegged whenever you're transferring files.</p>

<h2>Fixing the Problem</h2>
<p>You can attempt to set your drive into DMA mode: <span class="code">hdparm -d1 /dev/hda</span>. If you get an error of Operation Not Supported (or similar), it means you don't have kernel support, and you need to recompile your kernel, making sure to include your hard drive controller chipset in Device Drivers. You'll probably have to look up your motherboard specs to find what controller you have.</p>

<p>Once you've recompiled your kernel, check to see if you're in DMA mode yet. If you are, then you're done! Your system automatically selects the highest DMA mode possible with your hardware. If you're not in DMA mode, you can try to set it into DMA mode again manually, as above. Check if this succeeds with: <span class="code">hdparm /dev/hda</span>. If it worked, and the * is not set at the highest DMA mode listed in <span class="code">hdparm -i /dev/hda</span>, then you can attempt to set it to a higher mode, with, for example: <span class="code">hdparm -X udma4</span>. If this doesn't work, well, keep reading, but you might be out of luck.</p>

<h1>I can only get Ultra DMA Mode 2. I want more!</h1>
<p>You might be able to get more (i.e. Ultra DMA Mode 3-6), but you're going to have to get your hands dirty. This involves opening up your computer and tinkering around. I don't recommend doing this unless you know something about tinkering around in there, <em>and</em> you're willing to get frustrated.</p>

<p>Ultra DMA Modes 3 through 6 are only available with 80-pin IDE (hard drive) cables. Most older systems come with 40-pin IDE cables. See here for a <a href="/blogs/knutaf/img/ide_cable_comparison.jpg">comparison image</a>. Why is 80-pin better? Half the wires carry a ground (0V) signal, so the other 40 wires are physically separated from each other. The idea is that the 0V signals on the wires between "absorb" electromagnetic interference between the other 40 wires, which actually carry data. Because there is less signal noise, data can be sent at higher frequencies (i.e. higher transfer rates).</p>

<p>If you're already using 80-pin cables and you still can't get above Ultra DMA Mode 2, then it's because the drive is too old. My DVDROM drive from about 4 years ago can't support better, but many of my old 5400 RPM hard drives can. You never can tell, I guess.</p>

<p>If you're not using 80-pin cables and you think you're maxing out at Ultra DMA mode 2, you can go to your local computer store and pick up a new cable for about 10 bucks. Be warned, the $10 cables will have the connector spacing too close and set all wrong, so you might end up rearranging the physical positions of your drives within your computer case. It's a new type of hell, says I, the voice of experience at this point.</p>

<p>If you manage to change cables and you find you can hit Ultra DMA Mode 4 or so, congratulate yourself! You've been through a lot. Then tell me so I can pat you on the back, too. It's nice to find other tinkerers like myself.</p>

<p>Well, I hope you found this little article informative. I've really been meaning to vent about this, having fixed four or so computers that were plagued with PIO-sickness.</p>

<p>-- Virtual Beacon, &#x03B9;&#x0314;&sigma;&tau;&#x03B1;&#x0301;&mu;&epsilon;&nu;&omicron;&sigmaf;, the tinker... sort of --</p>

<h1>References</h1>
<ul>
<li><a href="http://www.michna.com/kb/WxDMA.htm">Where I first found out how to fix this</a></li>
<li><a href="http://gentoo-wiki.com/HOWTO_Use_hdparm_to_improve_IDE_device_performance">An excellent guide for hdparm on the Gentoo Wiki</a></li>
<li><a href="http://www.linuxdevcenter.com/pub/a/linux/2000/06/29/hdparm.html">A page with neat tricks on using hdparm</a></li>
<li><a href="http://www.pcguide.com/ref/hdd/if/ide/confCable80-c.html">A decent discussion of IDE cables.</a> There are better, but I can't find the page again.</li>
</ul>
         </kb:Body>

         

                  <kb:CommentCount>4</kb:CommentCount>
         

                  <kb:TrackbackCount>0</kb:TrackbackCount>
         
      </kb:Entry>
         <kb:Entry type="recent">
         <kb:Identifier>007496</kb:Identifier>
         <kb:Title>A Testament to College Life</kb:Title>
         <kb:Href>/blogs/knutaf/archives/2005/05/21/a_testament_to_college_life/index.xml</kb:Href>
         <kb:Date>
            <kb:Month>05</kb:Month>
            <kb:Day>21</kb:Day>
            <kb:Year>2005</kb:Year>
            <kb:Hour>18</kb:Hour>
            <kb:Minute>22</kb:Minute>
         </kb:Date>

         <kb:Category>Lysus</kb:Category>

         <kb:Body xmlns="http://www.w3.org/TR/xhtml1">
         <p>His roomate sent out an email to most of their friends, entitled, "A Testament to College Life." It said: Raising the bar for future generations. In it was a single photograph that he took outside our on-grounds apartment at the end of the year. He'd actually meant to do the same the year before, but didn't have nearly as many then as this year. In their defense, their consumption was higher by a factor of about 1.5 this year. I intercepted the email and the secrat contents.</p>

<p>It's borderline terrifying the things for which they used pizza boxes within their apartment. Someone needs to draw the line somewhere, or risk crossing into a kind of madness. Unimaginative night-stands and generic horizontal surfaces are within the bound of acceptable conceptions. I was able to see him using a stack of about ten to hold up his Xbox, and his roomate another stack of perhaps 12 to hold up his...alarm clock and some various papers.</p>

<p>But two stacks side by side, joined by a single stack on top, used to hold up a table lamp next to their television is something simply did not want to see. Table lamps are meant to go on tables! Tables made of of, you know, <em>wood</em> or maybe even <em>metal</em>. Not <strong>cardboard</strong>, of all things. I heard them conversing amongst themselves; they said, "My, that's a surprisingly sturdy table for our table lamp! We sure are glad we have it!" I left in a hurry.</p>

<p>But I also saw them use them for absurd horizontal surfaces. While eating dinner, in the absence of a table to eat at, one held a pizza box in his lap and put his plate on top of <em>that</em>, as though it were acceptable in any modern society. The same one, on another occasion, pulled out the topmost drawer of his desk and put a pizza box there, to use as extra desk space for writing on.</p>

<p>Rumor has it that in the previous academic year they used a stack about twenty or so high as a stand for their phone to reach the top bunk of their bunked beds. Whatever truth there be in that does not sit well with me.</p>

<p>Through some correspondents of mine, I came to find answers to the "food mess" problem. Supposedly, as they say, pizza boxes breed no vermin. No rats, no mice, no cockroaches even. I am incredulous, and with as many as they had, they <em>must</em> be covering up, out of shame.</p>

<p>I intercepted the email, yes, and have kept the contents, which I am now able to share with you. I counted: there were exactly <a href="/blogs/knutaf/img/pstack.jpg">99 of them</a>. Please, I beg of you, do not make the first joke that comes to mind, which involves towers, a location in Italy, and a painful pun.</p>

<p>-- Lysus, investigator, as usual --</p>
         </kb:Body>

         

                  <kb:CommentCount>3</kb:CommentCount>
         

                  <kb:TrackbackCount>0</kb:TrackbackCount>
         
      </kb:Entry>
   

         <kb:Entry type='previous'>
         <kb:Identifier>007440</kb:Identifier>
         <kb:Title>Third Time Around</kb:Title>
         <kb:Href>/blogs/knutaf/archives/2005/05/01/third_time_around/index.xml</kb:Href>
         <kb:Date>
            <kb:Month>05</kb:Month>
            <kb:Day>01</kb:Day>
            <kb:Year>2005</kb:Year>
         </kb:Date>
      </kb:Entry>
         <kb:Entry type='previous'>
         <kb:Identifier>007332</kb:Identifier>
         <kb:Title>Infinity Plus One?</kb:Title>
         <kb:Href>/blogs/knutaf/archives/2005/04/06/infinity_plus_one/index.xml</kb:Href>
         <kb:Date>
            <kb:Month>04</kb:Month>
            <kb:Day>06</kb:Day>
            <kb:Year>2005</kb:Year>
         </kb:Date>
      </kb:Entry>
         <kb:Entry type='previous'>
         <kb:Identifier>007330</kb:Identifier>
         <kb:Title>Commentary: ICO</kb:Title>
         <kb:Href>/blogs/knutaf/archives/2005/04/05/commentary_ico/index.xml</kb:Href>
         <kb:Date>
            <kb:Month>04</kb:Month>
            <kb:Day>05</kb:Day>
            <kb:Year>2005</kb:Year>
         </kb:Date>
      </kb:Entry>
         <kb:Entry type='previous'>
         <kb:Identifier>007133</kb:Identifier>
         <kb:Title>Rise of the Hands</kb:Title>
         <kb:Href>/blogs/knutaf/archives/2005/02/10/rise_of_the_hands/index.xml</kb:Href>
         <kb:Date>
            <kb:Month>02</kb:Month>
            <kb:Day>10</kb:Day>
            <kb:Year>2005</kb:Year>
         </kb:Date>
      </kb:Entry>
         <kb:Entry type='previous'>
         <kb:Identifier>007079</kb:Identifier>
         <kb:Title>Historia Musica Mihi</kb:Title>
         <kb:Href>/blogs/knutaf/archives/2005/01/27/historia_musica_mihi/index.xml</kb:Href>
         <kb:Date>
            <kb:Month>01</kb:Month>
            <kb:Day>27</kb:Day>
            <kb:Year>2005</kb:Year>
         </kb:Date>
      </kb:Entry>
   
</kb:KnutafBlog>

