TechEd 2006 WebCast Series

If you haven’t seen this already, you can download around 140 of the TechEd 2006 webcast and breakout sessions. It never ceases to amaze me how many resources Microsoft offer for free. [They also seem to have streamlined the registration/download process somewhat. Thanks Ron!]

In fact, Dan Appleman (the VB legend) recently commented on this phenomena, mentioning what it was like to develop software back in the mid to late 1980’s, before Google and when documentation was a lot scarcer than it is now!

Microsoft Privacy Guidelines

Microsoft have released a must read, downloadable document Privacy Guidelines for Developing Software Products and Services based on their internal privacy guidelines.

Before collecting and transferring personal information, you, as the entity
requesting the information, must have a compelling business and customer value
proposition. A value proposition that benefits customers may create a
natural incentive for them to entrust you with their personal information.
Only collect personal information if you can clearly explain the net benefit to
the customer. If you are hesitant to tell customers “up front” what you
plan to do with their information, then do not collect their data. This
applies to data collected and stored locally on the customer’s machine or
transferred over the Internet.

Windows Vista Blog Gets a Facelift

Jim Allchin has re-released the Windows Vista blog with more of a ‘Vista’ feel. The previous site was infrequently posted to, and this time Jim is pushing his co-workers to improve the content. If you’re already running Vista, they are looking for feedback.

Better Presentation Tips

Kathey Sierra has posted an article on how to start a presentation, book, article… and as usual it’s worth reading. A few hilights are:

You should not:

  • Start at the beginning
  • Tell, show instead
  • Start with history
  • Start with pre-requisites

You should:

  • Begin with a question
  • Be provocative
  • Evoke empathy
  • Do something surprising
  • Start with something funny
  • Start with a dramatic key event or turning point
  • Have some mystery, suspense or intrigue

The T-SQL Way: Converting Integers to Binary Strings

A post over at Rob Farley‘s blog on converting integers to binary using Transact-SQL caught my eye and it reminded me of a challenge a fellow developer gave me a few years ago, namely that I couldn’t speed up one of the VB functions he had written with the condition that it must still be written in VB. I did, by 3 orders of magnitude!, but that’s another story…

My solution is probably not quite as elegant as Rob’s CTE solution but I reckon it might be faster and use less memory. In fact there are two very similar function based solutions. One is certainly more readable than it’s slightly faster counterpart.

Originally, I used the formula as the basis for a computed column, like so:

CREATE TABLE #t (

intVal int ,

binaryStr AS (

SUBSTRING( ‘0000000100100011010001010110011110001001101010111100110111101111’ , (IntVal / 268435456) * 4 + 1, 4 ) +

SUBSTRING( ‘0000000100100011010001010110011110001001101010111100110111101111’ , ((IntVal / 16777216) & 15) * 4 + 1 , 4 ) +

SUBSTRING( ‘0000000100100011010001010110011110001001101010111100110111101111’ , ((IntVal / 1048576) & 15) * 4 + 1 , 4 ) +

SUBSTRING( ‘0000000100100011010001010110011110001001101010111100110111101111’ , ((IntVal / 65536) & 15) * 4 + 1 , 4 ) +

SUBSTRING( ‘0000000100100011010001010110011110001001101010111100110111101111’ , ((IntVal / 4096) & 15) * 4 + 1 , 4 ) +

SUBSTRING( ‘0000000100100011010001010110011110001001101010111100110111101111’ , ((IntVal / 256) & 15) * 4 + 1 , 4 ) +

SUBSTRING( ‘0000000100100011010001010110011110001001101010111100110111101111’ , ((IntVal / 16) & 15) * 4 + 1 , 4 ) +

SUBSTRING( ‘0000000100100011010001010110011110001001101010111100110111101111’ , (IntVal & 15) * 4 + 1 , 4 )

)

);

— Test values

insert into #t VALUES (0)

insert into #t VALUES (1)

insert into #t VALUES (2)

insert into #t VALUES (3)

insert into #t VALUES (4)

insert into #t VALUES (15)

insert into #t VALUES (31)

insert into #t VALUES (65)

insert into #t VALUES (127)

insert into #t VALUES (128)

insert into #t VALUES (129)

insert into #t VALUES (65535)

insert into #t VALUES (65536)

insert into #t VALUES (166754132)

insert into #t VALUES (1073741824)

— int’s are signed, max value is therefore, 2^31 – 1 = 2147483647

insert into #t VALUES (2147483647)

select * from #t

The first function version is:

CREATE FUNCTION IntegerToBinaryString(@intval int)

RETURNS char(32)

AS

BEGIN

DECLARE @bincode char(64)

SET @bincode = ‘0000000100100011010001010110011110001001101010111100110111101111’

RETURN (

SUBSTRING( @bincode, (@IntVal / 268435456) * 4 + 1, 4 ) +

SUBSTRING( @bincode, ((@IntVal / 16777216) & 15) * 4 + 1 , 4 ) +

SUBSTRING( @bincode, ((@IntVal / 1048576) & 15) * 4 + 1 , 4 ) +

SUBSTRING( @bincode, ((@IntVal / 65536) & 15) * 4 + 1 , 4 ) +

SUBSTRING( @bincode, ((@IntVal / 4096) & 15) * 4 + 1 , 4 ) +

SUBSTRING( @bincode, ((@IntVal / 256) & 15) * 4 + 1 , 4 ) +

SUBSTRING( @bincode, ((@IntVal / 16) & 15) * 4 + 1 , 4 ) +

SUBSTRING( @bincode, (@IntVal & 15) * 4 + 1 , 4 )

)

END

GO

This uses a concatenated string of the 4-bit binary string representations of 0 to 15, indexed by the 32-bit input integer broken into 4-bit chunks. You can reduce the number of arithmetic operations still further by creating a combined string of the 256 8-bit combinations:

CREATE FUNCTION IntegerToBinaryString2(@intval int)

RETURNS char(32)

AS

BEGIN

DECLARE @bincode256 char(2048)

SET @bincode256 = ‘00000000000000010000001000000011 …’

RETURN (

SUBSTRING( @bincode256, (@IntVal / 16777216) * 8 + 1, 8 ) +

SUBSTRING( @bincode256, ((@IntVal / 65536) & 255) * 8 + 1 , 8 ) +

SUBSTRING( @bincode256, ((@IntVal / 256) & 255) * 8 + 1 , 8 ) +

SUBSTRING( @bincode256, (@IntVal & 255) * 8 + 1 , 8 ) )

END

GO

[Note: I originally posted the whole 2048 characters of @bincode256, but it caused my blog some alignment problems! You can either use the technique of small cranes to build big cranes, using the following T-SQL snippet to call the first function to create the string, and then cut and paste it, OR type it in yourself. Personally, I ‘d go with the first suggestion!

DECLARE @i int

DECLARE @res varchar(2048)

SET @i = 0

SET @res =

WHILE @i < 256

BEGIN

SET @res = @res + + CAST(Substring(dbo.IntegerToBinaryString(@i), 25, 8) as varchar(8))

SET @i = @i + 1

END

PRINT @res

GO

I’m not sure what Rob and Omnibuzz (!) use for their timing harness or test dataset but hopefully, I’ll follow up with relative timings.

Rob’s was originally inspired by this post.

Windows Forms

If you write Windows forms applications for a living then you will probably have visited the Windows Forms site before. If not, it has interesting articles, sample code, downloads and upcoming trends you should know about. Worth a visit.

Using ASP.NET 2.0: CompareValidator Controls

You can use a <asp:CompareValidator> control to validate one control against another or against a fixed value. I spent an hour searching for a way to use one to validate a date that should be greater than or equal to today’s date. My initial attempt was

<asp:CompareValidator ID=”cvFromDate “ Text=” Date cannot be less than today’s date!” ControlToValidate=”txtFromDate” Type=”Date” Operator=”GreaterThanEqual” SetFocusOnError=”true” Display=”Dynamic” Runat=”server” ValueToCompare=”<%= DateTime.Today.ToShortDateString() %> />                       

 

But it did not like the fixed date value. Interestingly, several articles I found said this was possible, but I had no luck getting it to work (I suspect this is due to initialisation and binding event order?). The simple solution is to set this value during the page’s load event:

   if (!IsPostBack)

   {

       cvFromDate.ValueToCompare = DateTime.Now.ToShortDateString();

The final ASP.NET code which also includes a compare validator to check the same control for dates in valid formats is:

<asp:CompareValidator ID=”cvFromDate” Text=” Date cannot be less than today’s date!” ControlToValidate=”txtFromDate” Type=”Date” Operator=”GreaterThanEqual” SetFocusOnError=”true” Display=”Dynamic” Runat=”server” />  

 

<asp:CompareValidator id=”CompareValidator1″ Text=”Please enter a valid date format.” ControlToValidate=”txtFromDate” Display=”Dynamic” Type=”Date” Operator=”DataTypeCheck” SetFocusOnError=”true” runat=”server” />

Development Zen

Any task that is repeatable is a candidate for automation

Any coding task that is repeatable is a candidate for code generation

Advanced Article on ASP.NET 2.0 Master Pages

Whilst searching for the solution of referencing a control defined in a content page from JavaScript, I found this great article ASP.Net 2.0 – Master Pages: Tips, Tricks, and Traps by K. Scott Allen. It’s definitely one of the most comprehensive, in-depth articles I’ve come across (despite having bought two fairly advanced books on ASP.NET 2.0!). Scott Guthrie linked to this article a while ago here. The article describes how master pages and content pages are combined, event ordering, interacting between the master page and content pages and vice versa, JavaScript and naming containers, and name mangling (the bit that solved my particular problem).