Matthew Podwysocki's Blog

Architect, Develop, Inspire...

  • DSLs, Compilers and the Irony of it All

    In a previous post, I posted about the Lang.NET symposium and rolling your own compiler.  I cited an MSDN article that was a good starter for someone interested in writing that new language in .NET we've all been waiting for.  It's not by any means to get you towards finishing IronRuby by yourself, but some of the fundamentals are covered.

    The reason I've stated that I'm pretty interested is that of course I'm a geek, but I'm also interested in Domain Specific Languages (DSLs) lately as you may notice from my blog and what you can do with compilers to help that along.

    DSLs in General

    So, why DSLs and why am I interested?  I think Oren Eini, aka Ayende laid the reasons out well here and here.  In short he covers quite a few scenarios in which you might be interested in them, such as:

    • Mapping layers for DTO/Domain objects from incoming objects
    • Configuration scripting for IoC containers and so on
    • Business situations and Business Rule Engines
    And the list can go on.  In fact, he's actually writing a book about it, if you've been hiding under a rock somewhere...

    Ayende has been quite busy with the DSL posts that I encourage you to check out.  If you're looking for basic samples, check out these posts on Building an External DSL, and Implementing a DSL.  As you may note, most samples are written in Boo, but you could imagine them written in any language for that matter in the .NET space.

    Compiler Basics

    Now that we're through that section, let's take a step back to compilers in general.  If you're interested in these things, I would suggest the Compilers: Principles, Techniques, and Tools aka the Dragon Books.  Even though the first one was published back in 1977, there has been the Purple Edition released back in 2006.  There are several sample chapters available online if you wish.  This will give you a good foundation on how compilers work and give you more of a headstart than just the simple MSDN sample. 

    The Irony Of It All

    Greg Young pointed me towards Irony by Roman Ivantsov which is available off CodePlex.  If you paid attention to the Lang.NET 2008 symposium, Irony  and language challenges in ERP systems were covered as noted here.
     
    Off the site, it explains:

    Irony is a new-generation .NET compiler construction kit. It utilizes the full potential of c# 2.0 and .NET Framework to implement a completely new and streamlined technology of compiler construction.
    Unlike most existing yacc/lex-style solutions Irony does not employ any scanner or parser code generation from grammar specifications written in proprietary meta-language. In Irony the target language grammar is coded directly in c# using operator overloading to express grammar constructs. Irony's scanner and parser modules use the grammar encoded as c# class to control the parsing process.

    So, basically it takes the idea from that MSDN article and raises it to a whole new level.  And best of all, it's written in C#, so it opens compilers to a different audience instead.  For a full walkthrough of the possibilities, check out the article posted on CodeProject.  What's really cool is that he's opened it up for anyone to contribute to should you find something missing or not quite right.

    Greg brings out an idea of using Abstract Syntax Trees (ASTs) inside custom attributes to bring more of Spec# to the .NET framework.  He posted this simple sample of some of the possibilities:

    private void MyMethod( [Requires("value>5 and value<10")] int i) { ... }

    I think it's an interesting approach and I'm going to have to try it out.  I can't turn down a challenge like this.

    Conclusion

    So, as I continue on the journey of F#, DSLs and compilers, these things come to light and I find even after all these years, I'm still learning something new every day.  I hope you found this shallow dive into the deep end interesting into this geekdom.  Well, that and after going through some of these samples that my old lex/yacc skills aren't quite what they used to be.  With some time and perseverance, maybe it will...

    And yes, I'll be getting back to some code samples soon enough.  Until next time...

    kick it on DotNetKicks.com

  • Ruby.NET Is Dead; Long Live Ruby.NET

    As I noted yesterday, Dr. Wayne Kelly, the leader of Ruby.NET project, attended the 2008 Lang.NET Symposium last week led a discussion of how he wrapped Ruby, a dynamic language, on top of the static CLI.  Of note of course in that speech was how hard certain things are with Ruby due to the lack of a formal specification.

    Anyhow, fast forward to yesterday.  Wayne announced in a post yesterday about the future of Ruby.NET.  I encourage you to read the whole thing here.

    He writes:

    Ruby.NET started life in 2005 as an academic research project with the goals of learning more about the challenges of mapping a dynamic language such as Ruby onto the relatively static CLI platform. When we released our first beta in 2006, many people got excited and started blogging about the project, at which time the project took on a life of its own heading towards a production quality release that people could one day actually use. The release of IronRuby last year obviously caused us to question this unstated goal. At the time we didn't know if the IronRuby project and the DLR would succeed, so we decided to continue with Ruby.NET at that stage. Last week at the Lang.NET Symposium, I presented our work on the Ruby.NET project and also had the opportunity to learn more about the progress of the IronRuby project and the inner workings of the DLR (and also the JRuby project presented by Charles Nutter).

    I've come to the conclusion that the DLR is clearly here to stay - it's becoming an even more important part of the Microsoft platform. I also believe that to obtain production quality performance, Ruby.NET would need to reinvent (or adopt) something equivalent to the DLR. If we were starting the project today, there is no way we wouldn't use the DLR. Whilst Ruby.NET initially had a good head start on the IronRuby project; by incorporating the Ruby.NET parser and scanner and by leveraging the DLR, I now believe that IronRuby is more likely to succeed as a production quality implementation of Ruby on the .NET platform. I believe that ultimately there is no need for two different implementations of Ruby on .NET. So, if Ruby.NET is ultimately not going to be that implementation, then we should not waste further developer effort fruitlessly chasing that goal. There is still a massive amount `of work required to achieve full semantic compatibility, to achieve production quality performance and to get Rails to run robustly.

    There have already been a number of practical and research outcomes from the Ruby.NET project, however, at this stage, I believe we (the Ruby.NET community) can make the biggest impact by levering our experiences with Ruby.NET to contribute to the IronRuby and DLR projects. Personally, I still feel we have unfinished business - we set our selves the goal of running Rails on .NET and we haven't achieved that yet. If we can leverage our experience to help IronRuby get to that point, then I'd at least have the personal satisfaction of helping see the job completed.

    These are just my views. As a researcher, my prime interest is not in developing products, but in developing innovative new ideas and having an impact by having those ideas used in the real world. I'm aware that others in the community will have different goals and so will presumably have a different take on this - I'm keen to hear what you think. If anyone wants to press ahead, then the code base is still owned and controlled by you the community, so you are free to do with it as you please with our full blessing.

    I'd also like to make it very clear that this decision is entirely my own - based on research and technical considerations. Microsoft did not in any way suggest or encourage us to kill the project and we thank them again for their support of the project.

    I'd like to thank all of our contributors and supporters and apologize if this decision comes as a disappointment. I hope many of you will join me in contributing to the IronRuby project and see it through to a successful completion.

    Cheers, Wayne.

    So, what he's saying in other words is that it's best that he takes the lessons learned from the Ruby.NET implementation on the static typed CLI and contribute more towards IronRuby on top of the DLR instead.  I don't think that's going to dissuade anyone, and may preclude him, but I think others are willing and able to pick up the torch.  So far, my experience with the project had been good, although not as complete as I'd like.  But many of those problems come from the lack of a spec instead of anything squirrely done inside the code itself.

    John Lam has posted his reaction here on his blog.  The invitation is out to anyone to join and contribute to the IronRuby implementation.  So, all eyes turn towards the IronRuby team and anyone willing to step up to the plate...

    kick it on DotNetKicks.com

  • Lang.NET and Rolling Your Own

    Last week, the 2008 Lang.NET symposium was held last week.  If you're not familiar with what that is, it's a discussion about languages, compilers and libraries within the .NET space.  It's been one of those things I'd love to attend just to understand where Miguel de Icaza, Anders Hejlsberg, Luke Hoban, Jim Hugunin and others are going with their related languages.

    Lang.NET Stuff

    I followed Ted Neward's recaps as they were going on as to understand what all we were missing.  He was good enough to provide great writeups on the symposium and can be found here:

    So, there was a pretty wide array of speakers there including Tomas Petricek and his project Phalanger.  If you're unfamiliar with him, I've referenced him on several occasions when talking about F# as he's pretty deep into that as well.  Anyhow, he has assumed control of Phalanger which compiles PHP to IL and has recently added on Silverlight functionality as well.  What's really cool is that he's now working on Phalanger on the DLR.  His recap of the even can be found here.

    Ted Neward gave a presentation on Scala.  I don't think he sounded too pleased as to the way it went with ribbing from Don Box among others.  It'll be interesting to see how Scala progresses since it has been noted that Ruby is dead and Scala is in...   Scala on .NET is something that I have yet to fully explore but it's on the latter half of this year I think.  Right now it's a push on F# to get myself deep in that before anything else.

    Anders gave a talk as well as others.  It's going to be interesting to see the collision of functional programming into C#, taking ideas from F# and so on.  It's already happening with lambdas and the System.Func delegate type.

    F# was very well represented this year as Luke Hoban (F# Program Manager), Harry Pierson (Microsoft IT), and Tomas Petricek.  Harry has a good recap of what he saw here.  It's going to be interesting this year as F# becomes more of a first class player in the .NET space.  I'm loving F# in what I'm doing right now and all interested should put it on their learning list. 

    John Lam has a pretty good writeup as well with regards to Lang.Net as a whole here.  This time Ruby was well represented with Charlie Nutter, Wayne Kelly and John Lam.  John has a pretty good recap and slides of his talk and that can be found here

    Roll Your Own?

    So, why am I interested?  Well, compilers and languages is something I definitely geek about.  I've been looking at F# for creating my DSLs as well as looking at it to create compilers, both of which it can specialize quite nicely.  Robert Pickering's book "Foundations of F#" can start you on your way to that.

    With all this discussion about compilers, Joel Pobar published an article in the latest MSDN magazine called "Create a Language Compiler for the .NET Framework".   This is a pretty good starting point for those unfamiliar with creating compilers and unfamiliar with the lovely thing that is System.Reflection.Emit and how much of a friend it is.  I done a little bit of this years ago when I was creating a compiler for some DSLs that I created.  I realized that it was more trouble than it was worth, but still a worthwhile exercise.  But the point of the article is stating how easy it is to create or port a language to the .NET platform.  A very good read and the source code is pretty solid too.

    Until next time...

    kick it on DotNetKicks.com

  • Resharper 4.0 Early Access Program in Two Weeks?

    The good folks at JetBrains have recently announced that Resharper 4.0 Early Access Program will be available in two weeks.  It's like one of those long awaited things like Duke Nukem Forever, but it looks like R# will beat it to the punch, fortunately for me.  For those like me, I can honestly say I haven't been as productive in Visual Studio 2008 as I can say I have been without it.  Many people will use the workaround as stated many times around the blogs, but I've just stayed away until they can get it working just right.  Instead, I've been happy using it with Visual Studio 2005 in the mean time.

    The only thing now that keeps me with the Visual Studio 2005 sitting around continues to be BizTalk.  I imagine the next Service Pack of BizTalk 2006 R2 will contain the right templates, but it's frustrating that they haven't come out yet.  Either way, I can't wait until R# 4.0!  Until next time...

    kick it on DotNetKicks.com

  • Fluency in Fluent Interfaces

    Scott Hanselman's recent post about the Daily Source Code 14 - Fluent Interface Edition got me to think more on fluent interfaces and a previous post of mine on ObjectMother versus Test Data Builders.  Also, it comes to mind in regards to DSLs, both internal and external that has me intrigued.  Partially due to my latest involvement with Ruby and F#.

    Test Data Builder Example

    So, let's revisit that simple example:

    public class ClaimBuilder
    {
         private DateTime claimDate;
         private Provider provider = ProviderBuilder.StartRecording().Build();
         private Recipient recipient = RecipientBuilder.StartRecording().Build();
         private ClaimLineCollection claimLines = ClaimLinesBuilder.StartRecording.Build();

         public static ClaimBuilder StartRecording()
         {
              return new ClaimBuilder();
         }

         public ClaimBuilder WithClaimDate(DateTime claimDate)
         {
              this.claimDate = claimDate;
              return this;
         }
        
         public ClaimBuilder WithProvider(Provider provider)
         {
              this.provider = provider;
              return this;
         }

         public ClaimBuilder WithRecipient(Recipient recipient)
         {
              this.recipient = recipient;
              return this;
         }

         public ClaimBuilder WithClaimLines(ClaimLineCollection claimLines)
         {
              this.claimLines = claimLines;
              return this;
         }

         public static implicit operator Claim(ClaimBuilder builder)
         {
              return new Claim(builder.claimDate, builder.provider, builder.recipient, builder.claimLines);
         }
    }

    As you may note I changed the Build method from the previous post to an implicit operator to save me some coding time when it comes to my builders.  This is one of the very very few places where I'd recommend using this operator.  Anyhow, then we'd have the calling code to look similar to this for my unit tests.

    Claim claim = ClaimBuilder.StartRecording()
         .WithClaimDate(new DateTime(2008, 1, 1))
         .WithProvider(ProviderBuilder.StartRecording()
              .WithName("Robert", "Jones")
              .WithAddress(AddressBuilder.StartRecording()
                   .WithStreetAddress("1800 28th St, NW")
                   .WithCity("Washington")
                   .WithState("DC"))))
         .WithRecipient(RecipientBuilder.StartRecording()
              .WithName(James", "Smith")
              .WithAddress(AddressBuilder.StartRecording()
                   .WithStreetAddress("1210 14th St, SE",)
                   .WithCity("Washington")
                   .WithState("DC"))))
         .WithClaimLines(ClaimLinesBuilder.StartRecording()
              .WithClaim("00308-1")));

    This is truly powerful here to make it make sense to the reader instead of the usual black box ObjectMother approach.  When building my entity objects for test, this is the main approach I use. 

    Other Examples

    Scott Bellware has introduced the Behavior Driven Development NUnit Extensions which makes heavy use of fluent interfaces.  With my deeper dive into BDD, this has been very helpful.  Dave Laribee also has me on the kick as well, so lots of thanks to them for pointing me in the right direction, although some may disagree with their directions.  But that's for another time and another post.

    Jeremy Miller also has fluent interfaces on his StructureMap IOC container project.   Some new parts with registration will be coming up with his new release of version 2.5 as noted here.

    Of course I can keep rattling on with others like NHibernate and the ICriteria, Castle Windsor's fluent registration interfaces and so on.  The list goes on!  Very cool stuff coming out lately...  Until next time!

    kick it on DotNetKicks.com

  • RockNUG Meeting 2/13 - ASP.NET MVC

    The Rockville .NET Users Group (RockNUG) will be holding their Februrary meeting on the 13th at 6:30PM-9PM.  This month, Jeff Schoolcraft will give an introduction to ASP.NET MVC that we have all come to know and love, to a point of course... 

    The details are as follows:

    An Introduction to ASP.NET MVC
    presented by Jeff Schoolcraft

    Come walk with me as I lead you on a gentle, relaxed tour of the ASP.NET MVC Framework. I'll demystify the forest of three letter acronyms. Then we'll take a journey through the hall of ancestors--and cousins--to discuss some influences and other players in the MVC space. We'll end up at the Grove of Hello World and, like habitat for softwarity, we'll build a demo application. Along the way we might run into some tangential trolls, but we'll cross that bridge when we come to it.

    Jeff Schoolcraft is the founder of The Queue, Incorporated; a consulting shop that writes software and helps write software better. He has been in the .NET space from nearly the beginning and is still, mostly, writing web applications in C#. He tries to organize a couple Code Camps a year and is hoping to find a developer community that isn't over an hour away. When he's not immersed in code he enjoys spending time with his wife and two daughters.

    Time:
    Wednesday, February 13, 2007 6:30-9:00 PM

    Location:
    Montgomery College, Rockville
    Humanities Building - Room 103
    Rockville, MD
    Click here for details....

    Come and support the organization if you're in the area!  Should be a great session!

    kick it on DotNetKicks.com

  • Design by Contract Revisited with C# and .NET

    In a previous post, I talked about various attempts at frameworks that are trying to do Design By Contract (DBC) in .NET.  Many simply just come across as simple validation frameworks without the heart of DBC which is the contract.  Where is the contract?  Well, dig through my code and find out!  It's something that I've been harping on time and time again is that without transparency to the caller and callee of the contract, it's just another validation framework.  You'll hear either myself or Greg Young on that, I'm sure.

    The only approach that has worked so far has been Spec# in the .NET world.  Unfortunately, still a research product, isn't available for us to use commercially.  So, until that time in which it is thoroughly weaved into the .NET framework as a whole outside of the internals of System.Core.dll, we have to look at alternatives.

    Eiffel

    Before we look at another framework, I just want to walk you through a sample of the original DBC language, Eiffel.  This gives you an idea what I'm talking about.

    my_list.do_all (agent (s: STRING)
         require
             not_void: s /= Void
         do
             s.append_character (',')
         ensure
             appended: s.count = old s.count + 1
         end)

    As you can see, it's clearly stated as part of the language what the requirements are, and what its return will be.  That's the really slick part about it that we don't have unless we go to Eiffel.NET, but it's not using the latest and greatest .NET APIs, so it's pretty much a nonstarter.  So, let's look at yet another framework.

    LinFu DesignByContract

    Philip Laureano, who has done a lot with LinFu including Aspect Oriented Programming (AOP) among other things has taken a stab at DBC for all .NET languages and not just C# which Spec# has done.  He posted the LinFu.DesignByContract2 article on CodeProject that is well worth checking out. 

    Earlier, he posted one about the LinFu framework on CodeProject as well which includes the following:

    • A simple IoC container
    • Design by Contract framework
    • Dynamic Proxy
    • Reflection (Mixins, Duck Typing and Multiple Dispatch)
    • Delegates with lambdas for universal event handling
    But, let's get back to the DBC part, you'll remember the basic tenets of the philosophy:
    • What do we expect?
    • What do we return?
    • What do we maintain?
    We also throw in a few Eiffel constructs in terms of inheritance which are also quite important.  And they are:
    • The precondition may only be weakened by inheritance
    • The postcondition can only be strengthened by inheritance
    Well, enough about the basics, let's look at the framework itself.  Let's first look at a simple sample I whipped up:

    public class StringCollection
    {
       private int count;
       string[] strings = new string[5];

       [EnsureCountIncremented]
       public virtual void Add([NotNull] string value)
       {
            // NotNull doing
            // Debug.Assert(!string.IsNullOrEmpty(value));

            // Add value and redefine   

            // EnsureCountIncremened 
            // Debug.Assert(count == count + 1);       
       }
    }

    So, what you see here is that I put a postcondition making sure that the count is incremented by one as I'm adding a string to my array.  Also, I have the precondition that my string value is not null.  But, how does that work?

    In order to do that we need to implement a few interfaces.  Let's look at the one for preconditions.

    public interface IMethodContract
    {
        IList<IPrecondition> Preconditions { get; }
        IList<IPostcondition> Postconditions { get; }
    }

    public interface IPrecondition : IMethodContractCheck
    {
        bool Check(object target, InvocationInfo info);
        void ShowError(TextWriter output, object target, InvocationInfo info);
    }

    Ok, so now, I need to implement that somehow for my custom attribute.  That would look similar to this:

    public sealed class NotNullAttribute : Attribute, IPrecondition
    {
         public bool Check(object target, InvocationInfo info)
         {
              string value = target as string;
              if(!string.IsNullOrEmpty(value))
                   return true;
         }

         public void ShowError(TextWriter output, object target, InvocationInfo info)
         {
              output.WriteLine("string value cannot be null or blank");
         }

         public bool AppliesTo(object target, InvocationInfo info)
         {
              return target is string;
         }

         public void Catch(Exception ex)
         {

         }
    }

    So, it's pretty interesting and clever how this is being done.  But still without the static checking of Boogie and so on, it still falls well short of real DBC. 

    For those interested in postconditions and invariants, those are also supported through the interfaces as shown below:

    public interface IPostcondition : IMethodContractCheck
    {
        void BeforeMethodCall(object target, InvocationInfo info);
        bool Check(object target, InvocationInfo info, object returnValue);
        void ShowError(TextWriter output, object target, InvocationInfo info,
            object returnValue);
    }

    public interface IInvariant : IContractCheck
    {
        bool Check(object target, InvocationInfo info, InvariantState callState);
        void ShowError(TextWriter output, object target, InvocationInfo info,
            InvariantState callState);
    }

    So, as I said, quite interesting and clever the way of handling the DBC concepts through interfaces.  The libraries were also written to support the Eiffel constructs of inheritance.  So, very well written I must admit.

    Conclusion

    I just began to scratch the surface with what you can do with this framework and it's very well written.  But, still at the end of the day, it's not statically checked through a Boogie and a theorem prover to ensure the contracts hold.  That's the crucial part missing in this equation.  I'm sure more will come to mind on the subject.  Until next time...

    kick it on DotNetKicks.com

  • C# vNext Revisited

    I often rethink or have additions to my posts.  This topic of what's coming in C# vNext is definitely one of them.  I'm always looking for ways to push the envelope to see what I can get from the language.  I have to credit such people as Scott Bellware and others to look more outside of the C# bounds and look to such things as Ruby and even F# to really open my eyes to the possibilities of this language.  I'd love to see more F# features in the language as they have slowly seeped in and now pretty ubiquitous.

    What I like

    I enjoyed Jeremy Miller's post about what he likes about C# 3.0.  I'd definitely have to concur with a lot of those things such as his and some of my own:

    • Object Initializers
    • Lambda Expressions
    • Extension Methods
    • Anonymous types
    What I'm Undecided About

    So, what am I eh about?  Well, automatic properties is one of them.  Not doing much for me just yet, especially for my domain models.  Also partial methods have a particular use, but once again, it looks like a large potential for abuse.  Bart De Smet has a pretty good writeup on them though worth checking out here.  If you check out Wes Dyer's blog, he also has a good example and why you would use them.  To me, it looks like Aspect Oriented Programming in a way, but I much prefer using Windsor interception, and hopefully soon the StructureMap interception.

    Do We Know Any More?

    Charlie Calvert, C# Community Liason, and Mads Torgersen, C# Program Manager, wrote a post recently about the future focus of C#.  The first topic in this series is about dynamic lookup.  What dynamic lookup is, is the ability to distinguish a type at runtime instead of static compile time. 

    But why is this useful?  Well, in order to interact with dynamic runtimes, this is the best way to do it.  The idea of using this for COM interop is also pretty interesting.  I've done more than my fair share in this lifetime.  Many of the things you see on PInovke.NET are ones that I either put up there or refined quite a bit, especially while using unsafe C#.

    With this upcoming, could Duck Typing be far behind?  After all, it has been proposed at least for VB9, although dropped.  Of course in .NET, it's already supported on the foreach keyword as noted by Krzysztof Cwalina due to the fact you don't need to implement IEnumerable, and only need GetEnumerator().  But, will it go any further than that like Ruby?

    kick it on DotNetKicks.com

  • Why am I here?

    Sorry I never posted a welcome notice to this blog.  Anyhow, welcome to my new home on the net.  If you don't know me already, my former blog is at geekswithblogs.net.  If you're here for the first time, great! 

    So, who am I?  Well, I live and work in the Washington, DC area and actively involved in the .NET and Agile side of things in the area.  I run DC ALT.NET with the help of Phil McMillan, who ought to blog more BTW..  I'm also active in planning the ALT.NET Open Spaces, Seattle event coming in April.  We're going to have a great crowd there, but space is limited.

    Anyhow, my interests are many including:

    • Agile/XP
    • Functional Programming (FP)/Object Oriented Programming
    • Compilers
    • ASP.NET
    • BizTalk (pays the bills)
    • SharePoint
    So, hope you stay tuned!

  • CMAP Meeting 2/5 - User Experience (UX)

    Central Maryland Area .NET Professionals (CMAP) is holding their next meeting on Tuesday, February 5th, 2008.  This month looks to be a great one by Michael Wolf on the User Experience (UX).  In the agile methodology, it is quite an essential piece that often gets overlooked.  It's obvious too many times after looking at The Daily WTF to see plenty of evidence of that.

    Alon Salant posted a good set of Agile User Experience Resources that's pretty extensive on how UX fits into the Agile/XP practice.  This includes the Yahoo UX group, articles, practices and so on.  I've used this as a resource a couple of times when thinking about UX.

    Anyhow, here are the details:

    UX is the new UI: It's not the framework, it's how you use it.
    By: Michael Wolf

    As developers we love our frameworks and the elegance of code. Yet we often spend so much time staring at code we forget the essential user centered problem were trying to solve. In addition, due to the amazing and ever evolving frameworks/ tools / controls we have at our disposal, we often forgo what's most usable for what's most available. In this talk we will delve into these problems using examples written in Microsoft Silverlight, including the winning solution from the Microsoft Phizzpop Design Challenge LA.

    About Michael Wolf - Michael Wolf has spent over a dozen years building web applications and is currently a Senior Rich Internet Application Developer for global leader Cynergy (www.cynergysystems.com). He recently was a member of the winning team for Microsoft's PhizzPop Development Challenge in LA, successfully developing an interactive media platform for a mock media conglomerate in 3 days using Microsoft Silverlight technology. Starting with his first web application in vi using Mosaic in 1994, Michael has been heavily involved in application development holding numerous senior development positions at Washington, DC and Baltimore, Md base companies including Real Magnet, Blue Atlas Interactive and Bally's Total Fitness.

    Date/Time:
    2/5/2008 - 6:30PM

    Location:
    HCC Business Training Center
    6751 Columbia Gateway Drive
    Columbia, MD 21046

    In addition to all of that, Mike is part of DC ALT.NET, and it's great to have him as part of our group.  Hope to see a great turnout!

    kick it on DotNetKicks.com