Thursday, August 23, 2007

e - Text Editor - no such file exists -- ubygems

There's no doubt that e kicks ass.  On one of my computers, however I was having a problem using some of the bundles.  Specifically some of the bundles utilize cygwin to do their magic.

I was receiving this weird error, where ruby is complaining that it can't locat a file named "ubygems".  Obviously, they are referring to rubygems, and the problem exists when you have a windows install of ruby and a cygwin install of ruby.

To fix it you need to reinstall ruby gems within cygwin.  Download the latest version of rubygems from rubyforge.  Put the tarball in the c:\cygwin\home\USER folder, then open up your cygwin prompt and type:
$ tar -x -f rubygems-0.9.4.tgz  (this will change if you download a different version)
$ cd rubygems-0.9.4
$ unset RUBYOPT
$ ruby setup.rb

At this point rubygems should be installing and you should be good to go.  Back to "e goodness"!

Wednesday, August 22, 2007

Sogeti Is Hiring

My company, Sogeti, is always seeking out new candidates.  If you've got experience or are just out of college, there is a place for you.

Currently we have an immediate need for someone to help out on a project.  No development experience needed for this role.  It would be a great way to get started in a BA, QA, or PM position.   This position is in Houston, but I can always help pass the word to one of our other offices as well.

If you're interested, or know of anyone who might be, please send me an email at ben.scheirman _AT_ us.sogeti.com.

Thursday, August 16, 2007

Elegant ASP.NET Caching

So you have a central method that returns some common data, say for example US States.

public IList<State> GetUsStates()

{

    List<State> states = new List<State>();

    using(IDataReader dr = DataAccess.ExecuteReader("SELECT * FROM US_STATES"))

    {

        State theState = State.Fetch(dr);

        states.Add(theState);

    }

 

    return states;

}

Pretty simple stuff, loop over a datareader, building “State” objects based on a row in the database.

Well since this data hardly ever changes and is the same for every user, it is a prime target for caching.  (Psst, if you didn’t know, caching can be one of the most effective performance tuning techniques you can perform — if done correctly).

Now that we want to enable caching, we can create a little helper class that makes it a bit easier to work with…

This is a watered down version of the cache API, but it solves 90% of the cases.

public class CacheHelper

{

    public static bool ItemExists(string key)

    {

        return HttpContext.Current.Cache[key] != null;

    }

 

    public static void Insert(string key, object obj)

    {

        TimeSpan oneHour = new TimeSpan(1,0,0);

        Insert(key, obj, oneHour);

    }

 

    public static void Insert(string key, object obj, TimeSpan span)

    {

        HttpContext.Current.Cache.Add(

            key,

            obj,

            null, //no dependencies

            DateTime.Now.Add(span),

            Cache.NoSlidingExpiration,

            CacheItemPriority.Normal,

            null //no remove callback

        );

    }

 

    public static T Retrieve<T>(string key)

    {

        return (T)HttpContext.Current.Cache[key];

    }

}

Now that we have the utility methods in place, we can alter our US States function to enable caching:

public IList<State> GetUsStates()

{

    string statesKey = "US_STATES";

    if (!CacheHelper.ItemExists(statesKey))

    {

        //add it

        List<State> states = new List<State>();

        using (IDataReader dr = DataAccess.ExecuteReader("SELECT * FROM US_STATES"))

        {

            State theState = State.Fetch(dr);

            states.Add(theState);

        }

 

        CacheHelper.Insert(statesKey, states);

    }

 

    //now it definitely exists in cache

    return CacheHelper.Retrieve<IList<State>>(statesKey);

}

This code quickly gets repetetive and ugly, but it gets the job done.  How can we do better?

We need to be able to provide the means of getting the data, but without actually executing it every time.  This sounds like a good use for a delegate!

In our CacheHelper class we define the delegate:

 public delegate object RetrieveDelegate();

It’s just a method signature that returns an object.

Then we define another method that will first check the cache, and execute the delegate if the data is not there:

public static T GetAndCache(string key, RetrieveDelegate retrieveObject, TimeSpan span)

{

    if (!ItemExists(key))

    {

        object value = retrieveObject(); //this makes the call to the database

        Insert(key, value, span);

    }

 

    return Retrieve<T>(key);

}

Now we have a method that can be smart about caching, but it is completely agnostic of what data to cache.  Now we can refactor our GetStates() method to this:

public IList<State> GetUsStates()

{

    return CacheHelper.GetAndCache<IList<State>>(

        "US_STATES",

        delegate {

            List<State> states = new List<State>();

            using (IDataReader dr = DataAccess.ExecuteReader("SELECT * FROM US_STATES"))

            {

                State theState = State.Fetch(dr);

                states.Add(theState);

            }

            return states;

        },

        TimeSpan.FromDays(1));

}

We only have to interact with the CacheHelper once, thus we only use the cache key once as well.  There are no if statements here either.  Just a single function call that excepts an anonymous method.

This is pretty clean and it makes caching in your application easier.  What do you think?  Do you have any ideas for improvement?  Let’s hear in the comments!

Tags: ,
Wednesday, August 15, 2007

See you at Houston Tech Fest

If you're going to HoustonTechFest, then be sure to check out my presentations:
  • Advanced CSS and Javascript
  • ORM with NHibernate
It's all going down August 25th at the University of Houston.  See you there!

dasBlog 2.0 Released!

The team has been working like mad to get this release out the door and now it’s ready!

http://dasblog.info/

This is a full ASP.NET 2.0 release!   Along with the new release comes a new look for the dasBlog website (designed by me).

Check out the release notes to see all of the great new features.

Thursday, August 09, 2007

Blue October - August 4th

Me, My wife, and daughter went to go see Blue October play at the Sam Houston Race Park.  It was my 2nd time to see the band (the first being at a venue that only held 300 people).  There were a few thousand people there and it was really great to see how big the band has gotten.

Me and my baby at the Race Track before the concert
Me and my baby

My 2 favorite girls…
IMG_5490

Rocking out before the concert…
IMG_5509

Goofing around…
IMG_5512

No, I’m not stoned in this picture…
My JP Boodhoo Pose

We’re Hungry…
IMG_5554

Finally, they arrive…
IMG_5570

They played mostly songs from their new album, Foiled (which is my least favorite to be honest).  I much prefer The Answers or Consent to Treatment.

IMG_5603

 

Blue October always puts on such a great show.  The band is full of energy and Justin’s vocals seem to never end.  I don’t know how he does it… I was singing along all night and nearly lost my voice.  I guess I can let go of my hopes of being a rock god .  Well, there’s always Guitar Hero.

Wednesday, August 08, 2007

HTML 5 Sneak Peek

Check out the article over at IBM on New Elements in HTML 5.

Everyone who knows me knows that I loathe using tables for layout.  My biggest beef with it (there are many) are that it usually renders an unnecessary amount of markup for simple things.  Good CSS design reduces this drastically but there are occasions when you have a layout that ends up being as bloated as using tables.

If you need to style two sections of divs that have a similar or convoluted hierarchy, you usually have to resort to adding classes.  Classes add to the visual weight of the HTML, so I generally prefer not to use them if I can select the element using CSS.

New tags in HTML 5 will help with this even further.  These are all semantic structural tags that encourage proper design using HTML:

  • section
  • header
  • footer
  • nav
  • article

A <section> element will denote regions of the page that can easily be selected. Who knows, <section> might even replace <div>.

You’ll also notice a trend where tags have no visual representation at all.  They might be styled differently by CSS, but that’s not the point.  a <time> element could be used for programs to easily distinguish the time of a post, or the time that the page was last rendered, for example.

Check out the article, it is worth a read.  These changes are long overdue and will help raise the bar on web standards usage even further.  Let’s just hope IE plays nice this time (I think they will).

Professional Gender Transmogriphier

The other day, my cube-mate Peter Seale, posed the following question:

Do you ever wonder why the Experts Exchange website url has a dash in it?

Well, no I didn't before... but I now I am... why? (at this moment I pause for a second and think about what the url would be... )

expertsexchange dot com

That just might send the wrong message... whaddyathink?

e Goes Gold

My favorite text editor for HTML, CSS, JavaScript, Ruby/Rails, etc development just announced its 1.0 stable release.  The beta versions were very good and I rarely ran into issues.

If you aren’t using e, you should check it out:

e

If you’re like me and jealous of the Mac crowd who gets to use TextMate ( /drool ) then this is the best alternative for Windows.  (I hear there is a Linux version coming soon).

But if you’re not privy to what coolness awaits you, allow me to tantalize you with some e-excellence:

  • Keep looking up the exact doctype syntax?  Type doctype<TAB> and a context menu appears allowing you to select your doctype (XHTML 1.0 Transitional for example).   (And you should be using a doctype header).
  • Type head<TAB>, it creates the header section for you, places the cursor right where you put the title, press <TAB> again and you're ready to enter scripts and style sheets.
  • Want more? Try link, style, body, div, table, ul li ... the list goes on.

These are just the HTML bundles. There are a crap-ton of bundles that already exist for TextMate, and they are supported with e.

So head on over to http://www.e-texteditor.com and pick up a trial copy. If you like it, consider buying it. The time you save will surpass the measly $35 you spent in no time. time.

Tags:
Monday, August 06, 2007

Dear VSTS Test: I Hate You

I cannot even count the ways that VSTS Test is inferior to NUnit (or MbUnit).

I’ve been running my tests via TestDriven.NET (right-click, Run Test) and it has been working just fine.  The tests run, I get my results.  The reason I do this is because the built-in test runner sucks leaves something to be desired.

I went to a teammates machine the other day and he ran the test suite and most of the tests failed.  In fact, any test that hit the database failed.  All of them had the same error message: 

ConfigurationException:  Could not load the configSource ‘local-connectionStrings.config’.

This file is copied (via pre-build event) from a root location, to the output directory.  This file is, by nature, different for each developer.  It contains connection strings that are specific to the machine.

Using FileMon I was able to see that the VSTS Test Runner was looking in the ..\..\TestResults\{TIMESTAMP FOLDER HERE}\Out\ directory.  The VSTS product team claims that this is for remote running of tests, but I suspect that it is just a poor solution to the problem.  Anyway, there is no way that I can (via a batch file) copy the config file to this folder.  So Pre-Build events are out.

I read up on the issue and find that it is possible to have items copied to the Test Results folder.  You have to add this attribute to a test method:

[DeployItem(“local-connectionStrings.config”)]

…and yes, I said to a test method.  It will not work on a [TestInitialize] or [TestClass].  So basically if I want to use this feature, I have to retro fit around 80 tests to include this attribute, then tell my whole team to do it as well.  No thank you.

You can also add the Deployment Item to the localtestrun.testrunconfig file (under Solution Items).  This file says “local” but it is checked into source control, so it is not clear if this change will be applied to everyone’s working copy or my own.

This is a stupid, hacky solution to a problem that doesn’t even exist with the other unit test frameworks.  Since we aren’t really using any TFS test features yet (Web Tests will come) —I’m tempted to just rewrite them all for NUnit.  Of course I will get pushback from management, but these little issues are becoming a hinderance. 

If it is cumbersome to test, developers won’t write unit tests.

(Oh, and JetBrains:  when will you release support for the VSTS Tests?  I’m dying over here!)

Friday, August 03, 2007

Decorator - The Cool Pattern with the Stupid Name

So I have a logging class that is implementation agnostic.  Under the hood it uses an Adapter for Enterprise Library Logging, however we could easily switch it out for log4net if needed without changing the code.

So you can imagine that I have an interface that looks like this:

public interface ILogger

{

    void Write(string text);

    void Warn(string text);

    void Error(string text, Exception msg);

}

… and there is currently an implementation of this class called EntLibLogger:

public class EntLibLogger : ILogger

{       

    public void Write(string text)

    {

        //ent. lib write log entry

    }

 

    public void Warn(string text)

    {

        //ent. lib warn

    }

 

    public void Error(string text, Exception msg)

    {

        //ent. lib error

    }       

}

The specific logger that is used is abstracted behind a factory of course.  However, some of the applications that use this component will not have the logging configuration.  It is perfectly feasible to ignore logging in this scenario (ie: swallow exceptions) however this is something that any logging component would do.  I don’t want to add it to each and every implementation of ILogger.

So here’s where the decorator comes in.  This pattern could really use a better name, but I can’t think of one, so I’ll leave that up to you.

A Decorator implements the same interface, however it wraps each method with its own behavior before deferring the call to an inner implementation.  Wow, that doesn’t really make much sense, so how about an example…

public class SilentlyFailLoggingDecorator : ILogger

{

    private readonly ILogger _innerLogger;

 

    public SilentlyFailLoggingDecorator(ILogger innerLogger)

    {

        _innerLogger = innerLogger;

    }

 

    public void Write(string text)

    {

        try

        {

            _innerLogger.Write(text);

        }

        catch

        {

            //swallow exception

        }

    }

 

    public void Warn(string text)

    {

        try

        {           

            _innerLogger.Warn(text);               

        }

        catch

        {

            //swallow exception           

        }

    }

 

    public void Error(string text, Exception exc)

    {

        try

        {

            _innerLogger.Error(text, exc);

        }

        catch

        {

            //swallow

        }

    }

 

}

All of the actual implementation comes from whatever ILogger is sent via the constructor.  All this class does is “decorate” the method calls with additional behavior.  (This time, we’re choosing to silently ignore errors rather than throw exceptions that cause the program to stop)

To wire this up, wherever the factory method resides that creates the actual logger, you’d write…

public static ILogger GetLogger()

{

    //via IoC or just hard-coding

    return new SilentlyFailLoggingDecorator(

         new EntLibLogger()

    );

}

So there you have it!  The decorator pattern can do all kinds of Aspect-Oriented things such as Log a message each time a method is called, or possibly massage parameters before sending them to an inner class.

ReSharper Coolness - Move Methods

Every once and a while I come across a new feature that just makes me stop and think “ReSharper, I love you MAN!”

If you have your cursor on a method, press CTRL+ALT+SHIFT  and the Up or Down arrow keys.

Here it is in action:

Resharper:  move method

Thursday, August 02, 2007

How Does YouTube Handle It?

I ran across an excellent read about how YouTube's architecture handles so much bandwidth and traffic.

The core of it is:

  • SuSe Linux
  • Apache + lighttpd (for videos only)
  • Python + C extensions for expensive operations
  • Lots of caching

Many more points to read, but a great reference indeed.  Check it out here:  http://highscalability.com/youtube-architecture.

Excellent Advice from a Hibernate Expert

I just stumbled on this list of 10 Things I Learned About Using Hibernate Successfully.

It is excellent advice for anyone using Hibernate or NHibernate.  I fully agree with each point on this list.

http://www.spenceruresk.com/2007/07/27/10-things-i-learned-about-using-hibernatejpa-successfully/

Wills - Loans - Remortgage - Credit Card Consolidation