Archive for 2009

Ohloh’s Project Cost?

2 commentsWritten on December 21st, 2009 by
Categories: Off Topic

I was looking at Ohloh’s estimated project cost for Agatha and something is… wrong:

code_only_cost markup_onlycode_and_markup

The result for ‘Code Only’ might be a somewhat representative estimate, but look at how screwed up the numbers are once markup is included.  Now, i don’t know if you’ve ever looked at the Agatha codebase but there certainly aren’t over 66000 lines of markup to be found.  There is a bit of XML here and there, mostly WCF configuration in the example solution but that still doesn’t come nowhere near 66000 lines.  It doesn’t even add up to 1000 lines.

A similar result can be found when looking at the estimations of Rhino Tools:

rt_code_only rt_markup_only rt_code_and_markup

Over 70000 lines of markup compared to 54000 lines of code? I highly doubt it.

Just something to keep in mind when looking at Ohloh’s estimates, i guess ;)

What Do You Think This Does?

3 commentsWritten on December 21st, 2009 by
Categories: quicknet

I’m only going to show a part of a QuickNet Acid Test, and i’m intentionally leaving a lot of things out:

        private void EnsureExceptionInfoIsCorrect(Predicate<Exception> exceptionPredicate, ExceptionType exceptionTypeEnum, Type exceptionType, Response[] responses)
        {
            int index = exceptionsThrownFromRequestHandlers.FindIndex(exceptionPredicate);
            Ensure.Equal(exceptionTypeEnum, responses[index].ExceptionType);
            Ensure.Equal(exceptionsThrownFromRequestHandlers[index].Message, responses[index].Exception.Message);
            Ensure.Equal(exceptionsThrownFromRequestHandlers[index].StackTrace, responses[index].Exception.StackTrace);
            Ensure.Equal(exceptionType.FullName, responses[index].Exception.Type);
        }
 
        [SpecFor(typeof(ProcessRequestsTransition))]
        public Spec ProcessRequestsWithBusinessException(ProcessInput input, Response[] output)
        {
            Predicate<Exception> predicate = exception => exception != null && exception.GetType() == typeof(BusinessException);
 
            return new Spec(() => EnsureExceptionInfoIsCorrect(predicate, ExceptionType.Business, typeof(BusinessException), output))
                .IfAfter(() => exceptionsThrownFromRequestHandlers.Exists(predicate));
        }
 
        [SpecFor(typeof(ProcessRequestsTransition))]
        public Spec ProcessRequestsWithSecurityException(ProcessInput input, Response[] output)
        {
            Predicate<Exception> predicate = exception => exception != null && exception.GetType() == typeof(SecurityException);
 
            return new Spec(() => EnsureExceptionInfoIsCorrect(predicate, ExceptionType.Security, typeof(SecurityException), output))
                .IfAfter(() => exceptionsThrownFromRequestHandlers.Exists(predicate));
        }
 
        [SpecFor(typeof(ProcessRequestsTransition))]
        public Spec ProcessRequestsWithUnknownException(ProcessInput input, Response[] output)
        {
            Predicate<Exception> predicate = exception => exception != null && exception.GetType() == typeof(UnknownException);
 
            return new Spec(() => EnsureExceptionInfoIsCorrect(predicate, ExceptionType.Unknown, typeof(UnknownException), output))
                .IfAfter(() => exceptionsThrownFromRequestHandlers.Exists(predicate));
        }
 
        [SpecFor(typeof(ProcessRequestsTransition))]
        public Spec ProcessRequestsWithAnotherUnknownException(ProcessInput input, Response[] output)
        {
            Predicate<Exception> predicate = exception => exception != null && exception.GetType() == typeof(AnotherUnknownException);
 
            return new Spec(() => EnsureExceptionInfoIsCorrect(predicate, ExceptionType.Unknown, typeof(AnotherUnknownException), output))
                .IfAfter(() => exceptionsThrownFromRequestHandlers.Exists(predicate));
        }

Now, what do you think this does?

Saying ‘Bye Bye’ To LinkedIn

12 commentsWritten on December 20th, 2009 by
Categories: Rants

I've been on LinkedIn for a while now, and nothing good has ever come out of it. I either get requests to connect with people that i never even met or heard about, or i get harassed by recruiters. These recruiters would call me at my employer's office to discuss ways in which i can "better myself" and when i tell them that it's not a good time to talk (as if there ever is when you're not interested), they ask me if i can send them my email address. Now, i don't want to be an arrogant prick here, but my email address is only a google search away. Why on earth would i even consider talking with a recruiter who hasn't even gone through the trouble of googling me?

As for the people who are requesting me to connect with them even though they never met or worked with me... what is that all about? Except for two or three mistakenly added 'connections' there isn't a single person in my LinkedIn connections list that i didn't either work with previously or know in person. I'm not into the whole 'networking for the purpose of networking' thing. I've done pretty well without it so far, and i'll continue to do fine without it, thank you very much.

I'm also really tired of the hypocrisy that's going on LinkedIn. I often see former co-workers publishing updates about how they're reading about DDD, TDD, Scrum, and agile development practices in general when i know all too well that they don't really care about these things and they're just jumping on the bandwagon. I've also had it with the whole recommendation thing that's going on there... i have quite a few 'connections' on there with people that i've worked with in the past but that i honestly wouldn't recommend to anyone. When you see them hooking up at a certain new employer or project or whatever, and then see them writing recommendations for each other that are just plain dishonest then you can't help but wonder what value the whole recommendation feature of LinkedIn brings in general. Seriously, 3 of the worst people i could ever imagine working with once recommended each other with raving reviews. Wanna go out of business? Hire these 3 people. They'll get along great since they seem to think the world of each other. It wouldn't exactly be a smart business decision though.

That's the biggest problem with something like LinkedIn. People get to pretend that they're important or really good while in reality, most of them aren't. It's full of phonies, who are more than willing to help the other phonies out. So what exactly, is the benefit of being on LinkedIn? Figuring out who knows who? That doesn't mean anything either since a lot of the people on it are adding connections whenever they can, whether they liked working with you or not. The whole thing is basically meaningless. And if you're good at what you do, you really don't need LinkedIn to help you out.

So i tried to delete my account... except that i couldn't. You can hide your account and make it unavailable by selecting the 'None' option in your public profile options (which i did just now), but you can't actually delete it. You have to mail their customer service to actually get them to remove your account. Pretty sad, if you ask me.

How about you? Are you on LinkedIn? Have you ever experienced any benefit whatsoever because of it?

Open Source Licensing, Copyright Notices, Contributions: What To Do?

7 commentsWritten on December 20th, 2009 by
Categories: agatha

There are two interesting problems that i’m facing with open-sourcing Agatha, and i’m not quite sure how to deal with it correctly.  The first is how to apply the license of my choice to the actual code.  I’m using Apache License 2.0, and this is their recommendation (emphasis mine):

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

 

Copyright [yyyy] [name of copyright owner]

 

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

 

http://www.apache.org/licenses/LICENSE-2.0

 

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

This sort of implies that i’m required to put this boilerplate notice in each file, which is just tedious and the odds are pretty high that you’re going to forget to put this in one (or more) of the files that will be added later on.

Instead, i put a LICENSE.txt file in the root folder of the project with the following content:

Copyright 2009 Agatha RRSL Project, original authors and contributors

 

Licensed under the Apache License, Version 2.0 (the "License");
you may not use the files in this directory structure except in compliance with the License.
You may obtain a copy of the License at

 

http://www.apache.org/licenses/LICENSE-2.0

 

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Honestly, i have no idea if i’m allowed to do that.  I can’t think of a reason why i shouldn’t be able to do this since it certainly sounds reasonable to do so, but then again i’m not a lawyer and i wouldn’t be surprised if there are reasons for not doing so.  If anyone can provide advice on this, it would be much appreciated :)

Another thing that left me wondering is the actual copyright notice.  In the 1.0 release, i unfortunately used the following copyright statement for both the LICENSE.txt as well as the copyright information on the assembly level:

Copyright 2009 Davy Brion

Now, i did write most of the code, i did start the project and i do own the project.  But i did not write all of the code as there have been some contributions from other people.  I certainly want to give credit where credit is due, so i’ve changed that copyright notice (both in the LICENSE.txt file and the assembly copyright notices) to:

Copyright 2009 Agatha RRSL Project, original authors and contributors

I then added a CONTRIBUTORS.txt file at the same location of the LICENSE.txt file which contains the names of the contributors and the parts they worked on.  I think that’s all i need to do to to be fair and correct, but again, i’m not entirely sure on this.

If anyone can provide feedback on these issues, please do so :)

Agatha 1.0

4 commentsWritten on December 19th, 2009 by
Categories: agatha

I just released Agatha 1.0 which you can download here.  The biggest changes since the 1.0 beta 2 release is the support for the one-way requests and the ability to easily run the service layer within the same process as your client (if you don’t need or want WCF for example).

As for the next version (1.1) the biggest focus will be on the caching layer, and the ability to pick your own error handling strategy.

I hope the few users that we have will enjoy this :)