 Thursday, 08 February 2007
Herb updates us on the next C++ standard:
I'm happy to report that work on "C++0x", the much-anticipated Version 2.0 of the ISO C++ standard, has dramatically picked up steam over the past few months. The ISO C++ committee has now published the first partial draft of C++0x and plans to publish a complete public draft before the end of 2007.
As part of the push to get this done, the committee is having extra meetings, including one in Toronto in July. Hmmmm.....
You need to read Herb's blog post yourself for the details on what's in C++ 0x (Concepts, Garbage Collection, Memory Model for Concurrency, Concurrency Libraries) and what's not (Modules, Dynamic Libraries) with helpful links to even more details. This is our future -- and you can be sure, C++ has a future.
Kate
 Wednesday, 07 February 2007
Eileen Rumwell is sponsoring a contest to send someone to Globewomen's annual conference, Global Summit of Women, in Berlin in June. Globewomen invite you to:
- Join the premier gathering of women leaders focused on advancing women's economic opportunities globally
- Be inspired by the energy, enthusiasm and expertise of the women decision-makers in business and government from around the world
- Learn practical strategies to grow your career or your business
- Share winning solutions and strategies with your peers
- Be part of a global network of economic dynamos who will make changes in the 21st century global economy.
A 250 word essay about why you chose the technical field you did, and how you feel about it (man! 250 words is hardly anything! that's a challenge!) could get you airfare and accomodations so you can attend this seriously high-level get together. If you don't (or can't) win, consider attending anyway ... it sounds like fun!
Kate
 Tuesday, 06 February 2007
I missed this article when it first appeared. Mary Jo Foley talked to Jason McConnell, me, and David Johnson about getting to all the new exciting Vista goodies, and how it's a bit easier from C++ because you can mix and match native and managed so simply. Watch for more guidance and guidelines on this from Microsoft coming soon.
Kate
 Monday, 05 February 2007
Dylan Smith writes about testing: Unit tests (automated, written by programmers, repeatable), Acceptance tests (stories or scripts that can be done by developers or users and test high level requirements) and Exploratory tests (noodling around by a clever person to see how an app is doing). I like these categories and I do all three on my projects. I think a lot of developers get excited (rightly) about Unit tests and run the risk of forgetting the other two. You still need to lead your users through a structured process that causes them to conclude you have finished their project. (And you still need to rehearse that structured process yourself so you know in advance it will pass.) You still need to play around with it a bit, outside of the confines of test cases, and assure yourself it really is a good application.
We're not TDD, so I don't write the tests and code to them. But I write the scripts for Acceptance testing as we develop stories and requirements. They're also a fine way to bring a new programmer up to speed on a project by leading them through what it does and how you know it's working.
Kate
 Sunday, 04 February 2007
These are nice ... posters of all the Visual Studio keyboard shortcuts (language specific, according to your Visual Studio settings) are now available. Here's a snip of the C++ colour one (there's a black and white one too.)

Go get it!
Kate
 Saturday, 03 February 2007
This year I will be partnering with my friend Tim Huckaby to deliver a pre-conference session at Tech Ed USA 2007 in Orlando:
PRCN12 From Design to Deployment: Everything You Need to Know to Optimize Your Applications for Windows Vista Kate Gregory and Tim Huckaby Windows Vista is the most compelling operating system release in nearly a decade. With major improvements in the areas of security, user experience, and performance, Windows Vista offers a robust and dependable platform for building a breadth of solutions. This full day seminar prepares you for building a new class of applications that take advantage of these improvements. Come and see how to take advantage of some of the most interesting new native APIs, inter-op techniques, and .NET Framework 3.0 technologies.
In this all-day pre-conference seminar, learn how to build the next generation of smart client applications with the Windows Presentation Foundation (WPF). Learn the fundamentals of WPF and work your way through advanced topics like 3D. Learn how to build great user experiences with technologies like task-based dialogs, sidebar gadgets and customized Windows search functionality. Learn inter-operability techniques with managed wrappers and how to leverage the Vista Bridge. Dive into the best practices for upgrading existing applications, leveraging User Access Control (UAC) and techniques for virtualization. Learn how to build more reliable and secure applications with technologies like Windows Error Reporting, Next Generation Cryptography and Application Restart/Recovery. And lastly, learn how to build more connected systems with Windows Communication Foundation (WCF) and RSS platform support.
Many Tech Ed attendees come a day early to do a pre-con and jumpstart themselves to be ready for the rest of the conference. Registration is open and the early bird discount is still in effect.

Other RDs delivering pre-cons include Scott Hanselman, Richard Hundhausen, and Kimberly Tripp along with many other people you have heard of. This is great opportunity to get up to speed on a topic very quickly. You can then go and drill further into some niche of it that interested you, by attending breakouts on that subtopic.
See you there!
Kate
ps: do I have a breakout session? There's no announcement on that yet 
 Friday, 02 February 2007
It's easy to get intimidated by a feature like Lambda Expressions. It has a Greek word in it, so it must be difficult, right? And you can read explanations like this:
Lambda expressions, one of the most important new features to be included in the next 3.0 version of C# and one that offers support needed by the LINQ Project, are precisely a feature coming from the world of functional programming. ... Scheme ... Lisp ...
Or this summary:
In mathematical logic and computer science, lambda calculus, also λ-calculus, is a formal system designed to investigate function definition, function application, and recursion. It was introduced by Alonzo Church and Stephen Cole Kleene in the 1930s; Church used lambda calculus in 1936 to give a negative answer to the Entscheidungsproblem. Lambda calculus can be used to define what a computable function is. The question of whether two lambda calculus expressions are equivalent cannot be solved by a general algorithm. This was the first question, even before the halting problem, for which undecidability could be proved. Lambda calculus has greatly influenced functional programming languages, such as Lisp, ML and Haskell.
Lambda calculus can be called the smallest universal programming language. It consists of a single transformation rule (variable substitution) and a single function definition scheme. Lambda calculus is universal in the sense that any computable function can be expressed and evaluated using this formalism. It is thus equivalent to the Turing machine formalism. However, lambda calculus emphasizes the use of transformation rules, and does not care about the actual machine implementing them. It is an approach more related to software than to hardware.
This sounds really difficult. So let me show you something that's not difficult at all:
<input type=button value="Try it now" onClick="alert('Hello from JavaScript!')">
You know what that does, right? Well the stuff after onClick=" and before "> is [gasp!] a Lambda Expression. It's a little piece of code that you can stick somewhere without a whole lot of defining a function and defining a delegate and pointing that delegate at that function and blah blah blah. You can stick two lines of JavaScript in there if you want:
<INPUT TYPE="radio" VALUE="Switching to Blue" onClick="alert(value);document.bgColor='blue'">
This feels natural and ordinary in JavaScript, and all folks are talking about is giving you that same freedom in strongly typed languages where the compiler is your friend. We have some of this in C# 2.0 with anonymous methods, but lambda expressions are in effect more strongly typed. Here's a nice explanation of the subtle distinction.
It's not actually that intimidating at all ... it's going to make life easier.
Kate
 Thursday, 01 February 2007
[Sorry about the blogging gap - nothing dramatic, just a little case of overworked and underslept. Good excuse to start up again though.]
Imagine a room with a table, no computers, and four really smart people who care tremendously about helping people write software, and who tackle questions like "what keywords should be in this language" every day -- and whose decisions actually will get implemented. A full hour of amazing conversation appeared recently on Channel 9.
How will imperative programming languages evolve to suit the needs of developers in the age of Concurrency and Composability? What role can programming languages play in enabling true composability? What are the implications of LINQ on the furture of managed (CLS-based) and unmanaged(C++) languages? How will our imperative languages (static) become more functional (dynamic) in nature while preserving their static "experience" for developers?
Answers to these questions and much more are to be found in this interview with some of Microsoft's leading language designers and programming thought leaders: Anders Hejlsberg, Technical Fellow and Chief Architect of C#, Herb Sutter, Architect in the C++ language design group, Erik Meijer, Architect in both VB.Net and C# language design and programming language guru, and Brian Beckman, physicist and programming language architect working on VB.Net.
This is a great conversation with some of the industry's most influential programming language designers. Tune in. You may be surprised by what you learn...
Some quotes and paraphrases that caught my attention:
- "No language can ignore concurrency and stay successful for mainstream programming over the next five, ten years."
- our entire industry is based on composable software and we manage to do composable software with the languages, libraries and frameworks we have now. it's rather amazing that we can do it.
- "all you can do as a language designer is slow down the accrual of new features that will eventually lead to cave in."
Now if you aren't sure you know what a lambda expression is, or what makes a language functional as opposed to imperative, or what LINQ would have to do with that, or what composability is, then you may think you don't want to watch this video. But you'd be wrong! Spend this hour with these gentlemen and not only will you learn all those things, you'll learn why it affects you and why you should be following, at least a little bit, the current work in this area.
Watch it!
Kate
 Sunday, 21 January 2007
A lot of people are asking me if I am using Vista, if they should use Vista, if I think Vista will get good adoption, and so on. I have Vista on some machines, still have XP on my ancient primary laptop, and miss Vista when I'm not using it. I tell people this and they assume it's all about the shiny and the seethrough and the pretty. It's really not. For me the fast search is a big thing. And I still consider UAC a feature and have no intention of turning it off or launching everything I do from an elevated command prompt. I like the thumbnails that actually show your content - though I suppose some might dismiss that as "pretty", it's saved me from opening big files with odd names more than once, just so I can tell whether I want to delete them or not. An MSDN article lists a number of useful benefits of running on Vista that have nothing to do with being pretty. Beyond UAC and other security benefits, consider Sleep (fast as Standby, safe as Hibernate), SuperFetch, ReadyBoost, restart manager, presentation mode, ... there's so much! It's not just about the .NET Framework 3.0 -- you can have that downlevel. It really is a new version of the operating system and it does a lot of things a lot better.
So I forgive it for being pretty.
Kate
 Saturday, 20 January 2007
I once had an opportunity to write one of those Teach Yourself <Something complicated> in 21 Days books, or it might have been 24 Hours, or A Weekend, I forget. I was overloaded with work at the time and didn't write it. One of the things about writing those books is that nobody actually expects the reader to learn what they need in 21 days or 24 hours or whatever. It's basically the number of chapters. And if you processed one chapter a day, I guess you would cover the book in three weeks, but you wouldn't be a <Something complicated> programmer at the end of that, would you? Some folks might do 5 chapters a day, others might do a chapter a week. It depends on where you're starting from.
I came across a few interesting blog posts on this topic. Peter Norvig found hundreds of such books on programming languages or frameworks, and proposes instead Teach Yourself Programming in Ten Years. He has a point. Jasmine refines the point a bit, saying that if you're already a good developer you probably can pick up a new language or framework in a matter of days, and that if you don't have what it takes to be a good developer, ten years of plugging away at it won't make you good enough.
I've been getting paid to program since 1979, and I learn new things all the time. But I try to learn new languages no more than once a year -- and I wouldn't be able to invest 21 days in learning a language, either. More importantly, I've invested quite a lot of time and effort into spotting those who will be good developers some day, and trying to speed the process of making them better. I think the emphasis on debugging and on reading or fixing the code of others is appropriate. It's tempting to have the newbies work on little projects alone since they can't understand your big complicated project with difficult code written by the really smart people. But trying to understand that project and that code is what will make that newbie a developer -- or show you both that it's a hopeless cause .
Kate
 Friday, 19 January 2007
I do my searching these days at www.live.com -- the ads are less obtrusive or easier to ignore or something and on the occasions I've done the same search in two places, I like my Live results better. But for the next little while I'm going to use a slightly more complicated URL: http://click4thecause.live.com/Search/Charity/Default.aspx?locale=en-us&source=msnhp. I know, that's a mouthful, but here's the thing - it searches the same, but it also donates to charity. Really! I know we've all seen those "if you forward this to 40 people Microsoft will know and they will give money to charity" emails, but this is different. After all, counting web hits is something that can really be done.
Education and sports programs for refugee youth around the world? Sounds like a good cause to me. Check it out, and make it your new search page, won't you?
Kate
 Thursday, 18 January 2007
Rory interviews Kam VedBrat about glass, composition, DWM, and other ways to stray from the gray-buttons-and-white-textboxes-on-a-big-gray-background that is the UI most devs naturally create. Watch it!
Kate
 Wednesday, 17 January 2007
Try this. Open up Visual Studio and make yourself an MFC app. It doesn't really matter what kind of application it is - a dialog app is probably the quickest to create but you could use some more complex MFC app that you happened to have lying around if you preferred. Build the app and run it to prove to yourself that it's fine.
Now bring up the project properties, and under Configuration Properties, General set Common Language Runtime Support to Pure MSIL Common Language Runtime Support.

Click OK and build the application. Blam! Errors everywhere. My little nothing dialog application got 18 and they all look like this:
1>C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\afxv_w32.h(242) : error C3641: 'DrawState' : invalid calling convention '__stdcall ' for function compiled with /clr:pure or /clr:safe
1>C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\afxv_w32.h(260) : error C3641: 'DrawStatusText' : invalid calling convention '__stdcall ' for function compiled with /clr:pure or /clr:safe
1>C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winbase.h(1849) : error C3641: 'FreeResource' : invalid calling convention '__stdcall ' for function compiled with /clr:pure or /clr:safe
What does this mean? Well, every function has a calling convention. These include __stdcall, __clrcall, __cdecl, and so on. Many of the functions in the MFC libraries (look at the include files for which these errors occur) are declared to be __stdcall, meaning that they are common-or-garden native C++ functions. But when you compile your application /clr:pure, you are saying "I don't have any common-or-garden native C++ functions in here. Everything is managed."
Since you can't change MFC, you have to change your compiler options. Change the CLR support to just "Common Language Runtime Support (/clr)" and build again. All the errors go away.
Kate
 Tuesday, 16 January 2007
Thottam R. Sriram has an article in the January MSDN Magazine called CLR Inside Out: Introduction to COM Interop. As the introduction says:
COM is a wonderful technology. One aspect of the common language runtime (CLR) that makes it an extremely powerful platform is that it allows seamless interactions between Microsoft® .NET applications and unmanaged COM components. However, when I searched the Web, I found few working samples demonstrating the very basic concepts of COM interop. The purpose of this column is to illustrate those basic concepts in order to provide solid working examples that can jump-start users in this technology.
I'll start off with a simple Active Template Library (ATL) COM server and try accessing methods in this server using an unmanaged COM client, then do the same thing with a managed client. I'll walk through the various DLLs to illustrate the translation from unmanaged to managed, and I'll show how to access an exported method in an unmanaged DLL using P/Invoke. The toughest part of this is to figure out marshaling of complex structures, which I don't cover exhaustively in this column-it would be a complete column (or book) on its own. I'll show you how unmanaged code can call back into managed code using interfaces. (You could do this with delegates as well, but I won't cover that in this column.)
Finally, I'll discuss debugging your COM interop project using public symbols. This will give you very basic introduction to WinDbg.exe, unmanaged debugging, and managed debugging using SOS. I'll demonstrate the stack from managed to unmanaged as calls are made in either direction.
The managed client is in C# -- when you write your clients in C++/CLI you don't have to figure out how to declare and marshal complex structures, after all. And seeing how to call back from native code to managed code is helpful indeed. I'm not sure if Reverse P/Invoke is the official name for this, but it works for me. You set up an interface in your C# code and decorate it with attributes for COM. Then you implement that interface in your code and use tlbexp to make a COM Callable Wrapper around your .NET object. Then you hand-define the same interface as a COM interface in your native code and you're all set. The .NET code can P/Invoke some native function and pass in a reference to the .NET interface. By the time it's unmarshaled over in the native world, it's become a smart pointer to that COM interface and you can invoke the method from the native code. It's a little tricky, but it's not hard - once you've seen it done.
Since the article wraps up by touching on Windbg, there's something for everyone. Check it out!
Kate
 Monday, 15 January 2007
I read an interesting blog entry at Dumb Little Man. Essentially, the story goes like this. A guy is fed up with his job, doesn't like it, is ready to quit. Instead he throws himself whole-heartedly into it and gives it his all. He does the tasks he dislikes, he does tasks he isn't asked to do, he speaks up and speaks out, and he becomes so much happier in the job. And if that wasn't enough, he gets a two-layer promotion and a $15,000 a year raise.
His list may not precisely work for you. You may not be asked to do TPS reports, whatever they are. You may live a life like mine where no one can give you a promotion. You may not think that working long hours is important to success at your company, or worth what you have to give up in your private life. But look past the details of his particular list. What would happen if you totally threw yourself into what you are doing now and really really did it?
Kate
 Sunday, 14 January 2007
Here's another reason to install Visual Studio SP1 - it fixes one class of "intellisense stops working" problems. Intellisense stops working a lot for C++ developers. It doesn't happen very often for me, but people mention it quite often when I speak and some of my coworkers are less lucky than I am because it happens in their day to day work.
If Intellisense stops working for you and you're working on a C++ project, the workaround is to close Visual Studio, find and delete the .ncb file, and re-open Visual Studio. As you can imagine, that cuts into flow quite a bit. Now a KB article mentions that SP 1 fixes "In a Microsoft Visual C++ 2005-based solution that includes multiple projects, the IntelliSense of a project does not work correctly if the project references types from another Visual C++ or Visual C# project." Cool!
Kate
 Saturday, 13 January 2007
Jeff Atwood has a fun post explaining how much more quickly he finds things now that he can once again just type the names of programs. It's so true. Instead of clicking Start, All Programs, Microsoft Office, Microsoft Word Whatever, with the attendant pauses while the menus come up and the pauses while I desparately scan the huge list looking for the thing I know has to be there somewhere, it's just press the Windows key and type word, then press enter. Or perhaps type w if I'm lucky enough. The search is blazing fast and there's the application I want, or the file I want, or the control panel sub-thingy that has a new name now so I can't see it. Ah, typing. I never really gave up on typing. And now it's once again one of the main ways we'll interact with the operating system.
And not just because of the way cool search thing. There's the UAC aspect to this too. Open yourself an elevated command prompt, and everything you launch from that command prompt will be elevated -- no manifest, no right-click Run As Administrator, just run your utility so you can do whatever administrative tasks you need to do in relative peace. Small price to pay: you have to type the names of those apps (possibly with their full paths) into the command prompt.
And that's not the only deja vu I get as a Vista user and developer. Does anyone remember making Windows applications before, say WinForms? OK, before VB or before MFC? Before there was a framework that gave you an object called Button that had a property called Text or Caption or the like, how did you set the text on a button? You sent it a Windows message (WM_SETTEXT) with a parameter of "Save" or whatever you wanted. Well you don't have to do that any longer, but how do you arrange for the shield icon to appear on a button? (It's a convention that if clicking a button is going to pop up an elevation consent dialog, you put the shield on the button.) By sending it a BCM_SETSHIELD message, of course!
The longer you've been programming, the less jarring these things are. Soon enough the tools will catch up and it will be all drag-drop, set properties etc. If that's all you've ever known, you might feel like Vista has dropped you through the looking glass. But if you have some memories of the old days, you're going to be on more solid ground. And you probably still type really fast.
Kate
 Friday, 12 January 2007
Eric Appel recommends installing SP1 for Visual Studio 2005 and the Visual Studio 2005 SP1 Update for Windows Vista Beta. Let's drill into that name a little bit more. Starting at the end, it's a Beta of Visual Studio 2005 SP1 Update for Windows Vista. That is in turn an "Update for Windows Vista" of "Visual Studio 2005 SP1". You have to start with SP1 first. But SP1 has nothing to do with Vista.
SP1 is a common-or-garden service pack for Visual Studio. It fixes a pile of little things that were found in Visual Studio. Some are just syntax colouring, some are real issues. And it can be argued that you should only install it if you need it. There are some issues with the service pack itself: Heath Stewart has a summary with workarounds where they are known. It can take a long time to install, and you should make sure you have enough disk space, because if the install fails the rollback is a little overenthusiastic ... you might have to reinstall Visual Studio 2005 to make sure certain libraries are in place. That said, lots of people are glad they installed it.
If you want to install the update for Vista, then you need to install SP1. And once you've done that, you'll find many things both simpler and faster. Happy me.
Kate
 Thursday, 11 January 2007
Poor Visual Studio 2005, aka Whidbey. Developed and released before Vista, it's Vista-blind. Say you're building a COM component and one of your build steps registers it, writing to something under HKLM. Unless that instance of Visual Studio is running elevated (perhaps because you right-clicked and chose Run As Administrator) the registration will fail. The fix: close Visual Studio, run it again elevated, repeat your build. It's a little frustrating.
Every month that goes by is going to make this better. Eric Appel has a nice summary of what you can do now: install a pair of updates (one released, one in beta) and set Visual Studio to always run elevated. You'll need to consent every time you run it, so I actually skip this, run non-elevated most of the time, and when something fails I close and re-open Visual Studio. If you would find that super frustrating, go ahead and mark it to require Administrator. It's also a good habit to test by double-clicking your EXE in Windows Explorer rather than hitting F5, so that your app is elevated or not elevated according to its own manifest and not according to the way you started Visual Studio.
It's a transition time. It won't last forever.
Kate
 Wednesday, 10 January 2007
Eric Lee has spotted the Vista-programming-is-easier-with-C++/CLI phenomenon for himself.
... I have really come to enjoy the second incarnation of managed C++, now called C++/CLI. Unless you are really good at .NET marshalling, a lot of great Windows Vista features just aren't that accessible from .NET. This is where C++/CLI really comes into its own.
He gives a nice example featuring a preview handler. Preview and thumbnail handlers are really cool in Vista, but you have to implement some COM interfaces to do it. His final conclusion:
I'm pretty pleased with how C++/CLI gave me a way to mix what C++ and ATL do pretty well (COM, Shell Extensions, etc) with what .NET does pretty well (user interfaces, dnd design, etc).
Best of both worlds! I have a slide or two that say that 
Kate
 Tuesday, 09 January 2007
The January Orcas CTP is ready. The new C++ features include .NET Framework Multitargeting (allows the user to target different versions of the .Net framework from a single instance of Visual studio) and Library Versioning (renaming assorted libraries with 9 in their names because they differ from the current versions.) There's a handy list of Orcas features and which CTP they first appear in on MSDN. To view the documents, you'll need an XPS viewer unless you're already using Vista day to day.
Community Technology Previews are not as fully tested as betas, but they're here now, and you can provide feedback after working with them, so why not take a look?
Kate
 Monday, 08 January 2007
Time for me to speak at my home group once again. Here's the plan:
It’s Vista time – is your application ready?
This session starts with a discussion of overall compatibility of Windows Vista for applications written for earlier versions of Windows OS. It also highlights new features and security tightening in Windows Vista, how applications will behave under these conditions, and what changes may be needed to transition smoothly to Windows Vista.
We then drill deeper into the programming side. Windows Vista provides an extensive set of new APIs that enable improved user experiences and enhanced security, but some of these APIs are exposed through native COM and Win32 programming models. This session highlights strategies and techniques for taking advantage of these native APIs from managed code. Learn what's really involved in making your .NET application "light up on Windows Vista" with User Account Control (UAC) integration, Windows Vista User Experience features like common file dialogs, task dialogs and command links, and integrated desktop search.
Kate Gregory helped to develop the material for the Vista Ascend course for Independent Software Vendors, wrote the Hands On Labs currently being used by Microsoft to teach programming for UAC, and is developing a large C++ Vista reference application. She has spoken on Vista topics on three continents.
The meeting is at the Whitby Public Library. Pizza and networking from 6 to 7, then I'll speak. Please register so we get the right amount of pizza!
Kate
 Sunday, 07 January 2007
Let's see, I got dinged (so far) by
If I don't step up and produce my Five Things pretty quickly, there won't be anyone with a blog left for me to tag!
- I have a PhD in engineering -- Chemical Engineering to be precise -- from the University of Toronto. My thesis title had way too many "of"s in it and was about modelling the very first steps in blood coagulation at a surface. Simultaneous partial differential equations! Boundary layer! Non-Newtonian fluids! Woo hoo! My undergrad work was also in Chemical Engineering, at Waterloo.
- If you don't count co-op jobs while an undergrad, TA-ing while a grad student, part time lecturing, and the like, I have held only two "real" jobs in my entire life, one for two years between graduating from my undergrad and starting my grad work, and the other as partner here at Gregory Consulting ever since.
- I am an elder in a martial arts system, one of only six in that system. Don't try to beat me up though... we'll both be sorry.
- I never lie. I sometimes say I can't talk about something, or I say something that I know is deceptive but is technically true, but I do not lie. For example, I only say "this demo worked on the plane!" if it really did. But I might say "they haven't announced anything" knowing that you will conclude I don't know, when in fact I do know but can't tell you. Sorry.
- I adore my kids, and put them first in just about everything I do. I've turned down conferences because it conflicted with family things, and followed a lower-salary career path so I'd have time to be hugely involved in what they do. I even homeschooled one of them half days for an academic year. I just don't talk about them much in my blog to give them some privacy. As a result many people think I don't have kids! Trust me, when we're together in person and it's not all being archived for some future romantic interest of theirs to read 20 years from now, I'll talk your ear off about these sweet, funny, smart, hardworking, reliable little angels!
There.
Now, my victims. Who on my favourites list is not already playing, but knows me enough to take a tag from me?
Kate
 Saturday, 06 January 2007
Joe Duffy has moved from the CLR team to Parallel LINQ. How do you like this offer:
We're looking for supersmart technical people to join the team and help change the face of programming for anybody writing code on the CLR or VC++. PLINQ isn't the only project. Solid CS skills are a must, but you don't necessarily have to be a concurrency guru (right away).
Help change the face of programming? Sounds (almost) irresistible to me!
Kate
 Friday, 05 January 2007
Heh, you think it's not possible to leak memory from a managed application? Of course it is. For one thing, if you leak a thread, you will leak that whole thread's stack. Oh yes, there's more to memory than heaps. And there's more than one heap, too. You could mess up your interop and leak from the native heap, or you could even leak from the managed heap, generally as a result of an error somewhere other than the leaking code ... like a misbehaving finalizer that prevents some other finalizer from running, which prevents some other memory from being freed since it can't be freed till it's been finalized. Eeeeeww.
If none of this ever occurred to you before, and you're not scared to read more about it, check James Kovac's article in the January 2007 MSDN Magazine. He tells you how to notice leaks, track them down, and do something about them. (BTW, he's a Canadian MVP.) You'll also learn what a garbage collector does instead of buying a Porsche when it suffers a midlife crisis.
Kate
 Thursday, 04 January 2007
Ahmed's been running some Touchdown content in South Africa for ISVs who want to certify their applications on Vista. He's collected a nice set of links (about half of them were already purple for me) on the logo programs and things that will help you migrate to Vista. This stuff can be hard to find so having it in one place is very useful.
Kate
 Wednesday, 03 January 2007
Last year I posted about a demonstration of tag clouds for US Presidential speeches, so you could see words like Constitution or economy wax and wane in the big-ticket political speeches over the centuries. Well now someone has done the same for Microsoft speeches over the decades. Watch Windows appear, or spot the Ballmer speeches, you'll find it a fun little pastime. I wish it had more consistency in the type of speeches used: testimony before Congress is never going to have the same words as a press release, but it's fun nonetheless.
Kate
 Tuesday, 02 January 2007
The nice folks in the MVP program have decided I am still a Most Valued Professional for C++. Or to be specific, "Visual Developer - Visual C++". It's a delight as always to be among such company and I notice the C++ crowd has grown a bit this year. I really value my membership in this program.
Kate
 Monday, 01 January 2007
From Ahmed in South Africa:
Bring up the calendar by clicking on the time in the taskbar. Now click on the month (for example December 2006). You will get a year view. Click on the year and you get a ten year view. Click on this and you get a century view.
This is fun!
You can drill back down any time -- just click on a cell and work your way back to the month of interest.
Kate
 Thursday, 14 December 2006
Microsoft has announced that the next Professional Developers Conference (PDC) will be October 2-5, 2007 in Los Angeles, with two days of pre-conference on September 30 and October 1. That's good news and bad news for me. I'm glad we're having a PDC this year because it means there's something to announce and something to get early bits of. The official word is:
The PDC is the definitive developer event focused on the future of the Microsoft platform. PDC 2007 attendees will have the opportunity to access new code, learn about the latest Microsoft product offerings and hear from Microsoft executives about the various platform developments.
Check http://msdn.microsoft.com/events/pdc/ for updates; you can also subscribe to the RSS feed to find out more information about the event as we get closer. Registration will open in the May/June timeframe.
So what's the bad news? LA, again. This will be three in a row. I wouldn't miss the PDC for anything but can't we go somewhere else?
Kate
 Wednesday, 13 December 2006
Yes indeed, there will be a code camp in Toronto next year! It will be held Saturday, March 31st and the website is now ready for you to register as an attendee, a volunteer, or a speaker.
The Second Annual Toronto Code Camp, a free .NET community sponsored event, will be held on March 31st, 2007! Last years event was a huge success with over 220 attendees, 4 tracks, 20 speakers, 25+ volunteers and over $17,000 in prizes given away. This year’s event will be even bigger and better! Registration is now open, but remember, space is limited and based on last years response it will fill up fast.
Deadline for speakers is Jan 15th, for volunteers Feb 15th, and for attendees there is no deadline, but it will "sell out" -- to the extent a free event can sell out. Trust me, you want to be there. If you don't normally attend Microsoft events or user group meetings, either for scheduling reasons or because you don't want to be "sold to" and you worry that might happen at such events, you should make a point of coming to Code Camp -- it's a grassroots community event and a great opportunity to learn from a wide variety of speakers on a wide variety of technologies. And if you can stand the thought of ever speaking some day, Code Camp is the classic place to start. We'll even help you become a speaker if you're interested.
Kate
 Tuesday, 12 December 2006
Gee, ten minute talks on very specific technical topics... where have I heard that concept before? It really is something technical people need. Here are a bunch from MSDN in the UK along with a pretty nice UI to let you filter by technology, content level, even presenter if that's important to you. They seem to upload more about every other month.

I took a quick listen to "Wrapping Windows APIs with C++/CLI" and I liked it.
Kate
 Monday, 11 December 2006
The Regional Director program truly is worldwide -- about half of the 120 or so of us are located outside the USA. So let's say you want some pictures of Microsoft software in beautiful locations around the world, what better group to ask? The program asked us to send in pictures this fall, and here's the result:  (larger version)
Amazing, aren't we? For my picture, which is nowhere near as spectacular as some, I went and stood among some turning leaves.
Kate
 Sunday, 10 December 2006
The title isn't mine, it's Charles Petzold's, and I would be quite surprised if you didn't learn things about C++/CLI just by learning things about the .NET Framework. In other words, you don't need to plan to switch to C# to get some benefit of this free e-book. It was originally supposed to be a chapter, but ended up over 250 pages long.
I know people still need this material. I have a new mentoring client with an established team of C++ developers who are just looking at moving to the .NET Framework. I came and did a "what is .NET" talk for them, with diagrams like this:

If you already recognize these pictures and realize what they are supposed to illustrate, then you don't need the e-book. But if you haven't really paid much attention to the .NET Framework, then this is a fairly painless way to learn a lot of it. The thing is, it's all C#. My suggestion to you is to bear with that -- a C++ programmer can read C# without too much difficulty -- and then come on back here to see how to do the same things using idioms you already know and love, and how to drop back into native code any time you like for various reasons include control over your application's performance.
Kate
 Saturday, 09 December 2006
I was just looking at some old-style MC++ to convert a sample into C++/CLI. I had to convert this sort of thing: public __gc class PostCodeChecker
{
public:
virtual String* Check(String* code)
{
String* error = S"OK";
return error;
}
Boolean Test(String* code)
{
Boolean ret = false;
String* error = Check(code);
if (error->Equals(S"OK"))
{
ret = true;
}
return ret;
}
};
Into this sort of thing: public ref class PostCodeChecker
{
public:
virtual String^ Check(String^ code)
{
String^ error = "OK";
return error;
}
Boolean Test(String^ code)
{
Boolean ret = false;
String^ error = Check(code);
if (error=="OK")
{
ret = true;
}
return ret;
}
};
This is pretty mechanical work and just the sort of thing you might like to hand off to a tool. The VC++ team has been working on one, but it hasn't been a top priority. Now they've decided to release it as-is to those who might have some use for it, rather than holding onto it until it's perfected:
To set expectations correctly, the tool was going to be a “help” rather than a complete solution and in the push to complete other projects the tool was never fully completed, tested or documented. We are happy to release the tool “as is” as a few initial tests with external users have shown that they received benefits from using the tool even if: 1) it does not provide complete translation between the two different syntaxes and 2) manual modify of the outputted source code is still required to complete the conversion. The tool does come with source code so that users who wish to modify or extend the functionality to better suit their code bases can. The tool is totally unsupported by Microsoft.
If you have some oldstyle Managed C++ to convert, why not see if it can help you? It's a 5 meg download.
Kate
ps: one of the side effects of the more readable nature of C++/CLI is that after the mechanical work was done I just had to do this: Boolean Test(String^ code)
{
return Check(code)=="OK";
}
 Friday, 08 December 2006
Do you read Raymond Chen's blog? You really should. Like so many of the blogs I read these days, it is also going to be available as a book.

Ryamond says:
Luckily, I found a sympathetic ear from the folks at Addison-Wesley Professional who were willing to take a chance on my unorthodox proposal. But I caved on the length, bringing it up to 500 pages. Actually, I came up with more like 700 pages of stuff, and they cut it back to 500, because 700 pages would take the book into the next price tier, and "There isn't enough of an audience for a book that big!"
Eighteen months later, we have The Old New Thing: Practical Development Throughout the Evolution of Windows, following in what appears to be the current fad of giving your book a title of the form Catchy Phrase: Longer Explanation of What the Catchy Phrase Means.
It's a selection of entries from this blog, loosely organized, and with new material sprinkled in. There are also new chapters that go in depth into parts of Win32 you use every day but may not fully understand (the dialog manager, window messages), plus a chapter dedicated to Taxes. (For some reason, the Table of Contents on the book web site is incomplete.)
Oh, and those 200 pages that got cut? They'll be made available for download as "bonus chapters". (The bonus chapters aren't up yet, so don't all rush over there looking for them.)
This is a kind of trend really - many writers have put energies into blog posts instead of books, only to look up and discover that some of the posts, rearranged into an approrpriate order and with a little writing to connect them, make a pretty cool book. It's not clear whether it will be out in time to ask for it as a Christmas present, but it would be a cool way to use any booky gift certificates people give you.
Kate
 Thursday, 07 December 2006
In Barcelona, I was on the panel for the Barcelona Girl Geek Dinner. Now, lest anyone be under the illusion that these panels are carefully peer-selected and reviewed, that there's some committee somewhere finding the cream of modern geekhood -- well maybe that was how the others were chosen but for me, I was hanging out in the speaker room when Sarah, who I'd only just met, asked me if I'd do it and I said yes.
I had a lovely time at the panel and we all spoke about our experiences, advice to newbies, how nice it is not being "the only one in the room" from time to time, and so on. I was sitting with Catherine and Cyra, two of my fellow panelists, and Charles Torre of Channel 9 was with us, and we talked over dinner and wine the way in my experience geeky women always do -- a fast paced mix of very technical shoptalk and personal getting-to-know-each other material. (I learned a lot from Cyra and wish we had had more time together.) When the event ended, the four of us walked together across the street to the speaker hotel, but it was such a short walk and we weren't finished talking. Someone expressed an interest in dessert, and we decided to see what the lobby bar had to offer. We kept on talking, and at one point Catherine and I were trying to convince Charles that "the compiler is your friend" -- that strong typing and early binding have big advantages. Charles kept saying "I can't believe I'm not filming this" until eventually he picked up the camera and started to film. He asked us questions he knew we cared strongly about and off we went.
The resulting video is now on Channel 9. It seems to kind of start in the middle because, well, we started in the middle. I suspect it's the only video on Channel 9 featuring gestures with a glass of Scotch. It's one of the very few that doesn't feature exclusively Microsoft employees, so I am honoured to see it there. Those of you who have heard my line "I stay up late over too much red wine arguing about deterministic destruction" can now see that in action. We don't introduce ourselves till the very end, so if you need to know who's who, download the whole thing, skip to the end, then go back to the beginning and watch us.
Kate
 Wednesday, 06 December 2006
Man, I've been making software for a long time. I first came across Fred Brooks' essay No Silver Bullet: Essence and Accidents of Software Engineering when the mail (you remember, the physical mail) brought me the magazine (you remember physical magazines) and it was the cover story. Apparently that was the April 1987 issue which is bringing us perilously close to the twenty year mark. (And if I needed to, I could get my hands on that copy within minutes... in fact I'm sure I've held it within the last year or two.) And now people are talking about it again. Larry O'Brien has a long post with links to some other posts of his own and by Wesner Moise. He also captures what I consider to be the essential quote from the essay:
I believe the hard part of building software to be the specification, design, and testing of this conceptual construct, not the labor of representing it and testing the fidelity of the representation. We still make syntax errors, to be sure; but they are fuzz compared with the conceptual errors in most systems.
The thesis is that software development gets easier or faster or more accurate only by degrees: you cannot adopt structured programming or object oriented programming or aspect oriented programming or functional programming or agile techniques or anything and expect to be ten times faster or a hundred times faster, no matter what people tell you:
There is no single development, in either technology or in management technique, that by itself promises even one order-of-magnitude improvement in productivity, in reliability, in simplicity.
It was true then and it is true now. And it will still be true when my kids are as old and grey as I am becoming. Worth reading and rereading, and not waiting twenty years between rereads. Oh and by the way, this is the same Fred Brooks who invented the heavens-I-wish-it-wasn't-true rule: Adding more people to a late project makes it later. That's from 1975 and you can't escape it either.
OK, there is one way you can achieve an order of magnitude improvement in productivity: hire the right people. The good ones are ten times as fast as the OK ones, and infinitely faster than the none-of-their-code-ever-ships ones. But that's not a technology or a management technique, so it doesn't count for our purposes.
Kate
 Tuesday, 05 December 2006
Here's another neat way to search in Visual Studio. Press Ctrl-i to get into incremental search mode, and start typing:

Typing e finds the first e in the file. Keep going and find the next instance of your letter pair:

It keeps going as long as you want:

By the way the binoculars/arrows cursor reminds you what you're doing. Until you press Escape, you can also do Ctrl-i again to just go to the next one, Shift-Ctrl-i to go backwards, and Backspace to take a letter off your search string.
Fun, eh? I may like search in Visual Studio too much ... I routinely use the Find in Files to search folders of stuff that isn't anywhere close to code. Of course I don't have to do that on my Vista machines, where search is nice and fast.
Kate
 Monday, 04 December 2006
My recent post of a joke about a priest and a politician highlights a privacy issue: sometimes any sufficiently specific information can become identifying information. If the priest had referred to "one of the first confessions" instead of "my very first confession" nobody would have learned anything when the late-arriving politician told the crowd he was the very first to give confession to the then-new priest. Similarly when a CIA operative was identified in the USA, at one point the person who identified her took refuge in pointing out he hadn't named her, hadn't said "X Y is an operative", but instead had named her husband, "A B is married to an operative." Of course that was equivalent to naming her.
Similarly, when you're worrying about privacy in an application, it's not as simple as naming some fields you shouldn't include in the system. That's a good first step, for sure: why does this application have a field for Social Insurance Number, what do we use it for? Why do we need to keep it after that? But it's not the whole story. For example, we may need everyone's home phone numbers, but do we need them on the main screen or would it be better to make people click to see the more private information. Can we use role based security to show private information only to managers? This takes some thought.
Microsoft is offering a 49 page Privacy Guidelines whitepaper you may find helpful. The introduction says:
The purpose of this document is to propose a baseline for establishing this higher bar. It offers guidance for creating notice and consent experiences, providing sufficient data security, maintaining data integrity, offering customer access, and supplying controls when developing software products and Web sites. These guidelines are based on the core concepts of the Organisation for Economic Co-operation and Development (OECD) Fair Information Practices and privacy laws such as the EU Data Protection Directive, the U.S. Children’s Online Privacy Protection Act of 1998 (COPPA), and the U.S. Computer Fraud and Abuse Act (as amended 1994 and 1996). In the interest of developing a common set of industry best practices for privacy, we invite the community and other interested parties to participate in an open dialogue.
It discusses categories of information, retention, consent, notice, and a few things that are web-specific like cookies. A good place to start your thought process.
Kate
 Sunday, 03 December 2006
Technology Review has an interview with the father of C++. Some notable quotes:
- There has to be languages for those experts to use--and C++ is one of those languages.
- I want elegant and efficient code. Sometimes I get it. These dichotomies (between efficiency versus correctness, efficiency versus programmer time, efficiency versus high-level, et cetera.) are bogus.
- There are just two kinds of languages: the ones everybody complains about and the ones nobody uses.
- The main reason for C++'s success is simply that it meets its limited design aims: it can express a huge range of ideas directly and efficiently. C++ was not designed to do just one thing really well or to prevent people doing things considered "bad." Instead, I concentrated on generality and performance.
Read the whole thing!
Kate
 Saturday, 02 December 2006
UAC got you all confused? Do you think the best thing to do is turn it off? Maybe this article on TechNet will help a little. It's quite long, and not entirely developer focused, but it's a good place to start understanding what UAC is for and why it would be best not to turn it off.
Kate
 Friday, 01 December 2006
From Beyond Code, this made me smile:
Sorry for the delay
A priest was being honored at his retirement dinner after 25 years in the parish. A leading local politician and member of the congregation was chosen to make the presentation and give a little speech at the dinner. He was delayed, so the priest decided to say his own few words while they waited.
"I got my first impression of the parish from the first confession I heard here. I thought I had been assigned to a terrible place. The very first person who entered my confessional told me he had stolen a television set and, when questioned by the police, was able to lie his way out of it. He had stolen money from his parents, embezzled from his employer, had an affair with his boss's wife and taken illegal drugs. I was appalled. But as the days went on I knew that my people were not all like that and I had, indeed, come to a fine parish full of good and loving people.".....
Just as the priest finished his talk, the politician arrived full of apologies at being late. He immediately began to make the presentation and gave his talk. "I'll never forget the first day our parish priest arrived," said the politician. "In fact, I had the honor of being the first one to go to him in confession."
Moral: Being late can be (very) costly.
Kate
 Thursday, 30 November 2006
Like Dilbert, this list of top 20 excuses developers give to testers is only funny because it's true. I'll tell you that the answer listed as #1 there is banned in our offices -- and we have quite a bit of process in place to make sure deployments are complete, for just that reason. Personally, I find #8 the funniest - and again, only because I have in fact heard it... mostly from former employees . Number one winner in the comments: Billy Hollis - "We're not shipping your machine."
Kate
 Wednesday, 29 November 2006
To follow up on my post about pinning pointers, let me ask one of those tricky questions that someone asked me. If I have an array of things, how do I pin the whole thing? If I ask for a pinning pointer based on element #3 of the array, can I use pointer arithmetic from that pinned pointer to reach elements #4 through #11? Do I have to pin each element one at a time?
The answer is that pinning any element of an array pins the whole array, and that once you have a pinned pointer to one element of the array you can do the usual pointer things. This includes not only incrementing it to move through the array, but if it's a char* you can pass it to things that expect strings and those things will never know the difference. Here's an example from MSDN: array<Byte>^ arr = gcnew array<Byte>(4);
arr[0] = 'C';
arr[1] = '+';
arr[2] = '+';
arr[3] = '\0';
pin_ptr<Byte> p = &arr[1]; // entire array is now pinned
unsigned char * cp = p;
printf_s("%s\n", cp); // bytes pointed at by cp will not move during call
This sample prints out ++.
Kate
 Tuesday, 28 November 2006
As I mentioned earlier, I recorded a DNR episode while at Tech Ed Developers in Barcelona. A bunch of us got together to talk about Agile development. As I said at the time, at Gregcons we're not "formally Agile" (stop laughing) but we do a lot of things that fall under the Agile umbrella, because they just plain make sense.
I haven't had a chance to listen to the recording yet, but Scott Bellware has, and he liked it. Among other things, he says:
Kate Gregory nailed a quintessential a-ha moment in agile adoption: "You go through this phase of saying, that's way too extreme; I would never do that; what kind of weirdo does that?. And then a year later, you're doing that."
Agile practices go deep and often work at subtle levels. The very practice of agile development puts the sharpness in your perspective that you'll need before you can see the difference between pre-agile development and agile development. Kate's statement perfectly captures this experience of the agile practice paradigm shift.
Happy to help, Scott. Thanks for listening!
Kate
 Monday, 27 November 2006
I use search engines for a variety of reasons. Sometimes I want to find out how to do something. Other times, I want to find the official page about something so I can link to it here or send it to someone. Since most of the things I want to learn are related to things I already know, and since I blog about a lot of what I know, I have a bit of an occupational hazard:

One of my mentoring clients complained about this to me. "I decide to search the Internet instead of calling you to ask and what do I find? A bunch of stuff you wrote!". Believe me, it's worse when all I can find is a bunch of stuff I wrote. And Peter Near, a fellow MVP, Flyertalker, and Ontarian, has the same problem.
I would get in the habit of excluding gregcons.com from my search results if not for two things: first, a lot of my stuff is published on other sites, and second, from time to time my old words help me remember something I'd forgotten. So I guess I'm stuck with it.
Kate
 Sunday, 26 November 2006
I've recently been asked (again) about pinning pointers so I decided to blog it, so that next time I can just email the link and save everyone a little time 
When you're working in C++/CLI, there are two kinds of indirect access to objects: handles and pointers. A pointer is that good old friend (fiend?) we've known for so long and it holds the address of a place on the native heap or the stack. You get a pointer by using the new operator with a type, or the address-of operator, &, with an instance: Customer c("Microsoft");
Customer* pc1 = &c;
Customer* pc2 = new Customer("CTV");
Pointers stay still. You can cast them to ints, stick those ints into collections, do whatever you like to them, and later cast them back to pointers and dereference them and if they were pointing to something on the heap, like pc2 does, they will still be pointing to the same place on the native heap the whole time. What's more, the instance they point to will not have gone anywhere unless you explicitly delete it yourself.
Handles are the new kid on the block and they sorta-point-to a place on the managed heap. You get a handle by using the gcnew operator with a type, or the make-me-a-handle operator, %, with an instance: Employee e("Kate", "Gregory");
Employee^ he1 = %e;
Employee^ he2 = gcnew Employee("Brian","Gregory");
Handles don't stay still. If you found a way to get the value out of them and then stuck it somewhere and let the handle itself go out of scope, the garbage collector might clear away the item on the heap, making the number meaningless. Even if you kept the handle in scope, the garbage collector might move the item to somewhere else, making the number meaningless.
Now normally this is nothing more than an interesting fact, one of the differences between handles and pointers. But what if you have some information contained inside a managed instance and you need to pass it to some native code that doesn't know about handles? Now you not only need to convert somehow, you also need to ask the garbage collector not to move that heap item while you are holding a pointer to it. This is called pinning. Let's switch to simpler types so you don't have to worry about what's in an Employee object. I need this most often with strings - I have some managed code that gives me a String^ and I need to pass it to some native code that needs a LPCWSTR or the like. String^ title=HandyLibraryFunction();
{
pin_ptr<const WCHAR> str = PtrToStringChars(title);
NativeFunction((LPCWSTR)str);
}
PtrToStringChars is a handy function you will find in <vcclr.h>. Those brace brackets are important -- when the pinned pointer goes out of scope, the garbage collector is allowed to move the item again. You really need to minimize pinning time or you will ruin your app's performance, so I've artificially shortened its lifetime to release it as soon as possible. And whatever NativeFunction does, it better not take a copy of the pointer it's given and save it away for future use, because it will be a dangling pointer once str has gone out of scope -- even if title is still in scope.
The concept is much the same when you want a member variable from a managed instance. Grab hold of it and use the pin_ptr template to pin it and give you a pointer, which you can then work with following all the rules of pointers. Let go of it as soon as you can.
Kate
 Saturday, 25 November 2006
Here's a little oddity I happened across. It's a patent application:
The present invention provides a system and/or method that facilitates expanding keywords within an existing computer programming language by employing a whitespace keyword containing embedded whitespace. A whitespace component can receive code, and create a whitespace keyword based at least upon a successive comparison of adjacent tokens. The whitespace component creates a whitespace keyword by replacing more than one token with a single token containing embedded whitespace. Moreover, the whitespace component can utilize a lexical analyzer to group code into tokens and a parser component to parse the code.
This actually makes sense to me (assuming you accept that the idea of software patents in general makes sense.) It was a huge leap to take a language like C++, where keywords are separated by spaces, and extend it to become a language where some of the keywords actually contain spaces. After all, so many of us already have words like ref and value as variable names: the only way for C++/CLI to work is the conceptual leap that says "ref isn't the keyword, ref class is the keyword." If you wonder how that's actually done... read the patent application.
Kate
 Friday, 24 November 2006
There are quite a few products, generally older products, that aren't going to be supported on Vista and probably aren't going to work on Vista. One of the not supported announcements that seems to be catching people by surprise is about SQL Server 2000 and it's free sibling, MSDE. They seem to have run afoul of UAC, which really does require you to change your application.
If you are using SQL Server 2000, you should upgrade to 2005 anyway: it has a lot of improvements for you. But MSDE users don't generally even realize they are using a database: they're using an application that uses a database. Whoever made that application needs to tweak their install so it uses SQL Express (which is just as free as MSDE ever was, and doesn't have a governor) instead. And if that's you, learn about Vista development while you're at it in case your application ends up needing changes too.
Kate
© Copyright 2025 Kate Gregory
Theme design by Bryan Bell
newtelligence dasBlog 2.3.9074.18820  | Page rendered at Monday, 21 April 2025 23:08:54 (Eastern Daylight Time, UTC-04:00)
|
On this page....
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
---|
30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Pluralsight Free Trial
Search
Navigation
Categories
Blogroll
Sign In
|