Software

On-screen performance monitoring for acceptance tests

Posted in Programming, Software, Testing on November 15th, 2011 by Mr. Bungle – Be the first to comment

If you record videos of your automated acceptance tests (we are using CamStudio), an excellent addition is to install the free Prism HUD utility. This will give you on-screen (but transparent to mouse actions) CPU / disk / network and memory statistics which can be very useful when reviewing these videos. It appears to be the only application that allows reporting of metrics of any process that exceeds a certain (configurable) delta, or is over a certain (configurable) threshold. This means you get much more useful information than just a summary metric (e.g. total CPU utilization), but you don’t clutter your screen with the metrics for all processes, just those ‘that matter’ at any point in time, automatically!!

Go get it here.

Random Programming Quote

Posted in Programming, Software on November 2nd, 2011 by Mr. Bungle – 2 Comments

I’ve hand-collected > 100 great programming quotes and stuffed them in a tiny console application, which, when run, will randomly print one to the console. Use it as a footer for your nightly build email, or anywhere you have some drabby generated document / email.

Also can be used if you are just bored on a Friday afternoon. ;)

Download it here.

Bluetooth Service Connector

Posted in Bluetooth, Software, Windows 7 on October 20th, 2011 by Mr. Bungle – Be the first to comment

Bluetooth is still a relatively new technology when it comes to Windows. Although Windows 7 now has a reasonably decent bluetooth stack baked-in, it’s certainly not bug-free. It is not straightforward to control connection of bluetooth services, such as AudioSink, HeadSet, RemoteControl etc. And depending on how ‘dumb’ your bluetooth device is, your only option to get it connected to Windows in some cases (e.g. your device was last connected to a different host, such as your phone) is to completely uninstall and re-discover the device, as discussed on this thread. Weeeak.

I’ve written a small utility that may help with issue (it works for me, but I’ve only tested on my own bluetooth headphones – Sony DR-BT50). It works in conjunction with another utility I recently posted (that allows a program to set the default audio device), and provides control over connecting / disconnecting the available bluetooth services for all your paired bluetooth devices in Windows. It also provides a shortcut specifically for bluetooth audio devices which automates the process of getting a frustratingly silent pair of headphones / speaker to spring into life with a single click.

Download the utility here. I hope it works for you!

Setting default audio device in Windows

Posted in Programming, Software, Windows 7 on October 17th, 2011 by Mr. Bungle – 5 Comments

Since the audio revamp in Windows Vista, many things that were possible to do in code in the past (i.e. XP) are now difficult or impossible. One of those tasks that was easy in XP was setting the default audio device for playback. In XP this just required a registry change, but in Vista & Windows 7, Microsoft decided that developers should not have access to change the default audio device, so they locked down the registry and provided no documented API to achieve this. Their reasoning was that if two programs both wanted to set the default audio device, they would end up fighting each other for it, which of course is bad. But I believe this is a very short-sighted decision, since there are plenty of legitimate cases where a program needs to do this. These are discussed on this amazingly long-living thread (started in 2006 and still going).

The end result is that, no thanks to Microsoft, we finally have a way to do this, and I’ve created a console application in case others would like to control this as well:

Usage: SetDefaultAudioDevice.exe [deviceID] [role]
Where:
[deviceID] is a GUID including braces
[role] is either ‘console’, ‘multimedia’ or ‘communications’.

Example: SetDefaultAudioDevice {24dfc80a-680f-4748-8627-c340cb14f187} multimedia

Your audio device IDs can be found in the registry under HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render.

Feel free to download this utility here, source code is in my SVN repo.

Thank-you to EreTIk and Jonny Best and everyone else on the above forum post!

Unknown Build Error RG1000

Posted in Programming, Software on June 29th, 2011 by Mr. Bungle – Be the first to comment

After manually merging a set of source changes to a .csproj file, my project would no longer build, giving this error:

Common.targets(588,5): error RG1000: Unknown build error, ‘An item with the same key has already been added.’

Not particularly helpful, especially if there are a large number of changes in the .csproj file. To get more information in such a case, in VS2010 you can go to Tools->Options->Projects and Solutions->Build and Run and set the MSBuild output verbosity to ‘Diagnostic’. After attempting to build again, the error now becomes much more useful:

Error 2 The item “Views\FeedbackView.xaml.cs” was specified more than once in the “Sources” parameter. Duplicate items are not supported by the “Sources” parameter. C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets 160 9 MyCompany.MyProduct.WebClient

Interestingly, after I reset the verbosity level back to Minimal (without making any code changes), the more detailed error still appeared. Weird.

Integrating Agent Ransack with FreeCommander

Posted in Data Management, Software, Uncategorized on June 22nd, 2011 by Mr. Bungle – Be the first to comment

FreeCommander is my Windows Explorer replacement of choice, however it’s search feature is pretty basic. It pails in comparison to the free Agent Ransack which is fast, simple, and most importantly, lets you view snippets of the file contents in which a search term was found without having to open the file itself. Luckily, it is easy to replace FreeCommander’s built-in search feature with Agent Ransack instead:

  1. Install Agent Ransack.
  2. In FreeCommander, go to Extras->Favorite Tools->Edit
  3. Click the blue drop-down triangle next to the ‘Program’ field and seek to ‘C:\Program Files (x86)\Mythicsoft\Agent Ransack\AgentRansack.exe’
  4. Set the ‘Parameter’ field to ‘-d “%ActivDir%”‘ (without the single quotes, but including the double quotes around %ActiveDir% to ensure it works when there are spaces in the current directory path).
  5. Optionally set the icon by selecting AgentRansack.exe from the installation location.
  6. Select ‘Maximized’.
  7. Most importantly, set the HotKey to something and choose ‘global hotkey’.

Now you can press the defined hotkey (I use Ctrl+0) to launch Agent Ransack in the active folder, ready to search.

Error when opening Word documents

Posted in Software, Windows 7 on June 15th, 2011 by Mr. Bungle – Be the first to comment

OS: Windows 7 64-bit
Office: 2010 Premium

When double-clicking a .doc/x file in Windows Explorer, or launching it via a different explorer, such as FreeCommander, you may see this error message:

Many, many people have seen this issue. I tried several solution, including deleting the word Data key, as recommended by Microsoft, checking that ‘Run this program as an administrator’ is not checked and renaming normal.dotm, but all failed to fix the error. Finally, here’s what fixed it for me:

  1. Right-click a .doc/x file -> Open With -> Choose program
  2. Select Word 2007 and hit OK.

After doing that, I could open word documents from outside word successfully.

Pairing SPP bluetooth devices with Android phones

Posted in Android, Bluetooth, Programming, Software on May 22nd, 2011 by Mr. Bungle – 21 Comments

I bought a Bluetooth Bee from Seeed Studios, which is an SPP (Serial Port Profile) bluetooth device, with the intention of writing an app for Android that communicates with a remote data logger. Unfortunately, it turns out that there’s a bug in the BroadComm bluetooth stack that is used by most Android phone manufacturers (LG, HTC, Samsung are affected, but not the Google Nexus phones) that prevents discovery to this and all other bluetooth devices that report their Class of Device (CoD) code as 0×00. This is the case for many SPP bluetooth devices, and SPP is probably the most common bluetooth profile (at least it’s the most basic – just straight serial comms) so this bug is pretty nasty.

Basically, if you perform a scan for devices, your SPP device will not show up, and in the logs you will see:

ERROR/DTUN_HCID4(663): Device [00:18:E4:0C:6E:CA] class is 0×00 – skip it.

The code for the Broadcom bluetooth stack is open source, so the bug is plain for all to see here. The bug has been reported on StackOverflow and elsewhere.

Until Broadcom and/or all users of their bluetooth stack fix this issue (by simply removing the IF block that skips devices whose CoD is 0×00), the only way to connect to your SPP device from Android is to read the log files, looking for the above error, extract the device address, and manually initiate a connection in code. After this, your SPP device will appear along with all your other bluetooth devices in the bluetooth settings page on your phone, and you can successfully communicate using the bluetooth API provided by Google.

I have written a re-usable class that implements this workaround, which you can download from here.

How to use (from your Activity class):

(new BluetoothClassZeroDiscoveryTask(
    this,
    new BluetoothDiscoveryCallback())).execute();

Where BluetoothDiscoveryCallback is a class defined e.g. in your Activity. The call method will be called after the discovery task completes, and is passed the complete list of paired bluetooth devices, including those that are undiscoverable due to the above bug.

private class BluetoothDiscoveryCallback
    implements Action<ArrayList<BluetoothDevice>>
{
	public void call(ArrayList<BluetoothDevice> devices)
	{
		// Now you have the list of ALL available devices,
		// including those that report class 0x00.
	}
}

// Java equivalent of the built-in Action from C#.
public interface Action<T>
{
	void call(T target);
}

You’ll also need to add READ_LOGS permission to your manifest file:

<uses-permission android:name="android.permission.READ_LOGS" />

Feel free to suggest improvements to the code, I’m new to Android and haven’t done Java in ages :)

P.S. Hassle your phone manufacturer to fix this bug so this workaround is not needed!

Update: I have turned the above class into an app which I’ve made available in the Android Marketplace called Bluetooth Class Zero. It is a simple application which just enables pairing with bluetooth class zero devices without having to root & patch your phone. Screenshots:

After pressing “Start Discovery”, if any bluetooth class zero devices were found (but ignored), you will get the standard pairing dialog:

After entering the correct PIN code, your device will be listed alongside others in your bluetooth settings:

The app requires Android 2.1+. It’s been tested on the following phones:


Manufacturer Model Android Version Affected Results
LG Optimus One 2.2 Yes Works
HTC Desire HD 2.2 Yes Works, but unfortunately may interfere with networking / bluetooth operation.
Samsung Galaxy S (I9000) 2.2 Yes Fails
Samsung Galaxy Player 50 2.1 Yes Works

The app is free to use, if you find it useful, feel free to make small donation :)

PicasaPhotoViewer.exe staying in memory

Posted in Programming, Software, Windows 7 on May 3rd, 2011 by Mr. Bungle – 2 Comments

Google’s Picasa Photo Viewer is one of the best photo preview applications, it loads quickly, and is easy to exit. Unfortunately, Google introduced a bug recently that causes the PicasaPhotoViewer.exe process to remain in memory even after you close the application. Several posts on google forums and elsewhere have reported this:

Why does PicasaPhotoViewer.exe stay resident in memory
Multiple picasaphotoviewer.exe ghosts in Task Manager
Memory Loss from orphaned PhotoViewer Processes
PicasaPhotoViewer Process Doesn’t Terminate

This appears to only occur when you open a photo on a network location, such as a network drive. This is a pretty normal usage scenario, such as storage of photos on a RAID server or NAS, and is actually pretty nasty, because it means you can’t rename/delete/move any directory in which you viewed an image including any parent directory (due to the still-running PicasaPhotoViewer.exe locking the directory). It doesn’t take long for this to get seriously annoying when you find yourself having to open Process Explorer/Task Manager to kill off all the orphaned PicasaPhotoViewer.exe processes when you are working with directories.

Orphaned PicasaPhotoViewer.exe processes.

Until Google fixes this, I solved this with a small C# application. It monitors for orphaned instances of PicasaPhotoViewer.exe (i.e. those that are running but have no window) and kills them. This is the complete code:

static void Main(string[] args)
{
   while (true)
   {
      var picasaProcesses =
         (from p in Process.GetProcessesByName("PicasaPhotoViewer")
          where p.MainWindowHandle == IntPtr.Zero && !p.HasExited
          select p);

      foreach (var process in picasaProcesses)
      {
         process.WaitForInputIdle();
         if (process.MainWindowHandle == IntPtr.Zero)
         {
            process.Kill();
            process.WaitForExit();
         }
      }

      Thread.Sleep(1000);
   }
}

Feel free to download the utility, and launch it on Windows startup using a logon script such as described here. Note: The program requires admin rights to run, so you can’t just place a shortcut to it in your ‘Startup’ folder if you are using Vista/7 with UAC switched on.

Update: Ok, it appears this issue has been fixed by Google in Picasa build > 117.38. Updating to the latest version (build 117.43 at the time of writing) fixed the issue for me, so my program should no longer be needed :)

Update 2: According to the comment below, the issue may still be occurring for some people. So I have made the program to fix this available for download again.

Muting Bluetooth Headphones

Posted in Bluetooth, Programming, Software, Windows 7 on March 11th, 2011 by Mr. Bungle – 1 Comment

After much research, I recently purchased a pair of Sony BT-50 Bluetooth headphones. They are AWESOME!!!! The only problem is, there’s no way to mute them! In fact, there’s no way to mute any bluetooth headphones except from the ‘mute’ button on the bluetooth device. If you’re listening to music on a PC, volume up/down keys work (from a multimedia keyboard), but not mute. So I’ve written a utility that enables muting of your headphones with a global hotkey, and you can download it for free here.

Note: The program will only work on Windows 7, and you’ll need .Net 4 installed. So you know you’re on the bleeding edge of technology using this. Who knew a feature such as mute was so high-tech :D

The program uses the CoreAudioAPI library by Ray Molenkamp, and the global hotkey class by Max Bolingbroke. They made this possible.

Btw, the BT-50 headphones don’t come with a USB Bluetooth adaptor, so if you want to use with with a PC (as opposed to a bluetooth-enabled phone), you’ll need to purchase one. I’d advise against going with the $1.00 bluetooth adaptors from China (even with free shipping, wtf?), and instead do your research and find an adaptor that has drivers for Windows 7 and A2DP support.

For Aussies, I can confirm that the Dick Smith Bluetooth 100M USB adapter (not listed on the Dick Smith website, but I found them in the Macquarie park store in Sydney) will work with these headphones, after you wrestle a bit with BlueSoliel (worst usability in software I’ve seen in a while – see below for how to automate connection of the Advanced Audio Service). And you’ll need to swap out the American power supply with an Aussie one – again Dick Smith has the goods. Just make sure the polarity is right: The engraving “CEN” on the jack with the yellow tip should be on the positive side of the connector.

Update: To avoid using BlueSoliel every time you switch on your headphones, you can save the connection as a shortcut. It is placed on your desktop without telling you: