Postings are provided as is with no warranties, and confer no rights. Opinions expressed here are my own delusions; my employers at best shake their heads and sigh, at worst repudiate the content with extreme prejudice, whenever it manages to appear on their radar.
This blog is unsuitable for overly sensitive persons with low self-esteem and/or no sense of humour. Proceed at your own risk. Use as directed. Do not spray directly into eyes. Caution: filling may be hot. Do not give to children under 60 years of age. Not labeled for individual sale. Do not read 'natas teews ym' backwards. Objects in mirror are closer than they appear. Chew before swallowing. Do not bend, fold, spindle or mutilate. Do not take orally unless directed by a physician. Remove baby before folding stroller. Not for use on unexplained calf pain.
A nice FLAIR (FLuid Attenuated Inversion Recovery) view from the not-too-distant past. Every abnormality you can see on this scan (and there is more than one!) is asymptomatic at present. Alongside is a picture of me walking the walls at Fremont Studios, a sign of a damaged brain.
I thought regular and semi-regular readers might like an update on life with the IBOT, after I blogged about getting one in Cogito ergo cathedra... (I think, therefore IBOT...) a few days ago.
If you're not interested, then you can leave now. :-)
This may or may not be a series, it depends on how things go, like whether one seems needed.
So I went in ready -- like taking the English instructions to baggage handler types on dealing with the IBOT:
and the Spanish instructions:
printing them both out, then getting them laminated as a nice double-sided sheet -- which I will include with the IBOT, any time I travel.
Who says Kinko's can't be fun? :-)
After several instances of baggage handlers at destinations screwing up the scooter in both large and small ways, I decided it would be best not to take chances with a unit that costs more than 25 times as much as the scooter did!
But anyway, about the transition.
Obviously we are dealing with two entirely different steering systems:
Now the differences here are fairly obvious, for the most part.
In fact, when going forward, a smooth turn under power in the scooter handles a lot like a smooth diagonal push of the joystick.
Though obviously the combination of the zero turning radius side movement with forward movement can make the joystick handle with a bit more roughness when the movement is not as smooth, something that doesn't happen with the scooter.
Just something that will get better with practice -- the fact that I no longer have to back into elevators and offices is by itself so cool that I don't miss the finer points of scooter navigation. :-)
Going backwards is a bit harder though, since the nature of the movements when using the scooter versus the IBOT, which so closely tie together in forward movement, are pretty much reversed when going backward since the nature of the zero turning radius movement is unchanged.
THUS, going backwards in the scooter while turning the handlebars to the right will move the scooter back to the right, while going backwards in the scooter while pushing the joystick toward the right will actually move the chair to the left.
At some point I will draw this out or find someone else's drawings, as I don't find the above description to be very satisfying, and not everyone will want to take the descriptions a\and work out the physics for themselves. But in the meantime, just imagine combining a clockwise turn with a backwards movement and think about what way the scooter will be pointing.
You might see what I mean. :-)
Or if you have been steering a boat before you will understand this idea. That might be where I get pictures from.
Tonight I am going to head to the Stumbling Monk for a chess night, in the IBOT. In fact by the time you are reading this if you were waiting anxiously for the 12:01 AM post, I will be on my way home, perhaps after having gone backwards twice to get on the bus, which I am really happy that I will be doing at uncrowded times as I fighting over a year of muscle memory when I do it and I'd just as soon have fewer witnesses, if you know what I mean.
I can also talk about hills, living in a city whose downtown isn't exactly San Francisco but isn't exactly the flattest part of Kansas City, Kansas either.
With the scooter, they recommend not more than a 20° incline but to be honest I have done 30° with no trouble. But I have tripped the circuit breaker trying with higher inclines, some of which exist in Seattle. When it happens there is nothing to do but wait 30 seconds, hit the circuit breaker reset, and try again. I have had occasional hills that required doing that 4-5 times while I cursed choosing the wrong street to go on.
But with the IBOT, the incline is not really so much the issue -- it can handle even steeper inclines. Just take the hill head-on rather than at an angle, an even during training around the streets outside Swedish Medical Center I had steeper inclines. That is a change I'm much happier about, as I'm sure you can imagine. :-)
I'll probably talk about all of this later.
For now, I'll move on.
Let's talk about height.
When I graduated from high school in 1988 in Philadelphia PA, I stood tall and proud at 5'8".
A few years later, with the MS I suddenly found standing for long periods of time was harder, yet I did manage to gain a couple more inches so I was able to stand a proud 5'10", when I stood. Perhaps a lare growth spurt, perhaps it was marrying young. The spurt stopped after the divorce, so maybe she was the inspiration. :-)
Eventually, in the scooter, I found myself looking up to those I used to gaze upon at eye level, in my more diminished 4'1". I even tried to change the height to 4'1" at the DMV, though they said no dice. Aparently even if you are paralyzed driving with hand controls they want a real height, I guess measured lying down. Or estimated. It's not like they weighed me.
Anyway, now with the IBOT in balance mode and full verticalk extension I am once again 5'8".
I feel like I just graduated from high school again! In more ways than one. Or something like that.
Well crap, I could talk about being able to hit 5" curbs and climb over them without blinking or not being blocked by steps. And all of that is cool too.
Either way, I swear I'd like to find the original doctor who signed the initial NOT MEDICALLY NECESSARY rejection letter -- flying to him if that is what it takes -- wheel up to him in my IBOT in balance mode, and tell him that human dignity may not be medically necessary.
But health insurance that can't pay for human dignity for those who are sick is stupid, lame-ass health insurance, and it was a pleasure to go over his head to find people who understand that.
After which I'll break my safety rules and "accidentally" run over his foot. :-)
This post brought to you by ♿ (U+267f, a.k.a. WHEELCHAIR SYMBOL)
Another post about moving to the IBOT ! :-)
After I blogged From I SCOOT to IBOT, #1 of ??, I did leave some people hanging, wondering how the evening went.
How the IBOT was going.
You know, what lessons I learned, etc.
And more on the differences between scooting and IBOT-ing. :-)
I'll start with the trip to the Stumbling Monk for game night on Monday night.
I took the 545 to Seattle and get off at Terry and Stewart.
I took the 8:13pm because last time it took me nearly an hour to make it up the hill that is Dennhy Way there, whatwith the sskow trek up the too-steep hill, punctuated by the occasional stop-and-wait-and-hit-the-reset-button dance and all. Not to mention that it really is uphill and the little scooter that could definitely is not a high-speed climber.
Anyway, I leave the apartment in balance mode, because it is the best one for getting ariund the corner of the jacuzzi right by the door. I might have rethink some positioining eventually, but for now it works.
I decide to slip down to standard mode for speed as soon as I hit the walk outside the apartment . It's faster (up to 6.8mph!) with a bit less control, but good for wide open spaces when the best thing you can do is move through the pasce and on to some place interesting.
Then as I go up the hill after 156th heading toward the highway, I move into 4-wheel mode. Slower (max speed 4.8mph), but much better for hills and such. Much more stable since the gyroscopes are on and actively working to keep me upright.
By the way, did you ever have people telling you to use your inside voice when you were inside, because you were too loud? Well, 4-wheel mode is like really only outside wheels; I have actually brought uo the clearly-done-by-lowest-bidder squares of carpet in building 14 just by turning in that mode. So 4-wheel is not for indoors. :-)
Anyway, I get to the bus stop, slightly early because I am so used to doing it in the scooter thast I forgot I asm dking something faster now. It's just a few minutes.
I go into balance mode as I wait. I'm know I'm showing off since I already decided to get on the bus in standard, but I can't help it. It's fun and people love to talk about it. If I enjoy and so do they, then who am I to deprive us? I know I'll get bored eventually, but for now let's have fun.
Backing on to the bus is as hard as I thought it would be due to the very different steering mechanisms of the scooter and the IBOT. Backing on to the bus had becomes second nature; I was fighting muscle memory now, and even at low speed, the loer amount of control in standard mode is something people clearly aee as thy watch me back and file a bunch of times.
I'm embarrassed, but I carry on.
The driver is not sure where to tie me down but I show him the dedicated tie-downs, which I think he liked -- the are easy for him to reach and we are quickly ready to go.
One person runs onto the bus at the last moment, and now I don't feel as bad for my earlier trouble getting on -- she would have missed the bus had I been more coordinated, by like 45 seconds. :-)
The front is very uncrowded, with people sitting just behind the spot for wheelchairs. It occurs to me that I would be better off (when there weren't a ton of people on the bus) going on the bus forward, in balance or 4-wheel modes, and turning in place!
I make the mental note for the return trip, and then we are off.
I get off the bus in 4-wheel and am mch more coordinated. The bus driver seems much happier with my control, which I am sure he attributes to going forward rather than backward (though I think it was mostly the better mode; standard is not for indoors or tight spaces!
Anyhow, I Am off now at Stewart and Terry, asnd I slide over to Denny. I look at the hill that I have now climbed many times but never in this vehicle, and I pause wondering what it'll be like.
Ah well, the only way to find out is to do it -- I had on up.
I am shocked at how well it is able to maintain as much of the speed that it does going up the hill. I make it to the Stumbling Monk early, and just outside I move into balance mode, full height.
I remember how tall the bar is, and for the first time I am going to be able to see over it when I order a Belgian beer that I've never heard of.
The bartender does not recognize me, though he did before. It is the scooter, people remember it. But they remember the IBOT too, and it is easy to see why people wouldn't make the connection!
Some small talk, people I know start showing up and then throughout the evening people are curious, asking all the usual questions (is this a Segway, how does it stsnd up on two wheels, what if the power runs out, how much did it cost, did Microoft pay for it, how fast does it go, etc.).
Geeks love it an start getting all tech on it. And Seattle has more geeks per capita than most towns I have been in. Hell, I m one of them!
We are playing speed Scrabble. My poor finger dexterity works against me but I don't mind. We are having fun which is really what counts. :-)
When it's time to go, I head out. Straight down Olive Way, the whole way. all the way to the 545. I m on time rather than early, though the bus is late. I pass the time talking to two of my fellow busser folk, one of whom is really mad about her Tarot reading that was rushed because of the people asking too many questions before her. It is interesting just watching the rant so I listen and comment and express outrage at the times that I imagine I would be outraged if I believed in the things she spoke of.
They love the IBOT, and have their questions too. Still fun, believe it or not!
I point out that it must have been karma -- if the other two of them had not had a bus that came early which they missed and had I not had a bus that was late, this conversation would never have happened.
Both of them are delighted at my conclusion and agree very firmly.
When the bus finally arrives, I think I am about to get hugged or something, but they refrain since they don't want to tip me (I was not really in a hugging-strangers mood, or I would have talked about the gyroscopes; the whole thing put me in mind of Suzanne Vega's recent Hugging and Kissing blog she posted, with the obvious exception that I'm not a celebrity, though I totally understand where she's coming from).
I go on the bus in balance mode forward, turn in place, get in position, and move to 4-wheel. It is all very fast and people who are watching it clearly think I've done this before. Which
I haven't but I'm finding my groove, I think. :-)
All things considered, the IBOT experience of the Stumbling Monk was far superior to the scooter one. Even for a first time; I imagine it is only going to get easier now that I am getting a better handle on modes and when to use them in various situations....
Of course today there is a team lunch in a place that would require two buses to get to and three buses to get back from, so I am tempted to take the small scooter to work today and put it in someone's trunk. Or use all this saved up energy and go with just a cane, maybe. We'll see.
Tonight a bunch of us are going to Matador in Redmond. Pop by if you like and come up and say hi, too. Just don't ask to hug me? :-)
Regular reader Jan Kučera, in response to Stripping is an interesting job (aka On the meaning of meaningless, aka All Mn characters are non-spacing, but some are more non-spacing than others), asked in a comment:
Any way for the .NET Compact Framework people out there? (as the normalization does not seem to be available for them...)
Yes it is true, Unicode normalization support like System.String.Normalize does not exist in the Compact Framework.
By the way, I know Jan did not ask the question in the title!
But I suppose that is why they call it compact, in part -- because they didn't put everything in there. :-)
One can always do it oneself, I suppose -- Unicode Nornalization can be implemented by anyone!
And as I mentioned almost four years ago in Normalization and Microsoft -- whats the story?, one can always just call FoldString and get a bunch of the functionality -- just not everything since the tables aren't as up to date.
Or one could find some third party library and call it. Anyone have a favorite?
All of this is a lot of work to perform a destructive job like stripping -- note that although I never judged Valerie for her choices vis-a-vis stripping and school, I do tend to judge code that strips out diacritics that actually might contain meaning. Negatively.
In other words, I may have provided the code to do it (code that to be frank is much better than this code, for several reasons that I'll get into some other time), but I still judge the people who use it.
This is the very combination of logic and meanness that can drive nice people insane -- good thing I'm not nice! :-)
This post brought to you by ピ (U+30d4, a.k.a. KATAKANA LETTER PI)
(This is a post about Limonata)
or, to use the newer can style in my art:
In the middle of last year when I mentioned There is no more Limonata at Trader Joe's and the fact that Trader Joe's had chosen to stop carrying San Pellegrino Limonata.
Anyway, the situation is getting worse again.
Larry's in Redmond has been out of it for several weeks now. And they have no word on when they will have more -- they are on the verge of taking the shelf space away, apparently.
I negotiated a temporary discount at Whole Foods while I look into a more permanent episodic discount at Costco or Sams or Whole Foods or somewhere.
If all else fails, I guess I'll have to move to Italy.
Anyone in Italia looking for someone who knows a lot about globalization and drinks Limonata like it was water except he enjoys it more? :-)
To Larry's, I say: FEH. Perhaps it is because I do so much with an operating system, but I need a much more reliable uptime....
This post brought top you by ف (U+0641, aka ARABIC LETTER FEH)
So it was actually a couple of days ago (in the blog titled What a tangled web we weave when a KLID from an HKL we must receive) that I painted a picture that would cause any normal, sane developer charged with working with keyboard layouts to either run out of the room screaming or to collapse into despair, convinced that Microsoft designed all of this exclusively to make their lives more difficult.
Lucky for us that so few normal, sane developers around these parts! :-)
Now as a responsible blog author, I really need to inject some calm into the situation.
I mean, just because I'm unofficial doesn't mean I'm supposed to hit the fire alarm, after all....
With that said, the blog you are reading now is not going to reassure; that will happen in a blog later this week.
For now I am going to turn up the heat.
Did you know that every time you add a keyboard layout to Windows, it stores a bunch of information?
Let's tabulate some of it:
Now you'll notice that on top of the keyboard is a language, and it shows up everywhere.
But underneath, there is this other language. And that is the one that seems to control a whole bunch of the underlying behavior of the keyboard layout.
This setup mostly makes sense -- after all, if you put the Hebrew language on top of the Cyrillic keyboard layout on a system with an en-US system locale:
then you would not be very well-served by running your non-Unicode application's input through code page 1252 and your console applications through code page 437 (as the default system locale might recommend).
Just as you would not be well-served by running your non-Unicode applications input through code page 1256 and your console applications through code page 862 (as the user's chosen "language atop" might recommend).
The best locale to base the decision off is the one associated with the layout itself.
What a wonbderful coincidence that this is the actual design!
Uh oh, I was trying to make people less at ease in this blog. I need to point out why this is bad, not why it is good.
Well, remember the central message of What a tangled web we weave when a KLID from an HKL we must receive -- that it is hard to get a KLID if you have an HKL.
But all of this information inside the input language that does all of this work and makes all of these decisions is KLID-based!!!
And very hard to get, just like KLID, but a little harder since you need to get a little bit more information once you are exhausted from getting the KLID.
This means that if you have a non-Unicode legacy application and you need to convert the input to Unicode, you are not given the best information do the conversion.
And then there has been the occasion that the data has been wrong, like in Vista prior to a hotfix and SP1, leading to the problems covered in Double Secret ANSI, part 1 (Somewhere between ANSI and Unicode) and Double Secret ANSI, part 2 (the brokenest one yet, sorry 'bout that!).
Why are USER (keyboards) and GDI (fonts) tied together here so tightly, you might wonder? Well, most of the code that does this work is in WIN32K.SYS, and these two components help each other out.
Now wait a minute -- as bad as that bug is, we fixed it. How is that supposed to cause unease?
Well, let's try this on for size....
The bug might not be 100% fixed just yet. (insert evil laugh here?)
And then there is the actual flaw to discuss.
Remember Understanding (and explaining) why English is everywhere from a couple of years back?
It explains why/how most locales have the regular old KBDUS.DLL vanilla US English keyboard avalable.
Do you see the problem yet?
I'll give you a hint -- the KLID is 00000409.
Second hint -- the underlying ANSI code page (ACP) is 1252.
Last hint -- the underlying OEM code page (OEMCP) is 437.
Now 437 is okay if you are in pure English, but it kind of sucks for dealing with almost any other language supported by code page 1252 (which is why most of the locales that have an ACP of 1252 have an OEMCP of 850 and why most of them wish the had an OEMCP of 858 -- so that their language would be supported well in the console).
But the alternate keyboard layout that exists for most locales does not provide good support for even the locales that it could, in the console.
And there is no workaround for this other than using existing layouts or defining your own layouts based on a locale that would actually be useful.
Yuck.
And what about the fact that most IMEs and text based TIPs have the underlying 00000409 keyboard underneath them?
Double yuck.
Alright, that's enough for now.My heart is not in the task of trying to make people panic. I'll end this trilogy on a much happier note, soon. :-)
This blog brought to you by এ (U+098f, aka BENGALI LETTER E)
Late last week, Jan Kučera asked over in the Suggestion Box (which I am thinking of renaming to Jan's Place, soon!):
Hello.. I have a short one today: Could I use the MSKLC to make for example the B key to act as backspace key (and if so, how :))?Thanks!
Very good question.
The quickest answer is just two letters and a punctuatuon mark:
No.
The slightly longer answer is:
No, MSKLC cannot be used to muck with the backspace.
But this answer, while technically true, has me making an assumption that most people wouldn't make.
I am treating MSKLC as meaning msklc.exe, rather than the full Microsoft Keyboard Layout Creator installation, while most people would actually assume the latter and not the former.
Because just as with other blogs that talk aboput the .KLC file and KBUTOOL.EXE, like Pimping your Brazilian keyboard and In case you have a yen to extend your keyboard (or at least want a yen?) and so forth, there is a way to muck around here some....
You see, there are certain defaiult entries that evry keyboard has, and KBDUTOOL.EXE automatically adds them at build time if they are not already specified in the .KLC file.
Which means that you could specify them!
Some of those entries (with their default values on a US keyboard) are:
0e VK_BACK 0 0008 000801 VK_ESCAPE 0 001b 001b0d VK_RETURN 0 000d 000d53 VK_CANCEL 0 0003 00030f TAB 0 0009 0009
and of course you would need to change the scan code in front of each one you wanted to change (like in Jan's case, taking the scan code off the "B" and using that value should do the trick!).
Make sure to remove any duplicate entries in your own file....
Now one warning -- since these values tend to never change, the fact that you are changing them may fail in some applications that were assuming they would never change. Whether this is their bug or yours is an interesting philosophical issue but I'm sure you can imagine that you will be at a disadvantage when you argue the point with them.
The moral of the story of the whole blog is that sometimes it is worth waiting for the longer answer. :-)
This blog brought to you by U+0008, aka BACKSPACE
Previous blogs in this series of blogs on this Blog:
If you have been following this series, you might be wondering what comes next.
Perhaps it would be about selection and all of the interesting issues there (especially the weirdnesses with selecting partial elements in some cases and more interestingly the way we would think it weird if partial elements were not selected in other cases. It may be impossible to separate our intuitive expectations coming fresh into computers from our intuitive behavior based on generations of typewriters and then computers.
But it is really kind of old hat, minus an issue or two like the ones summarized in More on cursor support: the rest of the answer and the earlier blogs it references, plus a blog or two where I mention how weird it is to select half a surrogate pair or half a composite (decomposed) character -- like the cases I mention in More on cursor movement.
And when you get down to it these issues really are a natural extension of the ones involving cursor movement -- since selection is often just moving the cursor with shift key held down (and has top behave the same way even when it's not).
Or I could go down the road of how the more destructive operations (e.g. the BACKSPACE key and the DELETE key) come into play here, though they are two just natural extensions of cursor movement and selection (the one major difference being the exception I describe in BACKSPACE vs. DELETE and What do you get when you combine a base character with a buttload of diacritics? and really I think the behavior difference between BACKSPACE and DELETE is pretty sensible, and pretty defensible.
If you want to get into the one that is harder to suss out, I would say it is probably easier to get confused about the difference between the BACKSPACE key and the BACK ARROW key. The fact that these two do not behave the same way is explainable but may be even less intuitive....
And of course none of it should happen for surrogate pairs in any case -- thy should always be whole units and never split out, as the blogs above mention.
But in the end what is left to talk about?
The main thing that is left to describe in this series is explaining what support a product should add to a product if it is Unicode but thoroughly "USC-2" based using the definitions in this series, and one wants to move it up to be "UTF-16" based.
In other words, the obvious remaining practical question is what work needs to be done?
And that is a very good question.
Now for my example I will use a product that simultaneously
And that product type is databases.
The first criteria is met by the fact that they have a firm base in the middle of allocation issues -- whether it is column lengths or whatever -- and also "character" based parameters/syntax in SQL.
And the second is met by the fact that if you look at the categories from earlier in this series the second and third categories (and if you include SQL Server 2008, the first category as well) is well handled by the collation support used by the engine for almost all of its comparison operations, even the ones it should not!
This schizophrenic behavior is one I have mentioned in the past in blogs like Wild[card] thing, You make my CHAR sing and the follow-up to it, with the other side of the equation somewhere in the realm of blogs like the Freudianly-themed Sometimes a WCHAR really *is* just a character.....
Perhaps with With SQL Server (and SQL itself) comes the illogic of 'trailing spaces' (and the myth of fixed width) thrown in for good measure....
But here and now we run into a bigger problem --to do a full job here, up to three things would be needed:
Now obviously these three items while being simple enough conceptually could lead to a ton of actual work, so how much would actually be needed would have to be triaged.
And ideally, if one can get away with just extending existing support, that would be much better (as would handling all three categories of linguistic character) rather than just some if them).
Next time, I'll talk about some of the triage rules.
This blog brought to you by ດ (U+0e94, aka LAO LETTER DO)
Well, not really.
Unless you extend the definition of family to include things that are not really alive.
My 1995 Saab 900 died.
She was kind of a person to me, though I do not share her name with anyone. That's something private, sorry!
Yes, this is the one I fixed the roof on. In retrospect I could have saved a few thousand and just not fixed it. Ah, hindsight....
The exact cause of demise is three blown cylinders in its V6 engine, secondary to a broken timing chain.
She is currently being kept alive on machines, which diagnosed the condition, in a garage. But obviously this cannot last forever, as they will want the space back soon.
I was thinking I'd see if some high school auto shop wanted to take on the engine rebuild as some kind of project, though lacking children of any age I don't know much about high schools around and whether any of them would be looking for such a donation. Perhaps regular readers in Seattle who know how such things might be made to work could suggest something.
Then I was going to buy another car, and I asked myself if I really needed one, since I really almost never drive anymore. Perhaps it is time to take the bold step of declaring my independence of foreign oil by no longer owning an automobile.
My assistive devices seem to be stepping up adequately.
And the insurance company will probably survive if I no longer have to pay premiums and I am willing to lose my "continuous coverage" bonus since the zero premium discount will trump it anyway.I will even get some money back, I think!
Plus the state of Washington can survive without me shelling out money for my vanity tags each year.
Hey I won't have to go through emissions next year!
People who I go to lunch with will be stuck driving when we go off campus, but I think I can pick up some extra checks to make up for that nicely enough. And of course I'll have the handicapped pass so being the driver when I'm around gets really nice as we get closer and closer to the holiday season. :-)
When I started this blog I was not 100% convinced, but I think I've talked myself into it. I will be automobile-less, for the first time in over 20 years!
Onward we (by which I mean I, the royal we) scoot....
This bloog brought to you by 𐃏 (U+100cf, aka LINEAR B IDEOGRAM B243 WHEEL)
Off-topic, irreverent, but with a kernel of truth in it for people who care about such things....
I don't think that a blog has the force of law or anything, but hopefully when I die those charged with deciding how to dispose of my body will respect wishes I write here.
This blog contains a few of my wishes.
Basically, I want to be buried, not cremated. Just in case the faith I grew up in correct about my heavenly body somehow being linked to my early one, let's not make my remains suitable for a blender or easily mistaken for a urn full of herbal tea.
I realize how ridiculous the claims might be, but again just in case I am wrong I' like to cover this one base as best as I can.
I'd like a small non-gaudy headstone with the following words on it:
Michael Kaplan 1970 - <insert date of death here> Generally thought to be bad attrition
Michael Kaplan
1970 - <insert date of death here>
Generally thought to be bad attrition
Nothing else needed or probably even wanted.
This what I strive for every day, in what I think is a much more constructive way to think of things then treating every day as if it is the last day of your life just in case it might be.
My fondest hope is that those left behind will consider my loss to be bad attrition...
Can one ever really do better than that? :-)
This blog brought to you by 歹 (U+2f4d, aka KANGXI RADICAL DEATH)
Now going through the previous parts, there are two conclusions that developers and architects can come to:
It was ever about UCS-2; it was never about UTF-16. It was about character identity, and the desire to not destroy meaning....
But it is important to look at the full scope of the kinds of things that users might expect here.
The other day a mail thread involving the "delete" aspects of the problem inherent in how to safely truncate a string talked about several aspects of the problem.
In that thread, Peter Constable suggested:
SCRIPT_LOGATTR::fCharStop returned by Uniscribe’s ScriptBreak() API ought to tell you valid truncation points – including not to break between surrogate pairs, between a base character and a combining mark, or within Indic clusters.
This gives a practical suggestion to handle many of the problems pointed out earlier, problems that encompass the first two of the three major categories of linguistic characters I defined earlier in the series.
Peter then went on to mention:
One case that won’t tell you, though: In Thai and Lao, it’s best not to break between {U+0E40..U+0E44, U+0EC0..U+0EC4} and a following consonant letter {U+0E01..U+0E2E, U+0EC1..U+0EAE}.
Now these two cases actually also happen to fall under the third category which I named as sort elements, since these are the kinds of things that would also tend to impact collation operations.
Though the fact that a "collation dude" like me would call them sort elements while a "font dude" like Peter would not suggests that perhaps a name that encompasses a wider description of what these items would be might be in order. Otherwise we are each being partially functionally descriptive but not in any kind of robust, complete way.
In this case the result is the same, and plus there is no function to get all of the information, so naming it might be less important at the moment. :-)
There are also another aspect of truncation that was discussed in the thread, such as:
Also additional support for Arabic [could be] added since when breaking in the middle of a word, the character shape would change from the medial or initial form to the final form... ...inject a ZWJ to keep the form from changing so the user has context that additional text follows and wouldn’t change the meaning/context.
Note that this is a new idea that has not been discussed before in this series, or indeed this blog. I am still wrapping my had around the validity of the notion since to a native reader of the language the different forms really are the same letter, and I am not convinced that the confusion of truncating in the middle of a word would be mitigated appropriately by such an approach.
Another interesting issues related to the Thai case that Peter mentioned was that while a user might occasionally expect cursor movement and/or selection to respect those category-three sort element boundaries, they would for the most part actually expect the cursor to be able to put in the middle of the sort element, and most might never have such an expectation.
This is similar to the way (to use the earlier example for sort elements) a Hungarian user might expect dzs to be handled.
At this point it may be a challenge to find a user who is sophisticated enough to ask about expectations who does not have decades of experiences with typewriters and/or computers that have already built up expectations of proper behavior. and for every case where a user might expect multiple characters to be treated as one for movement/selection/deletion due to their experiences with dead keys, there can be just as many cases where the fact that the underlying entry/storage mechanism has multiple characters does not even allow for the possibility of treating the cluster as a single character.
Thus we have a design flaw in the platform where the underlying entry/storage mechanisms are guiding "expected" behavior, rather than the other way around.
Then we can look at yet another aspect of the problem: the way .NET does things.
You know how I quoted Peter Constable's ScriptBreak comments earlier?
This is an idea I mentioned before, in blogs like Stick a fork in GetCharacterPlacement and Sometimes you need more than StringInfo.
Now that blog prophetically talks about how StringInfo can't do it all here (in fact it only handles most of those first two categories of linguistic character boundaries without giving any of the word boundary information).
Add to it the fact that all of the methods that used to take just a System.Char -- for example Char.IsLetter(Char) -- now have a second overload that takes a string and a length -- for example Char.IsLetter(String, Int32). These have only one purpose -- handling surrogate pair handling. Thus all of the other times when a user might think of it as a character or even Unicode would think it is a grapheme cluster or a character via canonical equivalence are ignored.
And this addition of dozens of overloads to .NET >= 2.0 is a partial bandage over a perceived limitation -- the inability of functions to handle surrogate pairs properly -- that ignores all of the other scenarios here.
And .NET has no built-in support for the kind of things ScriptBreak can tell you, which are largely based in what Unicode and its character properties reveal (even though lots of the underlying properties are available via the CharUnicodeInfo class).
I guess this is what happens when the typography and rendering folks are not involved in design discussions that the core NLS folks work on. :-)
But you can see how lots of the pieces are available here, and can be used. Note that if in truncation you use the ScriptBreak-provided word break opportunities for your truncation then you will be able to support all three levels of linguistic character since none of then would survive a word-breaking opportunity!
This blog brought to you by එ (U+0d91, aka SINHALA LETTER EYANNA)
The question I got the other day was a "slightly less suitable for families" version of this blog's title.
It came out of It used to be right, dammit!, and reader Jon was kind of confused as to why this flag and so many other *_USE_CP_ACP flags are used in the various NLS API functions that also take a locale.
I may have unintentionally encouraged the "off" language by my own blog's use of the word dammit so I'm not speaking ill of the word used; I'm just trying to show a little control. :-)
Now the reason for having LOCALE_USE_CP_ACP and related flags is simple enough.
You see, if you call the ANSI versions of functions like GetDateFormat (i.e. your call resolves one way or another to GetDateFormatA) then by default the code page that will be used to convert from the Unicode data in Windows is the default system code page (ACP) of the locale you pass in.
This functionality is the hallmark of the double secret ANSI applications I first mentioned in Double Secret ANSI, part 1 (Somewhere between ANSI and Unicode).
This is a great feature -- when combined with support within GDI and the USER subsystem it allows non-Unicode applications even on Win9x to support characters off the default system code page.
However, most non-Unicode applications don't bother with such things, and stay firmly within the CP_ACP of the machine they are running on.
For them, the use of double secret ANSI-type features are not only unhelpful, but they are also kind of dangerous since the data is treated as already being converted from Unicode, even though it was converted incorrectly from the application's point of view.
In such cases, it is usually safer to get back a question mark ten to get back the wrong character -- which is what you would other wise get for any non-ASCII ( > 127) piece of the ANSI string.
And that is where LOCALE_USE_CP_ACP comes in. It gives you that question mark in such cases!
Of course since most applications are not double secret ANSI applications, the fact that the default is basically to support the double secret ANSI stuff while not supporting it requires an opt-in flag does seem like a strange choice, but keep in mind that keyboards don't really even give you the choice in the first place, and the flag itself was added later as a way to help mitigate a reported bug -- it is too late to change a default behavior when you've already shipped it for several versions....
When the issue was mitigated, it was a simple bug fix for the NLS subset of the Win32 API, not for all of Windows.
Thus LOCALE_USE_CP_ACP and its related cousins are always there and available, even though other parts of the double secret ANSI world don't have such a mechanism available....
One could perhaps argue that if such a mechanism existed that bugs like that mentioned in Double Secret ANSI, part 2 (the brokenest one yet, sorry 'bout that!) would be just as debilitating, though perhaps not as confusing!
This blog brought to you by ? (U+003f, aka QUESTION MARK)
Now ordinarily I would apologize to René Descartes for appropriating and re-purposing his quote, but he was not, in the end, all that fond of the particular phrasing of the idea, so....
I have talked about Dean Kamen's IBOT several times in the past, like in 'It's an iBOT,' I would say. 'Yes you bought it, but what is it?' she would answer.
And then back in the beginning of the year in NOT MEDICALLY NECESSARY per, by their own description, non-medical people, I talked about my fledgling first attempt to get an IBOT. after it became clear that this was not just a luxury item -- this was something that many people who are currently in powered wheelchairs or scooters really ought to be allowed to consider.
The news?
Well, as of today, a mere 10 months after the initial denial, I now have an IBOT!
Just got it today after being approved in a pass/fail test of my driving ability. Reminded me of that bit from the movie Sahara:
Rudi: I'm going with you guys, right?Dirk: No, you gotta tell Sandecker.Rudi: Hold on, how do I cross the border? I never took survival training.Dirk: Consider this your course, Rudi.Al: Kinda pass/fail, which I always thought was easier.
Anyway, I passed (luckily enough!).
Getting back to insurance company adventures, it only had to go through one appeal, which means it was decided at the Premera Blue Cross level (with no help or review by Microsoft, though the fact that it was a Microsoft account might have had some influence, a theory about which I have no supporting data).
The language of the approval letter made it very clear what was on their mind. I won't quote it here except to say that they wanted to make it clear that this was not to be a precedent that could be used to obtain future approvals for others who needed an IBOT -- the focus was on the unique facts reviewed in the course of the appeal.
Fair enough.
But did you ever see the movie The Shawshank Redemption? In particular, this scene:
ANDY: What is all this? HADLEY: You tell me, fuck-stick! They're addressed to you, every damn one! {Wiley thrusts an envelope at Andy. Andy just stares at it.}WILEY: Well, take it. {Andy takes the envelope, pulls out a letter}ANDY {reading}: "Dear Mr. Dufresne. In response to your repeated inquiries, the State Senate has allocated the enclosed funds for your library project... "{stunned, examines check}ANDY: This is two hundred dollars. {Wiley grins. Hadley glares at him. The grin vanishes.}ANDY {reading}: In addition, the Library District has generously responded with a charitable donation of used books and sundries. We trust this will fill your needs. We now consider the matter closed. Please stop sending us letters. Yours truly, the State Comptroller's Office.{Andy gazes around at the boxes. The riches of the world lay at his feet. His eyes mist with emotion at the sight.}HADLEY: I want all this cleared out before the warden gets back, I shit you not. {Hadley exits. Andy touches the boxes like a love-struck man touching a beautiful woman. Wiley grins.}WILEY: Good for you, Andy.ANDY: Only took six years.{pause}ANDY: From now on, I send two letters a week instead of one. {Wiley laughs, shakes his head}
So if there are people out there who are in the same situation vis-a-vis Blue Cross and an IBOT denial, the folks at Independence Technology (the subsidiary of Johnson and Johnson that produces the IBOT) now have more information on the cases that may have a better basis for an appeal.
There are other insurance company plans (e,g, Aetna's) that specifically disallow the IBOT as a matter of policy, which is eerily ironic since employees of Independence Technology are actually covered by Aetna. I wonder how they would choose to word THAT denial, and how they turn around and justify the policy to the company that makes the units.
Talk about your very sensitive communications!
Though luckily, if an employee there should actually need one -- not an unreasonable supposition when one considers how medical "miracles" can sometimes tend inspire people to work for the companies that provide them! -- Independence Technology will self-insure for the unit. Insurance company policy be damned! :-)
But anyway, I have an IBOT now.
If you a serf or a Seattle barnights/anti-freeze/chess night/karaoke/relative-o-mine type, you may even see it at some point. I can't give rides to anyone who weighs more than 100 pounds or who is uncomfortable sitting on my lap, but there are rules about people who have never taken the training, sorry....
Regular reader Jan Kučera asks over in the Suggestion Box:
Who does create the keyboard layouts? I'm using the Tamil one, which is nice to play with, yes, but... do people really need to install another layout (and constantly switch between them) just to be able to type question mark, exclamation mark, quotes, colon, brackets... or am I missing something fundamental here?
The answers to these questions can be found through some careful searching through the Blog. :-)
The very first question sees it answer in one of the very first blogs (plus or minus a few months), entitled Does MS pull new keyboard layouts out of their @!#$%?.
The answer to the second question is simpler -- No. Jan is missing nothing, as usual....
A more detailed answer on the specific problem can be found in later blogs.
Like the second bullet point in The real problems with keyboard switching, a blog that discusses the most important reasons that the model of switching layouts is not more readily accepted.
Or the second bullet point in Ideas about loading existing keyboards in MSKLC, a blog intended to be a quick brainstorming for someone authoring a keyboard layout creation tool to look at possible solutions to these problems.
Or more recently, The built-in attempt to support multi-monolingual keyboards is kinda broken, where I point out the real flaw in the assumption that the switching will be helpful for most people.
Now I can't claim a ton of progress has been made here beyond someone from Microsoft (well, me) identifying the problem almost three years prior.
Technically, I did provide a slightly more intuitive attempt at inputting Tamil in Behold the Table Driven Text Service, Part 12 (The knights who say நீ, redux, #2). Though that doesn't do much specifically in this case either. Mainly because I was focusing on other things....
But working to solve the problems here? Not so much.
Sorry about that. :-(
This blog brought to you by கு (U+0b95 U+0bc1, aka TAMIL LETTER KA + TAMIL VOWEL SIGN U, aka TAMIL LETTER KU)
This blog dedicated to six weeks I almost got to spend in Australia nearly 15 years ago, and a Kinks song named Long Distance that still reminds of me of the late night phone conversations I had with the girl who was able to make the trip...
In response to chcp can't do everything, rbouman commented:
interesting reading here, thank you.I've had an occurrance of the path variable on xp pro being displayed correctly once only as human readable then as ascii chars only.turned out the codepage for this machine was set to 850, if I then manually set the codepage to 437, the path variable remains human readable [that is; from a command prompt screen output].the mystery is ; the machine is set to australian english in regional settings; there's no multi linguallity [is that a word?] other than that.what else could possibly cause the path variable [and it's the only environment variable to be affected] to display ascii chars?I'm also making the assumption that the ascii chars may cause some apps. to not read the path var. properly, right?
Of course the value that chcp returns when you run just it from the command line with no parameters (assuming you haven't modified it) is the default OEM code page, aka the OEMCP, aka the LOCALE_IDEFAULTCODEPAGE of the default system locale.
Which kind of indirectly explains why rbouman is seeing code page 850 -- because the OEMCP for 0x0c09 is indeed 850.
Incidentally, the default EBCDIC code page for 0x0c09 is 500 rather than 037 like it is for US English. I have no idea why this is the case.
If one wants to change it on a total machine wide basis, one can just change the default system locale and reboot.
Unfortunately, even on Vista the reboot would be required since the OEMCP would be changing. So you don't get any of those Ready... set... Don't Reboot! benefits...
For the rest of rbouman's question related to what the path might look like in the console, although I don't know for sure what we're talking about, there are no worries about the path variable changing here based on the codepage -- this is just an illusion of the display, one that does not really change just because the code page does.
Though one should be careful copying it out of the console, like into Notepad or other Windows applications that either use Unicode or use the ACP (which even down under is still 1252).
Code page 850, aka Multilingual Latin 1, is very popular for a lot of Western Europe, and also apparently Australia. Perhaps they will be joining the EU sometime soon? :-)
This blog brought to you by ╚ (U+255a, aka BOX DRAWINGS DOUBLE UP AND RIGHT, which is inexplicably part of both code pages -- 850 and 037)
The epiphany started with a comment.
A comment to that blog Tavultesoft is one of the company names mispronounced more often than Trigeminal.
It was after Andrew Durdin gave the suggested pronunciation here and his brother Marc said more about it here.
The next day, Marc commented:
I have been informed (by my parents) that both Andrew and I got the phonetic transcription of Tavultesoft wrong. Here's what they suggest is the correct pronunciation: [tɑβʊltɛˈsɔft]ǃ Not quite sure how to turn that into a domain name...
I suddenly recalled how often tje relationships we have with our prents zbout names has some very real flaws.
There are obvious examples, like my Hebrew name. You see, I am a member of the Honorable Society of People Whose Hebrew Names Don't Correspond to Their English Names.
Thus Michael becomes מאיר instead of the more conventional מייקל.
And there is my sister's Hebrew name, that someone who our parents consulted just made up -- it isn't even a word! What's up with that?
Supposedly it was a Rabbi, but that word is based the Hebrew word "My teacher" and clearly he wasn't teaching anything useful that day!
I am not going to spell it here and make the word more of an actual word by making it easier to Google.
Of course there is Goldie's name, which I talked about in Learning to spell in Bengali (when one doesn't know the language).
That name (গোধূলি চৌধুরী) was based on a beautiful poem/song by Tagore (it might be a poem though I have heard it sung since then so we'll call it a song), though unfortunately the way she was taught to spell it all her life turns out was wrong.
Doesn't that work against the beautiful gesture a tad? :-)
I hesitate to ponder how long it would have been before she found out if I had not been on that odd project that I enlisted her in and she involved her parents in!
And then there is my colleague Daniel.
Daniel, you see, is from Hawaii.
Remember when I mention As the comma turned (in space!)?
Well, his name is Daniel Kamanaʻo.
I should actually give you the full name, including the middle name (which is decidely more "Hawaiian" than the first name!):
Daniel Keiki Oʻkalani kala hoʻo lewa Kamanaʻo
He also has it on his office door:
If you know Hawaiian you will know why this is kind of a cool name. And even if you don't, you can delight in imagining how the software developers who were hyperventilating trying to solve the problems in What's in a name? would be having a coronary trying to handle Daniel's name.
Now this is not the name on his birth certificate.
The name there is something like:
Daniel Keiki kalahoʻolewa oʻkakakakalani Kamanao
Now let's not even talk about the missing okina in the last name.
Let's focus on the middle.
It is kind of ironic in both the actual sense and the Alanis sense the way that the kaka bit is repeated, given that kaka is often used to mean crap. They stuck some random "crap" in the middle of his name that has no meaning in Hawaiian!
So, there are many morals/lessons one could get from all of this, including how cool it is to be in contact with so many people with so many different languages and cultures.
But I prefer the one that was the source of my epiphany -- Parents just really suck at names. :-)
This blog brought to you by ʻ (U+02bb, aka MODIFIER LETTER TURNED COMMA - typographical alternate for U+02BD or U+02BF, used in Hawai`ian orthography as `okina (glottal stop))