Sunday, February 1, 2009

Getting Rid of the Caps Lock Key

Photo of caps lock key physically removed from keyboard

The Caps Lock key is the most annoying key on your keyboard. It’s of no use whatsoever and it's always right at your fingertips, waiting for you to accidentally click on it. Therefore one of the greatest favors any computer user can do to himself, is to disable the Caps Lock key. All the major operating systems allow you to do it, even Windows...

Linux

Clearly the winner here, if you want to do it from command line:

$ xmodmap -e "remove lock = Caps_Lock"

Just type it in to try out and then place into your .bashrc file to make the setting permanent.

Mac

Although a real Mac user would find it more intuitive to drag the Caps Lock key to trashcan, this time they have to resort to simple list boxes:

Windows

And in Windows the same thing is done in the typical Windows way.

You modify the registry and restart your computer.

Images: For the first image, the credit goes to dipurinku, and for the second thanks to Carla216.

Thursday, January 22, 2009

The Last Browser to Pass Acid2

Acid 2 test reference rendering combined with IE8 logo as its nose So, I installed beta 2 of IE8. And it indeed passes Acid2 test... at least when you don’t press the Compatibility Mode button.

But I shouldn’t share this information with you, because the EULA of IE8 states:

You may not disclose the results of any benchmark tests of the software to any third party without Microsoft’s prior written approval;

But while I will be waiting for Microsoft troops break through my door, you can read on about the “innovations” in Internet Explorer 8.

X-UA-Compatible

IE8 comes with two layout engines: the old one from IE7, and the new one, able to pass Acid2.

Initially Microsoft decided, that by default all sites will be shown in IE7-mode, and only when the author of the page explicitly requests, then, and only then, will the page be displayed in IE8-mode. This thing had already happened once and was called the Doctype Switch, and it seemed that Microsoft was introducing yet another one. A huge noise broke out among the supporters of web standards. Nobody wanted another broken Doctype Switch.

Finally Microsoft took notice and reverted their decision. In IE8 beta 2 the default is IE8-mode. But when site relies on the quirks of previous IE versions, then it can send the following HTTP header:

X-UA-Compatible: IE=EmulateIE7

Additionally IE8 has a special button right next to address bar to switch IE7 compatibility mode on and off – a nice little interface clutter, just because of being IE.

Some sites have already started to use the X-UA-Compatible header. Most notably microsoft.com and the IE Blog – which shows how “ready” Microsoft itself is for their own IE8.

The Sloppy Copy Principle

The photocopiers of Redmond are famously known for their sloppiness. Whenever Microsoft copies another software product it first makes a blatant copy without thinking much and then introduces his own improvements, which usually make it even worse.

Classical example is the copying of Mac OS user interface. Mac has the menu bar of each application displayed at the top of the screen, and for a very good reason – because of Fitts’ law it is easier to reach with a mouse this way. But Microsoft saw just another opportunity to “innovate” and placed the menu right below title bar, making it as hard to reach as possible.

In IE8 we see this sloppy-copy-principle applied again and again.

Some Tabs

Before IE7 came along, IE was the only browser without tabbed browsing. All they had to do, was just to copy the damned thing. But Microsoft wanted to “innovate”. Other browsers had the tab bar running from one edge of the browser window to another – to make room for as many tabs as possible (and it’s still getting pretty tight, if you have more than ten tabs open). Somehow Microsoft didn’t get it and combined menu bar with tab bar:

Comparison of maximum amount of tabs in IE 8, Firefox 3 and Opera 9

On a standard 1024 x 768 display IE8 can display only 8 tabs (before they start to scroll out of view). Firefox manages to show 10, and both Opera and Chrome can show unlimited number of tabs – they just shrink smaller and smaller. One could say that IE is only two tabs behind Firefox, but this doesn’t take into account that these 10 Firefox tabs are a lot more readable than those 8 IE tabs.

IE8 also features grouping of tabs. But what do you group, if you only have 8 tabs?

Incrementally Jumping Search

IE8 also features a search bar, that appears when you press Ctrl+F. Again something that was easy to copy from all other browsers, that already had it. In Firefox the search bar appears at the bottom of the page, so that the web page can stay unmoved. In Opera it appears at the bottom left corner and the page doesn’t move. In Chrome it appears at the top right corner and the page doesn’t move. But Microsoft wanted to “innovate” – they placed it at the top and made the page move downwards when it appears.

Nasty search bar in IE8

Doesn’t everybody like when the whole page jumps up and down?

Browse Privately With Microsoft

This is a great feature. Turn on InPrivate Browsing and no-one will find out which pages you are visiting... except some guys in Redmond, as every URL you visit gets first sent to Microsoft to check that it’s secure enough for you to see it.

Few days after installing IE8 I got a critical security update:

This security update resolves a publicly disclosed vulnerability. The vulnerability could allow remote code execution if a user views a specially crafted Web page using Internet Explorer. Users whose accounts are configured to have fewer user rights on the system could be less impacted than users who operate with administrative user rights.

You really trust Microsoft in matters like security and privacy?

Still Behind

There are many other similar “innovations” whose alone purpose is to hide the painful fact, that IE8 is just a catch-up release, an attempt to not fall too far behind modern browsers that are all busy implementing CSS3, HTML5 and other standards.

By the time IE8 goes public, it will be the only browser that doesn’t pass Acid3.

Tuesday, January 20, 2009

The Cool Wall of Program Names

While using Windows I have discovered, that I'm constantly surrounded with programs that have really uncool names. The main source of the bad names is Microsoft, but the softie isn't the only one to blame here – uncool names are a general tendency in Windows land.

To explain what I mean by cool and uncool names, and in the spirit of the Cool Wall of Top Gear, I'm going to put up the Cool Wall of Program Names.

Seriously Uncool

  • Avira Antivir Personal
  • Microsoft Office Powerpoint Viewer
  • Microsoft Visual FoxPro
  • Windows Internet Explorer
  • Windows Live Messenger

First of all, all these names are really long – at least three words in each.

Secondly, they contain buzzwords like “Visual”, “Office” and “Live”, which don't add any meaning whatsoever. Was an earlier version of FoxPro “Microsoft FoxPro for Vision-Impaired”? And was the previous version of Messenger “Windows Dead Messenger”? And is there a PowerPoint that is not for office? These are pure marketing buzzwords, nothing more.

Additionally all these names also have a company name inside them, which in itself is uncool, but this is already the topic of the next part of the wall.

Uncool

  • Command Prompt
  • Google Chrome
  • Microsoft Excel
  • Mozilla Firefox
  • Windows PowerShell

Uncool names usually have company name added to the actual program name. But this addition rarely adds any value. How many other Excels do you know of? How many other Firefoxes? At least I don't know of any. So why do we have Microsoft Excel and Mozilla Firefox instead of just Excel and Firefox? That's just uncool.

For extra credit to Microsoft – half of their program names begin with “Microsoft” and the other half with “Windows”, so you can not even sort them and expect to find all Microsoft programs grouped together.

Additionally there are uncool program names like “Command Prompt”, showing that the creator of them had absolutely no imagination.

Cool

  • Gimp
  • Opera
  • Notepad
  • Paint
  • Skype

Finally the cool ones. These are short. That's the main thing. No extra buzzwords, no company names. To quote the already overquoted Antoine de Saint Exupéry:

“Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.”

Note that even Microsoft can come up with pretty cool program names. However primitive Notepad and Paint are as programs, their names are cool – no doubt.

In perfect world you would have most of the programs belonging to this group – this should be the norm. In Windows-reality the norm seems to be uncool names.

Sub Zero

  • bison
  • less
  • tac
  • wc
  • wine

So, finally the sub-zero zone. Initially I tried to compile the whole wall with program names found from my Windows XP box, but as hard as I searched, I couldn't find a single Windows program with a really sub-zero-cool name. So I had to seek help from good-old UNIX. Let's look at each of these really cool names in detail – they all deserve it.

bison is the free software alternative to yacc, which stands for Yet Another Compiler Compiler and is in itself already quite cool. yacc sounds similar to yak, to which bison is a close relative. Additionally yaks have been domesticated animals for a long time, but bisons have always been free (similarly the software bison is free, but yacc is proprietary).

less – the opposite of more. At least that's what the manual of less says. Actually less is a descender of even older UNIX program more. They both are pagers, but while in more you can only go through text in one direction, less allows you to scroll both up and down. Therefore less is better than more. This is hell-of-a-cool.

tac is cat in reverse. Cat is a simple program that takes a file and prints it to standard output. Actually it can take several files and concatenate them all. Tac does the same, put prints the lines in reverse order. Seriously cool.

wc stands for Word Count, but it also happens to stand for Water Closet. UNIX users send often stuff through pipes to wc. This program name is clearly sub-zero cool.

Wine Is Not an Emulator. A recursive acronym, a common theme in UNIX, which is already cool. And yes, although Wine acts as an emulator for Windows, it's not actually an emulator, but instead implements a compatibility layer for Windows apps. This name also works on second level. When you drink too much wine, you will get drunk. When you use Wine to run too many Windows applications, you're poisoning yourself with proprietary software. Again, seriously sub-zero cool.

If you don't agree with my Cool Wall, then your comments are always welcome. But please, don't use a chainsaw.

Disclaimer: This Cool Wall was about program names, not about the programs themselves. Clearly Mozilla Firefox as a program is a lot more cool than Notepad – it's just the name that kinda sucks.

Monday, January 19, 2009

Why Frank Hates Windows

Another day when I was doing a cleanup in my browsers bookmarks, I discovered an old bookmark to a site where Frank van Wensveen explains in a lengthy essey why he hates Windows. I barely remember bookmarking it, so it must have been many years ago.

But the truly great thing about this essey is, that unlike many others, this one has been kept up to date. So you don't have to think, "does this really hold any more in Vista?" As Frank van Wensveen explains – most of flaws in Windows stand the test of time.

Clearly a suggested reading:

Thursday, January 15, 2009

Upgrade to PowerShell V2

After I had cursed the command line completion of PowerShell for being so utterly powerless, PowerShell developer Lee Holmes commented:

Thanks for the feedback. Much of this behavior has been improved in the latest CTPs of PowerShell V2.

And he pointed me to CTP3 of PowerShell V2. Well, I thought, if these things really have been improved, then I'm most certainly going to try it out.

I downloaded the CTP3 ("Community Technology Preview 3" – this is Microsoft saying "Alpha"), and was going to install it and see, what has changed. But you know, it couldn't be that easy... even with Microsoft developer pointing you in the right direction... it's still Windows...

Installing and Uninstalling

The download page contained a small paragraph, hidden between the others, instructing me to uninstall the previous version of PowerShell first - I chose to ignore it, thinking it was just another measure to help save Microsoft his ass when something goes wrong.

I started up the installer, clicked next and next... everything was going fine. Until I was confronted with this:

Cannot install this version of the product. You must first remove any earlier versions of Windows PowerShell before you can install this version. Refer to install notes for uninstalling previous versions.

Alright, I thought, if that's really what you want, then I uninstall it.

  • I opened up Add/Remove Programs to uninstall it and... it wasn't there. I scanned the list for quite some time, wondering if it's named "PowerShell", "Windows PowerShell", "Microsoft Windows PowerShell" or even something else. Nope... not in that list.
  • I went to the Start menu entry of PowerShell... no uninstall option there.
  • I went to c:\Program Files\PowerSh... nothing like that over there. Where is the damn thing!?
  • Finally found it from c:\Windows\System32\WindowsPowerShell\v1.0. I removed these files, restarted installer, and was greeted with the already familiar error message.
  • I tried several more things, which didn't helped either.
  • I even searched around the registry, but didn't felt comfortable enough to modify it.

Finally I found uninstall instructions, hidden away inside one Windows PowerShell Blog post.

It appeared, that PowerShell was actually installed not as a separate program, but as a Windows update. And in the Add/Remove Programs dialog I had to check the "show updates" option to be able to see and uninstall it.

After that the installation of PowerShell V2 worked out just fine.

A Miracle Has Happened

It appears that the two things I complained about in the Powerless Completion of PowerShell have indeed been fixed.

Completion now also works with executable files in my $PATH and also with aliases. Additionally to complete cmdlet name like Join-Path I can just type jo and press TAB, instead of being only able to complete the part after the dash. Although I would prefer fir to be completed to firefox not firefox.exe, I'm quite satisfied.

On the filename completion side cd foo\bar is no more expanded to cd 'C:\Documents and Settings\Rene\Desktop\foo\bar'. Although it is still expanded a bit, to .\foo\bar, but this is still a big win in brevity.

So yes, a miracle really has happened. First time in this blog a truly happy end.

Tuesday, January 13, 2009

Smoking PowerShell Pipes

Everybody likes pipes. Starting from 1972 on when Douglas McIlroy introduced the concept, pipes have been an unreplacable tool for hooking programs together. Pipes just work. Well... at least in UNIX. But you know, this is a blog about me being stuck in Windows.

Real Pipes in UNIX

The main idea of a pipe is that you take the output of one program and connect it to the input of another program. The pipe itself does nothing more than just forwards data. When the output of one program does not fit into the input of another program, then you can pipe it first through a filter program, that transforms the data as needed. But the pipes themselves remain only as a transport layer, carefully carrying data from one program to another and not changing a bit on the way.

The same holds true for real-world pipes. A good pipe is one that doesn't change the aroma on its way from bowl to your mouth. It's the tobacco you want to smoke, not the pipe.

I had a PHP script that generated test data for MySQL database. In UNIX I would have used it as follows:

php create-test-data.php | mysql dbname

I thought that this should also work with PowerShell.

Water Pipes in PowerShell

PowerShell pipes work more like water pipes. The smoke that comes in is sucked through water, changing it's aroma, softening the bitter taste. Water pipes are great, but you shouldn't try to sell them labeled as normal pipes.

When I ran the above code in PowerShell, the data generated by the script wasn't exactly the same that MySQL database received. If it even received it, because the thing crashed along its way.

Actually I didn't even had to pipe it to another program, just redirecting the output to a file changed it considerably:

php create-test-data.php > test-data.sql
Let Me Encode This for You

The first problem was encoding. The output of the script was in UTF-8 encoding. PowerShell wanted to convert the text into his internal UTF-16 representation and then convert it to another encoding when saving to file, because for PowerShell the > operator is equivalent of piping your output to Out-File cmdlet:

php create-test-data.php | Out-File test-data.sql

Luckily Out-File takes -Encoding parameter, which can have the following values: unicode, utf7, utf8, utf32, ascii, bigendianunicode, default and oem. I tried all of them, and the only one that preserved my encoding was oem – which designates single-byte encoding.

Let Me Correct Those Lines

The philosophy of UNIX has been: it's all text. The input of every program is text and the output of every program is text. Except when it's not, and when it's not, then you can't use all the common UNIX text-processing tools on it. Instead you have to use separate tools specific to your binary format. For example you can use ImageMagick to apply all kinds of transformations for images.

This philosophy was recognized by the PowerShell team as one of the great weaknesses of UNIX pipeline. And therefore the mantra of PowerShell has been: it's not all text. It has been the great promise of PowerShell, that it will enable you to work more easily with all kinds of data, not just text.

And this all works out fine, when your program outputs .NET objects. But when it doesn't, the output is treated as text. But it's a water pipe as you remember, so the text isn't just left alone, it's transformed into .NET array, array of lines.

Doesn't look that bad, does it. But the trick is that when the text is split to lines, the line separators are discarded. And when it is put back together, all lines are joined with \r\n. For example this input:

Hello,\n
my name is Rene.\r\n
I'm the author of this blog.\n

...will be converted to this output:

Hello,\r\n
my name is Rene.\r\n
I'm the author of this blog.\r\n

First of all it's dosification - all your nice UNIX file endings will be converted to ugly DOS line endings. Really annoying. Not just annoying – terrible. I think you already know where this is going: binary data.

The SQL generated by my script also included binary data. And you can imagine what this kind of conversion can do to binary data.

There is no built-in mechanism in PowerShell to overcome this problem, although the problem is well known and there exist some ugly workarounds.

Conclusion

At the end of the day PowerShell had failed me. It was the first real job I wanted to do with PowerShell and it failed completely.

If PowerShell really wants to succeed, this behavior has to be corrected. Please, PowerShell, no water inside my pipe.

Thanks to paws22 for sharing the above photo in Flickr under Creative Commons Attribution Noncommercial Share-Alike license.

Sunday, January 11, 2009

Powerless Completion in PowerShell

PowerShell has command line completion. It can complete cmdlets, arguments, methods, properties and probably many more things. Which is great. But because this is Windows, there just has to be something terribly wrong with it...

Command Line Completion Essentials

Completion can be provided for a lot of things, but there are two for which I consider completion to be essential:

  • commands (programs)
  • files and directories

Lets look how the completion of these two essential things is handled in PowerShell.

Program Name Completion

It seems natural, that when we have a command line completion, then we should be able to complete commands. PowerShell doesn't think so. Completion is only provided for the PowerShell-native cmdlets. But simple executable programs are not worthy to receive the mighty PowerShell completion. Completion also doesn't work with aliases.

Actually the completion doesn't even work well with PowerShell cmdlets. For example there is cmdlet Join-Path, which is the only cmdlet starting with letter J. One would think that you just type "J", press TAB and have it completed to "Join-Path". Yeah... but not in PowerShell. Instead you have to type "Join-" and only after that you can press TAB to have it completed.

But as I said in my previous post, in Windows real programs aren't available from command line anyway - so I guess it makes sense to not have completion for these things also.

Filename Completion

But what about filename completion. It did work reasonably well in cmd.exe. It clearly must also work in PowerShell. Well... sort of.

Suppose that you open cmd.exe and want to go to your Desktop directory. You are already in your home directory, so you just type cd and the letter d:

C:\Documents and Settings\Rene>cd d

Then you press TAB and it will be completed to:

C:\Documents and Settings\Rene>cd Desktop

This works the same way in PowerShell. But suppose you want to go two directories with a one step. Suppose you want to go to Desktop\MyDir. So you just type backslash and letter m:

C:\Documents and Settings\Rene>cd Desktop\m

Then you press TAB again and in cmd.exe it will be completed to:

C:\Documents and Settings\Rene>cd Desktop\MyDir

But in PowerShell this will be completed to:

PS C:\Documents and Settings\Rene> cd 'C:\Documents and Settings\Rene\Desktop\MyDir'

PowerShell might call this a feature, but I would certainly call this a regression.

Just Another Day in Windows

PowerShell is nice. In fact it's even quite cool. But like always with Microsoft, they managed to screw up the essentials.