computers&technologys

Concurrent Computer posts $301K profit

Concurrent Computer Corp. was in the black in the third quarter of fiscal 2008, and it reported plans for a reverse stock split.

The Duluth, Ga.-based provider of real-time Linux software and technology for commercial and government markets (NASDAQ: CCUR) had net income of $301,000 on $19.4 million in revenue. This compares with a net loss of $3.1 million on $16.1 million in revenue in the third quarter of 2007.

Concurrent has break-even earnings in the third quarter, compared with a loss per share of 4 cents in the same period last year.

The Company also said its that its board of directors has stamped its approval on asking Concurrent's stockholders for a reverse split of common stock at a ratio of one-for-10, meaning every 10 shares of common stock of Concurrent will be combined into one share of common stock. Concurrent plans to schedule a stockholders' meeting in the next two months.

Google Chrome...is Windows inside, which may be a strategic error

In a fascinating post, Scott Hanselman pulls apart the Google Chrome browser to discover Windows inside or, rather, Windows Template Library (WTL). WTL was open sourced by Microsoft back in 2004 and went somewhat silent until now, when it popped up in Google's open-source browser.

Hanselman calls out the reason for WTL's inclusion:

Chrome uses abstraction libraries to draw the GUI on other non-Windows platforms, but for now, what sits underneath part of ChromeViews is good ol' WTL. Makes sense, too. Why not use a native library to get native speeds? They are using WTL 8.0 build 7161 from what I can see.

Speed matters, and getting top speeds on Windows may require using native Windows libraries, graciously offered by Microsoft back in 2004 as open source.

However, not everything came free of charge (and effort) from Microsoft, as Hanselman points out, and it appears from a recent PCWorld article by Neil McAllister that the effort to bring Chrome to the Mac and Linux will be even harder. Hanselman writes:

Looks like The Chromium authors may have disassembled part of the Windows Kernel in order to achieve this security feature [Data Execution Protection] under Windows XP SP2. Probably not cool to do that, but they're clearly doing it for good and not evil, as their intent (from reading their code) is to make their browser safer under XP SP2 and prevent unwanted code execution.

So the Chrome authors have had to cut some corners to make the browser secure on Windows. Microsoft may not like the approach, but as Hanselman notes, at least Google is doing it for benevolent purposes.

Fine. But what I really want to see is Chrome for the Mac (and Linux). For this, however, PCWorld's McAllister suggests that we "shouldn't hold our breath," as the "Mac build is a work in progress that is much closer to the start than the finish." In part, this is because Google needs to code around Windows platform-specific elements like WTL.

All of which means that while Microsoft's open-source efforts may ensure it will take first place in the Chrome bake-off, Google is forcing the early adopters to stick with Firefox, rather than experiment with Chrome. The trendsetting crowd is with the Mac and, to a lesser but still significant extent, Linux, not Windows. (Of course, some data doesn't support this contention.)

It might make sense to aim for the mainstream (i.e., corporate IT, which would get the most benefit from an JavaScript-optimized Web browser), but the mainstream isn't in the habit of trying out the latest and greatest.

Personally, I think Google needs the entrepreneurial CIO and CTO if it hopes to make Chrome stick. That crowd, however, is likely not a Windows crowd. Time will tell if this was a strategic error on Google's part.

Top 5 List On How To Pick The Right Motherboard

I decided to make a top five list on motherboards because, in building a computer, it’s the hardest component to pick. It’s pretty much the nervous system of the PC, so proper selection is crucial to ensure your new computer performs as well or better than expected. Anyway, on with the top five!

1. Make Sure you pick the right size motherboard for the case you have chosen to use. If you have a micro at ATX case then your motherboard cannot be an ATX. Larger cases sometimes allow you to have smaller motherboards. Check the specs on the case before you continue looking for a motherboard.
2. Count how many SATA or IDE connections are available. I learned the hard way — I bought a CD drive and a hard drive — both IDE — and I only had one IDE connection and six SATA connections on the board I bought. I had To send the hard drive back and get a SATA.
3. Price isn’t everything! a motherboard that costs $80 can just as easily run as well if not better than a motherboard that costs $1000. Check the specs for features you want and also that you don’t need. If you’re not a gamer, chances are you don’t need something like SLI.
4. Do your research! Check and see what other people are saying about the motherboard. Again, just because the motherboard is expensive doesn’t necessarily mean it’s a beacon of quality!
5. Never buy from a third party like a flea market, a friend, or a guy in a van.

Strong Passwords, Passphrases, and Keys

Internet Fixes has an article this week about using passphrases instead of passwords. That would involve using Windows’ ability to utilize 127 character passwords, and using a random phrase instead of using a random password.

Example: My Aunt Nellie eats cat food!

Here we have 29 characters, including spaces, three capitalized letters and a punctuation mark. This is a pretty strong passphrase. In theory, it would require a supercomputer working for millions of years to solve a random key involving 29 units. Of course, that isn’t really a random key. It’s a random phrase that, again in theory, could be cracked by a brute force attack on a fast computer, or a distributed computing network using botted machines with a sophisticated cracking program using a good dictionary.

Also, some programs and web pages will not accept passwords that long, and some will not accept spaces. For those problems, the article suggests eliminating the spaces. That pulls the length down to 24 characters, still plenty strong enough (and perhaps even harder to crack).

Another method, and the one I prefer myself, is to use the first letter of each word, along with the punctuation and capitalization. I like to use favorite quotations, and throw in a curve like a misspelled word or two commas instead of one. That way you can actually write the thing down and (a) it won’t look like a password or passphrase at all, and (b) it becomes so random that it’s hard to imagine a program that could crack it between now and the end of the universe.

Example: The woods are lovely, dark and deep, but I have promises to keep, and miles to go before I sleep becomes Twal,dad,bIhptk,amtgbIs — also 23 characters but even closer to truly random. Change those commas to something else, toss in an extra character or add an exclamation point, and you’ve got a very secure key.

Why is this important? Well, you have to be able to remember at least a master password to get into RoboForm or other password managers. [What? You don’t?] Second, someone else has to be able to do so too, in the event of an emergency. They aren’t likely to have memorized “Twal,dad…” but they can write that quote down and, knowing the trick of converting it, drag that sucker out years down the road. Just remember to tell them if you change it, and to use something else for your “private” files — you know, the ones you get from that Russian site.

We’ll discuss strong encryption of files and drives another time.

Top Five Tips On How To Use An Old Computer

1. Fix it up. If the computer’s not too old, you should be able to buy some new RAM and some more hard drive space to extend its life. Before you buy a hard drive, just make sure you know the right connections. If you have enough money, buy a new processor (at least a Pentium 3 or higher).
2. Turn it into a sub-woofer! I know you’re like Coolio. Well I did it by using this PC World article. I found it quite interesting.
3. Donate it or recycle it. Yeah not the coolest thing, but it’s pretty obvious.
4. Turn it into a home server. As long as you have Windows 95 or higher, this shouldn’t be too much of a problem. You might need to get a router and a few other things at your local computer store.
5. Take it apart. If you don’t know much about computers, you can get a “how to build a computer” article and practice building a computer before you spend your hard earned cash.

The Weekly Source Code 33 - Microsoft Open Source inside Google Chrome

First, let me remind you that in my new ongoing quest to read source code to be a better developer, Dear Reader, I present to you thirty-third in a infinite number of posts of "The Weekly Source Code."
That said, what does Microsoft Code have to do with Google Chrome, the new browser from Google? Take a look at the Terms and Conditions for the "Chromium" project up on Google Code. There are 24 different bits of third party software involved in making Chrome work, and one of them is WTL, the Windows Template Library, which was released as Open Source in 2004.
Chrome's use of the Open Source Windows Template Library
WTL is distributed under the MS-PL or Microsoft Public License. This is a VERY relaxed license that basically says "have fun, and don't call if there's trouble." In the Open Source world, licenses like that make people smile.
WTL is a C++ library for Win32 development and is kind of like MFC (Microsoft Foundation Classes), but a lot more lightweight. It was originally worked on by Nenad Stefanovic as an internal thing at Microsoft that was then released as an unsupported sample. Nenad is still listed on the old SourceForge project.
WTL embraces ATL (Active Template Library) which is a series of C++ template classes made to make COM development easier. It was more or less patterned after the STL (Standard Template Library). You may remember that folks like Chris Sells were hard-core ATL wonks. Chris and Chris Tavares (of P&P fame) worked on the ATL Internals book.
WTL was well loved going back to 2002. There's a great post from back then by Simon Steele about The Joys of WTL. Simon says:
The Windows Template Library (WTL) is MFC on template-based steroids - after a successful stretch on the slimfast plan. WTL provides the user-interface frameworks that we need to write proper GUI applications without resorting to the bloated MFC or complicated pure Win32 API programming. A number of the "must-have" classes from MFC are also available as WTL utility classes too, welcome back your old friends CPoint, CSize, CRect and most importantly CString! WTL produces small executables that do not require the MFC run time libraries - in fact if you stay clear of the Visual C++ runtime functions (strcpy and friends) you can dispense with msvcrt.dll as well - leading to really small programs, which run fast too
Windows Template Library was released as Open Source over 4 years ago which is like 28 Internet years. May of 2004 was a long time. I didn't think Microsoft was doing much Open Source that far back, but it appears they were. In fact, back as far as April of 2003 there was talk on the WTL Yahoo Group by Pranish Kumar, then of the Visual C++ team, of trying to figure out how to get the product out into the community in a way that would let it live on.
History: How WTL Became Open Source
I had an IM chat today with Pranish Kumar about how WTL made it out of a 2004 Microsoft as an Open Source project. I'd also encourage you to check out both the Shared Source page at MSFT, the Open Source page, and most importantly, Port 25.
Here's part of my IM with Pranish about how WTL was released:
[WTL] was one of the first if not the first OSS things from Microsoft and it was a tough sell. There was a meeting with some bosses where we were presenting 3 potential OSS items. I guess it was the first "real OSS" with joint MS/Community involvement as opposed to just us posting something externally. WTL was the only one that got approved.
Me: Did it start the Shared Source Initiative?
Yes in the broader sense, I think we took the basis for the license/process from Win CE and a few other components which Microsoft made available (in some form) as shared source. They also looked at BSD and some other licenses.
It was a fascinating experience for many reasons. One of them was seeing the reaction of various Microsoft execs to the whole open source/shared source idea. There was a lot of concern about OSS = Linux, and questions on whether there was business value in us engaging
It's pretty amazing how our stance/attitude has changed, one of the reasons WTL got through is because we convinced management, it had a passionate community base and would really help us foster that base.
I check in on the community now and then (not as regularly as I'd like) and I'm always impressed how it's remained strong.
One of the reasons I wanted to work for ScottGu was because of Microsoft's always improving attitude about releasing source. It's a big company and sometimes moves slow, but more people "get it" now than before.
Digging In
Chrome uses abstraction libraries to draw the GUI on other non-Windows platforms, but for now, what sits underneath part of ChromeViews is good ol' WTL. Makes sense, too. Why not use a native library to get native speeds? They are using WTL 8.0 build 7161 from what I can see.
Chromium is a lot of code. The source tarball is over 400 megs, if you want to try to compile it yourself with VS2005. Let's try to look at a few tiny interesting bits, though. You can check out their "Build Bot" if you like, and watch the development on the Linux and Mac Versions as they progress each day.
In some places, Chrome uses WTL for little stuff, like macros. For example, in the Chrome AeroTooltipManager, GET_X_LPARAM is a macro:
1. ...snip...
2. if (u_msg == WM_MOUSEMOVE || u_msg == WM_NCMOUSEMOVE) {
3. int x = GET_X_LPARAM(l_param);
4. int y = GET_Y_LPARAM(l_param);
5. if (last_mouse_x_ != x || last_mouse_y_ != y) {
6. last_mouse_x_ = x;
7. last_mouse_y_ = y;
8. HideKeyboardTooltip();
9. UpdateTooltip(x, y);
10. }
11. ...snip...
In other places, they rely on it more, like in text_field.cc that includes atlcrack.h. These are not drugs, mind you, but rather "message crackers" to help get at, and react to, the information inside Window Messages. These are used to create a "message map" of all the events you're interested in. These are macros that expand into an obscene amount of code. They are exceedingly handy.
1. // CWindowImpl
2. BEGIN_MSG_MAP(Edit)
3. MSG_WM_CHAR(OnChar)
4. MSG_WM_CONTEXTMENU(OnContextMenu)
5. MSG_WM_COPY(OnCopy)
6. MSG_WM_CUT(OnCut)
7. MESSAGE_HANDLER_EX(WM_IME_COMPOSITION, OnImeComposition)
8. MSG_WM_KEYDOWN(OnKeyDown)
9. MSG_WM_LBUTTONDBLCLK(OnLButtonDblClk)
10. MSG_WM_LBUTTONDOWN(OnLButtonDown)
11. MSG_WM_LBUTTONUP(OnLButtonUp)
12. MSG_WM_MBUTTONDOWN(OnNonLButtonDown)
13. MSG_WM_MOUSEMOVE(OnMouseMove)
14. MSG_WM_MOUSELEAVE(OnMouseLeave)
15. MSG_WM_NCCALCSIZE(OnNCCalcSize)
16. MSG_WM_NCPAINT(OnNCPaint)
17. MSG_WM_RBUTTONDOWN(OnNonLButtonDown)
18. MSG_WM_PASTE(OnPaste)
19. MSG_WM_SYSCHAR(OnSysChar) // WM_SYSxxx == WM_xxx with ALT down
20. MSG_WM_SYSKEYDOWN(OnKeyDown)
21. END_MSG_MAP()
They also use some handy helpers that are C++ classes around Windows structures. For example, the Windows POINT structure is a class in WTL called CPoint. The class actual derives from the struct. Lots of interesting stuff in there, and WTL is at a pretty low level helping out and keeping things tidy.
Now, moving on to something I found fascinating because it's not documented and may or may not have required some disassembling to accomplish.
Chrome's Odd Use of Data Execution Prevention
This part isn't explicitly about use of open source, but it's darned interesting. This is part of Chrome's WinMain(). It's long, but check out a few interesting bits. First, the big if/else at the beginning. They look at the command line and determine if they (the EXE) are one of three flavors...either a Renderer, a Plugin [host] process, or the Browser process. Notice that they have DEP (Data Execution Prevention) turned on for the Renderer and main Browser, but have to enable ATL7 thinking because there are plugins that weird build in older ways still out there. They are ultimately calling SetProcessDEPPolicy and passing in a flag to enable DEP, as well enabling ATL7 compiled processes. From MSDN help:
"Disables DEP-ATL thunk emulation for the current process, which prevents the system from intercepting NX faults that originate from the Active Template Library (ATL) thunk layer."
These new APIs were added in Vista SP1, Windows XP SP3 and WIndows 2008. Why is ATL special cased? From Michael Howard:
"Older versions of ATL, and by older I mean pre-Visual C++ 2005, used dynamically generated code in small isolated cases. Obviously, without the appropriate APIs this is going to cause problems on a DEP-enabled computer, because you can't execute data. This code is referred to as a "thunk" and versions of ATL in VC++ 2005 and later work correctly with DEP."
Some plugins that might run in a Chrome sandboxed process might be compiled in this way, so that process has a different security DEP setting than the others.
1. int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE prev_instance,
2. wchar_t* command_line, int show_command) {
3. // The exit manager is in charge of calling the dtors of singletons.
4. base::AtExitManager exit_manager;
5.
6. // Note that std::wstring and CommandLine got linked anyway because of
7. // breakpad.
8. CommandLine parsed_command_line;
9. std::wstring process_type =
10. parsed_command_line.GetSwitchValue(switches::kProcessType);
11.
12. const wchar_t* dll_name = L"chrome.dll";
13. if (process_type == switches::kPluginProcess) {
14. // Plugin process.
15. // For plugins, we enable ATL7 thunking support because we saw old activex
16. // built with VC2002 in the wild still being used.
17. sandbox::SetCurrentProcessDEP(sandbox::DEP_ENABLED_ATL7_COMPAT);
18. } else if (process_type == switches::kRendererProcess) {
19. // Renderer process.
20. // For the processes we control, we enforce strong DEP support.
21. sandbox::SetCurrentProcessDEP(sandbox::DEP_ENABLED);
22. } else {
23. // Browser process.
24. // For the processes we control, we enforce strong DEP support.
25. sandbox::SetCurrentProcessDEP(sandbox::DEP_ENABLED);
26. }
27. ...snip...
28. }
When you dig into their use of DEP, notice this interesting comment, as they try to get DEP working under Windows XP SP2 and Windows Server 2003 SP1. They are using the totally unsupported technique outlined in this article from 2005 to try to turn on DEP. If you try to call this on Vista you'll get back STATUS_NOT_SUPPORTED, of course. ;) There's an official Vista API, and that's SetProcessDEPPolicy.
As an side, and interestingly enough, this undocumented API has been added as a patch just last week to WINE (Windows Emulation) for those who try to emulate Windows under Linux, but outside a VM.
Note the most interesting comment in the method:
"// Completely undocumented from Microsoft. You can find this information by
// disassembling Vista's SP1 kernel32.dll with your favorite disassembler.
enum PROCESS_INFORMATION_CLASS {
ProcessExecuteFlags = 0x22,
}"
Looks like The Chromium authors may have disassembled part of the Windows Kernel in order to achieve this security feature under Windows XP SP2. Probably not cool to do that, but they're clearly doing it for good and not evil, as their intent (from reading their code) is to make their browser safer under XP SP2 and prevent unwanted code execution.
This internal and totally unsupported API is in the Microsoft Windows Internals 4th Edition, Chapter 6, on download.microsoft.com (PDF). It's also mentioned in a Microsoft Research PowerPoint (PPTX). An architect on the Windows Kernel team point out in a forum posting that this was internal:
"I want to stress as a disclaimer that NtSetInformationProcess, class ProcessAccessToken, is an undocumented and unsupported infterface. It is reserved for system component use and is subject to change between operating system releases"
You can see the dance Chrome does below or on their source site. They poke around looking for a method that does what they want, using GetProcAddress:
1. namespace sandbox {
2.
3. namespace {
4.
5. // These values are in the Windows 2008 SDK but not in the previous ones. Define
6. // the values here until we're sure everyone updated their SDK.
7. #ifndef PROCESS_DEP_ENABLE
8. #define PROCESS_DEP_ENABLE 0x00000001
9. #endif
10. #ifndef PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION
11. #define PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION 0x00000002
12. #endif
13.
14. // SetProcessDEPPolicy is declared in the Windows 2008 SDK.
15. typedef BOOL (WINAPI *FnSetProcessDEPPolicy)(DWORD dwFlags);
16.
17. // Completely undocumented from Microsoft. You can find this information by
18. // disassembling Vista's SP1 kernel32.dll with your favorite disassembler.
19. enum PROCESS_INFORMATION_CLASS {
20. ProcessExecuteFlags = 0x22,
21. };
22.
23. // Flags named as per their usage.
24. const int MEM_EXECUTE_OPTION_ENABLE = 1;
25. const int MEM_EXECUTE_OPTION_DISABLE = 2;
26. const int MEM_EXECUTE_OPTION_ATL7_THUNK_EMULATION = 4;
27. const int MEM_EXECUTE_OPTION_PERMANENT = 8;
28.
29. // Not exactly the right signature but that will suffice.
30. typedef HRESULT (WINAPI *FnNtSetInformationProcess)(
31. HANDLE ProcessHandle,
32. PROCESS_INFORMATION_CLASS ProcessInformationClass,
33. PVOID ProcessInformation,
34. ULONG ProcessInformationLength);
35.
36. } // namespace
37.
38. bool SetCurrentProcessDEP(DepEnforcement enforcement) {
39. #ifdef _WIN64
40. // DEP is always on in x64.
41. return enforcement != DEP_DISABLED;
42. #endif
43.
44. // Try documented ways first.
45. // Only available on Vista SP1 and Windows 2008.
46. // http://msdn.microsoft.com/en-us/library/bb736299.aspx
47. FnSetProcessDEPPolicy SetProcDEP =
48. reinterpret_cast(
49. GetProcAddress(GetModuleHandle(L"kernel32.dll"),
50. "SetProcessDEPPolicy"));
51.
52. if (SetProcDEP) {
53. ULONG dep_flags;
54. switch (enforcement) {
55. case DEP_DISABLED:
56. dep_flags = 0;
57. break;
58. case DEP_ENABLED:
59. dep_flags = PROCESS_DEP_ENABLE |
60. PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION;
61. break;
62. case DEP_ENABLED_ATL7_COMPAT:
63. dep_flags = PROCESS_DEP_ENABLE;
64. break;
65. default:
66. NOTREACHED();
67. return false;
68. }
69. return 0 != SetProcDEP(dep_flags);
70. }
71.
72. // Go in darker areas.
73. // Only available on Windows XP SP2 and Windows Server 2003 SP1.
74. // http://www.uninformed.org/?v=2&a=4
75. FnNtSetInformationProcess NtSetInformationProc =
76. reinterpret_cast(
77. GetProcAddress(GetModuleHandle(L"ntdll.dll"),
78. "NtSetInformationProcess"));
79.
80. if (!NtSetInformationProc)
81. return false;
82.
83. // Flags being used as per SetProcessDEPPolicy on Vista SP1.
84. ULONG dep_flags;
85. switch (enforcement) {
86. case DEP_DISABLED:
87. // 2
88. dep_flags = MEM_EXECUTE_OPTION_DISABLE;
89. break;
90. case DEP_ENABLED:
91. // 9
92. dep_flags = MEM_EXECUTE_OPTION_PERMANENT | MEM_EXECUTE_OPTION_ENABLE;
93. break;
94. case DEP_ENABLED_ATL7_COMPAT:
95. // 0xD
96. dep_flags = MEM_EXECUTE_OPTION_PERMANENT | MEM_EXECUTE_OPTION_ENABLE |
97. MEM_EXECUTE_OPTION_ATL7_THUNK_EMULATION;
98. break;
99. default:
100. NOTREACHED();
101. return false;
102. }
103.
104. HRESULT status = NtSetInformationProc(GetCurrentProcess(),
105. ProcessExecuteFlags,
106. &dep_flags,
107. sizeof(dep_flags));
108. return SUCCEEDED(status);
109. }
110.
111. } // namespace sandbox
It's a really interesting read and there's a lot of stuff going on in the comments, like TODOs, HACKs, and the like. All the stuff you'd expect to see any application of significant size. Funny, it's been at least 5 years since I've thought about C++ deeply. And to think I used to do all this -> stuff full time for money!
There's lots more to see. Check out the About Box version checks where they were blocking on Vista SP1 with UAC disabled. Also, the Threading stuff is interesting as they have a Thread Class that was ported to Mac and Linux. Finally check out Pickle.cc, as they serialize objects by "pickling them." Pickle is serialization for Python, and this looks like they're serializing between C++ and Python, and this is a C++ implementation of Pickle.
Back on WTL, you can download the final MS release of WTL 7.1 at Microsoft Downloads if you're interested. However, the more interesting release is the 8.0 release from June of 2007. This was the most recent release from the community! WTL 8 includes full support for Vista!
I think it's great that Microsoft is releasing more and more code in either Shared Source, Reference Source, or my favorite, Open Source as MS-PL. The fact that Google was able to use it, even this small part, really speaks to the spirit of Open Source.
Related Links
WTL on Code Project by Michael Dunn
Part I - ATL GUI Classes
Part II - WTL GUI Base Classes
Part III - Toolbars and Status Bars
Part IV - Dialogs and Controls
Part V - Advanced Dialog UI Classes
WTL Yahoo Gruop - Still Active with 4500+ members
WTL SourceForge Project

11 Top Tips for a Successful Technical Presentation

Over five years ago I posted Tips for a Successful MSFT Presentation. Yesterday I watched the video of my Mix Presentation all the way through. It's always very painful to hear one's own voice but it's even worse to watch yourself. I never listen to my podcast and I avoid watching myself. It's like watching a person in parallel universe and it inspires self-loathing. However, if you are someone who values continuous improvement - and I am - you need to do the uncomfortable.

Here's my five-years-later Updated Tips for a Successful Technical Presentation.

1. Have a Reset Strategy (One-Click)
If you're going to give a talk, you'll probably have to give it more than once. If you have demonstrations of any kind, have a "one-click" way to reset them. This might be a batch file or Powershell script that drops a modified database and reattaches a fresh one, or copies template files over ones you modify during your demo.

Personally, I'm sold on Virtual Machines. I have seven VMs on a small, fast portable USB drive that will let me do roughly 12 different presentations at the drop of a hat. You never know when you'll be called upon to give a demo. With a Virtual Machine I can turn on "Undo Disks" after I've prepared the talk, and my reset strategy is to just turn off the VM and select "Delete Changes." A little up-front preparation means one less thing for you to panic about the day of the talk.

2. Know Your Affectations (Ssssssseriously)
I have a bit of a lisp, it seems. I also hold my shoulders a little higher than is natural which causes my neck to tighten up. I also pick a different word, without realizing it, and overuse it in every talk. This is similar to how Microsoft Employees overuse the word "so" (which is actually Northwestern Americans, not MSFTies) too much.

It's important to know YOUR affectations so you can change them. They may be weakening your talk. Don't try to remember them all, though. Just pick two or three and focus on replacing them with something less detracting. Don't overanalyze or beat yourself up, though. I've spoken hundreds of times over the last 15 years and I'm always taking two-steps forward and one step back. The point is to try, not to succeed absolutely.

3. Know When To Move and When To Not Move (Red light!)
One of the most powerful tips I ever received was this: "When you move, they look at you. When you stop, they look at the screen." Use this to your advantage. Don't pace randomly, idley or unconsciously. Don't rock back and forth on your heels. Also, empty your pockets if you tend to fiddle with lose change or your keys.

4. For the Love of All That Is Holy, FONT SIZE, People (See that?)
It just tears me up. It physically makes me ill. To give a presentation and utter the words "um, you probably won't be able to see this" does everyone in the room a disservice. Do NOT use the moment of the presentation as your time to do the font resizing.

Lucida Console, 14 to 18pt, Bold. Consider this my gift to you. This is the most readable, mono-spaced font out there. Courier of any flavor or Arial (or any other proportionally spaced font) is NOT appropriate for code demonstrations, period, full stop. Prepare your machine AHEAD OF TIME. Nothing disrespects an audience like making them wait while you ask "Can you see this 8 point font? No? Oh, let me change it while you wait." Setup every program you could possibly use, including all Command Prompt shortcuts, before you begin your presentation. That includes VS.NET, Notepad, XMLSpy, and any others, including any small utilities.

I've found that the most readable setup for Command Prompts is a Black Background and with the Foreground Text set to Kermit Green (ala "Green Screen." Yes, I was suspicious and disbelieving also, but believe it or not, it really works.) I set Command Prompts to Lucida Console, 14 to 18pt, Bold as well, with much success.

Also, set the font size to LARGEST in Internet Explorer and remember that there are accessibility features in IE that allow you to include your own Large Font CSS file for those web pages that force a small font via CSS.

Learn how to use ZoomIt and practice before-hand. It can be an incredibly powerful tool for calling out sections of the screen and making it so even the folks way in the back can see what's going on.

For simplicities' sake, I like to keep a separate user around call "BigFonty" (choose your own name). He's an Administrator on the local machine and he exists ONLY for the purposes of demonstrations. All the fonts are large for all programs, large icons, great colors, etc. It's the easiest way to set all these settings once and always have them easily available.

5. Speak their Language (Know the Audience)
When I was in Malaysia for TechEd, I spent 3 full days exclusively with locals before the talk, I learned snippets of each of the languages, tried to understand their jokes and get an idea about what was important to people in Malaysia. American analogies, much humor, and certain "U.S. specific" English colloquialisms just didn't make any sense to them. When it came time to give the presentations, I better understood the Malaysian sense of timing, of tone and timbre, and I began each of my presentations by speaking in Bahasa Malaysia. I changed aspects of my slides to remove inappropriate content and add specific details that would be important to them.

I've used this same technique in a half-dozen countries with success. While this is an extreme example, the parallels with any audience are clear. If you're speaking to a room full of IT guys who work in the Automotive field, or the Banking industry, the fact that we are all programmers only gives you a small degree of shared experience. Remember no matter the technical topic, try to get into the mind of the audience and ask yourself, why are they here and what can I tell them that will not be a waste of their time. What would YOU want to hear (and HOW would you like to hear it) if you were sitting there?

6. Be Utterly Prepared (No excuses)
Short of an unexpected BSOD (and even then, be ready) you should be prepared for ANYTHING. You should know EVERY inch of your demos and EXACTLY what can go wrong. Nothing kills your credibility more than an error that you DON'T understand. Errors and screw-ups happen ALL the time in Presentations. They can even INCREASE your credibility if you recover gracefully and EXPLAIN what happened. "Ah, this is a common mistake that I've made, and here's what you should watch for." Be prepared with phrases that will turn the unfortunate incident around and provide them useful information.

7. CONTENT, CONTENT, CONTENT (Have some)
Every move, phrase, mistake, anecdote and slide should actually contain content. It should be meaningful. Your mistakes should teach them, your demos should teach them; even your shortcut keys, utilities and menu layout should teach them. A presentation isn't an opportunity to read your slides. I'll say that again. Don't READ your slides. I can read faster than you can talk.

Remember that most people can read silently to themselves 5 to 10 times faster that you can read to them out loud. Your job as a presenter is to read in between the lines, and provide them structure. Your slides should be treated as your outline – they are structure, scaffolding, nothing more. If you jam your slides full of details and dozens of bullets, you might as well take your content and write an article. It's difficult to listen to someone talk and read their slides at the same time – remember that when you design your content. YOU are the content, and your slides are your Table of Contents.

8. System Setup (Be unique, but don't be nuts)
When you a presenting, remember that you are looked upon as an authority. Basically, you are innocent until proven guilty. It's great to have a personality and to be unique, but don't let your personal choice of editors or crazy color scheme obscure the good information you're presenting. I appreciate that you may like to use VI or emacs to view text files, but let's just say that sometimes Notepad has a calming effect on the audience.

I give Microsoft talks, usually, so I tend towards Visual Studio, but 99% of my talks use a limited number of tools. Basically Visual Studio, Notepad, the Command Prompt and a Browser.

Remember that while you may prefer things a certain way while your face is a foot away from the screen, it's very likely the wrong setup when 500 people are more than 100 feet away.

I really like to get Toolbars and things out of the way. I use F11 (Fullscreen) in the Browser a lot, as well as Visual Studio's Shift-Alt-Enter shortcut to FullScreen. Turn off unneeded flair and toolbars. Also, turn on line-numbering so you can refer to lines if you're presenting code.

9. Speaking (Um…)
"Volume and Diction," my High School Drama teacher said to me. Speak clearly, authoritatively, project your voice to the back of the room. The best speakers don't even need microphones. If you have a speaking affectation (I had a lisp growing up) or you tend to say, um, etc, or find yourself overusing a specific phrase ("a priori", "fantastic", "powerful", etc) take it upon yourself to NOTICE this mannerism and avoid it.

Practice multi-tasking. It seems silly to say, but although we can all multitask to a certain degree, when we hit a real snag in a presentation, many of us tend to freeze. Silence is deadly. Remember, since all eyes are on you, complete silence and apparent introspection says "I don't know know what I'm doing." When you need to get to a particular file, don't make the audience wait for you while you putter through explorer. Have shortcuts ready (and explain when you use them). Move fast and efficiently, but annotate your actions. You should continue to "color-commentate" your actions like a sports announcer. Don't allow "dead-air," unless it's silence for effect.

10. Advancing Slides (No lasers!)
I always used to hate slide-advancers, you know, those little remotes with forward and backward buttons. Then I tried one and I'm hooked. I use the Microsoft Presenter Mouse 8000 and totally recommend it. It isn't just a great Bluetooth mouse, but flip it over and it's a great Powerpoint slide advancer.

Take a look at Al Gore's excellent presentation in "An Inconvenient Truth." It's seamless and flows. Now imagine him running over to his laptop to hit the spacebar each time he wanted to advance a slide. My presentations have gotten better as I've started incorporating this technique.

11. Care (deeply)
I really avoid presenting on topics that I don't care about. I avoid it like the Plague and I encourage you to do so as well. There's nothing more important that truly caring about your topic. If you care, it'll show. If you eschew all the other tips, at the very least care.