The Team Build service in Team Foundation Server includes the current date in the build number by default. To me, the string looks like the random gibberish of a disk head crash.
FooBarBuild_20060928.1
FooBarBuild_20060928.2
…
I know some people are fond of including the date in a build label, but it's a turn off for me. Build labels have a tendency to show up in many places, and a friendly number is easier on the eyes.
FooBar_2.5.1
FooBar_2.5.2
…
FooBar_2.5.176
Fortunately, it's easier to change Team Build with a custom MSBuild task. There are some examples of how to do this out there, but none that generate a truly friendly name. Ideally, the task will start with a base name like "FooBar_2.5" and just generate an extra identity digit. One of the properties in play during a team build is LastBuildNumber, which we can inspect during the task and use to generate the build number we want. The code would look something like this:
Then, register the task in TFSBuild.proj file. I like to deploy the assembly into the MSBuild extensions path to use from multiple projects.
Finally, in the same .proj file, override the build number target to spit a new build label into the system.
TFS is making the CM job easy…
I get the occasional earful from people who are upset with Microsoft. These rants might come electronically, or they might come in person. If I know anything about the particular problem the person is having, I might try to give them some perspective or background on why Microsoft made the software do whatever it is that is causing the person great pain and suffering. I might know a workaround, or I might not. I might make them happier, or I might not. I do try. C'est la vie.
Today, I am on the other side of the fence.
I updated ActiveSync from 3.something to 4.2 today, only to find they removed the ability to synch a device over the network.
Let me express my feelings about this decision by saying - it sucks. It sucks really large, rotten, ostrich eggs.
Joe Developer is working on a new application for a book publisher. Authors can publish zero or more books. Books can have zero or more authors.
Joe wrote a query to get a total count of all authors, and a total count of all books. Joe read on the Internet that the DISTINCT keyword is good to use in these scenarios.
The problem is - the numbers seem too high. What's wrong? Is it easy to fix?
A new article on OdeToCode: State Machines In Windows Workflow. State machines have been a powerful abstraction in software for many years. Using a state machine in Windows Workflow means we get all the tracking, persistence, and meta-data support the workflow runtume offers, which is quite a bonus.
If we interop with a COM component from ASP.NET, we might need to use AspCompat="true" in the @ Page directive. The question is: when do we need AspCompat?
The answer is that we need AspCompat if the COM component has to run on a thread initialized into a single threaded apartment (STA). This begs the question: how do we know if a component needs to run in an STA?
One answer is to dig into the HKEY_CLASSES_ROOT section of the registry and find the component by CLSID (or by ProgID, which can give us the CLSID). Inside will be an InprocServer32 key, which holds a ThreadingModel value.
We could also find this value using the OLE/COM Object Viewer. Locate the component on the left, and look for the ThreadingModel setting on the right.
If the ThreadingModel value is "Apartment", we need to use AspCompat="true" (and look for ways to get rid of the component). If the value is "Free", "Neutral", or "Both", then we don't need AspCompat.
This post was brought to you by the Ministry of Boring Trivia, headquartered in a bar in the airport of Savannah, Georgia.
From an ASP.NET discussion:
"Real men don't write code, they regenerate it."
Use the comments to discuss the technological, grammatical, and sociological aspects of this statement.
Maybe you've dealt with The Escalator before. The conversations with The Escalator go something like this:
"Now, what about this scenario? This is a very high-priority scenario for our users. We have to have this feature in the next release".
"We costed that scenario, and we don't have the time in this release".
"But this is a high priority scenario."
"Every feature in this iteration is high priority".
"You don't understand, our user's can't do their jobs without this feature. If we don't deliver this, the project will fail".
"But, it was never that important before…"
"Look – if we don't deliver this – I … will … lose … my … job".
<blank stares>
"Please! For the love of God! The mafia will kill my family!" <tears>
"Um … ok. We might be able to bump something and squeeze it in…"
"Great! Now, about this other scenario. This is a very high-priority scenario for our users. We have to have this feature in the next release…."