Thursday, November 30, 2006

Swapping two integer values in C# [Interview Question]

Offlate, many of my friends where talking about this problem. It seems they ask this question frequently in Microsoft Interviews :) I remember asking this question to freshers in 2005!

Just thought I would refresh my knowledge also on this :) So here are few samples which I tried for your reference.

Method 1: Using intermediate temp variable

int intNumOne = 1, intNumTwo = 2;
int intTempVariable;

//Swapping of numbers starts here
intTempVariable = intNumOne;
intNumOne = intNumTwo;
intNumTwo = intTempVariable;

Response.Write("Value of First Variable :: " + intNumOne.ToString() + "<br>");
Response.Write("Value of Second Variable :: " + intNumTwo.ToString() + "<br>");

Method 2: Without using Temp Variable and by using 8th standard Mathematics :)

int intNumOne = 11, intNumTwo = 22;

//Swapping of numbers starts here
intNumOne = intNumOne + intNumTwo;
intNumTwo = intNumOne - intNumTwo;
intNumOne = intNumOne - intNumTwo;

Response.Write("Value of First Variable :: " + intNumOne.ToString() + "<br>");
Response.Write("Value of Second Variable :: " + intNumTwo.ToString() + "<br>");

Method 3: Without using Temp Variable and by using bitwise XOR (^ symbol in C#)

int intNumOne = 9, intNumTwo = 1;

//Swapping of numbers starts here
intNumOne ^= intNumTwo;
intNumTwo ^= intNumOne;
intNumOne ^= intNumTwo;

Response.Write("Value of First Variable :: " + intNumOne.ToString() + "<br>");
Response.Write("Value of Second Variable :: " + intNumTwo.ToString() + "<br>");

Related articles ::

1. Still Confused or if at all you are not aware of how XOR works, check out http://en.wikipedia.org/wiki/Xor_swap_algorithm to get some insight into this.

2. Temp variable usage seems to be the best method (performance wise) as per this -- http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=457179&SiteID=1

Wednesday, November 15, 2006

Different Types of Partitioning Operations in SQL Server 2005

In this post let me explain about the three different types of Operations one can do with Partitions. They are:

1. Split Partition
2. Merge Partition
3. Switch Partition (Important of the lot)

Before reading further, make sure that you have read my earlier posts. That is, this and this.

Split Partition

For splitting a partition we need to make use of “Alter Partition Function” syntax. So in our existing “Partition function” lets create a new range with boundary value “Jan 01, 1970”.

Alter Partition Function PF_DOB_Range()
Split Range ('01-01-1970')

Now if we execute this code snippet it would throw an error something like this:

Msg 7707, Level 16, State 1, Line 1
The associated partition function 'PF_DOB_Range' generates more partitions than there are file groups mentioned in the scheme 'PS_DOB_1'.


So the way to split a partition is:

Step 1: Create a new Filegroup (if at all already you don’t have an extra filegroup)
Step 2: Make use of that Filegroup while altering the Partition Scheme.
Step 3: Add a “File” to the newly created Filegroup.
Step 4: Now execute the above “Alter Partition Function”

Step 1: Create a new Filegroup (if at all already you don’t have an extra filegroup)

Alter Database VadivelTesting Add Filegroup FileGrp3
Go

Step 2: Make use of that Filegroup while altering the Partition Scheme.

Alter Partition Scheme PS_DOB_1
Next Used FileGrp3;
Go


Step 3: Add a “File” to the newly created Filegroup.

Alter Database VadivelTesting
Add File
(
Name = Vel2006NewFile,
Filename = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Vel2006NewFile.ndf',
Size = 1MB,
Maxsize = 100MB,
Filegrowth = 1MB
)
To FileGroup FileGrp3


Verifying Purpose

If it is mentioned as "Range Right" then it works like this:

1. All records whose DOB is < Jan 1, 1960 would fall into Partion 1
2. All records whose DOB is >= Jan 1, 1960 and < Jan 1, 1970 would fall on Partion 2
3. All records whose DOB is >= Jan 1, 1970 and < Jan 1, 1980 would fall on Partion 3
4. All records whose DOB is >= Jan 1, 1980 would fall under Partition 4.

Till now there were only 3 partitions for dbo.empDetails table. Now that we have added another new partition execute the below code to see the new partition which got created.

Select * from dbo.EmpDetails Where $PARTITION.PF_DOB_Range(DateOfBirth) = 4

Merge Partition

If for some reasons we need to MERGE a partition then its also possible. We need to make use of the same syntax which we used for “Splitting partitions” and just replace the word “Split” with “Merge” :)

Alter Partition Function PF_DOB_Range()
Merge Range ('01-01-1970')

After executing the above statement we would be having the same old 3 partitions as we saw in this post.

Switch Partition

Extract from MSDN


Switches a block of data in one of the following ways:

· Reassigns all data of a table as a partition to an already-existing partitioned table.
· Switches a partition from one partitioned table to another.
· Reassigns all data in one partition of a partitioned table to an existing non-partitioned table.

Lets try to move the data in one of the already existing partition to a new table. For ex: Lets move Partition 3 of dbo.EmpDetails table to a dbo.EmpDetails_StagingTable.

--- Create a new table with the same structure of EmpDetails table.
Create Table EmpDetails_StagingTable
(
EmpID int identity,
EmpName Varchar(25),
DateOfBirth datetime,
Salary int
)
Go

---Try to switch the records in Partition 3 into this.
Alter table dbo.EmpDetails Switch Partition 3 To dbo.EmpDetails_StagingTable;
Go

If we execute the above statement. It would throw an error something like this:

Msg 4939, Level 16, State 1, Line 1
ALTER TABLE SWITCH statement failed. table 'VadivelTesting.dbo.EmpDetails_StagingTable' is in filegroup 'PRIMARY' and partition 3 of table 'VadivelTesting.dbo.EmpDetails' is in filegroup 'FG3'.

Hope the error message is self-explanatory.

::Tip 1

To overcome this we need to create that staging table on the same filegroup of Partition 3 (or what ever partition you are trying to move).

Drop table dbo.EmpDetails_StagingTable
Go

Create Table EmpDetails_StagingTable
(
EmpID int identity,
EmpName Varchar(25),
DateOfBirth datetime,
Salary int
)
on FG3;


::Tip 2

The staging table needs to be empty if we plan to SWITCH records from a partition to this. For example lets us insert the below record into that table and then try to Swtich partition.

Insert into dbo.EmpDetails_StagingTable values ('V','1976-03-23',500)
Go

Alter table dbo.EmpDetails Switch Partition 3 To dbo.EmpDetails_StagingTable;
Go

Msg 4905, Level 16, State 1, Line 1
ALTER TABLE SWITCH statement failed. The target table 'VadivelTesting.dbo.EmpDetails_StagingTable' must be empty.

So delete that record and then try this.

Delete from dbo.EmpDetails_StagingTable
Go


Alter table dbo.EmpDetails Switch Partition 3 To dbo.EmpDetails_StagingTable;
Go

-- To verify whether the records have been moved from Partition 3 to this newly created table.
Select * from dbo.EmpDetails_StagingTable;

Records in all other partitions would be there as-is except for this 3rd partition. You can verify it by executing this line.

Select * from dbo.EmpDetails Where $PARTITION.PF_DOB_Range(DateOfBirth) = 3

Monday, November 13, 2006

Example for Creating and using Partitions in SQL Server 2005

Lets assume that we have table which contains records of our company transaction starting from the date when our company was started 15 years ago! Hope you would understand that the table would have hell a lot of data as it would be holding 15 years of data. But effectively we might be using only last 2 months or 1 year data at the max (very frequently).

For each query, it would be processing through this huge data. Bottomline as the table grows larger the performance would go for a toss, also scalabiity and managing data would also be difficult.

Hope I have made the point clear. With the help of partitioning a table we can achieve a great level of performance; also managing tables easier. In our case, one of the way to increase the performance would be to “Partition” the data on a yearly basis and stored on a different filegroup (SQL 2005 allows you to partition tables based on specific data usage patterns using defined ranges or lists).

For further theoritical knowledge on this subject check out my earlier post on this topic.

OK enough of theory :) let’s get into the example right away.

--Add a filegroup
Alter Database VadivelTesting Add FileGroup FileGrp1
Alter Database VadivelTesting Add FileGroup FileGrp2

--Add few Files into the existing FileGroups.
Alter Database VadivelTesting
Add File
(
Name = Vel2006Q3,
Filename = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Vel2006Q3.ndf',
Size = 1MB,
Maxsize = 100MB,
Filegrowth = 1MB
)
To FileGroup FileGrp1

Alter Database VadivelTesting
Add File
(
Name = Vel2006Q4,
Filename = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Vel2006Q4.ndf',
Size = 1MB,
Maxsize = 100MB,
Filegrowth = 1MB
)
To FileGroup FileGrp2

-- Creating a partition function
Create Partition Function PF_DOB_Range (DateTime)
As Range Right
For Values
(
'01-01-1960',
'01-01-1980'
)


While creating a “Partition Function” ranges are of two types. They are, “Range Right” and “Range Left”. If it is mentioned as "Range Right" then it works like this:

1. All records whose DOB is < Jan 1, 1960 would fall into Partion 1
2. All records whose DOB is >= Jan 1, 1960 and < Jan 1, 1980 would fall on Partion 2
3. All records whose DOB is >= Jan 1, 1980 would fall under Partition 3.

If it is mentioned as "Range Left" then it works like this:

1. All records whose DOB is <= Jan 1, 1960 would fall into Partion 1
2. All records whose DOB is > Jan 1, 1960 and <= Jan 1, 1980 would fall on Partion 2
3. All records whose DOB is > Jan 1, 1980 would fall under Partition 3.

-- Creating a partition scheme
Create Partition Scheme PS_DOB_1
As Partition PF_DOB_Range To
(FileGrp1, FileGrp2, [PRIMARY])

-- Create a Partioned Table using the above Scheme.
Create Table EmpDetails
(
EmpID int identity,
EmpName Varchar(25),
DateOfBirth datetime,
Salary int
)
On PS_DOB_1(DateOfBirth)

Tip: In the create table syntax after ON keyword normally FileGroup name would be specified. But in the above example we have mentioned a Partition Scheme name. On seeing a script the way to identify whether it is a Scheme name or FileGroup name is by checking whether it has any parameters or not. That is, Scheme name comes with a parameter where-as Filegroup doesn't have a parameter.

-- Insert Dummy records
Insert into dbo.EmpDetails values ('Vadivel','1976-03-23',5000)
Insert into dbo.EmpDetails values ('Sailakshmi','1975-03-23',6000)
Insert into dbo.EmpDetails values ('Vicky','1986-04-30',7000)
Insert into dbo.EmpDetails values ('Test','1954-02-02',2000)
Insert into dbo.EmpDetails values ('Sivaji','1960-02-02',3000)
Insert into dbo.EmpDetails values ('Xyz','1960-01-01',2000)
Insert into dbo.EmpDetails values ('SSS','1980-01-01',3000)
Insert into dbo.EmpDetails values ('AAA','1959-12-31',3000)


That’s all. Going forward based on the select query “SQL Engine” internally decides on the “Partition” to query and fetches the record automatically. Bottomline, we need not do anything specific to segregate records from different partition while writing to the T-SQL statements or Stored Procedure.

That said, if at all you want to verify the partition number into which a set of partitioning column values would be mapped for any specified partition function, you can make use of $Partition function. In other words, $Partition is used to find the data’s in appropriate partition.

i) Fetch all records which got inserted into First Partition
Select * from dbo.EmpDetails Where $PARTITION.PF_DOB_Range(DateOfBirth) = 1

ii) Fetch all records which got inserted into Second Partition
Select * from dbo.EmpDetails Where $PARTITION.PF_DOB_Range(DateOfBirth) = 2

iii) Fetch all records which got inserted into Third Partition
Select * from dbo.EmpDetails Where $PARTITION.PF_DOB_Range(DateOfBirth) = 3

iv) This query would fetch you the partition number and the number of records in it.
Select * from Sys.Partitions where object_id = object_id('VadivelTesting.dbo.EmpDetails')

Or

Select object_name(object_id), partition_number, rows from Sys.Partitions where object_id = object_id('VadivelTesting.dbo.EmpDetails')

Another way to verify the partition ranges!

Select $partition.PF_DOB_Range(DateOfBirth) As 'Partition Number', count(*) As 'Rows' From dbo.EmpDetails Group by $partition.PF_DOB_Range(DateOfBirth) Order by 'Partition Number'

Or

Select EmpID,EmpName, Salary, $partition.PF_DOB_Range(DateOfBirth) AS 'Partition Number' From dbo.EmpDetails Order by 'Partition Number', EmpID

v) To display the list of filegroups in a database and to know which FileGroup is the default.
Select * from sys.filegroups


I strongly suggest you to read this MSDN article without fail.

Technorati tags:

Sunday, November 12, 2006

App_offline.htm – ASP.NET 2.0 new feature

It’s an interesting find. I got few mails asking me suggestions on the way to handle situations where “the application needs to be updated with the latest code base”. I was preparing a blog post something like this:

1. Normally sites are deployed in Web farm scenarios. If your app is also deployed in a web farm then it’s better to bring one server down update the code base there while all the user request would be served by the other servers in the farm. This way the downtime of the application would be almost zero.

2. If at all your application is deployed on a single server then either you need to face the downtime :) or temporarily create another virtual directory with the old code base. This Virtual directory would be functional till the time you update the actual directory with your latest code base. There would be some negligible amount of downtime here.

3. If you can’t create a new virtual directory for some reason! Then create a static page (“SiteDownForMaintanance.htm”) and based on a flag in your “web.config” redirect all request to this static page. Once the code base has been updated, change the Boolean flag in your “web.config” to false.

I am sure there might be other options to resolve this too. So I started (re)searching through the web to read how experts have handled similar situations in their projects. During one such (re)search I found about “App_offline.htm” concept in ASP.NET 2.0.

The concept seems to be really simple / cool. Let me explain it for those who haven’t heard about it.

1. We need to create an html page with name “App_offline.htm”. Put whatever junk content you want to display to your user during the application maintenance!

2. Now run any page in your application to see the content of “App_offline.htm” to be displayed.

3. Once you have done with your updates or maintenance remove this file from your project. That’s all.

Though I have read that “Excluding this file from project” is also enough it didn’t work for me. It worked only when I removed it from the project or renamed it to something else.

From ScottGu’s blog i came to know that
“The way app_offline.htm works is that you place this file in the root of the application. When ASP.NET sees it, it will shut-down the app-domain for the application (and not restart it for requests) and instead send back the contents of the App_offline.htm file in response to all new dynamic requests for the application. When you are done updating the site, just delete the file and it will come back online.”

Interesting isn’t it?

There is another point which I would like to bring to your notice. From ScottGu’s blog I came to know about this as well
“One thing I pointed out in the talk that you want to keep an eye on is a feature of IE6 called "Show Friendly Http Errors". This can be configured in the Tools->Internet Options->Advanced tab within IE, and is on by default with IE6. When this is on, and a server returns a non HTTP-200 status code with less than 512 bytes of content, IE will not show the returned HTML and instead substitutes its own generic status code message”

I am not sure whether he is wrong or in IE 6.0 SP2 they have changed it! because I created an “empty App_offline.htm” page and it worked. The Browser Version in my system is IE 6.0 SP2 and “Show Friendly Http Error Messages” is by default checked in it.

Technorati tags: ,

Saturday, November 11, 2006

Time to say, Goodbye to Adobe PDF Reader!

PDF (Portable Document Format) reader is a very important software one needs. As now-a-days most of the product user manual, eBooks, visa application forms etc., are in PDF format.

Today’s computers almost always come with Adobe PDF reader installed by default. Till few weeks back I was also using it without much satisfaction!! No doubt Adobe PDF reader is a great product but I hate it for the following points:

1. I feel that Adobe PDF reader software is really bulky.
2. Loading time of PDF document is unnecessary in Adobe reader
3. Installation of Adobe PDF reader takes at least >= 5 minutes.

For past few weeks I am fiddling with another PDF reader called “Foxit Reader 2.0”.
In my experience with this new reader, I haven’t found any of the above mentioned disadvantages which I have with Adobe PDF reader.

Let me explain those 4 points in detail now:

i) I feel that Adobe PDF reader software is really bulky.

First of all downloading Adobe PDF reader isn’t an easy joke :) it takes at least 10 minutes to download using a dial-up connection. You know the size of the latest Adobe PDF reader 7.0.8? Its ~16.4 MB!!!

Just for reading an eBook (for example) why the hell one should download such a big file?
I was really surprised and happy to see that download file size of Foxit Reader is just 1.56 MB.

Find below the screenshot of the time it took for me to download Foxit Reader:

[As of now I couldn't attached the screenshots here via blogger.com. May be some issues with the server. So would upload it later]

2. Loading time of PDF document is unnecessary in Adobe reader

Adobe PDF reader installs lots of plug-ins most of us are unnecessary for us. That’s the major reason for the download size to be more. Also even when you open a single page PDF file it would be pretty slow. It’s because it does lots of background check/work which I am not interested at all!

To increase the performance of Adobe PDF Reader, check these below links:

i) Version 6.0 : http://blogs.msdn.com/tims/archive/2004/11/24/269567.aspx
ii) Version 7.0 : http://blogs.msdn.com/jonathanh/archive/2004/12/22/330288.aspx

Why should one download and install all unwanted plug-in / features into the system and then remove it in the name of increasing the performance? This wastes my internet charges, telephone charges, my time :) etc.,


If you have ever been frustrated with how Acrobat drains system resources, then this PDF reader is for you.

FoxIt Reader loads / opens the PDF document real quick.

3. Installation of Adobe PDF reader takes at least >= 5 minutes

Adobe PDF Reader takes at least 5 minutes to install where-as Foxit Reader just got over within a minute! When I completed the wizard and clicked on “Finish” button it just took few seconds for the software to install.

[As of now I couldn't attached the screenshots here via blogger.com. May be some issues with the server. So would upload it later]

Based on these factors I guess FoxIt is the best option than Adobe PDF reader for simply going through a PDF file or filling a PDF form. What do you think?

Update: Amit Agarwal (MVP) infomed me about Adobe Digital Editions. May be I would try it out sometime tomorrow and update this post based on that.

Updated on November 13th: I got my hands dirty with "Adobe Digital Editions". I am not that impressed by this flash based software! It doesn't give me a feeling of reading a eBook the regular way :)

Related Post: Foxit - the Best PDF Reader

Thursday, November 09, 2006

IndiMix '06 -- Webcast

In continuation to my previous post on IndiMix I got registered to the webcast couple of days back.

I have gone through the agenda of the seminar and was interested only in these two sessions.

1. The Genesis of Creativity and Innovation – The Next Web Now (10:15 AM to 11:15 AM)
Speaker: Steve Ballmer, CEO, Microsoft Corporation.

2. Designing for the Next Web Now – Experiences and Expressions that Capture the Imagination (2 PM to 3:15 PM).

Speaker:

i) Leon Brown, Regional Designer and User Experience Lead, Microsoft Corporation APAC (Singapore)
ii)
Pandurang Nayak, Developer Evangelist, Microsoft Corporation India
iii)
Deepak Gulati, Developer Evangelist, Microsoft Corporation India
iv)
Dax Pandhi, CEO, Nukeation Studios

Not that I wasn't interested in the other sessions. Since that I am in vacation and browsing from home, I wanted to keep my broadband usage to the minimum :)

Today Morning, when i tried accessing the URL (which they have sent me in the registration confirmation mailer) it was throwing an error "We're Sorry, the page you requested could not be found". I tried for almost 20 minutes but the result was the same.

Then Vinod Unny (MVP) sent me the URL to access the webcast (http://server1.msn.co.in/sp06/indimix/challenge.asp). By the time I logged into the site "Steve Ballmers" keynote was already over :(

I got to listen to the topic "Realizing the opportunity in India". Since that I have missed out Steve's keynote, I started to wait for Pandu / Deepak to "perform".

I have seen Deepak Gulati take sessions in TechEd's. Normally I don't miss his sessions. On the flip side, I know of Pandu for a long time but i have never seen him take a session on a huge event like this. So i was eagerly waiting to see him online :) They actually didn't disappoint me. Both of their demo's where great. I felt that Pandu was bit tensed during the session which was evident in his face :)

To be frank, I really don't understand the purpose of bringing in "Mandira Bedi" and "Murali Karthik" for this event!! Do you have a say on this?

Wednesday, November 08, 2006

I am one of the Microsoft BlogStar Winner :)

Wow I am really excited to know that i am one among the Top 20 Microsoft India BlogStar winners :) Check out http://www.microsoft.com/india/blogstars/winners.aspx

On the flipside, I am bit disappointed that I didn't make it to the Top 5 :( Because the Top 5 guys gets a chance to meet Steve Ballmer in Mumbai tomorrow.

But overall this Month seems to be a really good one to me :) Because starting from November 1st, 2006 till date i have got 3 awards/gifts (including this) from various technology related sites. The other two are:

1. I have won the first prize in community-credit website this month.
2. I have won the "Best Member Award" in dotnetspider.

Technorati tags: ,

Tuesday, November 07, 2006

Visual Studio 2005 Tools for Office Second Edition

Visual Studio 2005 Tools for the 2007 Microsoft Office System (Visual Studio 2005 Tools for Office Second Edition or VSTO 2005 SE for short) is a free add-on to Visual Studio 2005 that empowers developers to build applications targeting the 2007 Office system. Developers can now harness the benefits of the 2007 Office system platform and create Office-based solutions using the professional development environment of Visual Studio 2005.

Go through http://msdn.microsoft.com/office/tool/vsto/2005SE/default.aspx to know about the "Feature List", "Download links", "Demos - Video" and "Artiles" on this product.

SQL Server Health and History Tool

The Microsoft SQL Server Health and History Tool (SQLH2) allows you to collect information from instances of SQL Server, store this information, and run reports against the data in order to determine how SQL Server is being used.

This version of SQLH2 supports SQL Server 2005 RTM collection.SQLH2 collects four main types of information:

1. Feature Usage – What services/features are installed, running and level of workload on the service.
2. Configuration Settings – Machine, OS and SQL configuration settings, SQL instance and database metadata.
3. Uptime of the SQL Server service
4. Performance Counters (optional) – Used to determine performance trends

You can download this tool here

Technorati tags:

Saturday, November 04, 2006

SQL Server Hosting Toolkit Launched

The Database Publishing Wizard enables the deployment of SQL Server 2005 databases into a hosted environment on either a SQL Server 2000 or 2005 server. It generates a SQL script file which can be used to recreate the database in shared hosting environments where the only connectivity to a server is through a web-based control panel with a scripting window.

The Database Publishing Wizard is currently a command line tool, though future releases will add a graphical user interface.

1. Current Release
2. Command Line Interface
3. Supported Objects & Types
4. Known Issues
5. Roadmap for Future Releases
6. FAQ
7. Tutorial: Upload the TimeTracker ASP.NET starter kit to your hosted account

Source: codeplex

Technorati tags:

Friday, November 03, 2006

Won a prize (Best Member Award) in dotnetspider.com

Below is the extract of the mail which I got from Tony John of dotnetspider.com couple of days back.

Vadivel Mohanakrishnan,

We are glad to inform you that you are selected as the RapTier Gift winner for the month of October 2006 for your valuable contributions to dotnetspider.com. We are looking forward to see more contributions from you in future.

Winners list is here :: http://www.dotnetspider.com/gifts/Winners.aspx

Gift which I would be getting is called "RapTier Software".



RapTier is a template-based ASP.NET, C#, VB.NET and SQL code generator that creates robust database driven applications for a wide range of database. Features: ASP.NET, C#, VB.NET and SQL code generation; DataSet and Typed Data Transfer Object support; Stored Procedure and Dynamic SQL support; Existing stored procedure wrapping; Support of many database engines; Template-based design, WebForm UI generation, Database documentation generation

To know more about it, check this out http://www.sharppower.com/

Wednesday, November 01, 2006

Won the first prize in community credit ...

I am glad that few minutes back i came to know that I have won the 1st prize in Community-credit for the month of October 2006.



Below is the extract from the mail which I received from David (Admin of Community-credit site).

Hello Vadivel,

Congratulations. You won 1st Prize in the October 2006 Contest. As you may know, a lot of people competed, but only a few won. Nicely done! Please also keep in mind that your prize is not just a stupid, geeky gift, but it's also a symbol to represent your contributions to the development community. When folks ask you how you won, you can tell them that it was by helping out other geeks. Be proud and brag.

Check out this page to know about the Prize I got :: http://www.community-credit.com/CommunityCreditPrizePage.aspx and choose October 2006 in the dropdown.