<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-10832913</id><updated>2011-09-11T12:12:53.624-07:00</updated><category term='voting'/><category term='firefox'/><category term='task queue'/><category term='python'/><category term='mac'/><category term='retirement'/><category term='productivity'/><category term='camino'/><category term='personal finance'/><category term='osx'/><category term='app engine'/><category term='google'/><category term='maps api'/><category term='safari'/><title type='text'>bologma</title><subtitle type='html'>every once in a while I have something to say</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10832913.post-4373920759263735813</id><published>2011-09-11T12:12:00.000-07:00</published><updated>2011-09-11T12:12:53.913-07:00</updated><title type='text'>Tests as System Specifications</title><content type='html'>&lt;p&gt;Today I was geeking out, following a long list of articles and papers by computer scientists sparked by Michael Fogus on &lt;a href="http://blog.fogus.me/2011/09/08/10-technical-papers-every-programmer-should-read-at-least-twice"&gt;papers every programmer should read&lt;/a&gt;.  I ended up checking out Leslie Lamport's (a distributed systems guru) &lt;a href="http://www.lamport.org/"&gt;website&lt;/a&gt; and downloading his book on &lt;a href="http://research.microsoft.com/en-us/um/people/lamport/tla/book.html"&gt;Specifying Systems&lt;/a&gt;. In its introduction he writes,&lt;blockquote&gt;A specification is a written description of what a system is supposed to do. Specifying a system helps us understand it. It's a good idea to understand a system before building it, so it's a good idea to write a specification of a system before implementing it.&lt;/blockquote&gt;&lt;br&gt;He also includes the quote:&lt;blockquote&gt;Writing is nature's way of letting you know how sloppy your thinking is.&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;This reminds me of the value I've found in writing tests for non-trivial programming modules before implementing them whenever it's not clear to me exactly how the system should work or what it is supposed to do, a topic &lt;a href="http://bologma.blogspot.com/2006/07/test-driven-design-not-just-for.html"&gt;I wrote about&lt;/a&gt; early in my career as a software engineer:&lt;blockquote&gt;[tests are] a specification for behavior. In essence, you're forced to think in a very concrete way, what is this code supposed to do? What exactly are it's input, outputs, error conditions, etc? And when you have finished writing the tests, you look at your code, it is amazingly simple.&lt;/blockquote&gt;&lt;br&gt;I wouldn't go so far as to say it always makes your program "amazingly simple", bit It does tend to make it simpler than it might have been were it not written only to satisfy the requirements you really need. And most importantly, to get back to what Lamport was saying, it helps you make sure you have really thought through the problem you are trying to solve before you starting writing a system to solve it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-4373920759263735813?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/4373920759263735813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=4373920759263735813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/4373920759263735813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/4373920759263735813'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2011/09/tests-as-system-specifications.html' title='Tests as System Specifications'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-6164455484186125958</id><published>2010-01-08T10:58:00.000-08:00</published><updated>2010-01-08T11:02:43.199-08:00</updated><title type='text'>Lyrics to the intro of "What up with that?"</title><content type='html'>because I could't find it anywhere online, I present the lyrics to "what up with that?"&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;i woke up this morning and i got out of bed, &lt;br /&gt;had a big old cup of coffee and to clear my head,&lt;br /&gt;telephone ring and you wanna chat&lt;br /&gt;well sit on down and tell me what - up - with - that&lt;br /&gt;&lt;br /&gt;oh whee! what up with that? what up with that?&lt;br /&gt;oh whee! what up with that? what up with that?&lt;br /&gt;&lt;br /&gt;he said, she said, we said, me said, what up with that?&lt;br /&gt;who knew, you knew, say what? voodoo! what up with that? what up with that?&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="512" height="296 "&gt;&lt;param name="movie" value="http://www.hulu.com/embed/tAXaZDXqZFaKGUShmarojQ"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.hulu.com/embed/tAXaZDXqZFaKGUShmarojQ" type="application/x-shockwave-flash" allowFullScreen="true"  width="512" height="296"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-6164455484186125958?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/6164455484186125958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=6164455484186125958' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/6164455484186125958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/6164455484186125958'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2010/01/lyrics-to-intro-of-what-up-with-that.html' title='Lyrics to the intro of &quot;What up with that?&quot;'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-8646500047828791028</id><published>2009-08-16T16:29:00.000-07:00</published><updated>2009-08-16T19:00:59.361-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='app engine'/><category scheme='http://www.blogger.com/atom/ns#' term='task queue'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='maps api'/><title type='text'>Fun with app engine's task queue</title><content type='html'>I just finished &lt;a href="http://kraigshousing.appspot.com"&gt;an app engine site&lt;/a&gt; that plots some housing rentals in Ann Arbor on google maps (&lt;a href="http://code.google.com/p/kraigshousing"&gt;source&lt;/a&gt;).   I originally started working on it out of frustration that &lt;a href="http://housingmaps.com"&gt;housing maps&lt;/a&gt; doesn't support Ann Arbor.  About half way through I realized &lt;a href="http://www.mapskrieg.com/view/annarbor/apartments-housing-for-rent"&gt; mapskrieg&lt;/a&gt; does, but by then I had already found an excuse to play around with some of app engine's latest features so I was happy to finish it up :)  Even though it is hard coded to listings in Ann Arbor, it works based off a list of craigslist search urls, so it could be targeted anywhere.&lt;br /&gt;&lt;br /&gt;The meat of the server is pretty simple:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;class RefreshCron(webapp.RequestHandler):&lt;br /&gt;  &amp;quot;Cron job that refreshes listings for each housing URL&amp;quot;&lt;br /&gt;  def get(self):&lt;br /&gt;    import pickle&lt;br /&gt;    # fire off tasks for each url&lt;br /&gt;    for url in HOUSING_URLS:&lt;br /&gt;      taskqueue.add(&lt;br /&gt;        url=&amp;quot;/task/craigsrss&amp;quot;,&lt;br /&gt;        payload=pickle.dumps(url),&lt;br /&gt;        headers={&amp;quot;Content-Type&amp;quot;: &amp;quot;application/octet-stream&amp;quot;})&lt;br /&gt;    self.redirect(&amp;quot;/&amp;quot;)&lt;br /&gt;&lt;br /&gt;class CraigsRssTask(webapp.RequestHandler):&lt;br /&gt;  &amp;quot;&amp;quot;&amp;quot;takes in a url to a craigslist rss feed, and grabs&lt;br /&gt;  each entry.  for each one, fires off a DetailsTask to&lt;br /&gt;  get the detail of each listing.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;  def post(self):&lt;br /&gt;    import pickle&lt;br /&gt;    url = pickle.loads(self.request.body) + &amp;quot;&amp;amp;format=rss&amp;quot;&lt;br /&gt;    listings = parseListings(fetchContent(url))&lt;br /&gt;    for listing in listings:&lt;br /&gt;      taskqueue.add(&lt;br /&gt;        url='/task/fetchdetails', &lt;br /&gt;        payload=pickle.dumps(listing), &lt;br /&gt;        headers={&amp;quot;Content-Type&amp;quot;: &amp;quot;application/octet-stream&amp;quot;})&lt;br /&gt;    self.redirect(&amp;quot;/&amp;quot;)&lt;br /&gt;&lt;br /&gt;class DetailsTask(webapp.RequestHandler):&lt;br /&gt;  &amp;quot;&amp;quot;&amp;quot;Fetches details from one listing and stores the &lt;br /&gt;  full listing in the datastore.  The listing is passed in the request &lt;br /&gt;  body as a pickled dictionary.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;  def post(self):&lt;br /&gt;    import pickle&lt;br /&gt;    listing = pickle.loads(self.request.body)&lt;br /&gt;    url = listing[&amp;quot;url&amp;quot;]&lt;br /&gt;&lt;br /&gt;    text = fetchContent(url)&lt;br /&gt;    address = extractAddr(text)&lt;br /&gt;    photos = extractPhotos(text)&lt;br /&gt;    lat,longit = parseGeocode(fetchContent(geocodeUrl(address)))&lt;br /&gt;    listingStored = ListingStore(&lt;br /&gt;      title=listing[&amp;quot;title&amp;quot;],&lt;br /&gt;      url=url,&lt;br /&gt;      address=address,&lt;br /&gt;      photos=photos,&lt;br /&gt;      lat=lat,&lt;br /&gt;      longit=longit)&lt;br /&gt;    listingStored.put()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A cron job posts a task for each craigslist search url using the &lt;a href="http://code.google.com/appengine/docs/python/taskqueue/"&gt;experimental task queue&lt;/a&gt; feature.  Each rss task parses the feed and some initial data about each listing, and then posts another task to gather the rest of the details from the listing url (including address and photo extraction, and geocoding of the address).  What's really cool is this all fans out in parallel, which means a 100+ listings can be parsed and ready to go very quickly.  With the addition of the task queue, I feel like app engine's request timeout has turned from a pesky limitation to a helpful reminder that if you are doing too much work in any single request handler, you are doing it wrong and should thing about how to break it down into smaller tasks that can be parallelized.  Since firing off a task is almost as easy as calling a function, there's really no excuse not to.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://code.google.com/appengine/docs/python/tools/devserver.html"&gt;development server&lt;/a&gt; does a really nice job with tasks.  Instead of firing them all off automatically, you can view each task in an admin console and fire them off one at a time to make sure everything is working properly, and also verify the tasks that you expect to show up do.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Sr0VppZ9JNY/Soi1Nt4uOoI/AAAAAAAAF5g/OJHrH_3IYG4/s1600-h/Picture+3"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 201px;" src="http://3.bp.blogspot.com/_Sr0VppZ9JNY/Soi1Nt4uOoI/AAAAAAAAF5g/OJHrH_3IYG4/s400/Picture+3" border="0" alt=""id="BLOGGER_PHOTO_ID_5370741802899749506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, you don't get the same interface once the app is running in production; it would be nice to have a way to see what tasks were pending, or at least flush them out in case a task is repeatedly barfing (as happened to me the first time I uploaded).  Another feature I'd like to see was a way to have a handler notified when a queue empties out to facilitate multi-stage parallel processing.  But overall I'm impressed with the task queue and look forward to it becoming a core feature (and available on the jvm).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-8646500047828791028?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/8646500047828791028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=8646500047828791028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/8646500047828791028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/8646500047828791028'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2009/08/fun-with-app-engines-task-queue.html' title='Fun with app engine&apos;s task queue'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Soi1Nt4uOoI/AAAAAAAAF5g/OJHrH_3IYG4/s72-c/Picture+3' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-4656608605683597505</id><published>2009-07-11T15:13:00.000-07:00</published><updated>2009-07-12T10:09:18.349-07:00</updated><title type='text'>Understanding the Y Combinator using Java</title><content type='html'>I've been interested in clojure lately, and therefore functional programming.  This lead me to reading about the Y Combinator, which is essentially the theory explaining how recursion can be implemented without naming, and therefore without being able to make the recursive call to the function name itself.  It's also a fun puzzle, and I suspect that's why it is so popular among functional programming geeks.&lt;br /&gt;&lt;br /&gt;Here is the Y Combinator in clojure:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;(defn Y [r]&lt;br /&gt;  ((fn [f] (f f))&lt;br /&gt;   (fn [f]&lt;br /&gt;     (r (fn [x] ((f f) x))))))&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.fatvat.co.uk/2009/04/understanding-y-combinator.html"&gt;This article&lt;/a&gt; does a pretty good job explaining how to apply it, but didn't really explain how the Y Combinator works.  What I wanted was the Y Combinator in a familiar form where I could step through the code and see what was going on.  Since java is the environment that is easiest for me to step through code, I looked around until I came across &lt;a href="http://arcfn.com/2009/03/y-combinator-in-arc-and-java.html"&gt;this article&lt;/a&gt; that does a good job explaining the Y Combinator, and provides source code in both lisp and java.  &lt;br /&gt;&lt;br /&gt;When you perform a direct translation of functional code into java, you get a mess of anonymous inner classes that isn't particularly easy to reason about.  So after pasting into into my IDE, I tried to remove all unnecessary anonymous inner classes while still preserving the essence of what the Y Combinator solves: how to implement recursion without making a direct recursive call.  I ended up with a lot more code of course, but java's verbosity shines when trying to understand this dense concept.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;/**&lt;br /&gt; * Demonstrates the principles of the Y-Combinator in java.&lt;br /&gt; */&lt;br /&gt;public class YComboDemo {&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Let's start with a simple function implemented &lt;br /&gt;     * recursively: factorial&lt;br /&gt;     */&lt;br /&gt;    static int factorial(int n) {&lt;br /&gt;        return n == 0 ? 1 : n * factorial(n - 1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * conceptually, factorial implements an interface &lt;br /&gt;     * that takes an integer and returns an integer&lt;br /&gt;     */&lt;br /&gt;    interface IntFunc {int apply(int n);}&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Here it is again in terms of a class implementing &lt;br /&gt;     * this interface:&lt;br /&gt;     */&lt;br /&gt;    static class SimpleFactorial implements IntFunc {&lt;br /&gt;&lt;br /&gt;        public int apply(int n) {&lt;br /&gt;            return n == 0 ? 1 : n * apply(n - 1);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Suppose java didn't support recursive calls.  &lt;br /&gt;     * How can we accomplish the same thing? Let's &lt;br /&gt;     * start by abstracting away the recursive call by&lt;br /&gt;     * delegating to some other function.&lt;br /&gt;     *&lt;br /&gt;     * This won't work unless we find a way to get &lt;br /&gt;     * that function to call back into us...&lt;br /&gt;     */&lt;br /&gt;    static class DelegatingFactorial implements IntFunc {&lt;br /&gt;        private final IntFunc f;&lt;br /&gt;        public DelegatingFactorial(IntFunc f) {&lt;br /&gt;            this.f = f;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public int apply(int n) {&lt;br /&gt;            // we can't call apply directly, so delegate&lt;br /&gt;            return n == 0 ? 1 : n * f.apply(n - 1);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Let's start by defining something that can generate&lt;br /&gt;     * a function in terms of some other.&lt;br /&gt;     */&lt;br /&gt;    interface IntFuncToIntFunc {IntFunc apply(IntFunc f);}&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * And then implement it for factorial.  This will generate&lt;br /&gt;     * a function that delegates to the passed in argument.&lt;br /&gt;     *&lt;br /&gt;     * But we still need to pass in the right argument to make&lt;br /&gt;     * the &amp;quot;recursion&amp;quot; work...&lt;br /&gt;     */&lt;br /&gt;    static class FactGen implements IntFuncToIntFunc {&lt;br /&gt;        public IntFunc apply(IntFunc f) {&lt;br /&gt;            return new DelegatingFactorial(f);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * That's where the Y-combinator comes in.  It finds the&lt;br /&gt;     * fixed point of any {@link IntFuncToIntFunc}.  That is,&lt;br /&gt;     * it finds the function for which calling &lt;br /&gt;     * {@link IntFuncToIntFunc} one more time will yield the&lt;br /&gt;     * same function.&lt;br /&gt;     *&lt;br /&gt;     * This is all just a fancy way of saying that it contains &lt;br /&gt;     * the plumbing to make sure the original function that &lt;br /&gt;     * needs to get calls back into itself will get them.&lt;br /&gt;     *&lt;br /&gt;     * This implements recursion for any &lt;br /&gt;     * {@link IntFuncToIntFunc} that generates&lt;br /&gt;     * a function that calls back to the passed in function.&lt;br /&gt;     */&lt;br /&gt;    static class YCombinator implements IntFunc {&lt;br /&gt;        private final IntFuncToIntFunc mIntFuncToIntFunc;&lt;br /&gt;&lt;br /&gt;        public YCombinator(IntFuncToIntFunc intFuncToIntFunc) {&lt;br /&gt;            mIntFuncToIntFunc = intFuncToIntFunc;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * The fixed point works by kicking of the first call to &lt;br /&gt;         * generate the int function.  We pass in ourselves as &lt;br /&gt;         * the argument so it will call back to our&lt;br /&gt;         * {@link #apply(int)} as necessary.&lt;br /&gt;         */&lt;br /&gt;        public IntFunc fixedPoint() {&lt;br /&gt;            return mIntFuncToIntFunc.apply(this);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * If the function calls back into us, we generate &lt;br /&gt;         * another function that calls back into us again.  &lt;br /&gt;         * This will keep happening until it knows the &lt;br /&gt;         * answer itself (its base case).&lt;br /&gt;         */&lt;br /&gt;        public int apply(int n) {&lt;br /&gt;            // setup another function with ourselves as &lt;br /&gt;            // the callback again&lt;br /&gt;            final IntFunc func = mIntFuncToIntFunc.apply(this);&lt;br /&gt;&lt;br /&gt;            // then just apply it&lt;br /&gt;            return func.apply(n);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String args[]) {     &lt;br /&gt;        final IntFuncToIntFunc factGen = new FactGen();&lt;br /&gt;&lt;br /&gt;        // if we apply the ycombinator to factgen, we have &lt;br /&gt;        // a working implementation of factorial&lt;br /&gt;        final IntFunc factorial = new YCombinator(factGen).fixedPoint();&lt;br /&gt;&lt;br /&gt;        System.out.println(factorial.apply(3));&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;So the Y Combinator works by serving as a trampoline for a generated function to bounce off back into itself after another function has been generated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-4656608605683597505?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/4656608605683597505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=4656608605683597505' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/4656608605683597505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/4656608605683597505'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2009/07/understanding-y-combinator-using-java.html' title='Understanding the Y Combinator using Java'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-3580473075223260403</id><published>2007-12-07T05:59:00.000-08:00</published><updated>2007-12-07T06:31:21.348-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='camino'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='safari'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Finally a fast browser for OS X that supports Google apps</title><content type='html'>I like Macs, but up until recently, I wasn't happy with its available browsers.  My first choice was to stick with &lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt;, since I am pretty happy with it on Windows and Linux.  For some reason though, Firefox has an exclusive Mac OS X feature of sucking; it &lt;a href="http://crazybob.org/2007/08/firefox-hangs-on-os-x.html"&gt;hangs&lt;/a&gt; all the time, and seems quite a bit slower than Safari.  So I tried Safari (version 2 at the time), and found it to be alright, but was disappointed that the support for google web apps on it was lacking.  Gmail worked at a basic level (no chat integration though), &lt;a href="http://reader.google.com"&gt;reader&lt;/a&gt; sort of worked but had a bunch of subtle UI bugs, and &lt;a href="http://docs.google.com"&gt;docs&lt;/a&gt; just flat out wasn't supported.  &lt;a href="http://caminobrowser.org/"&gt;Camino&lt;/a&gt;, which uses the same &lt;a href="http://en.wikipedia.org/wiki/Gecko_(layout_engine)"&gt;layout engine&lt;/a&gt; as Firefox but has a native OS X UI, seemed like a good choice for a while since it supported Google apps better, but never seemed to fully meet my expectations.  It wasn't quite as slick as Safari, and not quite as versatile as Firefox.&lt;br /&gt;&lt;br /&gt;I recently upgraded to &lt;a href="http://www.apple.com/safari/"&gt;Safari 3&lt;/a&gt;, and was delighted to find full support for gmail, reader and docs and spreadsheets.  That isn't the only improvement over Safari 2 either, it has a lot of snappy UI improvements, and seems even faster.  Going to Amazon or nytimes.com is like flipping to a TV channel when I'm on a high speed connection and it's the first browser I've used that allows you to pull a tab out into its own window too, something that ends up being very useful when I find myself with 10+ tabs open.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-3580473075223260403?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/3580473075223260403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=3580473075223260403' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/3580473075223260403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/3580473075223260403'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2007/12/finally-fast-browser-for-os-x-that.html' title='Finally a fast browser for OS X that supports Google apps'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-2352115139197826102</id><published>2007-12-06T11:05:00.000-08:00</published><updated>2007-12-06T11:11:40.375-08:00</updated><title type='text'>Url Encoded Charts</title><content type='html'>Creating by &lt;a href="http://code.google.com/apis/chart/"&gt;encoding them in a url&lt;/a&gt; is just too easy.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chtt=It's+Like&amp;cht=p3&amp;chd=s:hW&amp;chs=400x160&amp;chl=This|That"/&gt;&lt;br /&gt;&lt;br /&gt;I'm guessing we'll start to see a lot more sites like &lt;a href="http://www.jamphat.com/rap/"&gt;this&lt;/a&gt; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-2352115139197826102?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/2352115139197826102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=2352115139197826102' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/2352115139197826102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/2352115139197826102'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2007/12/url-encoded-charts.html' title='Url Encoded Charts'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-621664807870616267</id><published>2007-10-27T10:10:00.000-07:00</published><updated>2007-10-27T10:23:11.912-07:00</updated><title type='text'>Playing WFUV on a Squeezebox</title><content type='html'>&lt;a href="http://www.wfuv.org/"&gt;WFUV&lt;/a&gt; is a fantastic station my friend recently pointed me to (I was instantly sold when I heard they had a whole day devoted to Neil Young in honor of his upcoming album).  I streamed their &lt;a href="http://www.wfuv.org/audio/fuv247_128k.pls"&gt;high quality stream&lt;/a&gt; from work via iTunes with no problem.&lt;br /&gt;&lt;br /&gt;Then, I was disappointed when the friggin' stream wouldn't play on my &lt;a href="http://www.slimdevices.com/"&gt;squeezebox&lt;/a&gt; at home that evening.  I found a &lt;a href="http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=794507&amp;file=filename.pls"&gt;crappy quality stream&lt;/a&gt; on &lt;a href="http://www.shoutcast.com"&gt;shoutcast&lt;/a&gt; that worked, but at 56 kbps, it was hardly worth listening to.&lt;br /&gt;&lt;br /&gt;Today I figured it out with curl:&lt;br /&gt;&lt;br /&gt;$ curl http://www.wfuv.org/audio/fuv247_128k.pls&lt;br /&gt;[playlist]&lt;br /&gt;NumberOfEntries=1&lt;br /&gt;File1=http://wfuv.ic.llnwd.net/stream/wfuv_allmusic2&lt;br /&gt;Title1=FUV 24/7 All Music Channel, 128k&lt;br /&gt;&lt;br /&gt;It turns out the .pls link returns extra information that the squeezebox can't parse, but the direct link 'http://wfuv.ic.llnwd.net/stream/wfuv_allmusic2' works great.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-621664807870616267?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/621664807870616267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=621664807870616267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/621664807870616267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/621664807870616267'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2007/10/playing-wfuv-on-squeezebox.html' title='Playing WFUV on a Squeezebox'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-1050007352239354939</id><published>2007-08-15T06:41:00.000-07:00</published><updated>2007-08-16T13:19:43.103-07:00</updated><title type='text'>Kurzweil vs. Gelernter</title><content type='html'>The headline of the article, "&lt;a href="http://www.technologyreview.com/Infotech/18867/"&gt;Is Artificial Intelligence Lost in the Woods?&lt;/a&gt;", in the recent MIT Technology Review is compelling.  I began reading it expecting that the author, David Gelernter, might be outlining some new research into what makes emulating the intelligence of the human brain / body so daunting.  Instead, it is an incoherent rant that basically boils down to an argument that computers will never literally be human beings, and even if they behave exactly as intelligent, it doesn't matter.&lt;br /&gt;&lt;br /&gt;While investigating Gelernter further online, I was happy to find that Ray Kurzweil &lt;a href="http://video.google.com/videoplay?docid=-4037867521925272124#44m47s"&gt;layed the smack down&lt;/a&gt; in a recorded debate with him by clarifying that whether computers will ever truly be conscious in the exact same way humans are is a philosophical question, not a scientific one, and that Gelernter is rigging the argument in his favor by refusing to accept any objective way to verify that a computer has become conscious.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-1050007352239354939?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/1050007352239354939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=1050007352239354939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/1050007352239354939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/1050007352239354939'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2007/08/kurzweil-vs-gelernter.html' title='Kurzweil vs. Gelernter'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-3052089003121035101</id><published>2007-08-13T04:40:00.000-07:00</published><updated>2007-08-13T05:46:19.672-07:00</updated><title type='text'>facebook survives the cut</title><content type='html'>Every now and then, someone invites me to join some social network, and the same thing usually happens:&lt;br /&gt;- I sign up, enter in some subset of the usual 'profile' questions&lt;br /&gt;- I find a few people and become "friends" with them&lt;br /&gt;- I don't visit the site for a few months&lt;br /&gt;- I get some spammy update email from the site encouraging me to find more friends&lt;br /&gt;- I delete my profile from that site (accept for linked in, which &lt;a href="http://www.codinghorror.com/blog/archives/000703.html"&gt;won't let you&lt;/a&gt;, so in that case I just changed every entry in my profile to 'linked in sucks')&lt;br /&gt;&lt;br /&gt;Facebook started off on the same path, but has managed to avoid the ax so far.  The addition of 'news feeds' was a big reason, it's easy to log in now and then and see quickly if there is anything worth checking out (a friend posting a photo for instance).  I also like how people are tagged in photo, so you are alerted when you've been tagged in a new photo for instance, or can easily see the photos of one of your friends whether it was taken by them or not.  One thing I recently discovered is you can remove yourself from being tagged in an individual photo if you like; let's say someone snaps a shot of you when you weren't sucking your gut in and don't want everyone to see it every time they look at photos tagged of you, you actually can remove the tag from someone else's photo.  So while you can't remove someone else's photo, you have some control over what photos of you people will easily discover.  The rest of the privacy controls are good too.&lt;br /&gt;&lt;br /&gt;Since facebook doesn't suck, I'm glad they've opened up a &lt;a href="http://developer.facebook.com/"&gt;developer API&lt;/a&gt; so that every new site doesn't have to create their own half assed social networking feature.  I don't want to create a profile on flixter.com just to write a couple of movie reviews, but I'm happy to add the flixter app to share reviews with my friends on facebook.  My tolerance for creating profiles for new sites is at an all time low.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-3052089003121035101?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/3052089003121035101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=3052089003121035101' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/3052089003121035101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/3052089003121035101'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2007/08/facebook-doesnt-suck.html' title='facebook survives the cut'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-7772163899022616854</id><published>2007-05-17T09:57:00.000-07:00</published><updated>2007-05-17T10:27:14.319-07:00</updated><title type='text'>Embedded Slideshow</title><content type='html'>Kind of cool new feature for picasaweb:&lt;br /&gt;&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="400" height="267" flashvars="host=picasaweb.google.com&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fkrosaen%2Falbumid%2F5045990443470353393%3Fkind%3Dphoto%26alt%3Drss" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-7772163899022616854?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/7772163899022616854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=7772163899022616854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/7772163899022616854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/7772163899022616854'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2007/05/embedded-slideshow.html' title='Embedded Slideshow'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-2043365957364067198</id><published>2007-03-14T17:57:00.000-07:00</published><updated>2007-03-14T18:03:15.006-07:00</updated><title type='text'>Looks Like Someone's Got a Case of the Muunnndays</title><content type='html'>I took a look at my stats from &lt;a href="http://reader.google.com"&gt;google reader&lt;/a&gt; today, and was surprised that Monday was overwhelmingly the busiest for my feed reading:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Sr0VppZ9JNY/RfiaW5QEKJI/AAAAAAAAAc0/c0SRXRXVOPs/s1600-h/readerbyday.png"&gt;&lt;img style="float:none; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_Sr0VppZ9JNY/RfiaW5QEKJI/AAAAAAAAAc0/c0SRXRXVOPs/s400/readerbyday.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5041949500957272210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had no idea I wasted that much more time on Mondays :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-2043365957364067198?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/2043365957364067198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=2043365957364067198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/2043365957364067198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/2043365957364067198'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2007/03/looks-like-someones-got-case-of.html' title='Looks Like Someone&apos;s Got a Case of the Muunnndays'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Sr0VppZ9JNY/RfiaW5QEKJI/AAAAAAAAAc0/c0SRXRXVOPs/s72-c/readerbyday.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-3144128455289922599</id><published>2007-03-07T07:56:00.000-08:00</published><updated>2007-03-07T08:44:44.869-08:00</updated><title type='text'>What "On the Media" and "The Daily Show" Have in Common</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.onthemedia.org/images/logo_otm_r.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.onthemedia.org/images/logo_otm_r.gif" border="0" alt="" /&gt;&lt;/a&gt;Two of my favorite ways to keep up with current affairs are, "The Daily Show" on comedy central, and NPR's "On the Media".  They both appeal to me because they each take a step back and look at what the media, reminding me that they are not some oracle passing down "the news", but organizations, consisting of people, making sometimes flawed decisions about what to cover and how to cover it.&lt;br /&gt;&lt;br /&gt;The Daily show makes fun of the media both directly via John Stewart's monologues, and via the parody performed by its corespondents, packing a lot of "funny cuz' it's true" punch.  Of course, I don't need to tell you that; everyone loves The Daily Show!&lt;br /&gt;&lt;br /&gt;If you do like The Daily Show, check out &lt;a href="http://www.onthemedia.org/"&gt;On the Media&lt;/a&gt;.  It takes a more serious, thorough and legitimate approach to talking about the media, but provides a similar satisfaction.  A recent example is from last weeks show, where they did &lt;a href="http://www.onthemedia.org/transcripts/2007/03/02/01"&gt;a story&lt;/a&gt; about how the media has covered the crappy conditions of Walter Reed.  The story seems to have broke only recently with &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2007/02/17/AR2007021701172.html"&gt;The Washington Post's story&lt;/a&gt;, but it's pointed out that this story has been covered by Salon's Mark Benjamin &lt;a href="http://dir.salon.com/topics/walter_reed_army_medical_center/"&gt;for years&lt;/a&gt;.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://www.onthemedia.org/"&gt;On the Media&lt;/a&gt; (&lt;a href="http://feeds.wnyc.org/onthemedia"&gt;podcast&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-3144128455289922599?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/3144128455289922599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=3144128455289922599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/3144128455289922599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/3144128455289922599'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2007/03/what-on-media-and-daily-show-have-in.html' title='What &quot;On the Media&quot; and &quot;The Daily Show&quot; Have in Common'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-315074604954656248</id><published>2006-12-10T01:13:00.000-08:00</published><updated>2006-12-10T01:43:38.249-08:00</updated><title type='text'>Learning to Read</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.curriculumdesign.com/YellowLegalPad.jpg"&gt;&lt;img style="float:right; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.curriculumdesign.com/YellowLegalPad.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;A couple months ago, I picked up a copy of &lt;a href="http://www.amazon.com/Punishment-Bantam-Classics-Fyodor-Dostoevsky/dp/0553211757/"&gt;Crime and Punishment&lt;/a&gt; from the local used book store and started to plod through it.  I usually make a bee line for the computer section, but was inspired by a coworker who told me he was planning on reading it.  Having gone through engineering school and missing out on the liberal arts education exposure to the classics, I thought it might be a good opportunity to read and discuss with someone else.&lt;br /&gt;&lt;br /&gt;About twenty pages in, I was quickly reminded why I prefer non-fiction to fiction; I couldn't tell what the hell was going on.  I've observed that I actually find it easier to read something as dry as &lt;a href="http://mitpress.mit.edu/sicp/"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt; than a spy novel like &lt;a href="http://www.amazon.com/Polish-Officer-Novel-Alan-Furst/dp/0375758275"&gt;The Polish Officer&lt;/a&gt;.  I've pretty much accepted that fact, and used it to my advantage to some extent by constantly reading evermore about programming, but this time I wanted to take a stand.&lt;br /&gt;&lt;br /&gt;Why is it, I thought, that I have such a hard time sticking with fiction (with the exception of sci-fi I'd imagine most middle schoolers can read)?  It turned out to be the characters.  About twenty of them in the first fifty pages.  I'd come across yet another generic Russian name (Yakov Smirnov) and wonder whether it was the protagonist or some minor passerby whom I'd never encounter again for the rest of the book.&lt;br /&gt;&lt;br /&gt;Eureka!  It's my crappy memory.  I can't remember people's names until I've met them at least a few times and my spelling is terrible (I've already been nagged a half dozen times by Firefox's new check as you go tool while writing this post), so no wonder I can't keep track of a barrage of new characters every time I open a new fiction book.  With technical books, it's more of filling in a piece or two into a partially solved puzzle.&lt;br /&gt;&lt;br /&gt;Having identified the problem I set out with a new tool: a pad of paper next to my bed.  Each time I encountered an unfamiliar name, I'd look it up and jot down a few notes if it was really someone new, or refresh my memory if not.  This worked really well.  After the first hundred pages, I finally knew the main characters well enough to enjoy the book, consulting the pad less and less often.&lt;br /&gt;&lt;br /&gt;I wonder if my brain will ever rewire itself to get better at this sort of thing.  In the meantime, at least I have figured out how to expand my horizons a bit, even if I'm going to look like a complete dufus next time I head to the beach with a pad of paper to accompany my paperback:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-315074604954656248?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/315074604954656248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=315074604954656248' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/315074604954656248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/315074604954656248'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/12/learning-to-read.html' title='Learning to Read'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-2177356140397800830</id><published>2006-12-06T08:41:00.000-08:00</published><updated>2006-12-06T08:59:41.561-08:00</updated><title type='text'>Aging Parents</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.gpc.edu/~heritage/military/YoungSoldier_OldMan2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.gpc.edu/~heritage/military/YoungSoldier_OldMan2.jpg" border="0" alt="" /&gt;&lt;/a&gt;My mom recently turned 59.  That's almost 60, and my Dad's not far behind.&lt;br /&gt;&lt;br /&gt;Over the years, my view of "old" has shifted to stay ahead of my parents.  When I was 10, a 50 year old was definitely old.  But then my parents turned 50, and I though, well, they aren't old; they're my parents!  But 60, man, my brain is pushing back at me when I say to myself, "60's not old!"&lt;br /&gt;&lt;br /&gt;Both of my parents are still vigorous, they work out, they work every day, they learn new things.  My mom uses firefox.  My dad embraces relatively new things like &lt;a href="http://www.pandora.com"&gt;pandora&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;They are showing signs though.  Their routines are getting more hardened.  They go to the same restaurant every week for months at a time.  It's not Bill Knapp's though; they aren't &lt;span style="font-style:italic;"&gt;that&lt;/span&gt; old :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-2177356140397800830?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/2177356140397800830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=2177356140397800830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/2177356140397800830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/2177356140397800830'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/12/aging-parents.html' title='Aging Parents'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-8566249625502292972</id><published>2006-11-26T14:10:00.000-08:00</published><updated>2006-11-26T15:14:02.303-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retirement'/><category scheme='http://www.blogger.com/atom/ns#' term='personal finance'/><title type='text'>To Roth or Not?</title><content type='html'>Among the most popular options for retirement planning are tax-deferred plans like 401k's and traditional IRAs, and tax-exempt plans like Roth-IRAs and Roth-401ks.  With tax-deferred plans, you get to put pre-tax money into retirement, let it grow tax free, then pay income taxes on it when you withdrawal at the end.  With tax-exempt plans, you place after tax money in, it grows tax-free, but you pay no taxes when withdrawing later on.  In both cases, "later on" means after you are about 60 years old.  And in both cases, you get the awesome benefit of the money growing tax free until it is withdrawn, instead of paying capital gains taxes every year on your investment income.&lt;br /&gt;&lt;br /&gt;Even after having been schooled in these two options from my Dad, who's obsessed about saving for retirement, until recently I was confused about the differences between the two.  I thought Roth-IRAs would actually yield more money in the long run since you weren't paying taxes on the much larger sum of money that would accumulate.  That's bunk, however, due to basic commutativity of multiplication: whether the tax bill comes now are later, it is still being multiplied by the same stuff.  With the same tax rate and return on investment, the same pre-tax income placed into a Roth-IRA and a traditional IRA will yield the exact same amount at then end!&lt;br /&gt;&lt;br /&gt;Let's say you take 10,000 dollars in pre-tax income, and want to save for retirement, and you expect to make 8 percent a year on investments over 30 years.  And let's say the tax rate is 20 percent.  With a 401k, you have:&lt;br /&gt;&lt;br /&gt;$10,000 * (1.08)^30 * 0.8 = $80,501.25&lt;br /&gt;&lt;br /&gt;The 10,000 dollars is multiplied by the compound interest you make over 30 years, after which you take away twenty percent (multiply by 0.8) for taxes.  In the case of a roth-IRA, the math is:&lt;br /&gt;&lt;br /&gt;10,000 * 0.8 * (1.08)^30 = $80,501.25&lt;br /&gt;&lt;br /&gt;You take out the 20 percent first, but you still have the same growth; in both cases the money grows tax free.&lt;br /&gt;&lt;br /&gt;After understanding that fundamental point, there are still a couple subtle things to consider when choosing.  First, your tax burden might be different later on.  Some recommend the tax-exempt Roth style approach because they figure by the time they retire they won't be making as much money, and will be in a lower income tax bracket.  Others think they will still be working, and perhaps be making more money.  Still others thing there is no way to know what the tax laws will be decades from now, and feel better paying taxes now when they know exactly what it is.&lt;br /&gt;&lt;br /&gt;A second very important thing to consider is the contribution limits.  If the contribution limits are "the same", for example if your company gives you the choice between a 401K and a roth-401K, then you can actually save &lt;span style="font-style:italic;"&gt;more&lt;/span&gt; money with the Roth.  Let's say the limit is ten thousand dollars.  Ten thousand dollars after tax money is more than ten thousand pre-tax dollars, so you will in effect be saving more money.  For example, if your tax rate is twenty percent, you could contribute (1 / (0.8)) = 1.25 times more money into an account where it can grow tax free with the Roth style account.  It of course requires placing more of your income into retirement, but at least it is an option.&lt;br /&gt;&lt;br /&gt;Personally, I'm torn.  I like the idea of being able to save more with Roth, due to the limits issue I just mentioned, but I suspect I'll be paying lower taxes later on given that I'm a software engineer and by the time I'm sixty years old I will likely have long since trained my fresh twenty year old replacement :)&lt;br /&gt;&lt;br /&gt;What I decided to do is split it up fifty fifty.  In the end, when one turns out to be the best option due to the tax bracket I end up in, I will have only blown it half way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-8566249625502292972?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/8566249625502292972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=8566249625502292972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/8566249625502292972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/8566249625502292972'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/11/to-roth-or-not.html' title='To Roth or Not?'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-4524343663289116630</id><published>2006-11-12T21:32:00.000-08:00</published><updated>2006-11-12T21:54:04.191-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><title type='text'>TODO: check out hiveminder</title><content type='html'>&lt;a href="http://hiveminder.com"&gt;Hiveminder&lt;/a&gt; is a slick piece of free online software I came across earlier today while looking for a way to keep a to-do list.&lt;br /&gt;&lt;br /&gt;At first, I tried using &lt;a href="http://docs.google.com"&gt;google spreadsheets&lt;/a&gt; to keep a list, but it didn't work so well.  For one, there is no natural way to prioritize or show dependencies between tasks.  Once I started adding a column with a numerical priority, I knew I was trying to shove a square peg into a round hole.&lt;br /&gt;&lt;br /&gt;After searching around, I came across a &lt;a href="http://lifehacker.com/software/todo%20manager/"&gt;tag on lifehacker&lt;/a&gt; on to-do list software.  After a brief perusal, it seemed &lt;a href="http://hiveminder.com"&gt;hiveminder&lt;/a&gt; was potentially the best.&lt;br /&gt;&lt;br /&gt;Anyways, after using it for all of twelve hours, I don't think I need to look any further.  It has a clean interface, allowing you to quickly jot down a bunch of tasks free form, after which you can go back and flesh out any individual task with due dates, priorities and tags.  You can say one task must be done before or after another, after which the main list only shows the first task in that dependency chain.  And perhaps most awesomely, you can create a group list, which I'm already using to keep a common list of household and bill-pay type tasks with my wife.&lt;br /&gt;&lt;br /&gt;Gad I love the internet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-4524343663289116630?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/4524343663289116630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=4524343663289116630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/4524343663289116630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/4524343663289116630'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/11/todo-check-out-hiveminder.html' title='TODO: check out hiveminder'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-5390202188754812684</id><published>2006-11-07T10:58:00.000-08:00</published><updated>2006-11-07T11:06:54.785-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voting'/><title type='text'>Electronic Voting Machines seem OK in Santa Clara County</title><content type='html'>There has been a lot of hoopla over the problems with electronic voting machines.  How there is no way to verify votes in case of a problem, how the code is not open to inspection etc.  But the one I used this morning to vote in Santa Clara county was an electronic voting machine, and it did seem to fulfill the requirements of verification.&lt;br /&gt;&lt;br /&gt;After I voted, it printed out a receipt that I viewed throw a plastic window, giving me an opportunity to verify that the votes printed out were true to what I touched on the screen.  Only after I said 'yes' did it attach some official vote bar code and deposit the paper vote into some box.  I imagine if I had said 'no' it would have given me a chance to go back and see why the votes were different, and if necessary ask an election official about it.&lt;br /&gt;&lt;br /&gt;This doesn't mean there aren't voting machines out there that fail to provide a paper trail, but at least this particular one seemed OK.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-5390202188754812684?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/5390202188754812684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=5390202188754812684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/5390202188754812684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/5390202188754812684'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/11/electronic-voting-machines-seem-ok-in.html' title='Electronic Voting Machines seem OK in Santa Clara County'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-116236606972653218</id><published>2006-10-31T23:19:00.000-08:00</published><updated>2006-11-07T10:57:40.694-08:00</updated><title type='text'>Voting in California</title><content type='html'>Next Tuesday, I will vote in California for the first time since moving here from Michigan in the summer of 2005.&amp;nbsp; I have been pretty clueless on all the ballot initiatives (there are tons; isn't this supposed to be a representative government?), so tonight I printed out the state voters guide and started wading my way through them with my wife.&amp;nbsp;&lt;br/&gt; &lt;br/&gt; Disclaimer: these decisions are tentative and are based on less than an hour of review.&amp;nbsp; Don't hold it against me too much if it turns out years from now I was incredibly wrong!&amp;nbsp; Also, the voting decisions posted are my own; my wife didn't necessarily agree with me on any of these :)&lt;br/&gt; &lt;br/&gt; The first one we looked at was &lt;a href="http://www.voterguide.ss.ca.gov/props/prop90/prop90.html" title="proposition 90"&gt;proposition 90&lt;/a&gt;, proposing restricting the powers of eminent domain.&amp;nbsp; At first glance, it seems like who wouldn't like it?&amp;nbsp; Who wants the government taking away their house by force and giving what they deem to be a fair price?&amp;nbsp; But I also wondered, how often is this used, and for what purpose?&amp;nbsp; Does the government low ball people?&amp;nbsp; Don't most state governments have this power?&amp;nbsp; For more insight on the matter I turned to &lt;a href="http://washingtonmonthly.com" title="Kevin Drum"&gt;Kevin Drum&lt;/a&gt;, a professional blogger who I've read on and off since he was &lt;a href="http://www.calpundit.com/" title="just an ameteur"&gt;just an amateur&lt;/a&gt;.&amp;nbsp; Through a &lt;a href="http://www.google.com/search?q=site%3Ahttp%3A%2F%2Fwww.washingtonmonthly.com%20prop%2090&amp;amp;sourceid=navclient-ff&amp;amp;ie=UTF-8&amp;amp;rls=GGGL,GGGL:2006-39,GGGL:en" title="site restricted search"&gt;site restricted search&lt;/a&gt; , I found &lt;a href="http://www.washingtonmonthly.com/archives/individual/2006_10/009873.php" title="this post"&gt;this post&lt;/a&gt; that provided some more context.&amp;nbsp; It pointed out that, beyond preventing the government from seizing property, it allows property owners to claim compensation for any action the government takes that could decrease the value of their land.&amp;nbsp; This puts it over the edge.&amp;nbsp; &lt;span style="FONT-WEIGHT:bold"&gt;Decision: no on prop 90.&lt;/span&gt;&lt;br/&gt; &lt;br/&gt; Next, we checked out &lt;a href="http://www.voterguide.ss.ca.gov/props/prop87/prop87.html" title="prop 87"&gt;prop 87&lt;/a&gt;, which proposes four billion dollars in taxes on oil companies that extract oil in California to promote clean energy usage.&amp;nbsp; Anything that would add more funding for clean energy usage sounds good.&amp;nbsp; However, I don't agree with how it is funded.&amp;nbsp; How ever rich oil companies may be, does it make sense to basically gang up on them and make them pay for something we all value?&amp;nbsp; If we think it is so important, why can't we pay for clean energy promotion out of the general fund?&amp;nbsp; Plus, what really is bad for the environment is energy consumption.&amp;nbsp; I'd prefer a gas or carbon tax.&amp;nbsp; Making Hummer drivers pay $100 to fill their tanks will make them think a little harder than seeing than some commercial where Leonardo DiCaprio claims his Prius rules.&amp;nbsp; It may be true that a gas tax will never get passed, and this is the best option for a long while to get more funding for enviro stuff, but I gotta stick to my principles on this one.&amp;nbsp; &lt;span style="FONT-WEIGHT:bold"&gt;Decision: no on prop 87.&lt;span style="FONT-WEIGHT:bold"&gt;&lt;br/&gt; &lt;br/&gt; &lt;/span&gt;&lt;/span&gt;The last proposition we looked at was 86, proposing more cigarette taxes, funding health care.&amp;nbsp; Currently, cigarettes cost about $4 a pack, about $0.87 of that going to the state.&amp;nbsp; If 86 passes, an additional $2.60 would be taxed, adding up to a whopping $6.60 per pack.&amp;nbsp; I know I just said I liked consumption based taxes in the case of energy, but come on!&amp;nbsp; It certainly would stop some people from smoking, but I feel like the people worst off would be the poor.&amp;nbsp; Someone who smokes a pack a day and can't quit would end up paying another 30 bucks a week, $1500 a year, on cigarettes, an amount that could seriously screw over someone making 20 grand a year.&amp;nbsp; I would be for it if it were a more moderate increase.&amp;nbsp; &lt;span style="FONT-WEIGHT:bold"&gt;Decision: no on prop 86.&lt;/span&gt;&lt;br/&gt; &lt;br/&gt; That's all I could stand to sift through in one sitting, stay tuned for updates on other decisions if I get around to blogging about it.&amp;nbsp; It is still a week until the polls open; I'm open to hearing more on any of these props and maybe even changing my mind.&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-116236606972653218?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/116236606972653218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=116236606972653218' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/116236606972653218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/116236606972653218'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/10/voting-in-california.html' title='Voting in California'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-116115114574639829</id><published>2006-10-17T22:45:00.000-07:00</published><updated>2006-11-07T10:57:40.562-08:00</updated><title type='text'>Shared vs Starred, Tags and Folders in Google Reader</title><content type='html'>A couple weeks ago, google reader came out with a new interface that is quite a bit better.  The main thing it changed was moving away from a single river-o-news model to an "inbox for the web".  This works much better when you subscribe to a lot of feeds.  Others have written plenty about it.&lt;br /&gt;&lt;br /&gt;After using it a bunch for two weeks, a couple more subtle yet crucial improvements have become apparent: a new notion of 'shared', and a distinction between tags and folders.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Shared vs Starred&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'll start with the shared vs. starred idea.  Ever since the first version of reader, you could star individual items.  This seemed relatively useful, let's say I like a story and want to remember it somehow: I'll star it.  However, there was a major flaw: when I clicked to view all of my starred items, the list was empty.  I had to click on "view unread items" to see the items I had starred and (obviously) read.  Then, when clicking back to the original stream of my feeds, there would be a bunch of crap I had already read and I'd have to uncheck the 'show read' button.&lt;br /&gt;&lt;br /&gt;Later on, still in the older version, they introduced sharing.  You could share your starred items and send a feed to your friends.  My brother could subscribe to my starred items in his reader and automatically see what I had found interesting.  Now, for the first time, stars were useful.  However, they still sucked for remembering stories I wanted to maybe go back and read later.&lt;br /&gt;&lt;br /&gt;In the latest version of reader, this problem is solved: starred has gone back to the meaning it has in gmail: flag this to make not of it to myself somehow.  I can still share my starred items if I want to, but there is another feature for that purpose: my 'shared items'.  Now, as I'm going though my stories, I'll hit the 'share' button on all the stories I think are interesting and want others to see, and star much more occasionally if I want to go back and read a particular story later on.  I can click on a button to see my starred stories and it will show them (even though they are read); no need to 'show unread'.  Yay!&lt;br /&gt;&lt;br /&gt;Another nice feature about 'shared' items is reader automatically constructs &lt;a href="http://www.google.com/reader/shared/09423407391920410611"&gt;a page&lt;/a&gt; for you to easily share with others, (see mine linked to as 'link blog' in the sidebar).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tags vs Folders&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another thing that stunk about the old reader was that there was no difference between folders and tags; and they were both called 'labels'.  You could label a feed, and label individual posts.  But a labeled feed means all stories within that feed are labeled the same, so if any label used for feeds would overwhelm the individual stories labeled the same.  I label slashdot as 'science', then, it's pointless to label any individual story 'science' because slashdot will always be spitting dozens of stories a day into that label.&lt;br /&gt;&lt;br /&gt;With the new reader, 'label' is killed (with what seems to be some lingering references that are likely bugs in the UI).  Google finally threw in the towel and started using the word 'tag' like everyone else (for reader at least), and distinguishes between categorizing your feeds (into folders), and further annotating individual stories (with tags).  The folders help me quickly check out a bunch of related feeds within reader, and the tags help me occasionally further describe an individual story.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-116115114574639829?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/116115114574639829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=116115114574639829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/116115114574639829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/116115114574639829'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/10/shared-vs-starred-tags-and-folders-in.html' title='Shared vs Starred, Tags and Folders in Google Reader'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-115674464756883601</id><published>2006-08-27T22:40:00.000-07:00</published><updated>2006-11-07T10:57:40.266-08:00</updated><title type='text'>What will EC2 be used for?</title><content type='html'>&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;Update (9/6):&lt;/span&gt; I received another email informing me of more signups available (in my inbox at 2AM PT), but by the time I clicked on the link this morning I was too late.  According to the email:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If you are unable to sign up in this round, we encourage you to stay ready. We intend on activating more beta users in the coming weeks.&lt;br /&gt;&lt;/blockquote&gt; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Last week, I received an email from Amazon announcing a &lt;a href="http://www.amazon.com/gp/browse.html?node=201590011"&gt;new beta web service&lt;/a&gt; named, "Amazon Elastic Computing Cloud", or EC2 for short.  I had messed around with s3 before so I was given the opportunity to preview EC2.  By the time I signed in, I was notified that,&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The Amazon EC2 Limited Beta is Currently Full&lt;br /&gt;We will e-mail you when we can accommodate additional users. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ah well, I probably wouldn't have done anything with it anyway.&lt;br /&gt;&lt;br /&gt;But this sounds really cool!  One of the first things that came to mind is the power of distributed computing for short periods of time.  Firing up a reliable web server is one thing, but this seems like it will really lower the barrier to using many machines at once; you don't have to own them, you just pay to use them for a little while then kill the jobs.&lt;br /&gt;&lt;br /&gt;For instance, imagine firing up 100 instances of a linux box loaded up with a python script to vote for your story on digg and reddit, bringing you to the front page, and sidestepping whatever security they probably have in place to restrict multiple votes coming from a single IP address.  As soon as the deed was done, you could halt the processes as well as the running tab.  At $0.10 per instance hour, that might only cost you ten bucks!&lt;br /&gt;&lt;br /&gt;It also reminds me of the command and control style bot networks used by spammers and denial of service attackers.  The process of gaining control of people's computers via viruses seems like a pain in the neck compared to the ease of spawning the exact machine images you desire via EC2.&lt;br /&gt;&lt;br /&gt;I'm sure Amazon has thought of the security implications, and the fact that you have to register with a credit card before using any of their chargeable web services would make it much tougher.  Plus, they already mention, "If you wish to run more than 20 instances, please contact us at aws@amazon.com."&lt;br /&gt;&lt;br /&gt;No matter the case, I look forward to see what comes of EC2, and eventually playing around with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-115674464756883601?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/115674464756883601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=115674464756883601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/115674464756883601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/115674464756883601'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/08/what-will-ec2-be-used-for.html' title='What will EC2 be used for?'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-115293834654078710</id><published>2006-07-14T20:17:00.000-07:00</published><updated>2006-11-07T10:57:40.097-08:00</updated><title type='text'>Test Driven Design: Not Just For Weenies?</title><content type='html'>During the last couple of weeks, I've given Test Driven Design a serious try.  I have been pleasantly surprised.  Beyond the expected benefit of having better test coverage, I have found that it leads (at least in the case of the last two weeks) to more elegant design that does just what it is supposed to do and no more.&lt;br /&gt;&lt;br /&gt;I first heard about TDD years ago, but wrote it off as eXtreme programming weeny stuff.  Extreme programming is a process for writing software that mandates a set of practices, including:&lt;br /&gt;- all code is written in pairs&lt;br /&gt;- tests are written before the code; no functionality is allowed unless a test verifies it (this is test driven development)&lt;br /&gt;&lt;br /&gt;I had a pretty strong reaction, my thinking went along these lines: why should I be forced to write code in a very particular way sitting next to someone?  What if I didn't like that person?  What if he didn't like me? (I would have used "he/she", but come on, this is programming.)  And if studies show that it increases productivity, it must be because, in the average case, you're taking a bunch of miserable people who work on boring code and forcing them to sit together where they won't feel comfortable surfing the web and reading blogs all day to avoid writing boring code.  It's like having the boss stop by every 2 minutes forcing you to alt-tab away from reddit and slashdot.  Plus, testing is the boring part of programming, you mean I have to do it all the time?  Can't someone from another team write tests afterwards?  I'm a good programmer, I don't need some process to enforce quality in my code.  Finally, the fact that it was named, "eXtreme programming" made me want to barf; you think a whiff of super macho man / slim jim / mountain dew bull shit is going to get me excited about you're crappy software practice you invented just so you could write a bunch of books about it?  Huh?  Did you!?  &lt;br /&gt;&lt;br /&gt;So what made me give the test driven development part a try?  Well, I started working at a real company on a real project.  Your code lives forever.  Any problems will come back to haunt you.  And once your code is live on a production website or service, fixing it isn't a matter of changing a few lines in a file, and then checking to see if the problem is fixed.  You have to patch a change list into a special branch that has to go through an entire quality assurance process.  Then it goes on a canary (a subset of production machines) where everyone waits to see if things seem to be going OK.  Finally, it is pushed out to all production machines.  At this point, at least a day or two has passed and many people have had to work to make it happen.  Then, the problem might still be there!  Oh crap!  Anyway, you learn to fear seeing an email pop up in your inbox about some stack trace in the production logs.  &lt;br /&gt;&lt;br /&gt;Contrast this with back in school, where each project was finite.  I wrote my code, got it to "work" and then it was done.  If there was a bug or two, eventually exposed by the automatic grading script, well, hey, I still got an A-.  Afterwards, I could throw it away, never forced to face any bugs.&lt;br /&gt;&lt;br /&gt;Anyways, after a couple of those emails I mentioned earlier popping up in my inbox at work followed by a scramble to hack together a change as fast as possible to fix the problem, I got a lot more serious about verifying my code.  I watched a &lt;a href="http://video.google.com/videoplay?docid=8135690990081075324&amp;q=type%3Agoogle+engEDU"&gt;tech talk online&lt;/a&gt; about test driven development. I picked up &lt;a href="http://www.amazon.com/gp/product/1558608680/102-7802626-1383364?v=glance&amp;n=283155"&gt;a book&lt;/a&gt; from a local used book store named, "Unit Testing in Java: How Tests Drive the Code."  As I walked back to my apartment from the bookstore, I found myself turning the cover of the book towards my body, half expecting someone to drive by in a convertible and yell, "Weeny!"&lt;br /&gt;&lt;br /&gt;Before reading about it, I had assumed writing tests as I programmed would help in a a simple yet direct way: I would be writing tests about each piece of code before I forgot about all of the functionality I was writing.  No more scrambling to write tests after the fact.  That is a benefit, but what I have learned from looking into it more deeply and giving it a try is that the process reaches beyond producing bug free code; it's producing modular, verifiable code.  Most importantly, it avoids over design.&lt;br /&gt;&lt;br /&gt;No code is written that isn't verified by a test.  In fact, you write the test first, run it, see that it fails, and then write the code to make the test pass.  That test is a specification for behavior.  In essence, you're forced to think in a very concrete way, what is this code supposed to do?  What exactly are it's input, outputs, error conditions, etc?  And when you have finished writing the tests, you look at your code, it is amazingly simple.  That polymorphic hierarchy I was anticipating writing?   Well, it turns out a couple of if-else statements were perfectly sufficient.  That design pattern I was chomping at the bit to apply?  Totally needless in this situation.  Some of that stuff does appear, but only after there is a proven need for it, namely code duplication.&lt;br /&gt;&lt;br /&gt;There are a bunch of other benefits of TDD that I've read about, like the fact that when someone else comes along a couple years from now and has to modify my code to do something new, they will feel a lot more confident in making sure they haven't screwed anything up.  We'll see, it hasn't been long enough to verify the rest.  &lt;br /&gt;&lt;br /&gt;In the meantime, I'll keep applying it the code I write and see if I continue to like it.  &lt;br /&gt;&lt;br /&gt;You might be wondering, have I drank the XP kool-aid?  Will I start bugging my teammates to buddy up and sit next to me while I program, and start watching them?  For now, no.  But I will give those XP guys a little credit.  Weenies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-115293834654078710?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/115293834654078710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=115293834654078710' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/115293834654078710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/115293834654078710'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/07/test-driven-design-not-just-for.html' title='Test Driven Design: Not Just For Weenies?'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-115168161231872134</id><published>2006-06-30T08:25:00.000-07:00</published><updated>2006-11-07T10:57:40.032-08:00</updated><title type='text'>Another Inconvenient Truth</title><content type='html'>Last night I saw the movie, An Inconvenient Truth, Al Gore's global warming movie.  It's really good, go see it!&lt;br /&gt;&lt;br /&gt;&lt;embed style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=2078944470709189270" allowScriptAccess="sameDomain" quality="best" bgcolor="#ffffff" scale="noScale" salign="TL"  FlashVars="playerMode=embedded"&gt; &lt;/embed&gt;&lt;br /&gt;        &lt;br /&gt;Then, this morning, I read &lt;a href="http://www.freep.com/apps/pbcs.dll/article?AID=/20060630/NEWS07/606300453/1009"&gt;this article&lt;/a&gt; about how driving while talking on your cell phone, even when using a handset, is as dangerous as driving drunk.  Doh!  &lt;br /&gt;&lt;br /&gt;The study that the article is based on does a comparison based on a BAC of 0.08%, which, if I remember correctly from my DARE class, is about one beer's worth.  Does this mean that people will soon be thrown in jail for the night, fined heavily, and sentenced to &lt;a href="http://www.1800duilaws.com/states/mi.asp"&gt;45 days&lt;/a&gt; of community service for driving while talking on the cell phone?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-115168161231872134?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/115168161231872134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=115168161231872134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/115168161231872134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/115168161231872134'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/06/another-inconvenient-truth.html' title='Another Inconvenient Truth'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-115057584509864127</id><published>2006-06-17T13:10:00.000-07:00</published><updated>2006-11-07T10:57:39.962-08:00</updated><title type='text'>Ann Arbor on Google Earth</title><content type='html'>Last weeks &lt;a href="http://www.gearthblog.com/blog/archives/2006/06/huge_database_u.html"&gt;major imagery update&lt;/a&gt; for &lt;a href="http://earth.google.com/"&gt;Google Earth&lt;/a&gt; includes my hometown Ann Arbor, which previously had terrible resolution.  Yay!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update:&lt;/span&gt; it turns out that it is only for the eastern half of Ann Arbor, and doesn't include the down town and campus areas.  Doh!  I was fooled because the coverage includes my parents house.&lt;br /&gt;&lt;br /&gt;Still cool though.  Plus, now it's &lt;a href="http://maps.google.com/maps?f=q&amp;hl=en&amp;ie=UTF8&amp;t=h&amp;om=0&amp;ll=42.290771,-83.711271&amp;spn=0.10362,0.12394"&gt;now available on google maps&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-115057584509864127?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/115057584509864127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=115057584509864127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/115057584509864127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/115057584509864127'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/06/ann-arbor-on-google-earth.html' title='Ann Arbor on Google Earth'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-115006028917542552</id><published>2006-06-11T13:50:00.000-07:00</published><updated>2006-11-07T10:57:39.894-08:00</updated><title type='text'>DS lite: I'm in pizza face paradise</title><content type='html'>&lt;span style="font-weight:bold;"&gt;The Seed is Planted&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yesterday my neighbor Judd told me his rich friend had ordered him a DS lite so he could have someone to talk about it with.  Apparently his friend does this from time to time; he also bought him a PSP when it came out.  I'm going to have to introduce myself at some point to this guy.&lt;br /&gt;&lt;br /&gt;Anyway, that got me curious; I didn't even know a new DS was coming out.  I have heard whiffs here and there about the DS being cool, but it looked so clunky in the stores.  Plus, I have been turned off to video games in general for the past few years.  The thought of spending hours a night to create a character on World of Warcraft just to go online and get my ass kicked by a bunch of 14 year olds; no thanks.  When the PSP came out, I was tempted, thinking that maybe it would have simple, fun games you could play for a half hour or so.  But after borrowing Judd's a couple of times, I was pretty unimpressed with the games.&lt;br /&gt;&lt;br /&gt;But Judd mentioned to me that the DS lite was supposed to be really cool, a new screen that was as bright and crisp as the PSP, a sleeker design.  Most importantly, a bunch of cool games that have been released over the last couple years.  The DS has slowly overtaken the PSP in market share due to its superior games despite its ugly appearance (and remember this is with the old ugly clunky one).&lt;br /&gt;&lt;br /&gt;This got me curious, yesterday afternoon I went online and started checking out game reviews.  There was a spruced up Mario 64, a new Mario Kart, and new 2d side scrolling Mario!  I thought, "Ok, I want one!."  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The Journey&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On the way to Trader Joes last night, I stopped by a nearby Game Spot to ask them about it.  I approached the store clerk, who looked like a store clerk at a video game store.  &lt;br /&gt;&lt;br /&gt;"Do you have the DS lite?"  &lt;br /&gt;&lt;br /&gt;"No."  &lt;br /&gt;&lt;br /&gt;"Will you have it tomorrow?"&lt;br /&gt;&lt;br /&gt;"Yes.  Do you have a reservation?"&lt;br /&gt;&lt;br /&gt;"Hmm, no I don't..."&lt;br /&gt;&lt;br /&gt;"Make that, 'no'."&lt;br /&gt;&lt;br /&gt;Aw man, why the hell can't companies just ship enough friggin' systems!??  Then I remembered, way back when Nintendo 64 came out, I showed up to Best Buy really early and waited until it opened along with a bunch of other geeks, and was able to get one even though I was sans reservation.  I thought to myself, "I can do the same thing this time!"  &lt;br /&gt;&lt;br /&gt;So this morning, I woke up at 8:30, and was dressed and at Best Buy by 9AM, an hour before they open.  I had packed my I-pod, a luna bar, and the latest issue of "The Economist".  As I pulled into the parking lot, my pulse quickened; would I be too late?  Would there already be 50 nerds waiting in line staring at me with pity as I pulled in too late?&lt;br /&gt;&lt;br /&gt;The parking lot was empty.  I laughed to myself, half grateful I hadn't shown up 2 hours early, and pulled into a nearby spot where I could read and wait for an hour.  As I read, I watched each Best Buy employee show up.  Some of them looked at me with some suspicion, most didn't notice.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;We're not Dissapointed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Anyway, I got the system along with 3 games, Super Mario 64 DS, Mariokart DS, and New Super Mario (the 2d side scrolling one).  They are all really cool, though I've played the New Super Mario the most.  It is a great game; a throwback to the original NES Mario games with some added functionality and flare. First impressions about the DS-lite itself:&lt;br /&gt;&lt;br /&gt;- It looks cool, kind of like an ipod, with white plastic casing.&lt;br /&gt;- The dual screen combo is effective.  The bottom one is touch sensitive, and aside from that is actually used effectively while playing.  For instance, in Mario Kart, you have a map of the track as you are racing around.  You can see when shells are approaching from behind, etc.&lt;br /&gt;- The wireless capability is intriguing.  Once Judd gets his, I look forward to playing Mario Kart against him.  If you get one, let me know, we can play online cross country even.&lt;br /&gt;&lt;br /&gt;Perhaps most amazingly, my wife likes it.  She &lt;span style="font-style:italic;"&gt;hates&lt;/span&gt; video games, but as soon as she heard the familiar sounds of Mario grabbing coins, growing after eating a mushroom, throwing a fireball etc. she became curious.  She used to like video games as a kid, and Mario was her favorite.  So now &lt;span style="font-style:italic;"&gt;she's&lt;/span&gt; grabbed the game from &lt;span style="font-style:italic;"&gt;me&lt;/span&gt;, and I'm stuck writing this blog entry.  &lt;br /&gt;&lt;br /&gt;Oh wait, she has finally put the game down.  Gotta go!&lt;br /&gt;&lt;br /&gt;Karl&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-115006028917542552?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/115006028917542552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=115006028917542552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/115006028917542552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/115006028917542552'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/06/ds-lite-im-in-pizza-face-paradise.html' title='DS lite: I&apos;m in pizza face paradise'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-114533974836883431</id><published>2006-04-17T22:49:00.000-07:00</published><updated>2006-11-07T10:57:39.809-08:00</updated><title type='text'>Why Statistics can't Explain what Joe Dumars Knows</title><content type='html'>In today's print Wall Street Journal, there was an article, "The Story That Stats Don't Tell" about how the effort of NBA organizations to use statisticians to optimize their player choices has yielded results far short of similar efforts in other sports, notable Major League Baseball.  I would link to the article, but WSJ.com is complete abomination, and a search on the exact title of the article produces zero results.  Anyway, it got me thinking again about how difficult it seems to quantify an individual player's worth in basketball, a subject I have pondered in the past as well as had lengthy geeky conversations about with my brother.&lt;br /&gt;&lt;br /&gt;My interest in basketball stats began while playing fantasy basketball, where it's easy to figure out who the best player is in terms of the fantasy league: there is a published formula for 'fantasy points' that depends on conventional stats (a point is worth 1 fantasy point, a rebound 2, a block 4 etc).  It was fun to use stats like fantasy points per game over the last X games to find the best players to pick up; one year I won the league (I also got butt lucky that year and had &lt;a href="http://sports.espn.go.com/nba/players/profile?statsId=3007"&gt;Kevin Garnett&lt;/a&gt; during his MVP season).&lt;br /&gt;&lt;br /&gt;Next, I read the book &lt;a href="http://www.amazon.com/gp/product/0393057658/102-6511298-5336903?v=glance&amp;n=283155"&gt;Money Ball&lt;/a&gt; about how General Manager Billy Beane and statistician Paul DePodesta used stats to build a team of unconventional, unlikely players and take the Oakland A's to the playoffs and have the league's best record with a &lt;a href="http://www.onestopbaseball.com/TeamPayroll.asp"&gt;payroll&lt;/a&gt; less than a quarter than that of the Yankees'.  Completely fascinating stuff: the geeks prevailed!&lt;br /&gt;&lt;br /&gt;Then, there was the fact that my favorite team in the NBA, the Detroit Pistons, happen to be the Oakland A's of the NBA.  I know, that doesn't really do them justice, but bear with me.  A team of cast-offs with people that no other team really wanted like Ben Wallace and Chauncey Billups.  A &lt;a href="http://www.hoopshype.com/salaries.htm"&gt;payroll&lt;/a&gt; less than half the awful NY Knicks (and a very good, but still inferior Dallas Mavericks).  And they won a championship.  They went to the finals last year, and they have the league's best record going into this year's playoffs.  Joe Dumars is the Billy Beane of basketball.&lt;br /&gt;&lt;br /&gt;All that, and apparently, the Pistons are NOT among the teams that make use of professional statisticians.  The WSJ article named the Celtics, Sonics and Houston Rockets as teams that do, and they range from mediocre to sucky.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Why Basketball Stats Suck&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. All plays are fluid.  &lt;br /&gt;&lt;br /&gt;With the exception of free throw shots, every play in basketball occurs in motion, and is very hard to quantify.  Consider a typical fast break where 2-4 guys are sprinting down court with defenders racing after from various starting positions and various speeds.  That exact play, with the exact same players starting in all the same positions, may not occur again for years, if ever.  Contrast that with each at bat in baseball.  In baseball, the state of the game before the play is quantifiable: the game literally stops between each play.  You know how many men are on base, where the fielders are, how well the particular batter has performed in the past against the exact pitcher he is facing etc. etc.   &lt;br /&gt;&lt;br /&gt;2. The stats that are recorded are vague&lt;br /&gt;&lt;br /&gt;An individual player may have a great field goal percentage, but what are his shots like?  If he makes wide open jumpers from 15 feet out because another player is drawing players away and getting him a great look, is that as good as someone who makes a turn around hook shot with a hand in his face?  According to the stats, yes.  &lt;br /&gt;&lt;br /&gt;What about an assist?  If a player hands the ball to a team mate right next to him who jacks up a 3 pointer and makes it, is that as valuable as a pass that threads between two defenders and gives a teammate a wide open layup?  Again, according to the stats, yes.&lt;br /&gt;&lt;br /&gt;3. Many stats aren't recorded&lt;br /&gt;&lt;br /&gt;Some stats that are of clear value simply aren't recorded officially, such as taking an offensive charge.  A defender plants his feet, stands in front of a driving defender, and falls over, resulting in a turn over &lt;span style="font-style:italic;"&gt;and&lt;/span&gt; a foul on the offender.  This is counted as nothing.&lt;br /&gt;&lt;br /&gt;Another defensive action of real value that is not recorded is a defender's ability to alter opposing player's shots.  Ben Wallace may get a couple blocks a game, but I'm guessing he makes opponents alter and miss five to six shots per game.&lt;br /&gt;&lt;br /&gt;4. Individual Performances are very dependent on Teammates&lt;br /&gt;&lt;br /&gt;The WSJ article mentioned this one too.  In baseball, a player at bat is by himself; no teammate is going to help him hit the ball.  In basketball, other players are involved in the vast majority of baskets.  Some players set picks for others.  The ball may be passed around the top of the key involving three players before an open man is found.  Who gets what portion of the credit?  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How to Do Better&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Qualify Each Existing Stat&lt;br /&gt;&lt;br /&gt;The first step in better predicting the value of players would be to start recording enhanced stats.  Every shot, every assist, every rebound, would be qualified somehow.  Perhaps something as simple as a subjective rating of difficulty from 1-5.  Someone with enough money could hire and train people to watch every NBA game and keep track of these things.  A shot: was it wide open?  Difficulty = 1.  Was it a turn around jumper with three defenders around?  Difficulty = 5.  A rebound: was it a simple rebound off a foul shot?  Or did the player jump up and rip it down over several defenders?  Each game could be independently kept track of by 3 - 5 players, and the averages could be kept, perhaps throwing out outliers.&lt;br /&gt;&lt;br /&gt;Or one could attempt to be a little less subjective.  The location of each shot as well as the distance and velocity of the defender could be estimated for each shot. &lt;br /&gt;&lt;br /&gt;2. Record New Stats&lt;br /&gt;&lt;br /&gt;An easy win would be to start keeping track of those unrecorded stats I mentioned, like altering a player's shot.  You could record anything that you thought could reliably measured, really.  &lt;br /&gt;&lt;br /&gt;You could then do regression analysis to find each one's effect on the points scored and points allowed, winning percentage etc to discover how important each one is.&lt;br /&gt;&lt;br /&gt;3. Team Performance With and Without an Individual Player&lt;br /&gt;&lt;br /&gt;Another method might be to look at how a team performed with and without a given player.  However, it is rare you will have good data on this; unless a player is injured for exactly half of the games, and you have many games vs the exact same opponent with the exact same lineup to compare with and without an individual player, this would unlikely produce anything but noise.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;It's Still Tough&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Either way, I doubt any of these efforts would yield anything close to as accurate as what is done with Baseball.  I'm willing to bet the existing stats guys are already doing stuff like this; I doubt that the Rockets hired MIT MBA Daryl Morey to come in and say, "according to my calculations, Kobe Bryant is leading the league in scoring."  &lt;br /&gt;&lt;br /&gt;There are just too many ways to be a valuable player.  How can you compare Richard Hamilton's ability to run around like a madman tiring out his defender, driving him into pick after pick to get open shots to Ben Wallace's ability to alter shots to others, when no one else has this strategy?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ask Joe D&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;All of this is a tribute to Joe Dumars' genius.  He's onto something for sure, but how does he pick?  How did he know Chauncey Billups could be transformed from journeyman to Allstar and MVP-candidate?  How could he have predicted that under sized Ben Wallace would the best defender in the NBA?  Maybe it that's what makes the NBA so interesting to me; no one has cracked the code to automating the process of picking out unlikely valuable players.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-114533974836883431?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/114533974836883431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=114533974836883431' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114533974836883431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114533974836883431'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/04/why-statistics-cant-explain-what-joe.html' title='Why Statistics can&apos;t Explain what Joe Dumars Knows'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-114402826221321858</id><published>2006-04-02T18:26:00.000-07:00</published><updated>2006-11-07T10:57:39.668-08:00</updated><title type='text'>firefox crash recovery: crucial on OS X</title><content type='html'>I like firefox.  I've grown accustomed to its features on Windows, Linux, and, since last year when I got an Apple Powerbook, on Mac OS X too.&lt;br /&gt;&lt;br /&gt;I would use Safari, but a couple of key applications (gmail and google reader) don't work as well on it.  However, while I haven't had any trouble on Windows or Linux, firefox crashes about once a day on the Mac.  This isn't terrible, aside from losing the 10 tabs I have open at any given time.&lt;br /&gt;&lt;br /&gt;Fear no more, &lt;a href="https://addons.mozilla.org/extensions/moreinfo.php?application=firefox&amp;id=1955"&gt;firefox crash recovery&lt;/a&gt; is here.  Nothing too special, it just reopens any windows and/or tabs you had open the next time you open firefox after a crash.&lt;br /&gt;&lt;br /&gt;I also stumbled upon another use of crash recover when VPNing into work.  I tried to open firefox remotely, and it complained that it was already open.  So I manually killed it, and when I opened it, all of my tabs from work were open!  I usually have 10-12 work related docs open, so a nice bonus when working from home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-114402826221321858?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/114402826221321858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=114402826221321858' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114402826221321858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114402826221321858'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/04/firefox-crash-recovery-crucial-on-os-x.html' title='firefox crash recovery: crucial on OS X'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-114270461734399583</id><published>2006-03-18T09:56:00.000-08:00</published><updated>2006-11-07T10:57:39.585-08:00</updated><title type='text'>Improving Blogging Software</title><content type='html'>A couple of weeks ago, Steve Yegge wrote one of his &lt;a href="http://steve-yegge.blogspot.com/"&gt;rants&lt;/a&gt; about the &lt;a href="http://steve-yegge.blogspot.com/2006/03/blog-or-get-off-pot.html"&gt;shortcomings of blogs&lt;/a&gt;.  He focuses on the lack of features to support essay publishing, such as the inability to display the entries ranked by popularity, rather than chronologically.  &lt;br /&gt;&lt;br /&gt;This reminded me that, about a year and a half ago, I thought a lot about how blogs could be improved too.  It was one of those ideas that came into my head while I was trying to fall asleep, and was so pervasive that I had to get up and jot it down.  Like most (all) of those types of ideas, I never found time to actually &lt;span style="font-style:italic;"&gt;implement&lt;/span&gt; it, but it was fun to think about anyway :)&lt;br /&gt;&lt;br /&gt;This was around the time leading up to the 2004 elections, when I was reading a lot of political blogs, such as &lt;a href="http://washingtonmonthly.com/"&gt;Washington Monthly&lt;/a&gt;, where it is often the case that bloggers talk about the same issues over and over again, bringing in recent events to shed new light on them.  I started to think, wouldn't it be nice if they could simply post their definitive opinion on a topic and then craft it over time?  The opinion would be change tracked, and between each change, there would be a list of things (blog posts, user comments, links) that contributed to the change.  &lt;br /&gt;&lt;br /&gt;For example, let's say you had written a 1.0 version of how to make the best ribs.  Then, you come across &lt;a href="http://virtualweberbullet.com/rib1.html"&gt;this recipe&lt;/a&gt;, give it a shot, and change your mind.  You write a blog post linking to the site, and describing your experience.  Then, you edit your best ribs article to reflect the use of cherry smoking wood, and in the change record, link to your blog post about using the recipe.  That creates "Best ribs" 2.0.  Anyone who comes to your site can see the article, as well as it's previous version.  They will also see in between 1.0 and 2.0, a link to the post about trying out the new recipe.&lt;br /&gt;&lt;br /&gt;I mentioned a lot of terms like change event, opinion, change tracking... Here are some definitions:&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;Blog post&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;This is your run of the mill, "I saw/experienced this article/link/event today and here's what I think" post.  Presenting these chronologically makes sense because they are usually relevant to a recent event.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Article revision&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;An essay, opinion, article that is relevant for longer than a week.  People might want to read this months later.  It may change over time, influenced by user comments, recent events etc.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Article&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;An ordered collection of article revisions, between which there change events&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Change Event&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;A collection of links to things that have influenced a revision change.  It can be anything that is linkable, including comments, blog posts, web sites, etc.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;Existing software like blogger do blog posts just fine of course, and that is enough for a lot of blogs.  However, more and more I am seeing people shoe-horn in essay publishing into their blogs.  They could simply post a separate page on their website (if they have one), but then there wouldn't be the built in ability for users to comment on it.  Plus, revisions wouldn't be visible.  So people use blogs.  When users comment on what they have to say, the author might say a few things in the comments, clarifying a thing or two, changing his/her mind etc.  Or they might revise their blog post, which unfortunately kills the original revision, making the comments that lead to the change seem out of place.&lt;br /&gt;&lt;br /&gt;Some examples.  &lt;a href="http://blog.guykawasaki.com/"&gt;Guy Kawasaki&lt;/a&gt; exclusively posts what I would consider essays.  John Battelle uses &lt;a href="http://battellemedia.com/"&gt;his blog&lt;/a&gt; for essays in &lt;a href="http://battellemedia.com/archives/002441.php"&gt;some&lt;/a&gt; &lt;a href="http://battellemedia.com/archives/001128.php"&gt;cases&lt;/a&gt;, and as a normal, "check this out" blog &lt;a href="http://battellemedia.com/archives/002443.php"&gt;other&lt;/a&gt; &lt;a href="http://battellemedia.com/archives/002439.php"&gt;times&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So what would this post count as?  Given that there are only two people who read this blog (when I ask them to), it probably doesn't matter either way, but probably an article.  I mean, just reading over it right now, I can already see some new things that could be added (such as the concept of a link blog entry; nothing more than a link), but I don't feel like revising it right now.  But I could throw it out there, get some feedback, and then write a revision citing what influenced it.  Wouldn't THAT be fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-114270461734399583?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/114270461734399583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=114270461734399583' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114270461734399583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114270461734399583'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/03/improving-blogging-software.html' title='Improving Blogging Software'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-114218944994590194</id><published>2006-03-12T10:44:00.000-08:00</published><updated>2006-11-07T10:57:39.441-08:00</updated><title type='text'>90s Music Wasn't so Bad After All</title><content type='html'>&lt;p&gt;&lt;a href="http://www.pitchforkmedia.com/top/90s/"&gt;This article&lt;/a&gt; lists the top 100 albums of the 1990s, and does a pretty good job of it.  I'll list my specific gripes below about some exclusions from the list, but overall it reminded me that while pop music in the 90s (think "Color me Badd") sucked in a hilarious way, there were some really good albums and new artists that emerged.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;b&gt;Should have made the cut:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Blackstar.  You include DJ Shadow, and can't remember Mos Def and Kweli??&lt;br /&gt;&lt;li&gt;Black Crowes.  At &lt;i&gt;least&lt;/i&gt; "Southern Harmony Musical Companion", and probably "Amorica".&lt;br /&gt;&lt;li&gt;Alice in Chains "Dirt".  They were the best grunge rock band of the 90s IMHO.&lt;br /&gt;&lt;li&gt;Medeski Martin &amp; Wood: "It's a jungle in here", or maybe "Combustication".  Either way, the best new Jazz group of the 90s.&lt;br /&gt;&lt;li&gt;Beastie Boys "Paul's Boutique"&lt;br /&gt;&lt;li&gt;Latyrx&lt;br /&gt;&lt;li&gt;Jurassic 5 "Quality Control"&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Awesome Inclusions:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Beck "Odelay"&lt;br /&gt;&lt;li&gt;Tribe Called Quest: "Low End Theory", "Midnight Marauders"&lt;br /&gt;&lt;li&gt;Gza: Liquid Swords.  The best Wu-tang album IMO.&lt;br /&gt;&lt;li&gt;Dr. Octagon.  Freaky / Funny collaboration of Kool Keith and Dan the Automator (of Gorillaz fame).&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Awesome Exclusions:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Phish.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Overrated:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Weezer.  A couple of catchy tunes, but what's the big deal?&lt;br /&gt;&lt;li&gt;Dj Shadow "Entroducing".  I have this album, and it's just "OK".  I don't get this being in the top 10, especially given the exclusion of some other notable hip hop.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Stuff I'm curious about&lt;/b&gt;.  There are some artists listed that I've heard of, but never really checked out, so now I'm tempted to finally give em' a listen:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Wilco&lt;br /&gt;&lt;li&gt;Built to Spill&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-114218944994590194?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/114218944994590194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=114218944994590194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114218944994590194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114218944994590194'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/03/90s-music-wasnt-so-bad-after-all.html' title='90s Music Wasn&apos;t so Bad After All'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-114159604827712863</id><published>2006-03-05T13:58:00.000-08:00</published><updated>2006-11-07T10:57:39.334-08:00</updated><title type='text'>cool videos of the week</title><content type='html'>&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=zFj_i6HtebM&amp;search=science"&gt;From boiling to frozen&lt;/a&gt;.  A man throws boiling water into the air in Saskatchewan during a typical mid-winter, -40c day.&lt;br /&gt;&lt;li&gt;&lt;a href="http://video.google.com/videoplay?docid=-4345041675875517929&amp;q=real+life+simpsons"&gt;Real life Simpsons intro.&lt;/a&gt;  Amazing attention to detail.&lt;br /&gt;&lt;li&gt;&lt;a href="http://video.google.com/videoplay?docid=-1070093049599841964&amp;q=transformer"&gt;A real life transformer!&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://video.google.com/videoplay?docid=-8203676824373879947"&gt;Blackstar (Mos Def and Talib Kweli) video&lt;/a&gt; I haven't seen this video for quite some time.&lt;br /&gt;&lt;li&gt;&lt;a href="http://video.google.com/videoplay?docid=208026788561310611&amp;q=fishing+video"&gt;A guy fishes with a flashlight.&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://video.google.com/videoplay?docid=-1744809380070014467"&gt;Cats&lt;/a&gt; &lt;a href="http://video.google.com/videoplay?docid=-1757803256836451754"&gt;are&lt;/a&gt; &lt;a href="http://video.google.com/videoplay?docid=3665832105675538700&amp;q=cat"&gt;funny.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-114159604827712863?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/114159604827712863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=114159604827712863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114159604827712863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114159604827712863'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/03/cool-videos-of-week.html' title='cool videos of the week'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-114066565634021248</id><published>2006-02-22T19:18:00.000-08:00</published><updated>2006-11-07T10:57:39.073-08:00</updated><title type='text'>Marinade = Olive Oil + Garlic + acidic liquid + fresh herb</title><content type='html'>I've been grilling a lot lately since I finally got a &lt;a href="http://www.amazon.com/gp/product/B00008RC2Q/qid=1140665126/sr=1-1/ref=pd_bbs_1/103-9494393-1787035?%5Fencoding=UTF8&amp;v=glance&amp;n=286168"&gt;gas grill&lt;/a&gt; a few days ago.  I noticed a pattern for marinades: blend in some olive oil, something acidic (lemon juice or balsamic vinegar for instance), a fresh herb and some garlic and you can't go wrong.  &lt;br /&gt;&lt;br /&gt;Olive Oil + garlic + ...&lt;br /&gt;&lt;br /&gt;1) lemon juice + cilantro : made for a delicious shrimp marinade (got it from &lt;a href="http://www.amazon.com/gp/product/0375405062/sr=8-1/qid=1140665333/ref=sr_1_1/103-9494393-1787035?%5Fencoding=UTF8"&gt;a middle eastern cookbook&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;2) lemon juice + basil : made for a great Tuna steak marinade (from a &lt;a href="http://www.amazon.com/gp/product/0761120149/qid=1140665373/sr=2-1/ref=pd_bbs_b_2_1/103-9494393-1787035?s=books&amp;v=glance&amp;n=283155"&gt;grilling cookbook&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3) balsamic vinegar + basil : was awesome on portobello mushrooms (same grilling book)&lt;br /&gt;&lt;br /&gt;How much of each you ask?  Start with about a half cup of olive oil, mix in the acidic ingredient, about two tablespoons (half lemon or pour of vinegar) at a time tasting it until the balance tastes right.  How much garlic depends on how spicy you want it; it could range from 2 to 10 cloves.  Herbs? A handful or two of freshly chopped.&lt;br /&gt;&lt;br /&gt;Karl&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-114066565634021248?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/114066565634021248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=114066565634021248' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114066565634021248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114066565634021248'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/02/marinade-olive-oil-garlic-acidic.html' title='Marinade = Olive Oil + Garlic + acidic liquid + fresh herb'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-114033275466765754</id><published>2006-02-18T22:48:00.000-08:00</published><updated>2006-11-07T10:57:39.001-08:00</updated><title type='text'>Pirates Cove: fun board game!</title><content type='html'>My neighbor Judd bought &lt;a href="http://www.piratescovegame.com/"&gt;Pirate's Cove&lt;/a&gt; today, and the four of us (him, his wife, me and my wife) played this evening.  It's TBD whether or not it will be a classic like Settlers of Catan or Axis and Allies, but it was definitely a lot of fun.&lt;br /&gt;&lt;br /&gt;The basic idea is that each player is a pirate, aiming to be the most famous and fearsome pirate of all the high seas (arrrr!).  There are four Islands that at the beginning of each turn each player silently decides where they would like to go, and each Island has a certain type of resource used to build up specific part of your ship (hull, guns, deck hands or sails).  The fun part is that if you happen to pick the same island as another player, you have to battle it out to see who gets to go to the island to get the resources there (the other pirate goes home empty handed).&lt;br /&gt;&lt;br /&gt;I don't feel like explaining the whole game, but I will say that the game is a success for the following reasons:&lt;br /&gt;- it doesn't take that long to pick up (20 minutes)&lt;br /&gt;- it doesn't take too long to play (~1 hour)&lt;br /&gt;- there is a reasonable amount of strategy involved&lt;br /&gt;- it has a creative plot / gameplay (not another dwarfs vs goblins or military simulation game)&lt;br /&gt;&lt;br /&gt;If you are looking for something new, try it out!&lt;br /&gt;&lt;br /&gt;Karl&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-114033275466765754?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/114033275466765754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=114033275466765754' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114033275466765754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/114033275466765754'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2006/02/pirates-cove-fun-board-game.html' title='Pirates Cove: fun board game!'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-113477277753446824</id><published>2005-12-16T14:39:00.000-08:00</published><updated>2006-11-07T10:57:38.805-08:00</updated><title type='text'>Pandora for new music that fits your taste</title><content type='html'>Now that I'm out of school and can no longer rely on the buzz from the "cool kids" for suggestions of new music to try, and I don't go to concerts around campus etc, I've found it tough to find new music that I like. Pandora attempts to help out in this area, and seems to work really well (after 30 minutes of using it).  I started with Alison Krauss, Beck, Jurassic 5, Neil Young, and Dire Straits, and have already found new artists I would have never thought to check out such as:&lt;br /&gt;- The Greencards (on Alison Krauss station)&lt;br /&gt;- Daniel Lanois (on the Neil Young station)&lt;br /&gt;&lt;br /&gt;The stations keep separate content separate; so it doesn't do something stupid like try to combine Jurassic 5 and Alison Krauss to return a rappin' fiddler.  You get to listen to the entire songs as they are queued up on your radio stations, and get to rate them as they go by (thumbs up or thumbs down).  When you give it the thumbs down, it skips to the next song.  Apparently they've managed to get licenses to do this by restricting the number of songs you can skip per hour, and not letting you pick exactly what you're going to listen to.  Whatever the case, this is the coolest site I've come by in a while.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Read more at &lt;a href="http://www.pandora.com/"&gt;www.pandora.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-113477277753446824?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/113477277753446824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=113477277753446824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/113477277753446824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/113477277753446824'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2005/12/pandora-for-new-music-that-fits-your.html' title='Pandora for new music that fits your taste'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10832913.post-110840297373085790</id><published>2005-02-14T09:33:00.000-08:00</published><updated>2006-11-07T10:57:38.726-08:00</updated><title type='text'>first post: veggies vs pills</title><content type='html'>I was about to send out an email to a few people linking to an article, and thought, "hey, this is what a blog is for, and that way I won't have to bug anybody!"&lt;br /&gt;&lt;br /&gt;There is an &lt;a href="http://www.latimes.com/features/health/nutrition/la-he-briefly14.3feb14,1,6656179.story?coll=la-health-nutrition-news&amp;ctrack=1&amp;cset=true"&gt;article&lt;/a&gt; in the LA times today about how eating more vegetables can lower your cholesterol.  That in itself isn't blog-worthy, but what I find interesting is in the article it is stated that:&lt;br /&gt;&lt;br /&gt;"Researchers said people who cannot tolerate the statin drugs because of side effects could turn to the diet, which they said their volunteers could easily follow."&lt;br /&gt;&lt;br /&gt;It seems that eating lots of vegetables is a last resort, only to be attempted in extreme cases :)&lt;br /&gt;&lt;br /&gt;Karl&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10832913-110840297373085790?l=bologma.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bologma.blogspot.com/feeds/110840297373085790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10832913&amp;postID=110840297373085790' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/110840297373085790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10832913/posts/default/110840297373085790'/><link rel='alternate' type='text/html' href='http://bologma.blogspot.com/2005/02/first-post-veggies-vs-pills.html' title='first post: veggies vs pills'/><author><name>Karl Rosaen</name><uri>http://www.blogger.com/profile/16688865407902750049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Sr0VppZ9JNY/Sdgdk9URbCI/AAAAAAAAFEo/AedahXc-FM8/S220/profile.JPG'/></author><thr:total>2</thr:total></entry></feed>
