# Sunday, April 15, 2007

Well it’s over – and it’s been great!

First off Architecture Camp 2007 was a lot of fun to present at this weekend... the relaxed nature and opportunities for everyone to talk, rather than just listening, was great – a nice soft introduction to a newbie presenter such as myself!

And a big hat-tip to all the guys who helped put this together, including Alex James, Kurt (where’s your blog boy!) and Chris + all the other presenters.

The thing I liked the most about this event was the number of people who brought their a-game... damn but there were some seriously experienced and intelligent guys in the audience, asking great questions – contrasted with the often pointless heckling and misguided questioning you can get at events like teched, this event was great ... if you couldn’t make it, definitely try to get to the next architecture camp, and if you were a no-show ... shame on you!

I’m still not 100% sure if my session got recorded or not, but if it did, I’ll point you to it at some point...  in the mean time – here’s the presentation itself in both pdf and pptx (powerpoint 2007) formats.

posted @ Sunday, April 15, 2007 11:28:29 PM (New Zealand Standard Time, UTC+12:00)    Comments [0] | |
# Thursday, March 29, 2007
Are the Codeplex guys just damned if you do, damned if you don't at the moment?
posted @ Thursday, March 29, 2007 9:25:35 AM (New Zealand Daylight Time, UTC+13:00)    Comments [2] | |
If you have to make your own license keys i.e.

ABCDE-ABCDE-ABCDE-ABC1Z-A32DE

Here's some thoughts/ideas for things you can do to break up the key space a little so people can not easily brute-force your keys by fiddliing just a couple of numbers.
  • Select a range of numbers and letters that can be directly mapped to 32 values (10 digits and 22 alpha maybe?).
  • Know your maths.. creating helper classes for unpacking and packing bytes will help.
  • In this example you could carry 125bits (15 bytes and just over a nibble ;o) ... or 13 bytes + CRC16 (or Maybe an Adler16).
  • Use lookup tables to translate sequential values into pseudo-random values.
  • Break any multi-byte values up into individual bytes, stuff em around your payload of bytes in non-sequential offsets.
  • Calculate the CRC for your payload and include it as part of the key's data, verify it when you're decoding.
  • You can use structs with a sequential layout and a packing of 1 to define your structure...
  • Use Marshal.Copy etc. methods to copy between the struct and a byte array.
  • Remap individual bits in the overall payload.
The last one is something that works really well... it's hard to avoid certain digits "sticking" when generating sequential keys no matter what you do... but if you remap the individual bits of a 15 byte array (i.e. using a lookup table containing 120 indexes) you end up with very unique looking keys that have no sequential behaviour to them (especially if you redistribute the bits of the CRC into all the bytes of the key, which in turn are repacked into 5 bit letters).




posted @ Thursday, March 29, 2007 12:23:15 AM (New Zealand Daylight Time, UTC+13:00)    Comments [0] | |
# Wednesday, March 28, 2007
Codeplex's new command line client is in beta.
posted @ Wednesday, March 28, 2007 9:10:33 PM (New Zealand Daylight Time, UTC+13:00)    Comments [0] | |
# Monday, March 26, 2007

I've got a little project on at the moment which I chose to use ActiveRecord for... this is for a "legacy" database where there are existing nightly data warehousing scripts written against it... The cost of changing the database structure and tables is potentially quite high (it has run on effects to other systems, potentially effects SLA's when the nightly scripts fail.. and a small project ends up having a big impact)

At any rate, I'm just consuming the existing database as-is... which includes a single character status columns i.e. "A" for active, "P" for pending etc... after poking around with a few solutions I ended up creating an NHibernate custom type... first off, this was surprisingly easy... but it annoyed me a little that I had to create a different custom type for each set of enumerated values, and that this information was no longer declarative, compared to the rest of the ActiveRecord implementation...

So I took a few minutes to re-write it as generic solution to the problem today... which at least solves the declarative problem... first off, here's a property with the custom type applied - nothing amazing here, but notice the type is generic... with the type of status field itself qualifying the generic custom type...

 [Property("dBlrStatus", "App.Model.MappedEnumerationHibernateType`1[[App.Model.Status, App.Model]], App.Model")]

 public virtual Status Status

 {

    get { return _status; }

    set { _status = value; }

 }


We then declare the mappings on the enumeration itself...

 public enum Status

 {

    [MapToCharacters('A', 'a', '+')]

    Active,

 

    [MapToCharacters('I', 'i', '-')]

    [Default]

    InActive

 }


I think this is a good fit for ActiveRecord... If anyone wants the code at some point just leave a comment and I'll package it up and post it... it's pretty elementary stuff, though it might save some time if you wanted to re-implement it yourself...

posted @ Monday, March 26, 2007 6:35:27 PM (New Zealand Daylight Time, UTC+13:00)    Comments [0] | |
# Tuesday, March 20, 2007

Well as the more observant reader of Alex Jame's Blog might have noticed, I'm talking at the the Architect Camp 2007 this year... which should be...interesting - I haven't done any public speaking for a while now, but Alex James assures me I'll be fine ... be it on his head! ;o) ...

So I'm planning to talk about IoC (Inversion of Control) - one of my little pet loves... Some of the subjects I'm considering include:

  • Coupling
    • How do we couple (Message, data, content etc.)
    • Metrics for the architect (Instability vs. Abstractness etc.)
  • Dependency Injection
    • Constructor dependencies
    • Parameter dependencies
    • Law of Demeter
  • Inversion of Control
    • Why bother?
      • Added flexibility and opportunity
      • Lowering the cost of change
    • ServiceLocators
      • Why they suck
    • Inversion of control containers
      • What's available (Castle, Spring, StructureMap etc.)
      • Autowiring
      • Services
      • Lifestyle vs Lifecycle
      • Configuration
      • AOP
      • Patterns
        • Decorators
        • Facilities
        • Arrays (simple contributor patterns etc.)


But that's only a small brain dump... we will see what actually gets in there.

 

For anyone who's thinking of attending this event, anything in particular you would like to have covered in a little more depth... or have you had any exposure to IoC at all?

posted @ Tuesday, March 20, 2007 11:27:35 PM (New Zealand Daylight Time, UTC+13:00)    Comments [0] | |

Well first off... where has this month gone??... it's been 2 weeks since I last blogged... I thought it was only a week!

At any rate, one of the things I've been working on lately is mocking out COM interfaces (using RhinoMocks of course) ... and I have to admit that my eyes start crossing after a while, at about the point where the mock repositories setup code begins dominating the test case... which happens all too often... here's a smaller example of what I'm talking about:

MockRepository repository = new MockRepository();

TaggedValue oneTaggedValue = repository.DynamicMock<TaggedValue>();
Expect.Call(oneTaggedValue.Value = "").Constraints(Is.Equal("ExpectedValue"));
Expect.Call(textAlignTaggedValue.Update()).Return(true);

TaggedValue anotherTaggedValue = repository.DynamicMock<TaggedValue>();
Expect.Call(anotherTaggedValue.Value = "").Constraints(Is.Equal("AnotherExpectedValue"));
Expect.Call(textAlignTaggedValue.Update()).Return(true);

Collection taggedValuesCollection = repository.DynamicMock<Collection>();

Expect.Call(taggedValuesCollection.GetByName("")).Constraints(Is.Equal("OneTaggedValue"))
    .Return(oneTaggedValue).Repeat.Any();

Expect.Call(taggedValuesCollection.GetByName("")).Constraints(Is.Equal("AnotherTaggedValue"))
    .Return(anotherTaggedValue).Repeat.Any();

Element destinationElement = repository.DynamicMock<Element>();
Expect.Call(destinationElement.TaggedValues).Return(taggedValuesCollection).Repeat.Any();

repository.ReplayAll();

So in this case we have an "Element", which has a collection of "TaggedValues", and we have two tagged values "OneTaggedValue" and "AnotherTaggedValue", and for each we are updating their values, and then invoking "Update()" on them to flush the changes...

To help solidify that, here's an example of what we're expecting to happen to our element (Element, Collection and TaggedValue are all interfaces from a COM interop assembly, in case you were wondering):

Element element;
...
TaggedValue oneTaggedValue = (TaggedValue)element.TaggedValues.GetByName("OneTaggedValue");
oneTaggedValue.Value = "ExpectedValue";
oneTaggedValue.Update(); TaggedValue anotherTaggedValue = (TaggedValue)element.TaggedValues.GetByName("AnotherTaggedValue"); anotherTaggedValue.Value = "AnotherExpectedValue";
anotherTaggedValue.Update();

Now normally in this case I take unit tests once I've got "green" and refactor the mocking code out a bit... so in the above case I'd probably end up with something like:

MockRepository repository = new MockRepository();
            
Collection taggedValuesCollection = repository.DynamicMock<Collection>();
AddTaggedValueSetter(repository, taggedValuesCollection, "OneTaggedValue", "ExpectedValue");
AddTaggedValueSetter(repository, taggedValuesCollection, "AnotherTaggedValue", "AnotherExpectedValue");

Element destinationElement = repository.DynamicMock<Element>();            
Expect.Call(destinationElement.TaggedValues).Return(taggedValuesCollection).Repeat.Any();

repository.ReplayAll();

Which works... generally quite well... but lately I've been moving away from that approach and instead have been refactoring the setup code into a fluent interface... which I've found to be a lot easier to maintain and extend (and tends to be a little more re-usable across multiple test fixtures...)


So for example, this is what the setup code for the above mock element is now:

MockRepository repository = new MockRepository();

Element element =
    Mock
    .Element()
    .HasTaggedValue("OneTaggedValue").ExpectSetValue("ExpectedValue")
    .HasTaggedValue("AnotherTaggedValue").ExpectSetValue("AnotherExpectedValue")
    .Complete(repository);

repository.ReplayAll();

I'm just skimming the surface of what I've been doing, but it might be food for thought for anyone working on similar projects... anyone else doing similar things?

posted @ Tuesday, March 20, 2007 10:23:38 PM (New Zealand Daylight Time, UTC+13:00)    Comments [0] | |
# Tuesday, March 06, 2007
Have you ever wanted to be able to do something like this in C#?

string propertyName = GetName(MyClass.MyProperty);

Well I have, in fact I've wanted the ability to do this since Version 1 of the .Net Framework, and now with C# 3.0 we finally can!

First off, check out the original blog post here - Symbols in C# 3.0 by Jafar Husain - it's a clever (and once I thought about, plainly obvious) use of extension methods and expression trees.

public static class SymbolExtensions

{

    public static string GetPropertySymbol<T,R>(this T obj, Expression<Func<T, R>> expr)

    {

        return ((System.Linq.Expressions.MemberExpression)

           (((System.Linq.Expressions.LambdaExpression)(expr)).Body)).Member.Name;

    }

}


Usage requires a lambda, but that's not to painful, here's example usage:

MyClass o;

//...

string propertyName = this.GetPropertySymbol(o => o.MyProperty)


The beauty of this is that refactoring is entirely painless, you don't need to spend time reviewing all the optional string replacements that resharper may have found in case you haven't mirrored a property or method name change correctly... it also looks like it could offer some nice usability improvements to some unit testing scenarios (nothing worse then unit tests that don't seamlessly refactor with your code).

I wonder what other ideas are floating around for expression trees at the moment (outside of the obvious querying concepts) ?

posted @ Tuesday, March 06, 2007 3:18:22 PM (New Zealand Daylight Time, UTC+13:00)    Comments [0] | |
# Saturday, March 03, 2007

Dumping events

I'm often surprised (or is it dismayed) when questions pop up in news groups surrounding things like event orders for winforms or webforms applications... this isn't rocket science... we're given all the tools to make this easy to figure out!

Lets do a winforms 2.0 app as an example... first off, the earliest point at which can easily get involved is the constructor...  lets have a look:

public partial class Form1 : Form

{

    public Form1()

    {

        AttachToAllEvents();

        InitializeComponent();           

    }


So I'm going to attach to all the events before the forms components are initialized... now lets have a look at the "AttachToAllEvents" method.

private void AttachToAllEvents()

{           

    Type type = GetType();                      

 

    foreach (EventInfo info in type.GetEvents())

    {

        string eventName = info.Name;

 

        EventHandlerWrapper wrapper = new EventHandlerWrapper(new EventHandler(

            delegate

            {

                Console.WriteLine("{0}: EventName: {1}, IsVisible: {2}, IsHandleCreated: {3}, HasChildren: {4}, IsDisposed: {5}",

                                       DateTime.Now, eventName, this.Visible, this.IsHandleCreated, this.HasChildren,

                                       this.IsDisposed);                                                                       

            }));

 

        wrapper.Attach(this, info);               

    }

}


Only magic there is we're using a class called "EventHandlerWrapper" - what's that... well, it's used to create a strongly typed delegate for attaching to an event.

The reason we need this at all is because EventInfo.AddEventHandler(...) is fussy about the kind of delegate you supply, so if you pass in an "EventHandler" for a "CancelEventHandler" event, it'll throw an exception complaining about it's inability to cast between them... there might be an easier way to do this, but I haven't come across it so far.

public class EventHandlerWrapper

{

    private EventHandler _handler;

    private static readonly MethodInfo _methodInfo;

 

    static EventHandlerWrapper()

    {

        _methodInfo = typeof(EventHandlerWrapper).GetMethod("InvokeHandler", BindingFlags.NonPublic | BindingFlags.Instance);

    }

 

    public EventHandlerWrapper(EventHandler handler)

    {

        if (handler == null) throw new ArgumentNullException("handler");

        _handler = handler;

    }

 

    public void Attach(object target, EventInfo info)

    {

        Delegate wrappedHandler = Delegate.CreateDelegate(info.EventHandlerType, this, _methodInfo);

        info.AddEventHandler(target, wrappedHandler);       

    }

 

    private void InvokeHandler(object sender, EventArgs args)

    {

        _handler(sender, args);

    }

}


With a little brain power I'm sure I could've done this without the separate wrapper class, but this is probably a little easier to read at any rate.

Results..?

So.. onto the results - once we run the code and see exactly what order events are happening in, we can then make a pretty table that may not render in most browsers because I cut 'n pasted it from Excel 2007 ;o)

EventName  IsVisible  IsHandleCreated  HasChildren  IsDisposed
Resize  False  False  False  False
SizeChanged  False  False  False  False
ClientSizeChanged  False  False  False  False
ClientSizeChanged  False  False  False  False
ControlAdded  False  False  True  False
ControlAdded  False  False  True  False
StyleChanged  False  False  True  False
TextChanged  False  False  True  False
Move  False  True  True  False
LocationChanged  False  True  True  False
HandleCreated  False  True  True  False
Invalidated  False  True  True  False
StyleChanged  False  True  True  False
ChangeUICues  True  True  True  False
Invalidated  True  True  True  False
BindingContextChanged  True  True  True  False
Load  True  True  True  False
Layout  True  True  True  False
VisibleChanged  True  True  True  False
Activated  True  True  True  False
Shown  True  True  True  False
Paint  True  True  True  False
Paint  True  True  True  False
Paint  True  True  True  False
MouseCaptureChanged  True  True  True  False
Closing  True  True  True  False
FormClosing  True  True  True  False
Closed  True  True  True  False
FormClosed  True  True  True  False
Deactivate  True  True  True  False
HandleDestroyed  True  True  True  False
Disposed  False  False  False  False

The main thing to keep in mind when doing something like this is to avoid making assumptions - we may not be the first or last to attach to the events (depending on the complexity of the form) - and events can trigger other events... which could explain the ordering of some of this data i.e. changes in visibility and handle creation... if anything we are viewing the order of consequences, as opposed to the true order in which the events are invoked (to get that we'd need to override all the OnXXXX methods of the form class... which would be a good job for dynamic proxy :)
posted @ Saturday, March 03, 2007 1:54:32 PM (New Zealand Daylight Time, UTC+13:00)    Comments [0] | |
# Thursday, March 01, 2007
I've been using tortoise SVN for a couple of years now... but I'd never seen this dialog before when renaming files with similar name patterns... probably old news to some people, but it pleased me no end, very helpful!




It's these kinds of features that I like about an explorer based SCM client... I find IDE integrated source control just bugs me now days (like Team System which I use for codeplex).
posted @ Thursday, March 01, 2007 12:38:48 PM (New Zealand Daylight Time, UTC+13:00)    Comments [0] | |
Search
FeedCount

Tags...
.Net (83) .Net Reactor (4) .net user groups (9) 2008SummerRoadTrip (1) ActiveRecord (1) architecture (1) architecture chat (97) ArchitectureCamp2007 (2) asp.net (1) Astoria (1) Auckland (1) base4 (9) batching (1) binsor (1) blog (4) boo (1) books (1) C# 3.0 (9) cambodia (9) CAML.Net (1) castle (40) china (8) codecamp (3) codeplex (3) dapper.net (1) DevDefined Ltd. (4) DirectShow.Net (1) DLR (1) DSL (4) EAUG (1) Enterprise Architect (5) Enterprise Architecture (1) Enterprise Library (1) F# (1) feedburner (2) first post (1) Friendster (1) generics (1) googlegears (1) hacks (3) hardware (3) hongkong (2) Horn (1) hyper-v (1) ideas (1) IoC (21) IronPython (13) IronRuby (2) jobs (1) Languages (2) laos (8) LINQ (7) LiveId (1) LLU (1) Local Government (1) MDA (1) MDD (1) microsoft (1) Model Driven Development (1) mono (1) monorail (2) Movies (1) Music (1) nDepend (1) news (1) NHibernate (3) NUnit (2) nvelocity (1) OAuth (6) office (1) OpenSocial (1) orcon (1) photos (1) php (1) PostSharp (1) powerpoint (1) presentations (1) ReSharper (1) REST (2) rhino commons (3) rhinomocks (5) Ruby (1) SaaS (1) scm (1) Screen Architect (0) SharePoint (5) silverlight (1) Splicer (4) SQL2008 (1) supcom (1) survey (1) svn (1) Syzmk (4) thailand (6) Tools (2) Tortoise SVN (1) trac (2) Travel (36) Unity (2) vietnam (7) vista (2) visual nhibernate (1) vmware (1) volta (3) VS2008 (1) WCF (3) wiki (2) wikipedia (1) Windows Server 2008 (1) windsor (6) WinForms (1) wix (2) WPF (2) xmlrpc (1) yahoo pipes (1)
Who am I?
Alex Henderson
Alex Henderson
Auckland, New Zealand
Managing Director at Dev|Defined Limited

"Self Confessed Coding Junky for 15 years"
View Alex Henderson's profile on LinkedIn
 
Mobile: +64-21-402-969
Email: bittercoder 'at' gmail 'dot' com
MSN: bittercoder_nz@hotmail
Skype: alex.devdefined
Navigation