Sunday, December 12, 2010

Introducing...Edufy

Like I mentioned in my last post, I have some big personal news to announce...without further ado -

My entrepreneurial tendencies have finally resulted in something that lives on the internet!


It's called Edufy (http://www.edufy.org). We have built a site for teachers to share and discover learning activities for their students. Our founder, Philip Cooke, is a teacher in Arlington, VA, and his frustration with finding ways to create personalized learning activities for his students inspired him to start this project. After six months of planning, building, testing, and fixing, we launched the site at a couple of conferences in November, and now we want to start spreading the news.
You can check out what Edufy is all about at:
http://www.edufy.org/about/index

We'd love it if you could all check out the site and let us know what you think. If you are a teacher, give it a test drive! If you know any teachers, PLEASE send this to them - we are just getting started, and any feedback/criticism/encouragement we can get is highly valued. If you have any questions or comments, please let me know, or send feedback to contact@edufy.org.

For anyone who cares, I'll be posting about some of the technologies we're using, but for now, check out Edufy, and spread the word!

To keep up with what's new on Edufy, be a fan on Facebook, or follow our blog

Thanks from the Edufy Team!

Friday, November 5, 2010

Big News...Coming Soon

For months now, I have been working with a group of awesome folks on something.  Lots of leaving my job, getting home, and going back to work.  I am pretty proud about what we've come up with.  In a few days, I'll be sharing it.  Fingers crossed.  Exciting times ahead...make or break as they say.

Stay Tuned.

Wednesday, November 3, 2010

Generating .ldif Files using Groovy

I recently needed to do a bulk update of an openLDAP directory to add a password for a really big batch of test users.  I wrote a little Groovy script to do it.  Thought it might be helpful.  First things first, generate a password for the test users using the slappasswd command.  Using the defaults will give a you password with SSHA encryption.  Now we need an .ldif file that describes the change to make.  For more information on ldapmodify commands, head here.  The script here will loop through a group of sequentially id'd users in a couple of ous and assign them our nicely hashed password:



        File newFile = new File('modify-script.ldif')
        String username = ''
        String toAdd = ""

        def stuCount = 80000
        def admCount = 2000
        def teachCount = 18000

        StringBuilder sb = new StringBuilder()

        def ous = [ 'ou1', 'ou2' ]

        for ( ouname in ous ) {

            for ( i in 1..stuCount ) {
                username = "user_${epname}_${i}"

                toAdd = """
dn: uid=${username},ou=people,ou=${ouname},dc=yourdc,dc=com
changetype: modify
add: userPassword
userPassword: {SSHA}zW7Q/yQQ8IKZiX8ANJIGugi0deNebN1o
                    
"""
                sb.append( toAdd )
            }

            sb.append( "\n\n" )

            newFile << sb.toString()
        }

This will produce a file (modify-script.ldif) with a bunch of entries like these:


dn: uid=user_ou1_1,ou=people,ou=ou1,dc=yourdc,dc=com
changetype: modify
add: userPassword
userPassword: {SSHA}zW7Q/yQQ8IKZiX8ANJIGugi0deNebN1o
                    

dn: uid=user_ou1_2,ou=people,ou=ou1,dc=yourdc,dc=com
changetype: modify
add: userPassword
userPassword: {SSHA}zW7Q/yQQ8IKZiX8ANJIGugi0deNebN1o

...

Now you can simply run the ldapmodify command to update the users:

ldapmodify -x -D "cn=admin,dc=yourdc,dc=com" -w yourpass -f modify-script.ldif

I've been able to use derivatives of this script for a few different tasks.  Hope it helps someone else.

Thursday, October 7, 2010

Grails Image Processing with the ImageTools Plugin

I recently had a requirement on my side project to add some simple image processing.  I had previously used the ImageTools plugin, but that seems to have falled into a bit of disrepair.  I had a multistep process to get this going, and I figured I'd share it.

According to the git repository, the last checkin on version 1.0.4 was way back in January 2010.  Grabbing the plugin using the standard grails install-plugin as documented on the plugin documentation page just doesn't cut it.  When attempting to use the documentation, you get a message that tells you
unable to resolve class ImageTool @ line xxx, column xxx. def imageTool = new ImageTool();
This is troubling, as that is the only class included in the plugin.  Fortunately I found this comment on a closed (???) issue on github:
So, to solve this I had to run a git clone on this source tree and then follow the instruction at the link below to create my own version of this plugin with correct package.
So it would seem that you need to grab the source, then create a plugin.  This is not as easy as you might think.  First of all, you might not have git installed.  Follow the instructions here to 'git git'.  Next, you need to grab the code.  From the command prompt in the directory you want the code, run the following command:

git clone http://github.com/ricardojmendez/grails-imagetools.git

Now you have the code.  Even though it's a plugin, you have to tell grails it's a plugin, by running the grails create-plugin command.  Now you have a zip file that you can install in your project, using the standard grails install-plugin command.

From there you can follow the instructions.  The import statement is recognized, and we can get finally get down to actually writing the controller code:

import org.grails.plugins.imagetools.*

...

//the controller method we submit to
def myProfileSave = {

...

uploadPhoto( file, user )

...

}

def uploadPhoto( upfile, user ) {

 if(upfile.empty) {
  flash.message = 'File cannot be empty'
  redirect( action: 'myProfile' )
 }

 def imageTool = new ImageTool()

 imageTool.load( upfile.getBytes() )

 // Crops it to a square
 imageTool.square()
 
        //make the new squared image the image to operate on 
 imageTool.swapSource()
  
 // Reduces the image size
 imageTool.thumbnail( 125 )

 def fileBase = grailsApplication.config.imageLocation
 def fullPath = "${fileBase}/user/photo"
        File fullPFile = new File( fullPath )

 if ( !fullPFile.exists() ) {
  fullPFile.mkdirs()
 }
  
 def filePath = "${fullPath}/user_${user.id}_125.jpg"

 File toMake = new File( filePath )

 if ( !toMake.exists() ) {
  toMake.createNewFile()
 }
  
 // Saves the result
 imageTool.writeResult( filePath, "JPEG" )
}

Once you get the plugin working, it's a breeze, as you can see!  It's a great, simple wrapper around the nasty and complicated JAI library.

Some Tips:

1) You'll probably want to increase your heap size if you are running with a default or small heap.  This requires a bit of memory.
2) Remember to specify a multi-part form.  A good explanation of this can be found in the grails documentation.
3) Profit!

Saturday, July 31, 2010

July!

Let's talk about family.  My grandparents are 94 and 92, and still going.  They live by themselves.  They take care of themselves.  They sometimes complain about how badly they are doing, but I can name multiple couples one third of their age who aren't doing as well as they are!  My grandfather has good days and bad, and my grandmother has short-term memory issues, but really all in all, they are both really still rocking.  I talked to them today for half an hour, and afterwards, I was hit smack in the face with one of those 'wow am I blessed to have these people in my life' moments.  They have been married now for more than SEVENTY years.  They are amazing people who have been a part of so much, and who have so many amazing stories.  They are 'unconditional love machines', who just amaze me with their capacity to be proud of and kind to their family.  They are so positive, so caring, and so full of love.  It's really quite refreshing.


Thanks Grandma and Granddaddy for being an inspiration.  We all love you a ton!

Friday, July 2, 2010

UberConf, Days 2+3

After a great day one, we were looking forward to another great, long day, and we weren't disappointed.

Scala for Java Programmers - Day 2 started with a fun Scala workshop by Venkat Subramaniam that spanned two sessions.  This was extremely hands-on, and very worthwhile.  I learned enough about a language I have had interest in for a while to get started on my own, and got a nice little dose of Computer Science and compiler fun too.  My only complaint here was that we spent too much time using closures and Scala syntax craziness to write code in one, perl-ish, unreadable line.  We should have used the time writing 'terse' obfuscated code playing more with Scala parallel programming.  Actors are nifty, and it's amazing how clearly you can express complicated multi-threaded program flow.  If I had access to this goodness, I can think of one project I did at Blackboard that could have been written in half the time, in 1/5 the LOC, and in a much more readable and intuitive way.  Hindsight is 20/20, I suppose, but man that made me burn a bit.

Emergent Design - After lunch, we attended Neal Ford's talk on emergent design.  This was a good talk, mostly because Neal Ford is a good speaker, but I wouldn't say this was anything new.  No big design up front, test first, don't solve problems that don't yet exist, as this leads to heaps of code debt.

Stability Antipatterns - This was a workshop by Michael Nygard about common antipatterns you see as it relates to stability - this was more on the operations and integration level than at the code level, and had a fair amount of good tips for things to remember - mostly how to keep your application from dying because there is an external resource that you don't control that is failing.  Some of the horror stories he shared were hilarious, and some you could totally see happening to you (if they hadn't already).  Good session.  Good reminder of things to consider that often fall by the wayside.

On to Day 3, which was kind of disappointing.

Implementing Domain-Driven Design - I was excited about this one because DDD is one of those things you always hear about, but never really get.  After the session, I still didn't really get what the big deal was - drive the design of your application by the real-world domain.  Seems pretty simple to me.  What wasn't simple was the 100 slides of UML class diagrams the presenter used to demonstrate DDD.  Yikes, not that awesome.

SOLR - A Case Study - This was an interesting enough presentation, as Solr is something that we are evaluating.  I learned enough to know that we didn't really need to do this right away, but not much more.  It wasn't really a case study.  What I would have liked was either, Solr real-world example, or Migrating from Lucene to Solr, but alas we didn't really get either.  It was still a good presentation though, just not what I was looking for.

Android Mobile Development - Gah!  Fail!  This could have been a great way to close things out, but the presenter instead did the presentation completely out of order, gave nobody any opportunities to code, and was just generally all over the place.  I was at least able to use the time to make my way through some of the Android tutorials that Google provides.  Man what a bummer.

Monday, June 21, 2010

Uberconf Impressions, Day 1


Last week a group of us from eCollege attended the Uberconf presentation here in the Denver area.  I figured I'd post a few impressions:

First off - the venue - the Westin in Westminster, CO.  Nice place.  Really awesome food whether you are a vegetarian or a carnivore.  Free drinks all day.  Decent coffee, although the cups were oddly small.  One note to the Westin - people operate better at temperatures higher than 58 degrees.  It was FREAKING COLD in there.

Now on the conference organization.  This was one of the best flows of any conference I've attended.  There weren't too many people working the conference, and it still went well.  Easy registration process, good marketing materials (4GB USB stick - not bad), and two t-shirts I would be super embarrassed about wearing.  Easy to figure out what sessions were coming up and where they were going to be.  One minor nit - it's a developer conference, which means laptops - next time, get more power strips in the rooms, at least for the workshops.

And, finally the important stuff - the sessions (day 1):

Patterns of Modular Architecture - This was not quite what I had hoped.  I was looking for patterns, and instead got a fairly basic explanation of how to make your dependencies fairly one-way and isolated.  Neat I guess?  A decent refresher, but definitely nothing earth-shattering, and the most interesting part was OSGI, which the presenter covered for literally two minutes at the end of the presentation.  It did look promising, though.

Common Antipatterns and how to Avoid Them - This was well presented, but it was still a little light.  Good reminders on some common sense things NOT to do, and some reasonably interesting stuff out there - that this presentation was really hitting home with some of the attendees scared me - some of these were things that just shouldn't be happening now, and they obviously still are!

Architect for Scale - This was a good session - lots of 'things you should be doing when you get to this size/load'.  There were a fair amount of good notes about what was not enough, what was too much, and how to move up without huge disruptions

Automated Deployment with Maven - This was a huge win.  It was a discussion about how to use Maven plugins to streamline and automate the numerous steps that go into releasing a module of code.  With maven, it involves updating poms, branching, integrating, labeling, etc, and many manual steps.  With some of the tips in the presentation, I was able to make a releasable unit this morning in about 10 minutes with the help of some maven doc.  Why were we not doing this!?!?  Oh well - awesome.  Worth the price of the registration itself.

Architecture - Non-functional Requirements - This was more of a 'what goes into architecture' talk, than something specifically about non-functionals, but very interesting nonetheless.  As someone who is headed down that path, it validated much of what I think architecture is about.  There was some great back and forth in this presentation from the presenter of this session and the presenter of the earlier Antipattern session.

Tuesday, June 1, 2010

Grails Wizardry: Mocking all your web services with Grails

Background

At work, we are using EC2 to run capacity tests on our environment, which would normally be pretty trivial, but we are a big SAAS shop with tons and tons of endpoints internally.  Without setting up EVERYTHING in the cloud, we can't really run our tests...or can we?  We would love to use Amazon VPC for EC2, but it requires a fair amount of intervention from your network team.  That will be a great alternative down the road - being able to point back into the internal network to access machines rather than deploying them in the cloud.  So, plan b - Using grails, I was able to mock every single .NET service that our application talks to in about three hours.  Here are the details:

We use SOAP services that return some XML, I simply used Fiddler to see what responses are sent back over the wire for each service, and I was ready to rock.  There are two main pieces to the puzzle:

MarkupBuilders


Generating XML is almost too easy in Groovy.  Using the instructions here, I was able to write some code that spits out some xml based on info passed in.  For instance this sample Grails controller will take a login and company and return an XML document with a user id and company id:


import groovy.xml.MarkupBuilder

class UserController {

  /**
  * /MyService/users/getuser?login=myuser&company=mycompany
  */
  def returnUser = {

        def user = params.login
        def comp = params.company

        def writer = new StringWriter()
        def xml = getXMLBuilder( writer )

        xml.'user'('xmlns:xsi': getNsXsi(), 'xmlns:xsd': getXsd(), 'xmlns': getXmlNs() ) {
          userId( "${comp }@${user}" )
          compId( "${comp}@compId" )
        }

        render( text: writer.toString(), contentType:"text/xml", encoding:"UTF-8" )
  }

  def getXMLBuilder( StringWriter writer ) {

        writer.append(  "" )

        return new MarkupBuilder( writer )
  }

  def getNsXsi() {
        return "http://www.w3.org/2001/XMLSchema-instance"
  }

  def getXsd() {
        return "http://www.w3.org/2001/XMLSchema"
  }

  def getXmlNs() {
        return "http://yourcompany.com/UserStuff/2009/11/01"
  }
}


Now that you have defined your controller, you need to make it so your application can make its normal request to the url it has configured but still get to your controller.  That's where the URLMappings.groovy class comes in:

UrlMappings

The UrlMappings file already exists by default when creating a project.  This file is built to map external urls to your controllers - you can use it to create nice shiny RESTful URLs, or just to do some utilitarian mappings for backwards compatibility, etc.  Obviously not every project's requirements map to the grails conventions on how urls map to controllers.  To add access to your controller from a different url, you just need to add the following snippet - this will allow Grails to map your request from something like

/MyService/users/getuser?login=me&company=acme

to

/user?login=me&company=acme 


    "/MyService/users/getuser" {
          controller = "user"
          action = "returnUser"
    }


More information can be found at this link.

At this point, you have a service running that will return the valid XML for your service, and will respond to a call at a URL that doesn't actually match.  Now you can rinse and repeat for each service that you need to mock out.  Happy Grailing!

Wednesday, April 28, 2010

PowerMock - Mocking Statics - Supplemental Documentation

I have recently suffered through a bit of pain working with PowerMock.  It seemed extremely promising, as it sits on top of EasyMock, which we use for mock objects in our unit tests (it also works with Mockito, apparently), and promises to give you the tools to mock those pesky static calls that kill testability.  I had a few issues getting started, and they centered around jUnit 3.

PowerMock with jUnit 3

All the examples and documentation seem to be based on jUnit 4. This page has great examples on how to run your static mocking tests when running on jUnit 4, but how to do it on jUnit 3??  An extremely simple example of how to do this in jUnit 4 is here:


@RunWith(PowerMockRunner.class)
public class AwesomeTest {

  @PrepareForTest(StaticClass.class)
  public void testDoExecute() throws Exception {
    ...
    PowerMock.mockStatic(StaticClass.class);

    expect( StaticClass.doStuff( param ) ).andReturn( "yo!" );
    replay( StaticClass.class );

    //test some stuff!
  }
}


To accomplish the same thing in jUnit 3, without the annotation support, you can do this:



public class MyPowerMockSuite extends PowerMockSuite {

  public static TestSuite suite() throws Exception {
  
    return new PowerMockSuite(AwesomeTest.class);
  }
 
  public static void main(String[] args) throws Exception {
  
    junit.textui.TestRunner.run( suite() );
  }  
}

public class AwesomeTest {

  @PrepareForTest(StaticClass.class)
  public void testDoExecute() throws Exception {
    ...
    PowerMock.mockStatic(StaticClass.class);

    expect( StaticClass.doStuff( param ) ).andReturn( "yo!" );
    replay( StaticClass.class );

    //test some stuff!
  }
}



PowerMock and Multiple Classes

To mock methods from multiple classes, you will need to amend the '@PrepareForTest' annotation, just passing a string array like so:



public class MyPowerMockSuite extends PowerMockSuite {

  public static TestSuite suite() throws Exception {
  
    return new PowerMockSuite(AwesomeTest.class);
  }
 
  public static void main(String[] args) throws Exception {
  
    junit.textui.TestRunner.run( suite() );
  }  
}

public class AwesomeTest {

  @PrepareForTest({StaticClass.class,StaticClassier.class})
  public void testDoExecute() throws Exception {
    ...
    PowerMock.mockStatic(StaticClass.class);

    expect( StaticClass.doStuff( param ) ).andReturn( "yo!" );
    replay( StaticClass.class );

    PowerMock.mockStatic(StaticClassier.class);

    expect( StaticClassier.doStuff( param ) ).andReturn( "yo!" );
    replay( StaticClassier.class );

    //test some stuff!
  }
}


Gotchas

PowerMock 1.3.7 only works with EasyMock 2.5.2, which we have had some issues with.  I had to move back to PowerMock 1.2.5 to use EasyMock 2.4.  I didn't find a lot of issues with using this version, though we had some odd calls that were required where it told me not to stub a return when the method returned something, or where I had to stub out calls that didn't seem like they should be required.  With a simple static method that didn't really call many other static methods, it seems to work like a charm.

Wednesday, April 14, 2010

How Five Guys Got Big...by being Awesome

About once a month when I was young (late 80s into the 90s), my dad and I went to this ratty little burger shop to get the most delicious burgers and out of this world fries at a place called 'Five Guys'.  The people were always friendly, and the order was always perfect.  It was no frills but they promised delicious burgers and fries, and it's what they delivered, without exception.

Fast forward to today, and Five Guys is EVERYWHERE.  It's growing in leaps and bounds - they even have them here in Colorado, with 400 to come in California!  Read the story in Inc. Magazine about how they got here.  You can really learn a lot from the way this business is run.

In an age when we understand that eating burgers and fries is not good for you, if you are going to do it, don't do it at McDonald's.  Go get something worth splurging on.

Wednesday, March 31, 2010

Grails Wizardry: FCKEditor

So I am working on this side project, and obviously I chose Groovy and Grails to do the work.  I continuously marvel at how awesome, easy-to-use, and powerful the framework is, but lately I've been even more amazed at the plugins and how many there are now, how well documented (most) are, and how the quality has increased greatly.

We are using rich editors, and the FCKeditor was a no-brainer.  I was delighted to find out that it was available as a grails plugin.  I pulled it into my project, and defining an editor in one of my views was as hard as this:


<fckeditor:editor
id="materials"
name="materials"
width="70%"
height="200"
toolbar="Standard"
fileBrowser="default"
value="${fieldValue(bean:mybean, field:'materials').decodeHTML()}">               ${fieldValue(bean:contentInstance, field:'materials').decodeHTML()}
</fckeditor:editor>


The important parts here are:

  1. toolbar:  This gives you the ability to choose the set of tools for your editor.  More on this one later
  2. value: You can identify the preset value.  If this is html that was saved, then you must include the decodeHTML() call or else the value you will see is raw html.
The rest is pretty much boilerplate - obviously the height/width will depend on your site.

To customize the contents of your toolbar, you will need to specify a custom configuration file, which is in the form of javascript.  Your gsp page must contain:


<fckeditor:config CustomConfigurationsPath="${resource(dir:'js',file:'myconfig.js')}"/>

This file looks like this:


FCKConfig.ToolbarSets["ed-limited"] = [
   ['Cut','Copy','Paste'],
   ['Undo','Redo','-','Bold','Italic','Underline','StrikeThrough'],
   '/',
   ['OrderedList','UnorderedList','-','Outdent','Indent'],
   ['Link'],
   //'/',
   ['Style'],
   ['Table','Image','SpecialChar'],
   ['About']
   ];

You can define as many of these as you want.  See this link for configuration details.

Once you defined this, you can simply update the toolbar attribute on the FCKeditor to point to your new toolbar, in this case 'ed-limited'.

One big gotcha is that this uses 2.6 currently, while the newest stable version seems to be 3.1.

Sunday, March 28, 2010

The Brilliance of Southwest

When watching the yearly installation of March Madness, CEOs of all the major airlines not named Southwest must be furious.  Nearly every commercial break during the games features an advertisement touting Southwest's baggage policy.  In fact, most Southwest ads feature ridicule of other airlines.  I fly almost exclusively on Southwest.  Make no mistake - it's not perfect.  Sometimes flights are late.  Sometimes you have to too much taxiing, or to wait a while for a gate assignment.  The difference between Southwest and the rest is clear:  Southwest makes it a bit easier to deal with the stressful travel day by being cordial, helpful, and by performing their jobs professionally and with a smile.  Because of this advantage, Southwest can charge a little more than the bargain carriers, and not charge for baggage.

The CEOs of United, American, et al. can only be furious at themselves.  Jena and I were talking about how the show 'Undercover Boss' (which we love by the way) should feature a CEO of an airline, but then we joked that they would have to shut down the entire operation after all employees in the airport were fired by the undercover boss for being surly, unpleasant, and incompetent.

An example of the rank ineptitude:  'The Rest' has employed a baggage fee policy that encourages people to cram all their stuff into oversized baggage that they attempt, usually unsuccessfully, to cram into an overhead bin.  After being berated by the rude airplane staff (who let them on the plane with the large bag in the first place), the thrifty passengers are allowed to check their bags FOR FREE.  Now the people who played by the rules are mad because they had to pay and the people who cheated didn't.  The people who didn't pay aren't happy because they have been treated rudely by the flight attendants.  All of the people are wondering why they didn't fly another airline, like...hmmm...Southwest maybe?

Lesson to any managers of any company, any size, any industry, any location:  there is no excuse for rude, unprofessional behavior, no matter how hard or stressful your job may be.  If this behavior is tolerated, then it becomes accepted practice, and all of a sudden a few years pass by and you can't watch basketball without your company being made fun of by a company that never accepted that sort of behavior.

Monday, February 22, 2010

What's That You're Reading?? February '10 Edition

Well once again, the days have become weeks, weeks have become a month, and I haven't checked in on my blog...sigh.  I need a personal assistant to hound me into keeping up with this thing.  It's not for lack of ideas of what to write about that I let my poor journal languish...I seem to always find something else to do.

So for an awesome Christmas/Birthday present, my mom got me a Kindle!  This is the perfect gift for a serial reader like myself.  It's easy to read, easy to use, has free wireless internet (super handy for those of us without iphones/androids), has incredible battery life, and delivers me books in under a minute.  It's so awesome!  I fired it up, and immediately ordered...

The Lost Symbol - This is Dan Brown's latest Robert Langdon tale, and what can I say...it's obviously interesting in its conspiracy theory stylings, similar to Angels and Demons and The Da Vinci Code, but this one really seemed to fall short.  I loved that it all took place in DC, and down the street from our old house.  I liked the initial plot.  It's pretty much everything else that took place that really didn't do it for me.  I thought it was too long, that the badguy was almost comical, and that the way everything shook out was just a little over the top, even for a fiction.  The ending wasn't even earth-shattering.  Sigh.


The Last Dickens: A Novel - this was a novel by Matthew Pearl who also wrote the Dante Club, which I really enjoyed.  This one is about Dickens' last manuscript, and the trials and tribulations of a small publishing house in Boston that held the rights to Dickens publishing in the US.  It's a pretty decent mystery until the end, when it all of a sudden turns out that the entire story was based on a premise that more ridiculous than I ever could have imagined.  Fairly disappointing book for the last 20-30 pages...

SuperFreakonomics: Global Cooling, Patriotic Prostitutes, and Why Suicide Bombers Should Buy Life Insurance - this followup to the big blockbuster Freakonomics is more of the same - irreverent discussion of real-life things and how they relate to economics.  It's worth a read, quick, and provides a reader with a few more decent 'hmm didn't think of that' moments, but certainly not anything astoundingly good.  I'd say it's well written but not really extremely well thought out stuff.

Simple Genius - Ahh, another David Baldacci book.  No need to write much.  They are always pretty good without being great.

The Whiskey Rebels - Another historical fiction from David Liss, whose books I really enjoy.  This one is a story about a couple that is tricked into buying a plot of useless land in western Pennsylvania after the Revolution, and a disgraced spy in Philadelphia who gets roped into a crazy plot to bring down Alexander Hamilton's Bank of the United States.  Inevitably and rather smartly, the two plot lines intersect in what is a very enjoyable novel.  David Liss really has mastered the historical novel (and the non-historical, as evidenced by another book I really liked - The Ethical Assassin).

The Girl Who Played with Fire - This was another really good book by Stieg Larsson.  The Girl with the Dragon Tattoo was an immensely enjoyable novel about a disgraced investigative writer in Sweden on the trail of a really juicy story, and his collaboration with the young and troubled investigator Lisbeth Salander.  That book was very well written with great character development, and had a great cliffhanger of an ending.  This book was even better!  A great story that fell into place at a nice pace, with more great writing, interesting characters, and a crazy ending.  I can't wait to read Larsson's third (and sadly last) book soon.

Now that I finished those, I am working on these:

The Ascent of Money: A Financial History of the World - this is a (so far) easy to read history of currency.  The first fifty pages have been full of interesting information and it's delivered in a very accessible manner.

All the Pretty Horses

The Omnivore's Dilemma: A Natural History of Four Meals - All you can say every time you finish a chapter of this book is 'WOW'.  I can't believe that the things we eat have such a colorful (and mostly disgusting) history.  Really makes you think about the things you eat.

Tuesday, January 26, 2010

Politics!, or Why Scott Brown Matters So Much

Well Barack Obama's time in charge hasn't been all peaches and cream.  Is anyone surprised??  I am not, but ever since 'worst.candidate.ever' Martha Coakley blundered away Ted Kennedy's seat in Massachussetts, all the talking heads have been writing Obama's political eulogy.  I think it's far too early to say that anything is a failure or that Obama will never get anything done.  It took two years for Clinton to fail at passing health care, and I think we can agree that from a non-Lewinsky standpoint, he did a pretty decent job.

Why does it matter so much if the Democrats have only 59 votes??  The filibuster!  That's why!  Jena and I were talking about it the other day, and I must admit that I was fairly ignorant outside of being able to say that 60 votes allows you to shut down the filibuster completely.  Fresh Air to the rescue!  The first segment of yesterday's Fresh Air program explains the dynamics of the filibuster...click the link below to listen:


Gregory Koger, Explaining The American Filibuster

Monday, January 25, 2010

Couldn't Say it Any Better

From Seth Godin:  Without Them
"you can fail by going along with that and not doing it, or you can do it, cause a ruckus and work things out later"
At work you often run into situations where you see something that just smells.  Something that isn't right, but is perpetuated by inertia or apathy.  You have two choices.  You can say 'well that will never fly - they have been doing this forever', or you can say 'I have an idea and I am going to go ahead and do it, and when people see that things can be better they will get on board or get out of the way'.

I choose B.

On the Mountain

Everyone knows that skiing is a big part of living in Colorado.  I wasn't sure how much of an integral part of my Colorado life it was going to be, but surprisingly, it's ended up being something that I really enjoy, and that I can see myself doing a LOT of in the future.  Prior to coming out here, I had spent all of 5 or 6 days skiing in my life, with one extremely icy/slushy day at Wintergreen, and a few pretty solid days at Snowshoe and Sugarloaf up in Maine, where I did about six cartwheels on my head while avoiding a potentially deadly collision with an entire ski school.



Anyway, I got here, and I think there's magic in the air because for someone who is not exactly the most graceful, I was able to get out on the slopes at Copper, and by the end of the day I was sort of skiing like someone who knows how to ski.  This inspired us to get a season pass at Arapahoe Basin.  We have been up to the mountain four times since then, and this time I went up to the top and skiied the blues all the way down without killing myself.  I also completed my very first ski day without a fall.  This won't come as a surprise to anyone who has done skiing or snowboarding, but it's pretty awesome.  All your cares evaporate, as all you can think about is how fast you are going and whether or not you want to go faster.  Awesome.