Internet Explorer 7 User Agent Browser Extension

Astonishingly, some sites reject Internet Explorer 7 as out-of-date, but they accept IE 6.  (Lazy coding, I suppose.)  Microsoft has a utility to make IE lie about its version, but it runs as a wrapper around IE, setting the UA in the registry, running IE, and then setting it back when IE exits.

There is a spiffy browser extension that lets you change the user agent on the fly.  See http://www.enhanceie.com/ietoys/uapick.asp

While you're there, he's got other good tools, like SlickRun.

 

On Requests

The Language of the Request

The only important thing is to know that if one works well in a potato field, the potatoes will grow. If one works well among men, they will grow- That's reality. The rest is smoke. It's important to know that words don't move mountains. Work, exacting work, moves mountains.. -Danilo Dolci

One reason that some software professionals fail to advance to their full potential is that they are perceived as lacking in ‘soft’ skills. This situation is not surprising, given that most never received training in soft skills nor have they had the time to do self-study in this area. Soft skills can be learned and practiced, just as with ‘hard’ skills. This article is the first in a series of articles intended to help make available information on key soft skills. It is targeted at software professionals at all levels. Please send any feedback to softskills @ kleinfelter . com.

The Hardest Thing about Creating Software…

One of the toughest things about creating software is communication. This article touches on one area of communication that frequently goes awry: the language of the request If you’re in the business of providing or obtaining a service (and isn’t all of software development either one or the other?), then clear communication of requests is important. The language suggested in this article is not important per se, but it can go a long way toward ensuring that full and accurate communication occurs.

The Language of the Request

Unless you’re in the military, when you want someone to do something, you have to ask them. (Duh!)

A well-formed request is clear on several points:

  1. The fact that a request is being made
  2. Who is being asked
  3. Who is asking
  4. What they are being asked to do
  5. When they are being asked to do it

Let’s consider the case where I’m in a room full of developers, and I say, "Gee! This code really stinks! Somebody should clean up this ugly code."

Let’s assume that George, a skilled developer, wrote the code. George is someone who likes to write 90% of the code and then move on to other things. Earl and Janet, two of the other developers in the room are decent coders. They are also the kind of person who assumes that if something is wrong, it is up to them to personally fix it. It is easy to see that George is likely to completely blow off my remark, and Earl and Janet are each likely to set off on a mission to fix the code.

Assuming that I wanted George to fix the code, where did I screw up? I have failed to make a Clear and Unambiguous Request [sic].

I have in mind that the author of the code should fix it, but I’ve not made clear who I’m asking. George is the kind of guy who just isn’t interested in doing that sort of thing, so he chooses to hear my remark as tantamount to commenting on the weather. Since Earl and Janet always assume that everything is their fault, each chooses to hear my remark as a request that they fix the code. I left the matter of who was being asked open to interpretation, and each developer interpreted it differently. (Don’t tell me you don’t know any developers like these three – I won’t believe it!) It ain’t their job to figure out who I’m asking. It is my job to make clear who I’m asking.

This ‘request’ also fails to identify the requestor. In fact, it was probably worded this way specifically to avoid doing so. Most people don’t want to create additional work for their peers, staff, supervisors, etc. When I must create additional work for someone, I often seek to avoid taking the responsibility for doing so. My reasoning goes something like, "Maybe if I don’t directly ask, they won’t notice that I’m asking them to do more work," or perhaps, "They won’t think I’m a team player if I’m always asking them to help me."

Bad idea! Unless they’re terminally dense, they’re going to figure out that I’m the source of the additional work. If they don’t want to do it, they’ll choose to ignore what I said. (After all, I didn’t actually ask them to do anything, now did I?) In addition to ignoring my request, there’s a good chance that they’ll resent me for not coming right out and asking. If I’m going to ask someone to do something, I have to be willing to take the heat for making a request. I am the one who is going to be displeased if the work isn’t done, so I owe them the courtesy of letting them know that it is me who is asking.

The third failing of my request is that I didn’t make clear what I was asking George to do. George chose to hear it as not requiring any action on his part. If he were Earl, he might have interpreted it as a request to rewrite the entire application, when all I wanted was for him to fix a single function. Jeez, if he thought I wanted the whole app rewritten, no wonder George blew off my request. If I want someone to do something, I owe it to them to make clear what I’m asking them to do.

The fourth failing of my request is that I did not make my deadline clear. Do I want this done today? In this lifetime? Assuming that George is going to work another 30 years, there are 6000 workdays for him to choose from. Odds are that he’s not going to choose the same one as me. If I want something done by a certain time, it’s my job to make the deadline a part of the request.

The fifth failing is that I’ve obscured the fact that I’m even asking anyone to do anything. One reason why I sometimes avoid making a clear and unambiguous request is that I don’t feel like I have the authority to ask someone to do something. Bullshit! I’ve got all the authority I need to ask a subordinate to do something, to ask a peer to do something, or to ask my boss or even the CEO to do something. It is not always necessary to create an external justification for a request. Just make the request. If the requestee wants to know why, they can ask. If I want something done, that’s justification enough to ask! (Remember that we’re not talking about the military here. The only time I need authority is if I’m going to issue an order.)

The reasons why I (and by extension, others) avoid making a clear and unambiguous request are not bad ones. They are part of the social fabric that makes it possible for people with differing goals and needs to coexist. When you’re working with someone whom you just work really well with, you often don’t have to make the effort of clear communication. If they’re not someone who always seems to know just what you want, then you’re going to have to make the extra effort if you want the communication to occur. If the communication doesn’t occur, you’re probably going to be disappointed by the results.

What if the shoe is on the other foot? What can I do if someone makes a poorly-formed request of me? Ask for clarification! I can try something clever like, "Are you asking me to debug the module? When would you like it to be done?"

When someone makes a well-formed request, there are several appropriate responses:

  • Accept
  • Decline
  • Propose an alternative
  • Ask for clarification

If I ask George to fix the code and he accepts my request, I’m a happy camper.

If I ask George to fix the code and he declines my request, I’m not pleased, but he’s made a clear response. If I need the code fixed, I now have the option of asking Earl to do it. Please note that I’m George’s boss, and he makes a habit of declining my requests, he may find his career options severely limited.

If George is unable to accept my request (of if he just prefers not to accept it), he can propose an alternative. If George has a tight deadline next week, and he knows that Janet has free time on her hands, he could say, "Gee, I’m kinda busy. How about asking Janet to do it?" I can accept his alternative, or we can continue negotiating until we reach a mutually acceptable alternative.

If George isn't clear whether or not I expect him to work late in order to get this done, he can ask for clarification on this point before responding.

Please note that it is not appropriate for George to label my request. If I say, "George, I want you to clean up this function by next Friday," it is entirely inappropriate for George to say, "That’s the dumbest thing I’ve ever heard! Don’t you know I’ve got 3000 lines of code to debug by then!!??!!" (Sound familiar?)

To summarize, a well-formed request is clear and unambiguous, identifying:

  • What is to be done
  • Who is to do it
  • When it is to be done
  • Who is asking.

To respond appropriately is to do one of the following:

  • Seek clarification of the request
  • Accept
  • Decline
  • Propose an alternative.

Copyright 2000-2005, Kevin P. Kleinfelter, All Rights Reserved

Retrieved from http://www.kleinfelter.com/requests

VirtualBox Makes VMDK Not Mountable by vmware-vdiskmanager

If you create a virtual disk, using Vmware's vmware-vdiskmanager, SOMETIMES after you use the disk in a VirtualBox VM, vmware-vdiskmanager will refuse to mount the disk. VirtualBox (version 1.6.2) adds entries to the disk header file that "VMware DiskMount Utility version 5.5.0 b­uild-18463" is not prepared to accept.

To cure the problem, delete the added entries. For example, if you create a virtual disk using the command:

vmware-vdiskmanager -c -s 1Gb -a ide -t 2 test1gb.vmdk

it will create two files: test1gb.vmdk and test1gb-flat.vmdk. The test1gb.vmdk file is just a descriptor for test1gb-flat.vmdk. The contents of test1gb.vmdk resemble the following:

# Disk DescriptorFile
version=1
CID=9b84b314
parentCID=ffffffff
createType="monolithicFlat"

# Extent description
RW 2097152 FLAT "test1gb-flat.vmdk" 0

# The Disk Data Base 
#DDB

ddb.virtualHWVersion = "6"
ddb.geometry.cylinders = "2080"
ddb.geometry.heads = "16"
ddb.geometry.sectors = "63"
ddb.adapterType = "ide"

After you access the vmdk using VirtualBox, it can look something like this:

# Disk DescriptorFile
version=1
CID=dcfc4939
parentCID=ffffffff
createType="monolithicFlat"

# Extent description
RW 2097152 FLAT "cygwin-flat.vmdk" 0

# The Disk Data Base 
#DDB

ddb.virtualHWVersion = "6"
ddb.geometry.cylinders = "2080"
ddb.geometry.heads = "16"
ddb.geometry.sectors = "63"
ddb.adapterType = "ide"
ddb.uuid.image = "acb5e55e-497f-4622-a9c2-693d7a2f3d70"
ddb.uuid.modification = "ea0c778f-abb5-48d4-b19f-23d86da70c5b"
ddb.uuid.parent = "00000000-0000-0000-0000-000000000000"
ddb.uuid.parentmodification = "8e4bc96d-1c02-43b7-9eeb-51eaa692fc63"
ddb.geometry.biosCylinders="520"
ddb.geometry.biosHeads="64"
ddb.geometry.biosSectors="63"

To return the vmdk to being usable by vmware-mount, simply delete the 3 lines that begin with "ddb.geometry.bios". Of course, you have to do this every time you want to use vmware-mount (if the disk has been used by VirtualBox since the last mount).

­

Oracle ODBC Via Oracle Instant Client

Update 2013.07.17: Still works with Oracle 11.2. Just substitute "11" everywhere you see "10" in the instructions below.


Instead of installing the full Oracle Client plus ODBC drivers, you can use Oracle "Instant Client" plus Instant Client ODBC supplement.  Setting it up is not intuitively obvious, so here's what I did.  Note that you do NOT need a tnsnames.ora or a sqlnet.ora.

  • PC = Windows XP Pro SP3 with 4GB RAM
  • Oracle server is 10g version 10.2.something
  • Instant Client for Win32 download from http://www.oracle.com/technology/software/tech/oci/instantclient/index.html (two downloads)
    • Instant Client Package - Basic
    • Instant Client Package - ODBC
  • Unzip the Basic Instant Client.  All of the files are now in C:\instantclient_10_2.
  • Unzip the ODBC supplement.  Put all of its files in C:\instantclient_10_2.
  • Run C:\instantclient_10_2\odbc_install.exe
  • Set the following SYSTEM (not user) environment variables:
    • LD_LIBRARY_PATH=C:\instantclient_10_2
    • TNS_ADMIN=C:\instantclient_10_2
    • SQLPATH=C:\instantclient_10_2
    • AppendC:\instantclient_10_2 to your PATH
  • Start/Control Panel/Data Sources(ODBC)
    • System DSN
    • Add:
      • Data Source Name = whatever you want to call it (I used P1EBETL)
      • Description = whatever you want to say (I used P1EBETL)
      • TNS Service name = //hostname:port/serviceID (I used //p1bid1d1.edc.mycompany.net:1524/P1EBETL)
        • Note: This is NOT a TNS Service name -- it is a "SQL Connect URL."  Using this means you don't have to create a tnsnames.ora or a sqlnet.ora, and it might be essential to not installing SQL*Net. (I don't know for certain.  I just know that by using it, I didn't have to install other software or create the .ora files.)
      • User ID = database-user-ID-here
    • Press Test Connection, enter the password, and click OK.  You should see a "Connection Successful" dialog.

Update 9/4/2008: This was working well for me and then one day it suddenly stopped.  I started getting the following error:

unable to connect
sqlstate s1000
oracle odbc ora ora-12705 cannot access nls data files or invalid environment specified

The solution was to run Regedit, and delete: HKLM\Software\Oracle\NLS_LANG

 

You may also want to install sqlplus. It is similarly installed by unzipping into C:\instantclient_xx_2. SQL*Plus can be run without TNSNAMES by using

sqlplus userid/pwd@database.company.com:1521/sid

Microsoft Office 2003 Demands the Install Disk Even Though It Has Been Installed

Sometimes, Microsoft Office will demand the Office CD,even though it has already been installed.  This usually happens when you start an Office application.



In the particular case of MS Project 2003, it may tell you that it can’t find sku03a.cab, but with different Office applications, different files will be demanded.



If you’ve misplaced your CD, or if you installed from your LAN, but you are not presently connected to the LAN, this can be a bummer.  If you cancel the message, it will open the application, but if will re-demand the CD each time you start the app.  Very annoying on a cross-country flight.



The problem may be caused by the application trying to collect your name and initials, for a first-time use.   To work around this:


  • Run regedit
  • Navigate to HKEY_CURRENT_USER\Software\Microsoft\Office\<version-number-here>\<application-name-here>
  • Create a DWORD with value = 1, named UserData

Note that for MS Project, you may find entries for both "MS Project" and "Project."   Create UserData under "MS Project."



Update
I encountered a very similar problem when attempting to uninstall Office 2003.  I wanted to uninstall, but I didn’t have my install CD.  I had the disk files from my CD, but not my CD.  But my files were from Office 2003 SP2, and my installed office was Office 2003 SP3.  It refused to uninstall.

I took my Office 2003 SP2 setup files, and slipstreamed the administrative edition (the "full edition") of Office SP3 on top.  That allowed me to use the SP2+SP3 setup files to uninstall Office 2003, so that I could Install Office 2007.

The moral of these stories is to never, ever throw away your Microsoft CDs, even after you make (multiple) copies of the CD to hard disk.

VirtualBox Mouse Weirdness

When running VirtualBox with a Windows XP client, I ran into a problem where it worked fine before I installed the Virtual Box Client Drivers, and then, any mouse movement resulted in the mouse pointer moving slowly down and to the right.  It turns out this is a known VirtualBox conflict with the SMS mouse driver. (SMS allows the Windows domain managers to manage your PC, including remote control.)

So I uninstalled SMS.  Problem NOT cured.

So I checked Device Manager.  SMS Mouse Driver does not appear.

It turns out that there is a Microsoft known problem, where uninstalling SMS does not uninstall the SMS Mouse and SMS Keyboard drivers.  But why weren't they listed in Device Manager?

Because SMS had been uninstalled the 'devices' no longer existed, and Device Manager doesn't show non-existent devices.  The solution?  See Device Manager and Invisible Devices elsewhere on this blog.   Then delete the SMS Mouse Driver and reboot.

Somewhat Portable VirtualBox 3.x

I'd like to have a zero-install, Windows, virtual machine environment.  In theory, this would let me run my OS and desktop environment on any Windows computer, without installing the VM software.

There is a fundamental reason why this can't happen 100%.  The VM has to be able to handle the situation when the virtual computer attempts to execute ring-0 (privileged mode) instructions.  You have to install a device driver or a Windows service in order to be able to handle the interrupt/trap.  There is also the issue of getting your network to work.  Many VMs handle this by creating a TUN/TAP virtual adapter in the host.

You can get close to zero-install with VirtualBox.  For starters, you don't have to create the TAP virtual adapter in the host.  For a VirtualBox NAT adapter, VirtualBox does not provide the full TCP/IP stack to the VM.  Essentially, it provides a TCP (only) proxy.  While this breaks things like 'ping', it means you don't need a virtual host adapter in order to do networking from the guest.

Here's a Windows batch file to run a non-installed VirtualBox.  It assumes you have copied the contents of the C:\Program Files\Sun\VirtualBox (or C:\Program Files\Sun\xVM with some versions of VBox) directory to t:\pvb. It also assumes that you have a utility program called 'sleep' that can sleep for the given number of seconds.  (If you don't have one of those, replace the 'sleep' lines with 'pause' and you can do manual sleeping.)

UPDATED for VirtualBox 3.0.12

UPDATE: Still works with 3.1.4

UPDATE: Still works with 3.2.0

SET pvbroot=S:\pvb
SET datadir=S:\pvb\pvb-data
S:

cd %pvbroot%
mkdir %datadir% 2>nul:

SET VBOX_USER_HOME=%datadir%\.VirtualBox


REM This service *has* to be loaded.  It manages the client's attempts to go to ring 0 (supervisor mode).
sc create pvboxdrv binpath= %pvbroot%\drivers\vboxdrv\vboxdrv.sys type= kernel start= demand error= normal displayname= pvboxdrv

sleep 5
REM The VirtualBox COM service, i.e. all COM objects that live outside the VM process. 
%pvbroot%\VBoxSVC.exe /reregserver

sleep 5
REM Client-side COM library. All COM (or XPCOM) objects that live on the client side
REM (i.e. inside the VM execution process) are contained in this file. So IConsole and friends go there. 
regsvr32.exe /S %pvbroot%\VBoxC.dll

sleep 5
REM Load the "VirtualBox Portable Runtime (IPRT)"
rundll32 %pvbroot%\VBoxRT.dll,RTR3Init

REM Start the ring-0 driver
sc start pvboxdrv

Sleep 3
REM Start the GUI
%pvbroot%\VirtualBox.exe


REM Count off seconds before you let it continue.  If you don't, you'll find that you have to reboot before you can run again.
sleep 5

REM Stop the ring-0 service
sc stop pvboxdrv
sleep 5

REM Make sure it is really stopped
sc query pvboxdrv
pause

REM Remove the VirtualBox COM service, i.e. all COM objects that live outside the VM process.
%pvbroot%\VBoxSVC.exe /unregserver


REM Remove Client-side COM library. All COM (or XPCOM) objects that live on the client side 
REM (i.e. inside the VM execution process) are contained in this file. So IConsole and friends go there. 
regsvr32.exe /S /U %pvbroot%\VBoxC.dll

sleep 3
sc delete pvboxdrv

echo
echo All done
sleep 9

A troubleshooting tip – For a little while, I was having trouble with the service going into a stop_pending state from which it never exited. This caused the "sc delete" to fail because you can’t delete a running service. I think this was caused by a previous install of VirtualBox that left some bits behind. I deleted the various vbox* files from C:\Windows\System32 (and similar folders), and I scrubbed all vbox and virtualbox entries from the registry, rebooted, and it started working.

Device Manager and Invisible Devices

  1. Open a command prompt
  2. set devmgr_show_nonpresent_devices=1
  3. devmgmt.msc
  4. In Device Manager, click View/Show Hidden Devices in the menu</strong />

Windows Live Writer

I thought I'd try Windows Live Writer.  It won't work with Windows 2000, which I use because I despise product activation.  (I do a LOT of PC setup and tear-down, with a lot of OS re-installs.)  Bummer.

Then I read about Windows Live Writer Portable.  It actually works -- under Windows XP. Under Win2K it crashes.  I'm betting it is using DotNet 3, which is a no-go on Win2K.  I do have GDI+ installed on my Win2K, so it isn't that.

Or maybe it has a dependency on IE7?  Good luck getting THAT to run in Win2k!