Blog


Aidan Kelly on Truth

Published November 27, 2009

Knowing that all truths are meerly metaphors is perhaps the greatest advantage you can have at this point in history. Thinking that you know the "Whole Truth" keeps you from learning anything more; hence you stagnate; hence you die. But knowing that every thruth is merely a metaphor, merely a tool, leaves you free to learn and grow, by setting aside old metaphors as you learn or evolve better ones.

Aidan Kelly, quoted in Margot Adler's Drawing Down the Moon


Bushwick Book Club in The New Yorker

Published November 26, 2009

There's a nice Bushwick Book Club mention in the New Yorker. It's coming up Tuesday December 1st at Goodbye Blue Monday.

Here's what the New Yorker said:

Books inspire many things: movies, plays, religions, and even political platforms. Less frequently, they inspire songs (Kate Bush's "Wuthering Heights" Jefferson Airplane's "White Rabbit"). For the past year, the Bushwick Book Club, which meets monthly, has addressed that deficiency by choosing a bill of songwriters to compose songs prompted by a chosen book, ranging from "The Unbearable Lightness of Being" to "The Origin of Species". In celebration of its one-year anniversary, the Book Club offers a best-of performance highlighting the year's most inspired tunes. Songwriters include Dan Costello, Dibson T. Hoffweiler, Phoebe Kreutz, Ben Krieger, Corn Mo, and the club's founder, Susan Hwang. (Goodbye Blue Monday, 1087 Broadway, Brooklyn. 718-453-6343. Dec. 1 at 8.)


Sierpinski's Carpet Animation

Published November 19, 2009

A few weeks ago I wrote a little script (code below the fold) to generate the frames of the following animation. It's an animation of different iterations of Sierpinski's Carpet.

7 Iterations of the Carpet

To generate the carpet, take a square. Divide it into nine squares (3x3) and remove the center one. Then, for each of the remaining 8 squares, repeat ad infinitum.

If you get bored doing it an infinite number of times, take a break and eat Sierpinski's Cookie.

The Code - SierpinskisCarpenter.py

Sorry for the crappy box this is in. Copy and paste for reading.

#!/usr/bin/python

#
# SierpinskisCarpenter.py
#
# Author: Dibson T Hoffweiler 
# WWW:    http://www.dibson.net/
#
#             DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
#                     Version 2, December 2004
# 
#  Everyone is permitted to copy and distribute verbatim or modified
#  copies of this license document, and changing it is allowed as long
#  as the name is changed.
# 
#             DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
#    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
# 
#   0. You just DO WHAT THE FUCK YOU WANT TO.
#

import Image

class SierpinskisCarpenter:
    
    def __init__(self):
        """ Prepare the Carpenter """
        self.color = (0, 0, 255)

    def getCounter(self):
        """ Return current counter value, increment it. """
        c = self.counter
        self.counter += 1
        return c

    def getFrameFilename(self):
        """ Return filename for next frame. """
        return "carpet-frame-%02d-%06d.gif" % (self.itr_start, self.getCounter())

    def getCarpetImage(self, itr, size, init=True):
        """ Return an image object of Sierpinski's Carpet

            itr - int - how many iterations deep to go
            size - int - width of carpet in pixels
            init - bool - if True, clear counters - must set False when recursing! (default True)
        """

        if (init):
            # Prepare to lay the carpet out
            self.counter = 0
        
        if (0 == itr):
            # No need to iterate, return the part
            part = Image.new("RGB", (size, size), self.color)
            return part
        else:
            # Get smaller carpet, and paste it in 8 times

            third = size / 3

            partSmall = self.getCarpetImage(itr - 1, third, False)
            
            im = Image.new("RGB", (size, size), (255, 255, 255))

            # top left
            tl_start = (0, 0)
            im.paste(partSmall, tl_start)

            # top center
            tc_start = (third, 0)
            im.paste(partSmall, tc_start)

            # top right
            tr_start = (2 * third, 0)
            im.paste(partSmall, tr_start)

            # middle right
            mr_start = (2 * third, third)
            im.paste(partSmall, mr_start)

            # bottom right
            br_start = (2 * third, 2 * third)
            im.paste(partSmall, br_start)

            # bottom center
            bc_start = (third, 2 * third)
            im.paste(partSmall, bc_start)

            # bottom left
            bl_start = (0, 2 * third)
            im.paste(partSmall, bl_start)

            # middle left
            ml_start = (0, third)
            im.paste(partSmall, ml_start)

            return im

    def animateCarpet(self, itr, size, start=None):
        """ A recursive function to generate an animation of drawing Sierpinski's Carpet.
        
        - itr - int - how many iterations to do
        - size - int - image size will be a square with lengths this many pixels
        - start - 2dim tuple - top left corner of carpet to draw

        Example:

          sc = SierpinskisCarpenter()
          itr = 3
          size = (3 ** itr, 3 ** itr)
          im = sc.animateCarpet(itr, size)
          im.show()

        """

        if (None == start):
            # Init the animation
            start = (0,0)
            self.counter = 0
            self.im = Image.new("RGB", (size, size), (255, 255, 255))
            self.itr_start = itr
            self.im.save(self.getFrameFilename())

        # tab for clean debug output
        tab = "\t" * itr

        #print tab + "MAKE CARPET ITR %s" % (itr)
        #print "%sStart %s" % (tab, start)

        if (0 == itr):
            # LAST ITERATION - PAINT IT!
            #print "%sPAINTING: Start %s" % (tab, start)
            self.im.paste(self.color, (start[0], start[1], start[0] + size, start[1] + size))
            self.im.save(self.getFrameFilename())
        else:
            # NEED TO ITERATE, DO ALL 8 SQUARES

            third = size / 3
    
            # top left
            tl_start = (start[0], start[1])
            self.im = self.animateCarpet(itr-1, size/3, tl_start)
    
            # top center
            tc_start = (start[0] + third, start[1])
            self.im = self.animateCarpet(itr-1, size/3, tc_start)
    
            # top right
            tr_start = (start[0] + 2 * third, start[1])
            self.im = self.animateCarpet(itr-1, size/3, tr_start)
    
            # middle right
            mr_start = (start[0] + 2 * third, start[1] + third)
            self.im = self.animateCarpet(itr-1, size/3, mr_start)

            # bottom right
            br_start = (start[0] + 2 * third, start[1] + 2 * third)
            self.im = self.animateCarpet(itr-1, size/3, br_start)

            # bottom center
            bc_start = (start[0] + third, start[1] + 2 * third)
            self.im = self.animateCarpet(itr-1, size/3, bc_start)
    
            # bottom left
            bl_start = (start[0], start[1] + 2 * third)
            self.im = self.animateCarpet(itr-1, size/3, bl_start)
    
            # middle left
            ml_start = (start[0], start[1] + third)
            self.im = self.animateCarpet(itr-1, size/3, ml_start)
    
        return self.im

cm = SierpinskisCarpenter()

# EXAMPLE: saves 6 iterations of Sierpinski's Carpet
#topItr = 6
#size = 3 ** topItr
#for itr in range(topItr+1):
#    im = cm.getCarpetImage(itr, size)
#    im.save("carpet-%spx-%s.gif" % (size, itr))

# EXAMPLE: dumps out frames for drawing out carpet
#cm.animateCarpet(3, 27)



The Mock Turtle's Regular Course

Published October 1, 2009

"Reeling and Writhing, of course, to begin with," the Mock Turtle replied; "and then the different branches of Arithmetic: Ambition, Distraction, Uglification, and Derision."

The Mock Turtle, from Alice's Adventures in Wonderland. Did you know that all of Lewis Carroll's works are in the public domain?

Dan showed me this video a few weeks ago. It's not in the public domain, but it stars Ringo Starr as the Mock Turtle. I really like this video because it's easy to hear Carroll's wordplay. I skip to the above quotation:

(video missing)


James Yorke on Disorder

Published September 30, 2009

"The first message is that there is disorder. Physicists and mathematicians want to discover regularities. People say, what use is disorder. But people have to know about disorder if they are going to deal with it. The automechanic who doesn't know about sludge in valves is not a good mechanic."

James Yorke, quoted in Chaos: Making a New Science by James Gleick


Distraction, Extinction

Published September 30, 2009

A few weeks ago, Elen told me that one of the reasons why humans are so easily distracted is because we've been trained over generations to feel rewarded when we notice changes around us. This sense of reward makes us want to notice small changes in our environment - very useful when there's a big hungry cat down the road, less useful when sitting in front of a screen all day repeatedly pressing a "check mail" button until a new message ([insert spam excerpt here]) shows on the screen.

I think of this while doing my best thinking. In front of where I do my best thinking, there's a copy of Wired Magazine. While paging through it, I feel silly for being distracted from my distracted thoughts. But not too silly. The magazine is constructed to be completely distracting. Half of the pages are advertisements; half of the other half are articles. The other half of the other half are clumps of text dipped and fried in glittery graphics.

While doing my best thinking, if there are magazines in front of me, I'm drawn to the byte-sized data rather than the potentially informative articles. I worry that these habits train me to crave only short-term satisfaction.

Once done with my best thinking, I flush. Then I envision a world where the human race splits into two, HG-Wells's-The-Time-Machine-style. One half short-term thinkers: clamoring for anything in front of them; the other long-term: committing to depth over breadth. Both species end up down the evolutionary drain because both have become too specialized.

If our race is destined to split and die out because I read magazines, I'm not too worried. It won't affect me short- or long-term.


Cherchez La Boum - West Coast Tour

Published July 24, 2009

Monday I depart for California. Kevin and Sara from Cheese On Bread are getting married, and after the wedding I'll be hopping in a minivan with Daoud, Deenah, and Sibsi to do some shows!

Cherchez La Boum: California tour Aug 2-6, 2009

Art by Deenah

We'll be in the following places!

  • Aug 2 - Chico, CA
  • Aug 3 - Petrolia, CA
  • Aug 4 - San Francisco, CA
  • Aug 6 - Santa Cruz, CA

Twitter Weekly Updates for 2009-05-15

Published May 15, 2009
  • ♫ new band with Heiko and Jen: Space Rainbows - see our myspace: http://www.myspace.com/spacerainbows ♫ #
  • Headed to the Open Mic LJ Fox to play with the Space Rainbows. #
  • @thelisps Congrats on the show! Which biographer was it that came to the show? #
  • Spinning it back six hours. Consider my Time machine tickled. #

  • Had a great end-of-show tour at Schokoladen last night with Phoebe. I <3 Berlin. Having a chillout before going to kreuzberg for mayday #
  • http://www.myspace.com/orchestreminiatureinthepark gave me a new love for pop music ♫ #
  • CATS IN BAG/BAGS IN RIVER http://bit.ly/VxrDY #
  • @Brookpridemore The realization that what you are wearing is smellier than what you've already declared 'dirty' is always a shock. #
  • Play him off, keboard cat! http://bit.ly/eFlPa #
  • Working on http://www.ojalday.com/ in Heiko's kitchen. It's pretty alright. #
  • @andyprice If twitter allows newlines, twyt should too. I don't know why one would use newlines, but might as well let them if they want to #
  • @andyprice does twyt strip nl when displaying? Maybe just do that - when I think of an option to strip nl in tweets, I think YAGNI #