Navigation

Search

Categories

On this page

Message Box Error and Solution
Todays Message Box Error and Solution
Databinding to a XmlDataProvider in WPF
How to remove the horizontal scrollbar from a ListView
Memories from MSDN Unleashed: The Best of PDC event
MSBuild fail on specific days
Utterly Destroy #regions
What Was That Format String Again You Know The One For The GUID Where You Only Output The Guid But With No Formatting
Group Membership in .net
Checking for even 1 unread message Using Outlook as a client
Append Location to Path Environment Variable
Dont touch a compiler on monday
Using a text file to hold sequential numbers in Excel
Microsoft ?= Fruitcake
Making your Asp.Net Applications safe from conononical attacks

Archive

Blogroll

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

RSS 2.0 | Atom 1.0 | CDF

Send mail to the author(s) E-mail

Total Posts: 120
This Year: 1
This Month: 0
This Week: 0
Comments: 40

Sign In
Pick a theme:

# Wednesday, December 30, 2009
Wednesday, December 30, 2009 2:05:44 PM (Mountain Standard Time, UTC-07:00) ( All things Microsoft )
Here's another error I got today while using Visual Studio 2008

---------------------------
Microsoft Visual Studio
---------------------------
Error connecting to undo manager of source file 'C:\dev\Work\ReportBrowser\ReportBrowserWeb\SiteLayout.Master.designer.cs'.
---------------------------
OK  
---------------------------

Found a good solution here
http://www.hanselman.com/blog/CommentView.aspx?guid=8bc798ae-da26-4864-b4e3-b68b081b4be1

1) Right-click the designer file and select delete
2) Right-click the aspx file and select Convert to Web Application

Comments [0] | | # 
# Wednesday, December 23, 2009
Wednesday, December 23, 2009 12:47:21 PM (Mountain Standard Time, UTC-07:00) ( All things Microsoft )

I've decided to start a new series of articles on how I solve various problems in my daily programmer lifee. Usually a problem has a distinct message box that shows up which you can copy the text of with the CTRL + C key combination. I think that a lot of people search directly for this text, and it woudl be awesome to have it solved. Maybe I'll even start a website some day to host these solutions so that people (or in a perfect world the vendor...) can post a solution to them. For today, here's my problem that I experienced inside of devenv.exe (Visual Studio 2008) today while trying to use the Server Explorer to add a new Data Connection.

---------------------------
Server Explorer
---------------------------
Unable to add data connection.

Could not load file or assembly 'Microsoft.SqlServer.Management.Sdk.Sfc, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.
---------------------------
OK  
---------------------------

I was tipped off by this forum post http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.vstudio.general&tid=89ee0e86-b8fc-40a7-a0e1-51ac4033302e&cat=en_US_38f7e3d1-40bd-4daf-941f-f45d2ff6ff9b&lang=en&cr=US&sloc=&p=1

to install the SQL Server 2008 Managment Objects and Native Client, which you can get from here

http://www.microsoft.com/downloads/details.aspx?FamilyId=C6C3E9EF-BA29-4A43-8D69-A2BED18FE73C&displaylang=en#filelist

Or more specifically, here

Microsoft SQL Server 2008 Management Objects X86 Package http://go.microsoft.com/fwlink/?LinkId=123708&clcid=0x409

Microsoft SQL Server 2008 Native Client X86 Package http://go.microsoft.com/fwlink/?LinkId=123717&clcid=0x409

Comments [0] | | # 
# Tuesday, October 06, 2009
Tuesday, October 06, 2009 9:46:36 AM (Mountain Daylight Time, UTC-06:00) ( All things Microsoft | Code )
I've resolved to start making the shift to WPF. It's about time. The technology has only been around for a good 3+ years. So far, I'm very excited by what I see. An invaluable reference has been Programming WPF 2nd edition by Chris Sells. Specifically the appendices. The explination of Xaml, and the Xaml Extensions removes the veil of confusion from all of the arcane looking symbols going on in the Xaml code. Thanks for the awesome book Chris! I was going through an article published in MSDN Magazine, Data Binding in WPF by John Papa. I encountered a very frustrating bug and I felt the need to let the next developer know about the solution I uncovered. (The next developer is sometimes me. I do very much love finding my own posts months or years down the road that help me out). Maybe this will help you out.

So, I'm building my Xaml out, and I have a perfectly good XmlDataProvider in my Resources.
<XmlDataProvider x:Key="MoreColors" XPath="/colors">
<x:XData>
<colors>
<color name="pink"/>
<color name="white"/>
<color name="black"/>
<color name="cyan"/>
<color name="gray"/>
<color name="magenta"/>
</colors>
</x:XData>
</XmlDataProvider>

I Created the Binding to my Listbox as such.


This whole thing is working in the Designer (Visual Studio 2008), but is displaying nothing at runtime. I whisk away to the MSDN Documentation for XmlDataProvider and find this clever little note.

The root node of the XML data has an xmlns attribute that sets the XML namespace to an empty string. This is a requirement for applying XPath queries to a data island that is inline within the XAML page. In this inline case, the XAML, and thus the data island, inherits the System.Windows namespace. Because of this, you need to set the namespace blank to keep XPath queries from being qualified by the System.Windows namespace, which would misdirect the queries.
Is it possible that this is the explination to the Debug output I'm seeing in Visual Studio at runtime?

System.Windows.Data Error: 47 : XmlDataProvider has inline XML that does not explicitly set its XmlNamespace (xmlns="").

I add the missing xmlns="" to the root xml element (as shown below), and things begin to work at runtime.

<XmlDataProvider x:Key="MoreColors" XPath="/colors">
<x:XData>
<colors xmlns="">
<color name="pink"/>
<color name="white"/>

In searching for the answer to this solution, I also came across this post Why WPF databinding is an awful technology. I hope this is not shared feeling of frustration many of us receive by wasted hours of our day with the Moteur de recherche du jour (search engine of the day). It's a really useful tool if you can convince it to give you the right answer, and people have posted about the particular phrase you're looking for.

Good luck reader, with your journey to WPF enlightenment. It has been worth my time.

Comments [0] | | # 
# Thursday, October 01, 2009
Thursday, October 01, 2009 10:05:19 AM (Mountain Daylight Time, UTC-06:00) ( All things Microsoft | Code )

When you have a ListView control in Windows Forms, and you don't want the horizontal scroll bar to show up, you need to set the size of the columns to be the same 'Width' as the ListView.
What exactly is the 'Width' you should use here? Yes careful reader, I've been quoting Width because we need to take a closer look at what's going on.
Lets look at a dead simple example to clearly illustrate why this is a concern.

When I create a new Windows Forms application in Visual Studio, I get a standard sized form. Dragging a ListView control from the toolbox will create a control with the dimensions defined as

private void InitializeComponent()
{
   ...
   this.listView1.Size = new System.Drawing.Size(121, 97);
   ...
}
I added the following code to constructor of the Form after the InitializeComponent() call;
void Form1()
{
   InitializeComponent();
   
   listView1.Columns.Add("Name");
   for (int i = 0; i < 20; i++)
   {
      listView1.Items.Add(new string((char)(i + 33), 10));
   }
   // Naive width
   listView1.Columns[0].Width = listView1.Width;
}

What we end up with looks like the image below.

This is definately not what we wanted. Even though none of my data is forcing my scroll behavior, my column definition definitely is. I could change this to use the ClientSize of the Control, I know that's smaller. The documentation on MSDN for Control.ClientSize makes these remarks about the property.

"The client area of a control is the bounds of the control, minus the nonclient elements such as scroll bars, borders, title bars, and menus..."
This will work right? I'll just make a quick change to the code, recompile and... drat. No love.
    // Setting the width on the Column
   //listView1.Columns[0].Width = listView1.Width;
   //listView1.Columns[0].Width = listView1.ClientSize.Width;

}

What is going on here?!
As it turns out, the calculation for ClientSize in the constructor is completely correct. The control hasn't been drawn yet, and it has no knowledge of whether it will need to use a vertical scrollbar to display the data. That's just fine control. I know how to fix you. I know how wide a scroll bar is, and I can figure that out on my own... Just watch me.

   // Setting the width on the Column
   //listView1.Columns[0].Width = listView1.Width;
   //listView1.Columns[0].Width = listView1.ClientSize.Width;
   listView1.Columns[0].Width = listView1.ClientSize.Width - SystemInformation.VerticalScrollBarWidth;
}

Ha! Take that ListView. Now my column displays perfectly, and I have no Horizontal ScrollBar to contend with. Just to prove it to you, I'm going to check how wide it should be after the form shows up, to make sure I'm right...

      //listView1.Columns[0].Width = listView1.Width;
   //listView1.Columns[0].Width = listView1.ClientSize.Width;
   Debug.Print("ListView is {0} px wide and has a client width of {1} px", listView1.Width, listView1.ClientSize.Width);
   Debug.Print("VerticalScrollBarWidth: {0}", SystemInformation.VerticalScrollBarWidth);
   Debug.Print("Calculated width: {0}", listView1.ClientSize.Width - SystemInformation.VerticalScrollBarWidth);
   listView1.Columns[0].Width = listView1.ClientSize.Width - SystemInformation.VerticalScrollBarWidth;
   this.Load += new EventHandler(Form1_Load);
}
void Form1_Load(object sender, EventArgs e)
{
   Debug.Print("Loaded width: {0}", listView1.ClientSize.Width - SystemInformation.VerticalScrollBarWidth);
}
Debug Output:
ListView is 121 px wide and has a client width of 117 px
VerticalScrollBarWidth: 17
Calculated width: 100
Loaded width: 100

Uh-oh. I have a bad feeling. It seems like the Width of the ClientSize after the control has been painted is different than before it was painted. Could it be that when the VerticalScrollBar is painted, the control does in fact know how much room it has left to use to paint on the screen?! Isn't that in fact, exactly what the Remarks of the ClientSize property told me? Do the numbers above not in fact make perfect sense!? Is 117 - 17 = 100?! Yes... sigh. Perhaps I should have meditated on the implications that the remarks on MSDN were accurate from the begging.

"The client area of a control is the bounds of the control, minus the nonclient elements such as scroll bars, borders, title bars, and menus..."

As it turns out, the correct time to set the width of a ListView Column is AFTER you've determined that there will be scrollbars painted on the control.

Comments [0] | | # 
# Wednesday, January 28, 2009
Wednesday, January 28, 2009 9:42:35 AM (Mountain Standard Time, UTC-07:00) ( All things Microsoft )
I went to the MSDN Unleashed: The Best of PDC event at ConfigureSoft. David Yack and Rob Bagby were presenting on the topics originally presented at PDC
  • What to expect with C# 4.0
    • It's really just the distilled content that has been available since October. You could hear it straight from Anders himself. Dave did an awesome job though.
  • The Silverlight Control Toolkit
    • Microsoft is releasing code out of band for Silverlight for those who wish to live on the edge
  • REST with WCF and the WCF REST Starter Kit
    • Creating a REST-ful web service is dead simple using WCF. Add to it the starter kit and you get all sorts of free goodies out of the box to making even more dead simple. Once again, "It Just Works"
  • Overview of Windows Azure (“The Cloud OS”) and Azure Services
    • Azure = a cloud operating system + a set of developer services. Somethings you just gotta have a platform to write scalable apps on without worrying about the infrastructure.
We got some awesome "Rest in WCF" t-shirts with a photo of Rob's dog on it. I'm going to have to hang it on the wall so everyone will ask why I have a sleeping dog on a shirt. It's all because of Representational State Transfer of course!

Rob had some very funny lines I will quote often in the future as well.

Like the guy on the Ginsu knife commercial says, But that's not all you get
...that's a potentially marriage limiting maneuver...
Thanks for the great presentation gentlemen. Thanks to Microsoft for continuing these events. They're a great way to digest the information.
Comments [29] | | # 
# Wednesday, January 21, 2009
Wednesday, January 21, 2009 11:20:59 AM (Mountain Standard Time, UTC-07:00) ( All things Microsoft )

I recently did a MSBuild script for a colleage to zip some files and move them to a file server and email them to two recipients.
The script should only run on a specific day (Sunday), and fail with an error if it is not that day.
Using the MSBuild Community Tasks Project from Tigris makes this a trivial exercise.

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">

  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

  <Target Name="Build">
    <Time>
      <Output TaskParameter="DayOfWeek" PropertyName="DayOfWeek" />
    </Time>
    <Message Text="It's Monday!" Condition=" '$(DayOfWeek)'=='Monday' "/>
    <Message Text="It's Tuesday!" Condition=" '$(DayOfWeek)'=='Tuesday' "/>
    <Error Code="1" ContinueOnError="false" Condition="'$(DayOfWeek)'=='Monday'" Text="Stop everything, it's monday!"/>
    <Message Text="Everything is ok"/>
  </Target>
</Project>
Comments [0] | | # 
# Friday, September 05, 2008
Friday, September 05, 2008 10:22:12 AM (Mountain Daylight Time, UTC-06:00) ( All things Microsoft )

I use C# on a daily basis to do most of my coding.

I really don't like #region directives. It's not just a love-hate thing. I really hate it. I have a compulsive need to eliminate them. It's extra fluff that really doesn't need to be in the in the code to make the code any more meaningful. It doesn't add any value to the executable bits.

Using Find/Replace always gets tedius. Why not just remove all instances of it throughout the solution in one action?

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Module CodeHelper

    Public Sub RemoveRegions()
        RemoveThisRegexFromSolution("\#region.+")
        RemoveThisRegexFromSolution("\#endregion")
    End Sub

    Public Sub RemoveThisRegexFromSolution(ByVal findRegex As String)

        DTE.Windows.Item(Constants.vsWindowKindFindReplace).Activate() 'Find and Replace
        DTE.Find.FindWhat = findRegex
        DTE.Find.ReplaceWith = ""
        DTE.Find.Target = vsFindTarget.vsFindTargetFiles
        DTE.Find.MatchCase = False
        DTE.Find.MatchWholeWord = False
        DTE.Find.MatchInHiddenText = True
        DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr
        DTE.Find.SearchPath = "Entire Solution"
        DTE.Find.SearchSubfolders = True
        DTE.Find.KeepModifiedDocumentsOpen = False
        DTE.Find.FilesOfType = "*.*"
        DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResults1
        DTE.Find.Action = vsFindAction.vsFindActionReplaceAll

        DTE.Find.Execute() ' Do it

        DTE.Windows.Item(Constants.vsWindowKindFindReplace).Close() ' Close the box

    End Sub

End Module

Comments [0] | | # 
# Tuesday, April 22, 2008
Tuesday, April 22, 2008 10:03:45 AM (Mountain Daylight Time, UTC-06:00) ( All things Microsoft | Code )

What was that format string again? You know, the one for the GUID where you only output the guid, but with no formatting?

using System;
public class GuidTest
{
    public static void Main()
    {
        string[] guidFormats = {"N", "D", "B", "P"};
        Guid g = new Guid();
        Array.ForEach(guidFormats, delegate(string t)
        {
            Console.WriteLine("{0}:{1}", t, g.ToString(t));
        });
        Console.ReadLine();
    }
}

N:00000000000000000000000000000000
D:00000000-0000-0000-0000-000000000000
B:{00000000-0000-0000-0000-000000000000}
P:(00000000-0000-0000-0000-000000000000)

That's right. Now I remember.

Edit: 1/8/2010 - I've forgotten again... Darn.

I should create a mnemonic device to remember this

N = Nothing

D = Dashes

B = Brackets

P = Parenthesis

http://msdn.microsoft.com/en-us/system.guid.tostring.aspx


Comments [0] | | # 
# Thursday, May 24, 2007
Thursday, May 24, 2007 11:18:41 AM (Mountain Daylight Time, UTC-06:00) ( All things Microsoft | Code )

A colleage approached me and asked how he could convert some ASP Classic code to ASP.Net 2.

Here's the snippet

Dim user 'DOMAIN\USERNAME

Const DomainAuthority = "dc.hq.domain.com"

user = Request.ServerVariables("AUTH_USER") ' BASIC Authentication

user = Mid(user, InStr(user, "\") + 1)

Set user = GetObject("WINNT://" & DomainAuthority & "/" & user)

For Each grp in user.Groups

   If grp.Name = "GroupName1" Then GroupFlag1 = True

   If grp.Name = "GroupName2" Then GroupFlag2 = True

Next

This doesn't compile in a VB.Net web-app.

In order to fix this, lets first add a reference to the types we're using.

At the project level in the Solution Explorer, right click and select Add Reference

Switch to the COM tab, and Choose the "Active DS Type Library"

This will automagically add some things to your project.

These are the magical COM Interop DLLs that are generated for you, and allow you to use the objects inside that library.
Dim up a few objects, to use a bit later.

Dim usr As IADsUser
Dim grp As IADsGroup

Set a reference to your user the same as always, using the WinNT ADSI provider.

usr = GetObject("WINNT://" & TheDC & "/" & UsrName)

Now that the compiler knows what the grp object's type is, it won't puke on you

For Each grp In usr.Groups()
  If (grp.Name = "foo" Or grp.Name = "bar") Then
    ' Do something with it
  End If
Next

There are better ways to do this though, Stay tuned for how to totally pimp this out, the ASP.Net 2.0 way.

Comments [0] | | # 
# Monday, April 09, 2007
Monday, April 09, 2007 8:03:47 AM (Mountain Daylight Time, UTC-06:00) ( All things Microsoft )

If Not InStr(1, WScript.Fullname, "cscript.exe") = 0 Then
 Dim WshShell
 Set WshShell = WScript.CreateObject("WScript.Shell")
 Call WshShell.Popup("Use this syntax: cscript " & WScript.ScriptFullName, 5, "Error", 0)
 WScript.Quit
End If
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Const olFolderInbox = 6

Dim myolApp 'As Outlook.Application
Dim myNamespace 'As Outlook.NameSpace
Dim myInbox ' As MAPIFolder
Dim sycs 'As Outlook.SyncObjects
Dim syc 'As Outlook.SyncObject

' Setup Outlook
Set myolApp = CreateObject("Outlook.Application")
If Err Then
    WScript.StdOut.Writeline "Could not create Outlook Application!"
    WScript.Quit
End If

' Setup the default MAPI namespace
Set myNamespace = myolApp.GetNamespace("MAPI")
If Err Then
    WScript.StdOut.Writeline "Could not create MAPI Namespace!"
    WScript.Quit
End If

' Force a send/receive
' Start Syncing (send/receive groups)
Set sycs = myNamespace.SyncObjects
For i = 1 To sycs.Count
 Set syc = sycs.Item(i)
 WScript.StdOut.Writeline "Starting send/receive on " & syc.Name
 syc.Start
Next

WScript.StdOut.Writeline "Retreiving unread count"
Set myInbox = myNamespace.GetDefaultFolder(olFolderInbox)

WScript.StdOut.Writeline "There are " & myInbox.UnReadItemCount & " unread messages"
WScript.Quit myInbox.UnReadItemCount

' Return code == 0 means there is no unread mail.
' Return code != 0 means there is that many read mail.

Comments [0] | | # 
# Monday, December 18, 2006
Monday, December 18, 2006 12:43:28 PM (Mountain Standard Time, UTC-07:00) ( All things Microsoft | Code )

More DOS Scripting goodness. This snippet appends some arbitrary location to your PATH variable, so you can call the executables inside of it.

@ECHO OFF
ECHO %PATH% | FIND /I "C:\Folder1\Folder2\Folder with Spaces\bin\Release"
IF ERRORLEVEL 1 SET PATH=%PATH%;C:\Folder1\Folder2\Folder with Spaces\bin\Release

That, ladies and gentleman, will save you minutes of grief. Isn't that what it's all about anyway? makes it all worth while.

Comments [0] | | # 
# Monday, August 07, 2006
Monday, August 07, 2006 10:11:45 AM (Mountain Daylight Time, UTC-06:00) ( All things Microsoft | Code )

Some people (like myself) should learn not to touch a compiler on Monday mornings (before the third cup of coffee at least)

I don't know why I couldn't remember how to do this, but I feel like a noob.

I was just trying to build a Xml Document in memory with a XmlWriter and a MemoryStream simple stuff right?

XmlWriterSettings settings = new XmlWriterSettings();

settings.Indent = true;

settings.OmitXmlDeclaration = false;

MemoryStream strm = new MemoryStream();

using (XmlWriter w = XmlWriter.Create(strm, settings)) {

...

}

Now what if you want to get that back into a string? Say for use in a web-service query or something. like, I don't know, the SharePoint 2003 Search Web Service.

That conversion back to a string might look something like this.

string s;
System.O.MemoryStream ms;
System.IO.StreamReader sr = new System.IO.StreamReader(ms));
s = sr.ReadToEnd();
sr.Close();
ms.Close();

Of course later in the day, I decided to actually download the Research Service SDK, grab a copy of the QueryPacket Schema I was working against, generated a class against it with the XSD tool, and subclassed it to make sure I was submitting a valid search request. All was well with the world again, and I didn't feel so horribly inept for a Monday morning. Yeah me!

Comments [0] | | # 
# Monday, January 10, 2005
Monday, January 10, 2005 9:46:52 AM (Mountain Standard Time, UTC-07:00) ( All things Microsoft )

Using a text file to hold sequential numbers

This method is more useful in some situations. The biggest advantage is that the sequential number is no longer tied to a particular machine - it can be stored on a common server, or even a thumb drive. Disadvantages include difficulty in keeping the file from being modified simultaneously by two users, or of the file being more easily deleted or modified. This function will return the next sequential number:

Public Function GetNextSeqNumber(Optional sFileName As String, Optional nSeqNumber As Long = -1) As Long            
	Const sDEFAULT_PATH As String = "<your path here>"            
	Const sDEFAULT_FNAME As String = "defaultseq.txt"            
	Dim nFileNumber As Long                    
	nFileNumber = FreeFile            
	If sFileName = "" Then sFileName = sDEFAULT_FNAME                
		If InStr(sFileName, Application.PathSeparator) = 0 Then _                       
			sFileName = sDEFAULT_PATH & Application.PathSeparator & sFileName            

	If nSeqNumber = -1& Then                    
		If Dir(sFileName) <> "" Then                            
			Open sFileName For Input As nFileNumber                            
			Input #nFileNumber, nSeqNumber
			nSeqNumber = nSeqNumber + 1
			Close nFileNumber                    
		Else                            
			nSeqNumber = 1
		End If            
	End If                        

	On Error GoTo PathError                        
		Open sFileName For Output As nFileNumber                        

	On Error GoTo 0                        
		Print #nFileNumber, nSeqNumber                        
		Close nFileNumber            
		NextSeqNumber = nSeqNumber            
		Exit Function    

	PathError:            
		NextSeqNumber = -1
End Function

If you provide a full path in sFileName, that's where the file will be stored. If not, the file will be stored in whatever default directory you specify. You can set the sequential number by providing a value for nSeqNumber.

Thus, if I'm only using one sequence I can use

Public Sub Workbook_Open()            
	ThisWorkbook.Sheets(1).Range("B2").Value = GetNextSeqNumber    
End Sub

to return the next sequence number. If I'm using multiple sequences, I include the filename (with path, if the text file is not in the default path).

Public Sub NewClientInvoice()            
	This.Workbook.Sheets(1).Range("B2").Value = GetNextSeqNumber("Client1.txt")    
End Sub

And if I want to start a new sequence, beginning at, say, 1001, include that number in the function call. If the client name were in cell B4:

Public Sub SetUpNewClient()
	With ThisWorkbook.Sheets(1)        
		.Range("B2").Value = GetNextSeqNumber(.Range("B4").Value & ".txt", 1001)            
	End With    
End Sub
Original article credit to: http://www.mcgimpsey.com/excel/udfs/sequentialnums.html
Excel is a licensed product of Microsoft Corporation
Comments [0] | | # 
# Thursday, December 09, 2004
Thursday, December 09, 2004 9:25:28 AM (Mountain Standard Time, UTC-07:00) ( All things Microsoft )

I was looking around the Microsoft Windodws Media Center Edition website and they had this great rolling banner ad.

I'm not sure where they think there's anywhere near the equivalency of the company to fruitcake, but it made me smile just the same.

Speaking of which, I my Home Theater PC is up and running (90%) now and I have to say it's the coolest gadget we have in the house. The only thing that isn't working yet is the VFD, but I suspect that it's bad for some reason. So. We'll just have to trouble shoot that until we figure it out out, now won't we? 

Comments [0] | | # 
# Friday, October 08, 2004
Friday, October 08, 2004 7:46:03 AM (Mountain Daylight Time, UTC-06:00) ( All things Microsoft | ASP.Net )
A blurb on security vectors
Comments [0] | | #