First Look at Google Chrome

Posted September 3rd, 2008 by kyle
Categories: internet, keyboarding, reviews, Ultra Recall

The internet is abuzz with comments about Google Chrome, the newest entry in the browser wars. Within the first day, it had already exceeded Opera’s market share, and we had several questions about support for it in Ultra Recall. So I decided to download and install it to see it for myself.

In true Google minimalist fashion, it performs a no-questions-asked installation, and it installs to a user-accessible location (which means it can be installed by non-admin users). The interface is also rather sparse, with no window caption, menu or status bar, which does provide more screen space for web content but may be a tad overdone.

It does start quickly and is responsive when loading web pages, although it doesn’t seem all that much quicker than IE. I’ve seen claims of enormous JavaScript speed improvements, but GMail and GCal did not feel much faster to me.

I like the ability to drag a tab into its own window (and drag a separate window as a new tab into another Chrome window). Apparently each tab uses a separate process, which should make it more stable. I also like the address bar auto-completion, which is similar to what’s available in Firefox 3 and IE 8, but it also provides inline search capability instead of using a separate field.

Another novelty is the ‘create application shortcut’ feature, which creates a desktop shortcut that launches a specific web app in a separate Chrome window with custom icon, no tabs, address bar, bookmark bar, etc. I’m not sure how useful this is though, since clicking a link in this window opens in a new tab in the main Chrome browser window, but it might be useful for some Web 2.0 applications.

One drawback I noticed immediately: It uses a non-standard Vista-style window border on Windows XP, which looks out of place and has the “now which window is active?” flaw. And on Vista, it doesn’t even match the standard Vista look or support Aero Glass. I guess Google is trying to make the OS obsolete, but they haven’t replaced everything yet and should be a better citizen.

Keyboard accessibility is also lacking. It does provide keyboard shortcuts for some functionality, but there is currently no equivalent to Firefox find-as-you-type, nor any way to access bookmarks, options, etc. via the keyboard.

Some of the licensing terms were egregious, but they have been updated to correct that. And apparently Chrome is not immune from security flaws either. If and when these problems are resolved, I may take another look, but it isn’t compelling enough at this point.

Regarding Ultra Recall integration, copy/paste and drag/drop from the address bar or page selection was not working due to how Chrome puts data on the clipboard, but the latest release of Ultra Recall has a fix for that. As far as buttons in Chrome to import into Ultra Recall, extensions are not currently supported.

Creating a Non-Admin Installer with Inno Setup

Posted August 4th, 2008 by kyle
Categories: development

Most Windows applications require admin rights for installation, which explains why most users run as admin. It also explains why software viruses and spyware are so rampant and why Microsoft invented User Account Control in Windows Vista. Note that even applications that require admin rights for installation should run properly for non-admin (and non-elevated Vista) users.

Sometimes, it does make sense to allow an application to be installed without requiring administrative privileges (which we do for Ultra Recall). Some would argue this is just a way to subvert the IT police, but it doesn’t sidestep any security restrictions or permissions that the non-admin user already has, and sometimes the IT police are more like Nazis anyway.

Inno Setup is a popular tool for creating program installers, and it is fairly simple to create a non-privileged installer with this tool.

The first thing to do is add

PrivilegesRequired=none

to the [Setup] section of the installation script. This will cause Windows to run the install program without elevation for non-admin users.

Second, don’t install any files to {pf}, {win}, {sys}, or other system paths. DLL dependencies can be installed to the installation path.

Third, the installer should detect whether it is running as an elevated admin user and default the installation path under Program Files if it is or a user-writeable path if not. This can be done by using a DefaultDirName in the [Setup] section like this:

DefaultDirName={code:DefDirRoot}\AppName

and a [Code] section like this:

[Code]
function IsRegularUser(): Boolean;
begin
Result := not (IsAdminLoggedOn or IsPowerUserLoggedOn);
end;

function DefDirRoot(Param: String): String;
begin
if IsRegularUser then
Result := ExpandConstant('{localappdata}')
else
Result := ExpandConstant('{pf}')
end;

Fourth, any [Registry] entries written under HKLM will fail if the installer is run by a non-admin/elevated user and should be marked to ignore failure by adding the noerror flag. And if possible and appropriate, add the equivalent HKCU registry entries, which will work on a non-admin installation.

Finally, non-admin users do not have permissions to register COM DLLs and OCXs. One option, which is not recommended, is to also register in user-level registry locations. A better option where possible is to utilize Registry-Free COM.

Developers: It’s a Context Menu, not a Right-Click Menu

Posted July 14th, 2008 by kyle
Categories: development, keyboarding

Well-behaved GUI software should make all functionality easily accessible from the keyboard. For Windows, most of this is covered by the Windows User Experience Guidelines.

But there a some subtleties not covered there which many developers get wrong. And one that I see quite often is the improper display of context menus. Many people refer to these as right-click menus, but they can also be initiated from the keyboard, either by pressing the menu key (usually to the right of the space bar) or Shift+F10.

The first problem is that some applications ignore the user and don’t display the menu at all when initiated via the keyboard. The second issue, and probably the most common, is displaying the context menu at the mouse pointer location instead of near the keyboard focus/selection. For keyboard users, it is not uncommon for the mouse pointer to be far away from the current selection (even on a different monitor), making for a very unpleasant, inefficient user experience.

Handling display of the context menu properly is very simple. Do not use the WM_RBUTTONUP message to display a context menu. Instead, process the WM_CONTEXTMENU notification in each control that displays a context menu. This notification provides the mouse position (if initiated via the mouse) or a position of -1, -1 if initiated via the keyboard.

If initiated via the keyboard, determine the position of the caret or first focused/selected item in the control and use that position to display the context menu. For tree and list controls, see how Windows Explorer handles this, and for edit controls, see WordPad. For all you developers who are doing this wrong, please fix it now. Thanks!

Windows XP Forever

Posted July 7th, 2008 by kyle
Categories: Windows

Windows XP is a great operating system, possibly the best desktop OS ever. It looks great, is very stable, performs well, and rarely requires rebooting. And unlike earlier versions of Windows, it hardly ever needs to be repaved (format + reinstall). I’ve been running Windows XP SP2 as installed with my PC for over 3 years.

But like everything in the universe, entropy is always increasing, so it can’t last forever. Well, a few weeks ago, Windows XP stopped recognizing my DVD drive, probably after uninstalling some software. I don’t use it much, but I knew that I would eventually need to, and my online searches for a fix came up empty. I briefly considered just switching to Vista (which I have installed on another partition but use only for testing), but I have not been impressed with it.

I even toyed with switching to Mac or Linux. I have an old Mac Mini and also experimented with Ubuntu in a virtual machine, and while both have come a long way in the last few years, I didn’t find either more compelling than XP. Plus, there will always be a few Windows applications that I need. My experience with running the Windows apps that I use under Wine has been dismal, and running them in a Windows virtual machine under Mac or Linux is not nearly as useable as running natively (and I would still need to have Windows installed there anyway).

I tried searching one more time on the DVD drive issue, and lo and behold, I found the very simple solution of cleaning up a few registry keys.

I also had some trouble installing Windows XP SP3, but quickly found a fix for that too. And installing SP3 resolved the other annoyance that had cropped up — all open applications encountering an Application Error on Windows shutdown (which I had been working around by using CloseAll).

So XP is now running like new again and I expect it will for many years to come. I’m not sure how Microsoft will handle activation of Windows XP when support ends, in case I ever do need to reinstall Windows, but it is possible to transfer activation.

And I’m not really worried about Microsoft no longer updating XP. I’ve never encountered a security related problem with it (even running as administrator and without anti-virus or anti-spyware), and there’s not much chance that a new security flaw will ruin that record.

And there’s always Windows 2000, or maybe Linux 2014.

Announcing the Kinook Affiliate Program

Posted May 14th, 2008 by kyle
Categories: Ultra Recall

We’re excited to announce that you can now promote Ultra Recall (or any of our products) and earn 40% of every sale resulting from your promotion!

It’s easy to join. Just send us an email with your request, and we’ll provide a URL with your affiliate ID that you can use on your web site, blog, newsletter, email signature, etc.

Whenever a user visits our site via that URL, a browser cookie with your affiliate ID will be stored in the user’s computer. If that user visits our order page within a year and makes a purchase, the affiliate ID will be provided to us with the purchase information.

For every order containing your affiliate ID, we’ll pay you 40% of the purchase price. We will send payment via PayPal each month that you have one or more affiliate sales.

Thanks in advance for your participation!

Upgrading from Visual C++ v7.1 (VS 2003) to Visual C++ v9 (VS 2008)

Posted March 14th, 2008 by kyle
Categories: development, Visual Build

VC6

Our applications are written primarily in Visual C++. We started with Visual C 6.0 back in 1998 and used it successfully for many years.

VC7

There was quite a bit of disappointment among C developers with the release of Visual Studio .NET (VC7) in 2002 and VS .NET 2003 (VC7.1) the following year because of so much emphasis placed on the new .NET Framework and VB.NET and C# languages. But with some trepidation and a moderate amount of pain, we finally migrated to VC7.1 in mid-2005. Other than some quirks in the resource editor that we managed to work around, that version worked well for us (with the requisite additions of Visual Assist and Fast Solution Build add-ins). It brought much-needed improvements to standards compliance, some library improvements, and was fairly stable, although compilation was a little slower and the executables slightly larger than VC6.

VC8

In early 2007, we experimented with upgrading to Visual Studio 2005 (VC8) but ran into a lot of problems attempting to get everything to compile and link properly. Microsoft also made some changes to how LIB files are handled, and one third-party library we use did not offer a VC8-compatible library at the time, so we shelved the conversion.

With Microsoft readying the release of Visual Studio 2008 (VC9) and the availability of VC8-compatible third-party libraries, we decided it was time to attempt migrating one more time. We thought it would be easier to convert to VC8 first and then try VC9 after that, but boy did that turn out to be a poor assumption.

VC8 didn’t do a great job of converting our project and solution files, requiring manual correction (Build checkboxes in the Configuration Manager and dependencies getting dropped). We also ran into several compilation and linker issues to work through, including:

  • Several code changes were required to eliminate warning messages related to using the new safe CRT functions calls, etc.
  • Had to increase the compiler limits (/Zm) on some projects
  • Warning for non-standard extension used in qualified name for enums
  • Disabled manifest generation and embedding (since our executables already include a manifest)

    Thanks to Visual Build‘s built-in support for all Visual Studio releases, updating our builds was painless (only needing to append ‘|Win32′ to the solution configuration names).

    Once we finally got everything to compile and link, we ran into several runtime problems and had to make some more changes, primarily:

  • Avoid referencing &elem[0] of empty vectors (it’s safe to pass that to memcpy with a length of 0, for instance, but VC8 aborts the program just by referencing the element)
  • Make changes to bring STL iterator code (which assumes they are pointers) into compliance

    Most problems were identified quickly and corrected in the debug build, but even with these changes, we ran into two show-stoppers:

  • Choosing one feature in one of our applications resulted in the app just disappearing, and this only occurred in the release build on a Windows 2000 box.
  • Command-line builds worked fine, but compiling almost any file in any project within the Visual Studio IDE resulted in the dreaded internal compiler error (ICE), which made development and debugging unbearable.

    VC9

    We were about to give up and stick with VC7.1, but as a last-ditch effort, we decided to try migrating everything to VC9. We encountered a few more compilation issues:

  • Some of our projects defined a minimum Windows version of NT 4 (_WIN32_WINNT 0×0400), which now resulted in compile errors, but changing this to Windows 2000 (0×0500) fixed that and is safe since our applications require Windows 2000 anyway
  • The 64-bit portability check compiler flag is deprecated so we removed that directive from the project files
  • MFC no longer handles including of afximpl.h very nicely, so we just copied the few lines of code we used from that file into our own sources and removed the include

    After these changes, low and behold, we found that everything worked just great! No more crashing of the compiler when building in the IDE, and no more problems running our application on Windows 2000. Our executables are larger still (about 10%), which is acceptable considering all the improvements that have been added to make the code more secure in our connected world.

    It’s apparent that Microsoft has really put significant effort into improving their C tool chain with this release of Visual Studio, and there are many great IDE improvements as well:

  • The debugger, especially peering into STL containers, has improved tremendously
  • The resource editor is improved and now handles high color bitmaps
  • VS/MSBuild now supports parallel builds on multi-core and multi-CPU systems (and builds do appear to be noticeably faster on such systems)
  • New features like testing, optimization, code snippets, and property manager capabilities
  • Easy backup, restore, and sharing of IDE settings

    One caveat that bit us: Visual Studio 2008 requires Windows XP or later, and our build boxes were all Windows 2000, so we had to reconstruct the build machines. There is also a quirk with the Visual Studio 2008 Standard edition installer — it doesn’t install cl.exe and some ancillary files unless you perform a full installation.

    Overall, it took longer than expected to complete the migration, but fortunately it turned out to be worthwhile in the end.

  • LaunchAssist: Improving Application Launchers Everywhere

    Posted November 15th, 2007 by kyle
    Categories: freeware, keyboarding, software

    None of the popular launcher applications, nor Windows itself, do a very good job of integrating launching vs. activating an already-running application. LaunchAssist is a little utility I wrote to improve this situation. It works with most application launchers as well as the Windows Start Menu, Run dialog, Explorer, etc. To install, download it here, extract it somewhere onto your hard drive, then register by double-clicking reg.bat (to uninstall, double-click unreg.bat, restart Windows, and delete the DLL). It works on Windows 2000, XP, and 2003, but unfortunately the hook that is needed for it to work was disabled in Vista (and despite what is stated in that thread, it can’t actually be fully enabled on Vista).

    When an executable, document, or shortcut is launched, LaunchAssist is notified, looks for a matching application that is already running (by comparing the application or document filename with the beginning and ending of top-level window captions), and activates the matching window if found. If no match is found or if Shift is held down while launching (Shift+Enter in most launcher apps), LaunchAssist is bypassed and the program is launched normally by Windows.

    Bonus feature: when launching URLs, if Shift is held down, LaunchAssist attempts to open the URL in a new browser window (for URLs, if Shift is not held down, LaunchAssist is bypassed). This is useful to me since I still use the venerable IE 6 (since I disdain tabbed browsers), configured to reuse windows when launching shortcuts, but sometimes I do want to open a new window instead. It works by finding the application associated with .html and launching it directly, which should work with most browsers.

    The Zen Of Windows Application Launching, Part 2

    Posted October 29th, 2007 by kyle
    Categories: keyboarding, software

    Several categories of Windows application launchers have evolved over the past several years. In this post, I’ll look at the best and most popular products in each category. I’m only going to mention products that are either quite stable or that have been updated recently.

    Auto-Config

    Products in this category typically provide a polished GUI, automatically track the shortcuts on your system (Start Menu, recently launched apps and documents, etc.), and are summoned via a single hotkey. Typing a few characters will filter from the list of installed applications to quickly find the desired the one to launch, and pressing Enter launches it. The idea is to avoid having to configure anything, and (hopefully) the application quickly learns your habits and remembers the best matches for frequently typed abbreviations.

    Many applications in this category also provide additional features (for instance, capture of selected text from current app, web search, inline calculator, auto-type from abbreviations, etc.) and support a plug-in architecture for user extensibility.

  • Colibiri
  • Dash
  • Find and Run Robot
  • Enso
  • Launchy
  • Single Key Launchers

    Launchers in this category provide a more basic interface (typically text-only and no icons) that is more like the Run dialog on steroids. They are also launched with a single hotkey, and filter on the text you type to identify user-defined abbreviations which launch an application, open a web page, etc.

  • Dave’s Quick Search Taskbar Toolbar Deskbar
  • Executor
  • Keybreeze
  • SlickRun
  • Start Menu Replacements

    These applications attempt to provide a better alternative to the Windows Start Menu.

  • Engage
  • JetStart
  • VistaStartMenu
  • Typing Activated

    Applications in this category provide a minimal user interface. Rather than summoning the application with a hotkey, you actually type into whatever application you’re in, and when the application identifies some abbreviation that you’ve defined, it pops up a confirmation prompt. Confirming the prompt erases the typed text from the current application and launches the application (or performs other functionality, such as typing boilerplate text) connected to that abbreviation.

  • Direct Access
  • Perfect Keyboard
  • Phrase Express
  • Some products overlap multiple categories. I’ll look more in depth at some of these applications in future posts. Some additional categories that I won’t explore are hotkey programs, full-fledged macro programs, programmable keyboards, toolbar (mouse-centric) applications, and voice-activated launchers.

    First Gmail Spam!

    Posted August 13th, 2007 by kyle
    Categories: internet, keyboarding

    A few months back, I switched from Yahoo! Mail to Gmail for my personal email account, primarily because of its excellent keyboard accessibility. Yesterday, I encountered the first spam message to erroneously end up in my Inbox. Compare that with Yahoo! Mail, where I averaged a couple of uncaught spam nearly every day. Very impressive filtering.

    Review: AB Commander

    Posted June 4th, 2007 by kyle
    Categories: reviews, software

    The built-in Explorer application in Windows is rather wimpy, and every power user soon looks for a decent replacement. I looked at dozens of alternatives before settling on AB Commander, a dual-pane Explorer replacement.

    AB Commander’s dual-pane view suits me well, since I often need to deal with two folders at a time, but rarely more than that. In contrast to Explorer, AB Commander is very keyboard friendly, providing shortcuts for almost every activity (although the shortcuts are not customizable). No matter where you are, navigating is very quick:

  • Enter navigates into a folder
  • Backspace navigates back a level; Alt+Backspace navigates to the root of the current drive
  • For every folder that is visited, it remembers and reselects the subfolder that was previously selected
  • Alt+Left and Right Arrow go forward and back in the navigation history
  • Ctrl+D, letter navigates to a given drive
  • Alt+D or Ctrl+J can be used to navigate directly to a folder (and provides a drop-down list of recently accessed folders)
  • Ctrl+G displays a list of common and recent folders for navigating directly to
  • Ctrl+H displays the history of recently accessed folders
  • Ctrl+O shows a list of favorite folders
    AB Commander does a good job of leveraging the existing Windows shell rendering and navigation capabilities while adding lots of functionality that is missing from Explorer itself. It can also completely replace Explorer for most shell integration (display virtual folders, take over Windows+E shortcut and association with folders, show regular Explorer context menu, etc.). Some of the additional features I use frequently include filtering, favorites, history, quick editing, and drive and new folder shortcuts.

    AB Commander has been very stable for me on Windows XP, the latest release supports Windows Vista, and an x64 edition is also available. If you’re looking for a Windows Explorer replacement, AB Commander should be on your list to evaluate.