Holy cow, I wrote a book!
Attended my first formal Swedish lesson last night. It's great to recapture the simultaneous
thrill and frustration of trying to have a conversation in a language you don't really
It's a small class - Swedish isn't exactly one of the "big-name" languages out there.
I always feel sorry for the student who can't seem to shake the bad American accent.
I remember in high school, we had a student who spoke German with a thick Midwestern
accent. It was painful to listen to.
I thought it was just me, but it seems to be a common trait: When people are learning
their third language and they get stuck, they instinctively fall back, not on their
first language, but on their second. For me, it means that when I can't find the Swedish
word for something, I substitute the German word. One of my classmates falls back
on Spanish. (Technically, German isn't my second language, but I never got very good
at the other language before German, so German acts as the de-facto second language.)
In order to understand this properly, it helps to know where WM_MOUSEMOVE messages
When the hardware mouse reports an interrupt, indicating that the physical mouse has
moved, Windows determines which thread should receive the mouse move message and sets
a flag on that thread's input queue that says, "The mouse moved, in case anybody cares."
(Other stuff happens, too, which we will ignore here for now. In particular, if a
mouse button event arrives, a lot of bookkeeping happens to preserve the virtual input
When that thread calls a message retrieval function like GetMessage,
and the "The mouse moved" flag is set, Windows inspects the mouse position and does
the work that is commonly considered to be part of mouse movement: Determining the
window that should receive the message, changing the cursor, and determining what
type of message to generate (usually WM_MOUSEMOVE or perhaps WM_NCMOUSEMOVE).
If you understand this, then you already see the answer to the question, "Why does
my program not receive all mouse messages if the mouse is moving too fast?"
If your program is slow to call GetMessage, then multiple mouse interrupts
may arrive before your program calls GetMessage to pick them up. Since
all that happens when the mouse interrupt occurs is that a flag is set, if two interrupts
happen in succession without a message retrieval function being called, then the second
interrupt will merely set a flag that is already set, which has no effect. The net
effect is that the first interrupt acts as if it has been "lost" since nobody bothered
to pick it up.
You should also see the answer to the question, "How fast does Windows deliver mouse
The answer is, "As fast as you want." If you call GetMessage frequently,
then you get mouse messages frequently; if you call GetMessage rarely,
then you get mouse messages rarely.
Okay, so back to the original question, "Why do I get spurious WM_MOUSEMOVE messages?"
Notice that the delivery of a mouse message includes lots of work that is typically
thought of as being part of mouse movement. Often, Windows wants to do that follow-on
work even though the mouse hasn't actually moved. The most obvious example is when
a window is shown, hidden or moved. When that happens, the mouse cursor may be over
a window different from the window it was over previously (or in the case of a move,
it may be over a different part of the same window). Windows needs to recalculate
the mouse cursor (for example, the old window may have wanted an arrow but the new
window wants a pointy finger), so it artificially sets the "The mouse moved, in
case anybody cares" flag. This causes all the follow-on work to happen, a side-effect
of which is the generation of a spurious WM_MOUSEMOVE message.
It's actually a signal to Explorer to look harder.
It doesn't mean that the directory is read-only.
If a folder has the Readonly or System flag set, then Explorer will look for a desktop.ini file
which describes the folder customizations. For performance reasons, Explorer does
this only if the directory has the +R or +S flag. (This is enormously important on
There are two KB articles on this subject, and I will defer to them for much of the
discussion. This is the version
that applies to Windows XP and Windows Server 2003. There is also a
version that applies to older versions of Windows, although the UseSystemForSystemFolders policy
Coders shold use the function PathMakeSystemFolder to mark a folder as
requiring special attention from Explorer.
Somebody in a comment asked, "Why not draw the text vertically?"
Ah, now you get to learn about the exciting world of vertical text.
We originally intended to run text vertically in the new XP Start menu. In original
designs for the menu, your name ran vertically up the left side of the menu instead
of running across the top.
Rotating text is problematic in languages that traditionally run vertically, such
as Chinese. Since you probably don't have Chinese fonts installed, pretend that %, &,
and ' are the Chinese characters for your name. In traditional
vertical text, it would be written as shown in Example 1 below. Notice that the English
text is rotated clockwise. This preserves the top-to-bottom reading order.
As a concession to Western influences, it is permissible to render Chinese characters
left-to-right, in which case your name would be written as "%&' (Amy
Compare this to the traditional Western way of rotating text. Text which would normally
be rendered as "Amy Smith" is rotated counter-clockwise and rendered as shown
in Example 2.
Now consider what happens if you take a Chinese name rendered the Western way, "%&' (Amy
Smith)", then rotate the Western way, resulting in Example 3. Notice that from a Chinese
point of view, everything is upside-down! The character that is supposed to be at
the top (%) is now at the bottom.
Windows for many years now has been multilingual.
This means that the same underlying code runs regardless of language. Changing a language
merely changes the strings being displayed. This means that there can be no language-specific
UI. In this case, it means that we can't have separate rotation rules for Chinese
as opposed to English or German.
(And even if we were allowed to have separate rotation rules, we would have to be
able to tell whether the name was in the form above or was in the form "Amy Smith
(%&')". In this form, we should rotate it as in
example 2, since this is an English string with Chinese characters embedded; as opposed
to our example above where we had a Chinese string with English characters embedded.
Those of you who have seen Arabic and English mixed together get to see punctuation
marks bandied about with similar degrees of confusion.)
Multilingual support also explains why you see things like "1 folder(s)" instead of
"1 folder" and "2 folders". Why not have two format strings, one for when the number
of items is exactly one, and one for when the number of items is two or more?
Well, for one, that would significantly increase the number of strings we would have
to carry around. (If you say "just add s to make the plural" then you really need
to get out more!)
For two, some languages (such as Slovene) have a "dual" number in addition to singular
and plural. The Lahir language has singular (one), dual (two), trial (three), paucal
(a few), and plural (many). So now you have to have perhaps five versions of every
string that contains a replacable number.
This also explains why you see a lot of strings of the form "Property: Value" (for
example, "Last modified: Monday, September 29, 2003") instead of a phrase ("Last modified
on Monday, September 29, 2003"). This is necessary to avoid problems caused by grammar.
If you attempt to compose a phrase, you have to worry about subject/verb agreement,
gender and number agreement, declensions, all sorts of things that computers aren't
good at. The only safe solution is to avoid it entirely and use the "Property: Value"
We did get one special exception to the "grammar independence" rule: Personalized
folders. When you view somebody else's "My Documents" folder, it says "Chris's Documents".
We made this request to the translators and they worked really hard to make sure that
the templates for possessive forms were accurate in all the languages we support.
(Fortunately, we didn't have to deal with languages where the form of the template
depended on us knowing whether Chris is a man or a woman.)
I really did enjoy my trip. I just like talking about the goofy things.
I intend to go back to Sweden in the spring. I'm currently enrolled in Swedish lessons
but this trip came far too soon for me to have learned anything useful aside from
"tack", "ursäkta" and "Jag taler inte svenska." Though the lady behind the register
was exceedingly pleased to see a blatant foreigner buying Swedish children's books.
Everybody in Sweden speaks perfect English (it's quite embarrassing, actually), so
Swedes are honored when a foreigner actually bothers to learn Swedish. I'm told that
one of the factors contributing to astounding English-language abilities in Sweden
is that American TV shows and movies are not dubbed into Swedish when imported; they
are merely subtitled.
The Øresund bridge is totally awesome.
Amusingly, when you take the ferry from Denmark to Germany, the toll booth agent speaks
Danish and expects you to speak Danish. When you take the same ferry in the reverse
direction, the toll both agent speaks German and expects you to speak German.
The ferry schedules are published only in Danish. Just our luck, of all the languages
of all the countries we were visiting, that's the only one none of us knew. We had
a choice of two ferries, and we were unable to determine with confidence what times
each one ran, how much time the crossing lasted, and when the last ferry of the day
I studied German for five years, but that was a long time ago and my vocabulary has
decayed heavily since then. Actually, my listening ability never got very good. On
all the exercise tapes, they talk painfully slowly and clearly, whereas in real life,
people talk rapidly and don't enunciate clearly. I could usually follow about two
or three sentences before the rate of input exceeded my ability to process it. I got
around okay, but it was slow going. I've also been told that my German is overly formal
and stilted. (Is there such a thing as "overly stilted"? As opposed to what, "just
I am myself not a vegetarian, but my two travelling companions are. We discovered
the secret to finding vegetarian food: find an Indian restaurant or an Italian restaurant.
An Indian restaurant will have an extensive vegetarian menu. ("Scharf" is a good word
to know, too.) An Italian restaurant will have a few vegetarian options. We weren't
sure about German or French restaurants. We concluded that, while a French restaurant
is more likely to have vegetarian dishes or be able to convert an existing dish to
vegetarian, a German restaurant would be less likely to be annoyed at the request.
(We only tested this theory once: I stopped at a German restaurant and asked if they
had any vegetarian entrees; the answer was no.)
It's a good thing the glockespiel at the Marienplatz is so badly out of tune - it
sets expectations for the show that follows.
The important lessons at Oktoberfest were not learned by me firsthand, thank goodness.
The Deutsches Museum is ridiculously huge. We spent an entire day there.
Here are some things I learned in Sweden, Germany and Denmark.
Because the alternative is even worse.
If the taskbar is not wide enough to display the entire word "Start", then the word
"Start" is hidden. To get it back, resize the taskbar wider until the word "Start"
This behavior is by design. From a design point of view, a partial word looks very
Also, there is an apocryphal story of clipping text causing embarrassment during localization.
The word "Start", after being translated into some language, and then being clipped,
turned into a rude word. (As an analogy, suppose the text on the Start button said
"Start button", but it got clipped to "Start butt". Now you have to explain to people
why they have to click on the "Start butt".)
is in an uproar over a lawsuit charging computer
manufacturers for misleading consumers over hard drive
The manufacturers use the ISO definition,
wherein a "gigabyte" is one billion bytes, even
though most people consider a gigabyte to be 1024
This is a tricky one. The computer industry is itself
inconsistent as to whether the "kilo", "mega",
prefixes refer to powers of ten or powers of two.
The only place you see powers of two is when
describing storage capacity. Everything else is
powers of ten:
Your 1GHz processor is running at one billion cycles
per second, not 1,073,741,824 cycles per second.
Your 28.8K modem runs at 28,800 bytes per second,
not 29,491. And your 19" monitor measures only 17.4"
One thing I am known for at Microsoft is my frequent use of bad analogies. Everybody
else at work has had to suffer; now it's your turn.
Why are there so many copies of svchost.exe running? What is svchost.exe anyway?
Traditionally, each service runs in its own process. When you are developing and testing
your service, having it in its own process makes debugging a lot easier.
But if you look at your list of services (in Computer Management, Services), you can
see that if each one got its own process you'd sure have a whole lot of processes
lying around. Since there is a cost to each process merely for existing, having so
many processes running would be a waste, since many services are used only sporadically.
Tapisrv, for example, is active only when you are doing things with your modem.
For performance reasons, groups of services are thrown together and run in a shared
process called svchost. Sort of like a reality TV show, but without the voting.