Agile and Enterprises – No Match Found

I’ve just stumbled over an interesting blog entry: Why Agile is failing.

Cyrille shows in a very smart way the problems that I’m facing while selling our software to our customers. We are working internally according to Scrum (it’s actually ScrumBut, but anyhow), but our (enterprise) customers like to work on a strict waterfall model (for the process, not for their ideas :-)).

What is missing is an acceptance of the customers and a smooth migration strategy especially for enterprises to adopt agile methodologies (and not only for s/w development).

As long as this problem remains, there’s some kind of mixed mode where we try to handle two methodologies in parallel.

Is this task appropriate for my job?

One who considers himself too important for small tasks is often too small for important tasks.
(Jaques Tati)

ImageOnce in a while there’s a discussion where people are asking: “Is this task appropriate for my job?” (or role, assignment, or whatever) while they have to perform a specific task that seems to be a little bit outside their usual business.

Well, when we would live in an ideal world this question would be right and I would answer: “Yes, you are right. That’s not supposed to be your job. I’ll find the correct person/team to address this topic”.

Coming back to reality (especially while working for a project oriented company where the “start-up spirit” should still be the favorite way of working), statements like these would kill your business. Continue reading “Is this task appropriate for my job?”

I18n: Parsing Decimal values

At Tideum and for TimeJack we are developing line of business applications which usually handle numbers. As we are developing our software for international markets we usually face the problem of users entering numbers in a format that is not the same as the current locale (e.g. Germans are entering numbers in English locale and vice versa). This happens very often if data is copied from 3rd party applications (e.g. SAP or Excel).

Parsing those numbers with the standard .NET functions (aka. Decimal.Parse()) is parsing only a fixed language, e.g.

string source = "123,45";
decimal value = Decimal.Parse(source);

depends on the current thread culture settings. In case the current settings are “de-DE” (or “de-AT”), the conversion will return value == 123.45, for “en-US” value == 12345 will be returned and for “de-CH”/”fr-CH” a System.FormatException is thrown.
Continue reading “I18n: Parsing Decimal values”

TimeJack – I’ve got a new hobby

TimeJackA few days ago we started the public preview of TimeJack, our software to measure productivity and not time. TimeJack is a web application that focuses on project time booking.

We are doing business with Tideum for quite some time now and at some time we’ve seen that excel sheets for time-track do not fit our requirements any more. After trying some commercial and open source products we decided to go with something new: TimeJack.

What we wanted to have is a small piece of software that is able to

  • test1enter hours for projects & tasks
  • create simple and efficient reports
  • ease your life and not to have as much features as possible

All existing solutions where not able to provide the features that we needed or there where simply overblown

Currently the software is running in (free) preview mode as we would like to get feedback from you before going live somewhere end of this year.

If you are interested, please have a look at http://www.timejack.com.

WiX 3.5 released

I’d like to highlight the fact that WiX has been as released as version 3.5 stable. The official release can be downloaded here. The announcement is here.

We’re using WiX at Tideum now for about two years for all products which need an installer (internally and externally).

Best wishes to the team from one of your fans :-).

Creating bootstrapper installers with dotNetInstaller

Currently we are using WIX integrated into our TFS build process to create our installation packages. This has been proved to be a fast and cheap way to create professional setup packages.Actually there was the need to create combined setup packages consisting of several MSI packages generated by WIX.After looking at several packages (including WIX 3.6 burn, and others) we decided to start over with dotNetInstaller. Using a XML file you are able to generate .EXE bootstrappers. After playing around with this tool we decided to incorporate this directly into our build process which wasn’t that easy as the integration needed to support the following “features”:

  • MSBuild (the integration is done in the .wixproj file)
  • Support for dynamic filenames (including the automatically generated version number)
  • Support for multiple languages

The following sections describe the steps to include this into our software: Continue reading “Creating bootstrapper installers with dotNetInstaller”

Register (D)COM executables with WIX

One of our projects is using a 3rd party library for licence protection (Licence Protector) which is based on C/C++ and therefore not available as a processor independant library (like managed c# DLLs).

During migration to 64 bit we had to switch from a 32 bit DLL to a DCOM server which serves 32 and 64 bit.

The DCOM server installs itself by starting the (server) executable with the parameter /regserver (and /unregserver for deinstallation).

There’re several ways installing (D)COM servers with WIX, but every method has it’s drawbacks. So we decided to use the (from our point of view) simpliest way by simply calling the executable during installation with the correct parameters.

The corresponding <component> element looks like this:

<Component Id="cmpLicence64Bit" Guid="GUID">
  <Condition>
    <![CDATA[LICPROT31THERE="unset"]]>
  </Condition>
  <File Id="filLicPro31Exe"
       Source="ExternalFiles\LicProtector310.exe"
       KeyPath="yes"/>
</Component>

The (de)registration will by done by calling the executable with two custom actions:

<CustomAction Id="caRegisterEXE"
             ExeCommand="
             FileKey="filLicPro31Exe"
             Return="check"
             Execute="commit" />
<CustomAction Id="caUnregisterEXE"
             ExeCommand="/unregserver"
             FileKey="filLicPro31Exe"
             Return="check"/>

The importand point is the order. The deregistration needs to be done before the actual file has been deleted already and the registration can only be done during “commit” phase after the correspoding executable has been installed successfully.

In addition the custom action should be executed only on installation or deinstallation of the corresponding component:

<InstallExecuteSequence>
  <!-- ... -->
  <Custom Action="caRegisterEXE"
    Before="StartServices">$cmpLicence64Bit > 2</Custom>
  <Custom Action="caUnregisterEXE"
    Before="UnregisterComPlus">$cmpLicence64Bit = 2</Custom>
  <!-- ... -->
</InstallExecuteSequence>

Creating NetworkService services with wix

One of our products had the need to create a windows service running as “NetworkService” user.

So we did it the simple way and created the following (wrong) script:

<Component Id="cmpVipeService" Guid="PUT-GUID-HERE">
  <!-- CreateFolder is necessary for components without files -->
  <File Id="filServiceExecutable" Source="$(var.VipeService.TargetPath)" KeyPath="yes"/>
  <ServiceInstall Id="srvVipeService" Name="VIPE [INSTANCE_NUMBER] Service" Start="auto" Type="ownProcess"
    ErrorControl="normal"
    Account='[WIX_ACCOUNT_NETWORKSERVICE]'>
  </ServiceInstall>
  <ServiceControl Id="StartsrvVipeService" Name="VIPE [INSTANCE_NUMBER] Service" Start="install" Wait="no" />
  <ServiceControl Id="StopsrvVipeService" Name="VIPE [INSTANCE_NUMBER] Service" Stop="both" Wait="yes" Remove="uninstall" />
</Component>

Testing on a local PC and a test server worked fine, as WIX_ACCOUNT_NETWORKSERVICE has been translated to “NT
AUTHORITY\NETWORK SERVICE” or “NT AUTORITÄT\NETZWERKDIENST” (in German) and the service has been installed successfully. The only difference between existing (NetworkService) users and our service has been the written username “NT AUTORITÄT\NETZWERKDIENST”.

Result: Test completed inside our domain.

Yesterday we started to deploy the software to the production environment on a dedicated internet server hosted externally (and therefore not included in our domain). And (as expected) we failed. The following error has been reported in the event log with the id NETLOGON – 3095 (Sorry, in German):

Dieser Computer ist als Mitglied einer Arbeitsgruppe konfiguriert, nicht als Mitglied einer Domäne. Der Anmeldedienst braucht bei dieser Konfiguration nicht gestartet zu sein.

In english: The computer is a member of a workgroup, not a domain. The NETLOGON service doesn’t need to be run.

As a result the installation failed.

On day with unsuccessful research I finally analized an existing 3rd party tool that installs a service with a NetworkService login as well. The solution was simply not to put WIX_ACCOUNT_NETWORKSERVICE but “NT AUTHORITY\NetworkService” for the Account parameter.

Windows MSI API translates this value automatically into the local representation (i.e. NetworkService or Netzwerkdienst, …). After changing the parameter and running the installation again the software package has been installed successfully.

Support curing leukemia (blood cancer)

DKMS LogoToday we went to an event to register as bone marrow donors. This event has been organised by “Deutsche Krebsspenderdatei gemeinnützige GmbH” (www.dkms.de). A small amount of your blood might give other people a change to get cured from this disease.

Please support DKMS or your local organisation (search for leukemia or blood cancer) either personally or financially.

Applying patches for transformed installations

With wix it’s possible to create transformation for products via the <InstanceTransforms> tag. We use this feature for one of our software products to install the same software with different versions on the same machine.

Recently we had the problem how to apply a patch that has been created as described in this post. After some research we are using now something like this (found here):

msiexec.exe /package {ProductCode} /update patch.msp