• The Old New Thing

    Jag taler lita svenska.


    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 know.

    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.)

    I'm pretty sure nobody finds this fascinating aside from me...
  • The Old New Thing

    Why do I get spurious WM_MOUSEMOVE messages?


    In order to understand this properly, it helps to know where WM_MOUSEMOVE messages come from.

    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 state.)

    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 movement messages?"

    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.

    So if your program wants to detect whether the mouse has moved, you need to add a check in your WM_MOUSEMOVE that the mouse position is different from the position reported by the previous WM_MOUSEMOVE message.
  • The Old New Thing

    Why is the readonly property for folders so strange?


    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 slow networks.)

    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 still applies.

    Coders shold use the function PathMakeSystemFolder to mark a folder as requiring special attention from Explorer.

  • The Old New Thing

    Why you can't rotate text

    In a previous entry, I said that the word "Start" disappears because the alternative is worse.

    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.

    (Amy Smith)
    Amy Smith
    %&' (Amy Smith)
    Example 1 Example 2 Example 3

    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 Smith)".

    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" notation instead.

    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.)

  • The Old New Thing

    In case people got the wrong impression


    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 was.

    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 stilted enough"?)

    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.

    We did not get to spend as much time in Berlin as the city deserved. Berlin is a "real city" as opposed to Munich, which is a "tourist city".
  • The Old New Thing

    Back from Europe


    Here are some things I learned in Sweden, Germany and Denmark.

    • If you are an airplane pilot, you should avoid communicating on the emergency frequency unless you have an actual emergency.
    • In Sweden, marmalade comes in a flexible tube that looks like a really fat sausage.
    • Swedes can't handle spicy-hot food.
    • Road warning signs are blue-and-yellow in Sweden, but red-and-white in Denmark.
    • You can drive really, really fast on the Autobahn.
    • Never drive in the left lane of the Autobahn unless you are actively passing somebody.
    • When you ask at the cafeteria, "Gibt's Fleisch dabei?", and the guy says, "Nein, s'gibt kein Schweinfleisch", don't assume that he understood your question.
    • If somebody at Oktoberfest challenges you to drink your one-liter Maßbier in twenty seconds, you should decline.
    • If you vomit at Oktoberfest, they charge €25 to clean it up.
    • You really don't need to know that much information about lignite mining.
    • Parking in Copenhagen is free on Sunday. Putting money into the machine is a waste.

  • The Old New Thing

    When I dock my taskbar vertically, why does the word "Start" disappear?


    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" reappears.

    This behavior is by design. From a design point of view, a partial word looks very broken.

    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".)

  • The Old New Thing

    Pre-travel insomnia

    I can't sleep the night before an airplane flight. Certainly I'm not the only person with this problem, right?
  • The Old New Thing

    How much is that gigabyte in the window?


    Slashdot is in an uproar over a lawsuit charging computer manufacturers for misleading consumers over hard drive capacity.

    The manufacturers use the ISO definition, wherein a "gigabyte" is one billion bytes, even though most people consider a gigabyte to be 1024 megabytes.

    This is a tricky one. The computer industry is itself inconsistent as to whether the "kilo", "mega", etc. 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" inches diagonally.

    There do exist IEC standard designations for power-of-two multipliers. A kibibyte (KiB) is 1024 bytes, a mebibyte (MiB) is 1024 KiB, and a gibibyte (GiB) is 1024 MiB. Good luck finding anybody who actually uses these terms.
  • The Old New Thing

    Improving the world one bad analogy at a time


    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.

    This means that if you see a copy of svchost.exe going a bit haywire in Task Manager, you can't really tell which service inside it is responsible. For performance reasons, groups of services are thrown together and run in a shared process called svchost. Sort of like a reality TV show. Knowledge Base article 314056 describes how you can dig into each svchost to see which services are running inside it. This will at least narrow the problem down to a subset of all the services.
Page 429 of 436 (4,359 items) «427428429430431»