24/08/2011

User eXperience (UX) in agile software development

I've been working on a poster for the last month that could help agile software development teams use different analysis methods to enhance the user experience for their applications.
The poster gives an (non-exhaustive) overview of possible analysis techniques. For each technique some brief information is given on:
  • what it is
  • why you would use it
  • who should do it 
  • and how you should do it
The analysis methods are split up in 3 categories:
  • business analysis (green)
  • functional analysis (yellow)
  • technical analysis (orange)
On the lefthand side of the poster I've tried to fit those analysis methods into an agile development cycle.

The poster is by no means complete (I still have to provide brief information on a few items) and could use some more feedback before it reaches a 1.0 release, but I'd already wanted to share it.

It is based on my current work experience where we build 'enterprisey' applications and don't have dedicated (UX) designers available. The poster started out as an A4 sheet with a short overview of the different analysis methods that a development team could use with the intent to give this to each team, but by continuously adding more information that I felt was relevant, the poster grew to its current A2 size.

Download the poster here

Some excerpts from the poster:



and



12/07/2011

Debugging .net applications in production with mdbg

Today we had an issue at work where one of our ASP.net applications was installed on a production server and some part of the application (a WCF service hosted within the web application) didn't work. The reason why it was so hard to find why it didn't work is because we use a library for nhibernate session management that swallows the actual exception and throws a new one without adding the exception as an innerexception.
Without really knowing what the underlying exception is, it is very hard to make it work.

So how do we find out what the underlying exception is without modifying the code, without access to pdb debug files and without using Visual Studio remote debugging for a web application on a production server?

Enter Mdbg
The NET Framework Command-Line Debugger helps tools vendors and application developers find and fix bugs in programs that target the .NET Framework common language runtime. This tool uses the runtime debugging API to provide debugging services. You can use MDbg.exe to debug only managed code; there is no support for debugging unmanaged code.
The command line interface looks daunting at first sight because there's a whole bunch of commands.
But for what we wanted to do, we could narrow it down to just a few.
Mdbg.exe is part of either the Windows SDK or Visual Studio. None of which was installed on the production machine and none of which we wanted to install.
But fortunately all you need are just 3 files that can be copy-pasted to a folder on the production machine and you're ready to go.
  • Mdbg.exe
  • MdbgCore.dll
  • MdbgDis.dll
I copied them from C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
Double click and there's the mdbg CLI



We will now attach the debugger to a running application. In our case this was the correct w3p.exe process. As an example I will use a .net application I have installed on my computer, the totally awesome music player MusicBee.
In mdbg you can attach to a process with the process id. To find out the process id of the running musicbee application fire up your task manager, select the process id column in view > Select columns, and remember the correct process id (in this case 11820).



To attach a process in mdbg type: a 11820

We wanted to catch all exceptions. We can do this by typing: ca ex
And then we want the debugger to continue until we encounter an exception by typing: g



And there we have one:



If you want to continue (just like pressing F5 in Visual Studio) just press: g

I think this is just the top of the iceberg of what Mdbg can do, but we managed to solve our problem (the user of the application pool didn't have rights to write in c:\windows\temp) quite fast.

05/07/2011

DesignJamming

I've participated this weekend in my first design jam. A design jam is (from the wiki):
Design Jams are one-or-two-day design sessions, during which people team up to solve engaging User Experience (UX) challenges. Learn more about Design Jams.
For developers out there, you might see it as a 'code retreat' or a 'hack day', not for coding but for learning and testing out new User Experience (UX) techniques and methods.
The original design jams started in London by Johanna KollmannJoe LanmanFranco Papeschi and Desigan Chinniah, but other design jams start popping up in other countries/cities with the help of these people.
This saturday (02/07/2011) the third London design jam was organised. The event was sponsored by:
The challenge for the design jam is only announced at the beginning of the day, but we knew it would have something to do with social music as we could deduce from the mentors:
  • Hannah Donovan who worked 5 years for last.fm
  • Matthew Ogle who worked 6 years for last.fm
  • Jason Mesut is Head of User Experience at RMA Consulting, where he leads a team of 36 Experience Design specialists developing cutting-edge enterprise applications
The challenge:
Design a service that allows people to play, listen and contribute to the music in public spaces and situations.
There were about 50 people attending and 10 teams had to be formed. Everyone received an empty index card on which you would write your known, what you're good at and what you were planning to get out of the event. Then just put up your index card at a team number and a team is born!

DSC_2010
photo by Joe Lanman

I was part of team 5 that we renamed later on the day to 'on the move'.



From left to right: me, Mark Skinner, Millie Chan and Sabrina Rahimzadeh. Picture taken at the end of the day.

The schedule for the day was something like this:
9.30 - 10.00: introduction
10.00-12.00: research and explore phase
12.00-12.30: short presentation
12.30-13.30: lunch
13.30-16.00: design phase
16.00-17.30: final presentations

During the day we tried to document our process on a tumblr page (as requested), but we spent more time on talking about the idea and designing than on documenting.

DSC_1770
photo by Joe Lanman

When we sat together with the team at the start of the day, it was a little awkward at first because you don't know what you can expect from the other team members, but after a quick 'tour de table' we decided to brainstorm on the challenge each on our own for a couple of minutes.



After going through all our ideas we managed to sort them in a few categories:
  • places with like-minded people: concert, gig, pub with themed night...
  • places with people you know: houseparty, family events, office ...
  • places with strangers: the gym, hospital, the park, shopping centre, ...
  • other interesting places: the toilet, underground parking lots, ...
  • social interactions: silent disco, ...
  • transport: commute, train, waiting for plane/train, ...
Choosing on what we were going to focus was the next step and went very fast.
We picked the waiting for a plane scenario. It had the following interesting bits:
  • there is usually a long period of time in waiting to board a plane, mostly boring time
  • there is a clash of cultures
  • people who travel to other countries are mostly open to discovering something new
  • social aspect of people who travel to the same destination (at that time, and in the past)
We managed to simplify our idea into:
Travellers who want to find out about music specific to the place where they are travelling to in the time they are waiting for their plane.
The questions that we needed an answer for:
  1. Are you with ‘like-minded’ people or in a culture-clash situation? With friends or strangers? Culture clash + strangers
  2. Is the situation a private event, eg party at a friends’ house, or in a public space? Public space
  3. Is everyone listening publicly (e.g. from a stereo), or each person individually? Individually
  4. Is everyone listening to the same music, or can individuals choose separately? Separately
  5. Are lots of people co-creating the playlist, or is there only one person having the authority? Co-creating


We ruled out the business people as people we should target with our service and then created a few personas who would be a candidate for using our service.



We present you: Joe, Julia and Monica. Millie made really nice pictures for our personas. Joe looks a little bit androgynous, but hey, he plays in an arty-farty music band, what did you expect?



And with more than 15 minutes left to the short presentation we had a very solid idea that we could 'elevator pitch'.



Here's Mark just before presenting our idea to the rest of the teams and mentors.



And while presenting:

Design Jam London 3
photo by Monika Szczygieł

We had a fast lunch with the team and got back by 13.30. And then we kinda got lost in our idea. We had 2 hours and 30 minutes before presenting our final presentation and spent more than 1 hour and a half on discussing on more ideas and features without actually creating content. Luckily Sabrina got us back on track with identifying 3 main features of our service.



We started drawing out a user journey for Joe.



Next to the paper with the user journey is a paper with additional ideas of a kiosk in the airport that would use the service. But still we were discussing on a scope for the service that was too large. Then we got a visit from mentor Hannah Donovan who put us back on track and advised us to focus on 1 story and to work that out.
With 30 to 45 minutes left to the final presentations, we started reworking the user journey and drawing sketches of wire-frames.





With 15 minutes left I started updating our tumblr page while Millie started drawing on our awesome final wire-frames together with Sabrina while Mark was preparing for the presentation.





And suddenly it was 16.00 ... That last hour was really hush hush and flew by in a flash.
Mark did a very condensed and focused presentation showing the minimal viable product for our idea.

I've seen some very cool concepts, ideas, designs and wire-frames from the other teams during the presentations. You can find all the tumblr pages from all the teams on the wiki page for Design Jam 3 London.

After cleaning up the venue we hit the pub and stranded later in the evening at the banana tree for some delicious Asian food where among others I had an interesting conversation with Sedef Gavaz about the difference between User eXperience and Service Design. An excellent end to an inspiring day!

This whole day kind of reminded me of the group assignments I had in my architecture studies where we had to work as a team thinking about a concept for a building, start sketching it out and design it. With that difference that then we had 6 weeks to finish a design, today we had a couple of hours.

Also cheers up to the organizers who did an awesome job. Guiding more than 50 creative individuals throughout the day while keeping a tight schedule isn't the easiest task, but they did great.

Conclusion:
I thought it was a very inspiring and joyful experience. I've met a lot of engaged people and learned a lot about UX techniques. Maybe I might bring a design jam back to Belgium ...

And last but not least: big thanks to Joe and Rachel for letting me sleep at their place for 2 nights and have really nice English breakfast and pizza with fresh green (or was it leaves?)!

20/06/2011

My LateNightTales mix

I recently bought the album LateNightTales by Trentemøller. It is part of an ongoing series where the world’s best artists are invited to delve deep into their music collections to create the ultimate "late night” selection.

Thinking about how my LateNightTales mix would look like I just put my money where my mouth is and made my own. For your late evening listening pleasure I present you:




Tracklist
  1. fever ray - if i had a heart
  2. radiohead - like spinning plates
  3. efterklang - swarming
  4. low - embrace
  5. bonnie 'prince' billy - i see a darkness
  6. sufjan stevens - john wayne gacy, jr.
  7. mazzy star - take everything
  8. mogwai - helicon 2
  9. joy division - new dawn fades
  10. arcade fire - neon bible
  11. kaki king - ...until we felt red
  12. the god machine - boy by the roadside
  13. the decemberists - sleepless
  14. motorpsycho - painting the night unreal
  15. karate - this day next year
  16. russian circles - xavii
  17. tortoise - along the banks of rivers

Using WCF on Biztalk 2006 R2 for calling eHealth web services

The Belgian government offers a list of basic web services that hospitals and/or healthcare providers can use for building healthcare applications.
These SOAP based web services are written in Java and make heavy use of security. There's an excellent WCF library available that makes it more easy to use these web services from .net.
We received a question from one of our clients if one of those basic services (Trusted Timestamping Service (TTS)) could be used from within a Biztalk orchestration. This post is about all the steps we took and all the problems we solved to be able to support this. Unfortunately I'll have to disappoint you that as far as we tried it is not possible. We got very far but the technical limitations of Biztalk nailed us. If you want to find out which 'marvelous' journey we undertook: although my Biztalk knowledge equals to null, I'll be your guide during this wonderful trip of WCF, .net and Biztalk.

First we needed to find out if the library supports calling the Trusted Timestamping Service (TTS), the basic service we need to call, as it is not listed as tested. We've made a small test application that calls the eHealth TTS on their test environment.
Sidenote: for the application to work you need a valid installed eHealth certificate and it needs be correctly configured in your WCF endpointBehavior configuration.

The use of the library involves adding a custom binding extension to the app.config of the application.

<extensions>
 <bindingextensions>
  <add name="TimeStampBinding" type="Siemens.EHealth.Client.Sso.Sts.Configuration.StsBindingCollectionElement, Siemens.EHealth.Client"/>
 </bindingExtensions>
</extensions>

Problem 1: When running the test application we got the following exception:

Configuration binding extension 'system.serviceModel/bindings/TimeStampBinding' could not be found. Verify that this binding extension is properly registered in system.serviceModel/extensions/bindingExtensions and that it is spelled correctly.

Solution: You could change your machine.config and add the binding there, but that's not advisable. Or you could just add an empty bindings element to the system.serviceModel configuration:

<system.serviceModel>
 <bindings/>
 <extensions>
  <bindingextensions>
   <add name="TimeStampBinding" type="Siemens.EHealth.Client.Sso.Sts.Configuration.StsBindingCollectionElement, Siemens.EHealth.Client"/>
  </bindingExtensions>
 </extensions>
 <behaviors>
  <endpointbehaviors>
   <behavior name="TimeStampBehavior">
    <clientcredentials type="Siemens.EHealth.Client.Sso.WA.OptClientCredentials, Siemens.EHealth.Client">
     <clientcertificate storeLocation="CurrentUser" storeName="My" x509FindType="FindByThumbprint" findValue="c0c3438821b96b24cc94dad318d0cbaef31b5c34"/>
    </clientCredentials>
   </behavior>
  </endpointBehaviors>
 </behaviors>
</system.serviceModel>

After modifying the app.config with the above configuration we moved on to problem 2.
Problem 2: Our first try resulted in the following exception:

<env:Fault xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<faultcode>wsse:FailedCheck
<faultstring>weblogic.xml.crypto.encrypt.api.XMLEncryptionException: Unable to resolve encryption key for weblogic.xml.crypto.encrypt.api.EncryptedType{keyInfo=null, cipherData=CipherValue: JVO/dyAV5eIPIDGahQwBsI/CuqmFzBzfGe9MH9MM2bNDDpyGxa9ZXboX/3co8BzlDZY6F+b7R4DDaLXg0XZzO3gFiM7v1EaqVjuQcbiujiTdAWTVi921WMeO4to4Q9Px3ez6tBtYdIlU//WV+JRonL6NIBN66vs42E46PqOJIRIl3hx3ai589yBgcdAJTH3CCqVDXY3XcotWGtRpa4eu9K5fNxFs6o2Ez1gaeVAGLYOZwnRHVzg++Y+7V9dSS+UzwFEuVTLSvzqSg0p+mfgzlmAPtqTxDVro2cM3aJdJTgra86aEb9fp2q2jAE9BVXT2JDqa1yXWT26SajuyJqZAeABFBo0CmiVeDS/iSUQwvZaSc5g94G+6BQOs+JA7xEIAlWEihmLZyXT9LjhNF5CS/ZLBJqGWzRWcSByeIXrDn5sFtobLKP2o8P1hHxkzht4RQrEFsPs58jyUYd9wFLh/WLmWK6dQ2YjUsBkJI3A+bpK32FfhUagcpP22NmS7kJbJWylbvpInXftEnGGDTyrmD7DGYAMyoCH3X2jluXAXckHZpN0aBRgg4aQIGMYvSyZGHnmnXo8r4FFegH0nSHIIJaUMiFLKtRBmaChMtwyqajwT49AcUCfEvROlM6L2zBjkn7BMYTosaeZHBKTBzW1L8aT6lw5iKi/ISw2FFD96qSAY9pnScaPOdftoPbJd7mpV9Y3U8I2gO9JTLapsu5TP/C5sdRanLeKPriHKwSm/3DAfWKxxcFt1hDqswY9pFNuym4mXlXwru2ZKbRtqqwa0JRF7FuHCFBYK1aM8JtcBTrE2hx4aA2JpLTQ4JlaSgVk7uFwW7GDiO5iKSHCJPGTimHqGfzJnIRTJqGIhhk2p1MWmh30hMjkxIHv7L4uiOIytLZPgUCuEzdhMxZsMMD5H2bDv1QOp6oWI6s+cdo2GD9l9fdtbtYR8QUvfuSU410Lsin2iIZwigH9Z16YtmNMRlWdBg7ZRNJQF582qNiOnv6L7nar5uwuP0SXwWEALo47HCTcXRO2hV5rGn+r4BS8rg20gh+La30Icd60NIphn9/xAyPk48cedq7aY0t1Lj5w1Zbtd7NIcfr4p5vPqAs20NUTs+Fw2DYkyGPNZuVhFLnxXVYuiXsr9IAsN8F54BqEFRBHbDRbQ0CWOXm+p/98cAlPCWj9I6c9prDu6zGMw9p3jfg5MQ3c5nB0z9X7cUGhV/0cIQ2h/LCxXUGHJUPYVRxsMJoDz5zUxv9v2UM1GlqN1tvW7tfq0MyojdYRkrMBvfuYoMSyG2Xssa+fLhgN7SLMYjknjynbPdt5pFnL8yQs4cqgD743i3KSMDhnNmMAnNi1IlDe8jdGoL+sUQxEtXw==, id='_2', mimeType='null', encoding='null', encryptionMethod=EncryptionMethod: algorithm = http://www.w3.org/2001/04/xmlenc#aes256-cbc;}
</faultstring>
</env:Fault>

Solution: Googling this exception didn't deliver anything useful, but looking at the documentation of the library again we realized we had overlooked something important. You have to manually set the protectionlevel parameter on the ServiceContractAttribute of the generated service reference. When this was modified we received a valid response from the TTS.

At this point we had a working test application that was targeted at .net framework 4.0. Our next step was to configure a WCF endpoint in Biztalk to use the custom binding extension.

Problem 3: You can use a WCF endpoint in Biztalk, but on Biztalk 2006 R2 you are limited to .net framework 3.5 because .net framework 4.0 is not supported on this version.

Solution: The WCF library we are using is targeted for .net framework 4.0. Download the source, set the target framework to 3.5 and compile! Oops, doesn't work because:

Problem 4: In .net framework 3.5 there is a property missing on SecurityBindingElement, namely EnableUnsecuredResponse. It is a boolean value that enables WCF to send secured messages and receive unsecured responses, and to send unsecured messages and receive secured responses. We tried to comment out the setter of the property, but this resulted in following exception:

Security processor was unable to find a security header in the message. This might be because the message is an unsecured fault or because there is a binding mismatch between the communicating parties. This can occur if the service is configured for security and the client is not using security.

Solution: There is a hotfix available that enables this property for .net framework 3.5 SP1. But you need to know which one you need and it is by request only. The biztalk server we are going to deploy to is running on a Windows Server 2003 32 bit so we requested this one. We also needed this on a development machine where we were to compile the test application. This has a Windows 7 OS, but we couldn't install the appropriate hotfix, only receiving 'this hotfix is not valid for this OS' from the failing installer. It turns out that the specific KB was rolled up in Windows 7 SP1 and thus already on the development machine.
After removing the System.ServiceModel reference and re-adding it again, and uncommenting the setter for the EnableUnsecuredResponse property, we could compile our test application targetting .net framework 3.5 and run it on the development machine. Next up was running this on our test biztalk server that had the same setup as the one with our client.

Problem 5: The hotfix for Windows Server 2003 consists of 2 KB's where the first one got installed and the second one (the one we need) doesn't get installed without failing the installation. We noticed this because the version number of System.ServiceModel assembly in the GAC didn't change. After 'dotpeeking' the assembly we were sure this wasn't the updated assembly because it still was missing the EnableUnsecuredResponse property.

Solution: We managed to extract the assemblies from the hotfix and install them ourselves in the GAC. And yes! our test application targetting .net framework 3.5 worked, but this - manually updating the .net framework with assemblies from a hotfix you can only get by request - felt very uncomfortable!

So we were back at problem 3: Configuring a Biztalk WCF endpoint with the EHI library targetting .net framework 3.5.
Solution: see also here
  • You need to install the EHI assembly in the GAC for Biztalk
  • You need to modify machine.config so Biztalk can find the binding extension (see problem 1)
  • you need the assembly somewhere in a path where Biztalk can find it (something like C:\Program Files\Biztalk\). I have no idea why we needed to put it in the GAC and also somewhere else. This was something we had to figure out after the setup succeeded, but as we never got there, this remains unsolved.
We finally had a configured WCF endpoint that didn't throw any errors! Next step was calling the TTS through the endpoint.

Problem 6: Bam, a new exception:

The adapter failed to transmit message going to send port "WcfSendPort_TimeStampAuthority_timestampauthorityPort" with URL "https://wwwacc.ehealth.fgov.be/timestampauthority_1_5/timestampauthority". It will be retransmitted after the retry interval specified for this Send Port. Details:"System.InvalidOperationException: The ClientCredentials cannot be added to the binding parameters because the binding parameters already contains a SecurityCredentialsManager 'System.ServiceModel.Description.ClientCredentials'. If you are configuring custom credentials for the channel, please first remove any existing ClientCredentials from the behaviors collection before adding the custom credential.
at System.ServiceModel.Description.ClientCredentials.System.ServiceModel.Description.IEndpointBehavior.AddBindingParameters(ServiceEndpoint serviceEndpoint, BindingParameterCollection bindingParameters)
at System.ServiceModel.Description.DispatcherBuilder.AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection parameters)
at System.ServiceModel.Description.DispatcherBuilder.BuildProxyBehavior(ServiceEndpoint serviceEndpoint, BindingParameterCollection& parameters)
at System.ServiceModel.Channels.ServiceChannelFactory.BuildChannelFactory(ServiceEndpoint serviceEndpoint)
at System.ServiceModel.ChannelFactory.CreateFactory()
at System.ServiceModel.ChannelFactory.OnOpening()
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open()
at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2.CreateChannelFactory[TChannel](IBaseMessage bizTalkMessage)
at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2.InitializeValues(IBaseMessage message)
at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2..ctor(IBaseMessage message, WcfTransmitter`2 transmitter)
at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfTransmitter`2.GetClientFromCache(String spid, IBaseMessage message)
at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfAsyncBatch`2.BatchWorker(List`1 messages)".

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

Apparently Biztalk adds its own client credentials to the generated WCF client. From that blogpost there seems no way to get around this, but the first comment on the blog gives a solution to overcome this.
Solution: Create a custom BehaviorExtension that removes ClientCredentials.

public class BiztalkClientCredentialsBehavior : BehaviorExtensionElement, IEndpointBehavior
{
 public void Validate(ServiceEndpoint endpoint) {}

 public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
 {
  ClientCredentials clientCredentials = bindingParameters.Find();
  bindingParameters.Remove(clientCredentials);
 }

 public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) {}

 public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) {}

 protected override object CreateBehavior()
 {
  return new BiztalkClientCredentialsBehavior();
 }

 public override Type BehaviorType
 {
  get
  {
   return typeof(BiztalkClientCredentialsBehavior);
  }
 }
}

And configure it:

<system.serviceModel>
 <bindings/>
 <extensions>
  <behaviorextensions>
   <add name="BiztalkClientCredentials" type="Siemens.EHealth.Client.Sso.Sts.Configuration.BiztalkClientCredentialsBehavior, Siemens.EHealth.Client, Version=1.0.0.9, Culture=neutral, PublicKeyToken=3dd81f6b7de27543"/>
  </behaviorExtensions>
  <bindingextensions>
   <add name="TimeStampBinding" type="Siemens.EHealth.Client.Sso.Sts.Configuration.StsBindingCollectionElement, Siemens.EHealth.Client"/>
  </bindingExtensions>
 </extensions>
 <behaviors>
  <endpointbehaviors>
   <behavior name="TimeStampBehavior">
    <biztalkclientcredentials />
    <clientcredentials type="Siemens.EHealth.Client.Sso.WA.OptClientCredentials, Siemens.EHealth.Client">
     <clientcertificate storeLocation="CurrentUser" storeName="My" x509FindType="FindByThumbprint" findValue="c0c3438821b96b24cc94dad318d0cbaef31b5c34"/>
    </clientCredentials>
   </behavior>
  </endpointBehaviors>
 </behaviors>
</system.serviceModel>

Attention: Contrary to the BindingExtension configuration, the BehaviorExtension type must be the full name of the assembly (with correct version and publickeytoken).

So with this BehaviorExtension the automatically added ClientCredentials were removed and the ones we specify in the config were added. Haha, nothing will stop us now!

Problem 7: After doing a new call with the use of the WCF endpoint we bumped against another exception:

In short: Unable to resolve encryption key for weblogic.xml.crypto.encrypt.api.EncryptedType

We encountered this exception before (see problem 2) and thus all we needed to do was add the protectionLevel parameter to the ServiceContract attribute.

Solution: We didn't find any solution for this. As far as I know Biztalk dynamically generates the WCF proxy code and we didn't find a way to inject, intercept, change or modify it.

So there we are, probably at the last step to completing the complete setup, but we thought that with every problem we solved, thinking 'this will be the last one'.

We finally decided on creating 1 Windows Service configured with Quartz.net for scheduling. Easy to install, update, configure, no assemblies in GAC, no manual .net framework updates and no complicated Biztalk orchestrations.

13/06/2011

My impressions on TEDx Ghent 2011

For those of you who haven’t heard of TED before:

TED is a nonprofit devoted to Ideas Worth Spreading. It started out (in 1984) as a conference bringing together people from three worlds: Technology, Entertainment, Design. Since then its scope has become ever broader.

The TEDx events are local events/conferences under the TED umbrella. So for the first time a TEDx event was organised  in Ghent (11-06-2011). The venue for the event was the chapel of the Vlerick Management School which gave me a pleasant first impression, although it wasn’t really suited for these kind of events. The chapels acoustics where not good, the chapel couldn’t be obscured which made the presentations hard to see and the chairs weren’t that comfy either.

But let’s focus on the talks. Listening and looking at the presentations made it clear that presenting an idea in a short period of time (15-20 minutes) in a clear and engaging way (like we expect from TED talks) is very difficult. Between the live presentations a couple of recorded TED talks were shown and this made this even more clear. A few of the presenters were struck by ‘powerpointitis’ and ‘bullet-point-bacteria’, some weren’t actually presenting a (new) idea and some couldn’t get the idea across. Here’s a quick overview of the different talks:

Folke Lemaitre: the rise of the personal web. I guess he was the presenter with the worst spot on the afternoon schedule. During his talk there were lots of technical hiccups and he had to shorten his presentation. This and the fact that I didn’t hear anything new (just read DIgital: the new normal from Peter Hinssen) felt like a bad start for the event.

Dirk De Ridder: why the brain creates phantoms. We got an explanation of why our brain tells us we have pain in a leg after it has been amputated. Very interesting but overwhelming due to overload on information. If our brain doesn’t get enough information from the environment (through our senses) for a situation, it adds information from memory to remove uncertainty. If we don’t receive any information (amputated leg) then our brain creates information from memory which creates phantoms.

Ellis ten Dam: cradle to cradle. This was the first presentation that really presented an idea with a nice visual presentation, but the idea didn’t get across (at least not to me). In the talk Ellis ten Dam gave 3 principles related to circular society for sustainable solutions

  • think in positive outcomes: create a positive business case efficiency towards effectiveness and using less raw material will only delay the outcome
  • think in circles: loops instead of lines, chains of stakeholders
  • innovation on co-creation: not only technical innovations but also: legal and financial

Bas Haring: successful vs happy life. The last session before the break and this was the best one so far. A very good presentation and an idea that leaves a lot of room for discussion (I don’t agree with his black/white view in the idea). The idea: living a happy long life just doing nothing or leading a short successful life although less happy? Maybe you should opt for the long boring happy life.

Patrick Vyncke: fitness cues. This was an entertaining talk about when sex makes a difference in advertising. The reaction of a human being is divided in 2 systems (system 1 and system 2, or instinctive and rational). By using sex in copywriting results in no difference: this toothpaste – shiny teeth, this toothpaste – sexy teeth, no difference because we know rationally that this is not the case. But we do react differently to specific cues: we are finetuned to react to cues that enhance our survival. One obvious example: 75% of women choose an ad which has a man holding a baby to 25% that choose the man holding a caught fish.

Louis Jonckheere: mobile development. This was one of the most clear talks for the whole afternoon. A nice visual presentation, a clear idea and a good presenter. With some statistics and numbers he made it clear that mobile applications will make up the larger part of the number of applications worldwide in the near future. That’s where the audience of the future is.

Philip van de Gehuchte: dance organ – decap beat machine. Hacking an analog organ to be digitally controlled. Making the organ dance parties from the 50ties into contemporary dance parties. See this video.

Lars Sudmann: the virtual presentation project. Again a very good presentation on how to make your virtual presentations better and make them interact more with the audience. Some tips: speak like a radio presenter, learn from tv (visual elements), make it more visually appealing, make use of scribble (A scribble can also refer to a roughly drawn representation of a design) to give the presentation a more human touch and lastly make us of social media (for example to do a live polling).

Johan Braeckman: natural selection. Good presentation but nothing new here for me. A clear explanation of ‘natural selection’, but one that belongs more in a lecture hall in my opinion.

Clo Willaerts was the excellent facilitator for the afternoon. One remark on the little experiment on leadership and followers: being a follower is not something you are told to do but something you do out of free will.

All in all it was a positive experience, but I expected more from a TEDx event. To wrap up: some good presentations, a few good ideas and some things that can be improved upon for the next TEDxGhent event which will have me surely again as an attending TEDdict.

Here’s a link to photos of the event taken by Hans Stockmans: http://www.flickr.com/photos/hans_stockmans/sets/72157626826048961/with/5827729287/

11/02/2011

How to measure application lifecycle management?

Last year we’ve introduced Application Lifecycle Management in the company I work for. We already had a lot of best practices in place for the applications in our product portfolio. We have been using subversion as source control system and cruisecontrol.net as automated integration server, but we had no automated process for releasing a new version of an application and deploying it with the customer. The main goals of introducing ALM for our applications are:
  • to deliver software of higher quality to our customers
  • to automate the whole build & deploy process
  • to standardize on 1 process for all of our applications
Once we have set this up for an application (I won’t go into detail now how we set this up) we would like to know if it truly delivers software that is of higher quality then we had without the automated process. We would also like to know if we can capture KPI’s or measurements that can indicate when we’re falling back in old habits that would lower the quality of a software release. These measurements should be able to be retrieved without additional manual actions, they should be measurements that can be extracted from the automated ALM process.

mockup-singleI’ve made a small mockup of how these measurements could look like on a dashboard. Each measurement has a value and 3 states (green, yellow, red) where green is ‘good’, yellow is ‘could be better’ and red is ‘not good’

I’ve included 8 measurements for a given product. The thresholds for the measurements haven’t been verified with the actual situation yet and will probably change.

NCover percentage

If the application makes use of unit tests. The coverage of how much code is tested is a good indicator of the quality of the application. I believe you don’t always need 100% coverage and you need to find the sweet spot between the risk that you take not testing code and the cost it takes to maintain the testing code. This sweet spot may be different for each part of an application. Threshold: 80+ is good

Support lifecycle policy compliancy

Our applications need to be compliant with newly released OS, database, Office and browser versions within a given period. This indicator tells us whether the application is compliant with the company policy or not. Threshold: 0 is good

Commits per day / team member

The more frequent someone commits a piece of code the easier it will be to merge that code and if a defect is detected the easier it will be to find it and correct it. If we assume that the defect will be detected before we release and we don’t commit that often then this indicator won’t say much about the quality itself, but will about the speed of development. Threshold: 2+ is good

Average duration of a failed build / month (or release cycle)


We won’t measure the amount of failed builds because that’s what it’s for, detect if we have code integration defects. But a failed build should be fixed as quick as possible. That’s why we’ll measure the average of the failed build durations for a release cycle / iteration. Threshold: less than 30 minutes is good

Software distributions to production emulation / month

Before an application can be deployed at a customer it has to be deployed first in our production emulation. This deployment process is equal to the deployment process in production. If something fails here, it will certainly fail in production. This is the last step where we can detect defects before we release to production. A deployment to the production emulation is like saying that you have a release worthy product. The best scenario is that you have an equal amount of distributions to your production emulation as to production. If you have done enough testing in the earlier stages of the process, the chances of defects should be very low in this step. Threshold: 1-3 is good

Software distributions to production / month

Our customers want new releases with a fixed frequency of about once or twice a month. Our aim at this moment is to release 1 version each month. This will allow the team to pack a good amount of new features in the release and to test it thoroughly without letting the customer wait too long for requested changes. Threshold: 1-2 is good

Amount of helpdesk calls / month / customer

Although this indicator only partly applies to the quality of the process, it is still very useful. By partly I mean that not only the ALM process will be guilty for helpdesk calls, but also how the features are implemented in the product. Threshold: less than 10 is good

The last informative measurement is the current status of the defined builds on the buildserver (trunk, development branches, nightly builds) of the application.

If we really want to detect if we’re building a qualitative application, we should measure a lot more, but these measurements should already remind us of the constant focus we need to have on building and deploying qualitative applications.

What other measurements can we make that will help govern the ALM process?

05/01/2011

nixmix 2010

My selection of the best tracks of 2010 and each part fits on 1 cd.

Part 1

janelle monáe - cold war
katy b - katy on a mission
netsky - iron heart
goose - words
daft punk - derezzed
the knife - the height of summer
broken social scene - all to all
bonobo - kiara
four tet - angel echoes
caribou - odessa
hot chip - i feel better
ou est le swimming pool - the key
the wombats - tokyo (vampires & wolves)
klaxons - echoes
yeasayer - madder red
the ting tings - hands
the drums - forever and ever amen
best coast - boyfriend
broken bells - vaporize
avi buffalo - what's in it for?

Part 2

arcade fire - ready to start
the van jets - down below
the national - bloodbuzz ohio
triggerfinger - all this dancin' around
drums are for parades - a salesman's pen
neil young - walk with me
the black box revelation - love licks
blood red shoes - don't ask
customs - shut up, narcissus
belle and sebastian - i want the world to stop
eliza doolittle - pack up
sharon jones & the dap kings - i learned the hard way
the black keys - never give you up
sufjan stevens - all delighted people (original version)
broken glass heroes - baby don't worry
mintzkov - author of the play
band of horses - factory
foals - spanish sahara

Part 3

john grant - i wanna go to marz
the morning benders - excuses
she & him - in the sun
angus & julia stone - hold on
beach house - norway
laura veirs - july flame
warpaint - undertow
agnes obel - beast
joanna newsom - easy
anais mitchell - flowers (eurydice's song)
antony & the johnsons - fletta
james blake - limit to your love
mavis staples - you are not alone
johnny cash - ain't no grave
midlake - winter dies
villagers - becoming a jackal
eels - a line in the dirt
amatorski - come home
motorpsycho - close your eyes

05/10/2010

Remix 2010: Design venturing

Last week I attended a talk by Georg Petschnigg at Remix10 about design venturing: “Design techniques for identifying, developing and evaluating business opportunities”. Georg petschnigg is co-founder at Pioneer Studios who brought us the excellent courier concept.
I’ll try to recreate a couple of the topics he talked about from the notes I’ve taken. He talked about how you can get from design to business. The first diagram that was shown was the innovation process.
innovation process
It all comes down to a core idea and you need to ask yourself 2 questions (insight):
  • What is unique about you?
  • What does the world need?
By combining the insights you get from these 2 questions you can develop a core idea that stands out. Everyone has great ideas, but it takes a lot more to develop a product. How can you build a simple and beautiful product? The steps needed to create a product in industrial design are the 3 reads:
  1. eye
  2. touch
  3. use
Creating a product in interaction design (or software) follows the steps in the opposite direction:
  1. features (use)
  2. controls (touch)
  3. look & feel (eye)
You need to combine the 2 flows to create an overall experience.
To summarize his talk he conluded with the following diagram about how we can support creation.
20101003.creation support
An important part of the diagram is ‘soul’: Nothing great in the world has ever been accomplished without passion.

23/06/2009

Enabling NFS on Synology Diskstation 209 (version 2.1) and with ubuntu 9.04 client

I have been looking out for a NAS device for a few months that needed to match a few core conditions:

1. has lots of disk space (over 1 GB)
2. be able to host squeezecenter for my squeezebox duet
3. easy access to shares on the NAS from linux and windows
4. be able to make backups of windows and linux powered computers in network
5. low power consumption

After reading a lot of reviews and comparison charts I finally decided on the Synology Diskstation 207+, but since that was being replaced by a newer version, I bought the successor: Synology Diskstation 209. I stuffed it with 2 WD Caviar Green 1 TB eco friendly hard disks which have me a total of 2 TB. I've decided to choose RAID-0 for now and maybe change it later to a RAID-1 configuration.

• condition 1: check!

Next up was installing squeezecenter, which was pretty easy to do, because you can download the 'value application' right from the synology website. It worked like a charm.

• condition 2: check!

Now the easy access to the shares defined on the NAS for windows and linux clients. We have a couple of possibilities to do this:

• FTP
• Windows File Service (credentials by workgroup or domain)
• AppleTalk (that's for you, proprietary appleboy)
• NFS (Network File System)

The easiest way and the one i tried first was accessing the windows file share with the 'connect to server' application picking 'Windows share' as a service type. That worked so I then also tried to add the mount point to /etc/fstab which also worked.



But there was something wrong with the permissions and I couldn't get it right. Even if I entered the admin credentials I stumbled across 'permission denied' exceptions. I've tried various things to solve it, but no alas. This wasn't running as stable as it should be.
Appletalk was ruled out and after some searching after mounting FTP shares (which isn't easily possible) there was only 1 possibility left.

NFS allows a user on a client computer to access files over a network in a manner similar to how local storage is accessed. This isn't on by default in ubuntu, so you won't find in the 'connect to server' application. Because I have control over the server and the client I need to have the correct settings on both. Let's start with the client.

NFS Client settings

This blogpost says it all.
You need 2 services running: portmap and nfs-common. Only portmap was running on my machine so I also installed the other service.
After trying to mount the share from the command line

sudo mount 192.168.2.4:/volume1/share /media/share

where 192.168.2.4 is the ip address of the NAS device, /volume1/share is the share on the NAS, and /media/share is the local folder that I created manually (important, you need to do this before mounting).
I got the following error: mount.nfs: access denied by server while mounting.
So this made me conclude that my client settings are okay.

Server NFS settings

First enable NFS on the diskstation.



If you have a share already you can list them from the client this way:

showmount -e 192.168.2.4

Now for the real action: this wasn't as easy as the client settings. First of all the server in this situation (the Synology DS209) has no GUI like the client. Therefore I had to enable Terminal Service options in the disk station manager.



This wikipage has the different steps to setup NFS on a synology server. For the terminal server I used telnet from the command line

telnet 192.168.2.4

Important here is that you need to login with root and not with admin. Admin doesn't have all the permissions. The password for root is the same as your admin password.
Following the steps on the wiki page:

cd /usr/syno/etc/rc.d
mv S83nfsd.sh 5830001.sh (there is no S83nfsd.sh.sample and I replaced the 4 * with a number. I have no clue why this is though)
• I did a reboot
vi /etc/exports

And then you're in vi. As a first time user I had to look up some commands and I found those I needed here.

I edited the exports file this way:

/volume1/Share 192.168.2.2(rw,no_root_squash)

where 192.168.2.2 is the ip address of the client. I first tried it with an IP range, but that didn't work.

I 'touched' the /var/lib/nfs/rmtab file, because it wasn't there, with

touch /var/lib/nfs/rmtab

and

/usr/sbin/exportfs -a

After that I could connect from the client to the server. I added following line to /etc/fstab to boot it automagically:
192.168.2.4:/volume1/Share /media/share nfs rsize=32768,wsize=32768 0 0

What's pretty cool is that I'm connected to the lan wireless and that the share only mounts when it can find it. Nice!

• condition 3: check!

I still have to figure out the best backup procedure for the windows and linux machines and will have to measure energy consumption.
But that will be for later.