Saturday, October 8, 2011

Developing Software Productively through selective automation

How do you increase your software development productivity over the long haul? Here's how: Examine your daily task work to identify tasks that are amenable to automation, and then automate it. For me, this means to do the following:
  1. Maintain a constant awareness of all of your development activities, specifically patterns of behavior or groups of actions that are repeated multiple times throughout the day.
  2. Of those patterns, identify the ones that are comprised of tasks that do not change regardless of the circumstances.
  3. Determine if those tasks are amenable to automation (some will, some won't). This excludes tasks that should be delegated to someone else to do.
  4. Schedule time to encapsulate the tasks in a software routine.
  5. Make executing that routine mindless and effortless, by associating the execution of the routine to a new and unique combination of key-bindings in the main window of the primary editing tool you use (e.g. Emacs, Eclipse, Jedit, etc.).
Some may think that the "schedule time" item will eat into their productivity. However, I have found in practice that the time saved by automation will pay for itself over time. But there is one more benefit: Having a machine execute the tasks frees up your mind to think at a higher level of abstraction, in a given project. Making a task mindless and effortless has the goal of not distracting your mind from the flow of adding, deleting, and moving code around. Any requirement to pull down menus, bring other windows to the front, type in and execute long command lines, etc., are distracting to the mental process of software development and should be gradually eliminated by delegating those tasks to push-button automation. Therefore, as a software developer, those activities are best done right there in the text editing window itself, to be driven by carefully chosen key sequences that are easy to memorize. Below are some examples of tasks I discovered fit the above criteria, and that I could automate (this is specific to my focus on code development, but they could be generalized for other work domains):
  1. When the cursor is on a full or relative path to a file somewhere on the filesystem, typing a keystroke to open the file in the text editor. Compare that to opening up a new window, moving the mouse cursor into that window, navigating a file browser to find the file or typing in the full path to the file in the file system. Think about how often that task is done in given developers work day.
  2. When the cursor is sitting on a URL, typing a keystroke to open the URL in a browser. Think about how often you need to refer to reference material that is only on some remote web server somewhere.
  3. When the cursor is sitting on a symbol whose definition you need to alter, typing a keystroke to drive your editor to view and edit that definition. Compare that with using a file search to find the definition, and filter out the false positives.
  4. You need to go back to where you started when editing some code, so type a keystroke to go back to the place where you started. The idea here is that each time you navigate to a new view on some source, there is the equivalent of a "back" button in the form of a key sequence. This should be applicable for all types of navigation to some file, symbol, or web page.
  5. You need to reload your brain with the context after an interruption. The thing being automated away is the time wasted wondering where you left off, or clicking through various windows or views to answer that question. The solution is to track notes of decisions you are making in a searchable set of interlinked note files. This excludes writing them down on paper, since there is no search capability (and filing cabinets and other filing systems are yet another mental distraction). In my case, I use multiple text files that are interlinked (Muse mode in GNU Emacs). This also pays dividends later on when you need to refresh your memory on decisions that were made on the project done months later.

How to install Adobe Flash plugin versus Gnash under 32-bit FireFox 7.0.1 on Debian Linux


Herein I show a step-by-step procedure to install Adobe Flash plugin into Firefox, and remove the Gnash plugin which seems to be buggy as of 2011-10-08.  The version of Firefox I am using here is not the one that is installed using the Debian package manager, but the Firefox I downloaded directly from the Mozilla website.

Provided below is Procedure followed by the Backstory.


  1. Close down Firefox. 
  2. Do step 165  which states: "If you installed via apt-get/aptitude (Debian/Ubuntu): sudo apt-get remove flashplugin-nonfree"
  3. Do step 167:
    1. Type about:config in the address bar and press Enter. 
    2. Find the option plugin.expose_full_path and change the value to "true" (double-clicking the preference name will toggle the setting).
    3. Type about:plugins and locate the flash plugin
  4. If you see the Gnash Shockwave plugin (you will see "gnash" somewhere in the pathname), then you need to continue below and remove it:
    1. Remove the gnash plugin from the Debian installation: sudo apt-get remove browser-plugin-gnash gnash-dbg
  5. Install Adobe Flash plugin:
    1. Download the .tar.gz file from the Adobe website specifically for 32-bit Linux (I did this by disabling all Shockwave plugins, then browsing to YouTube, and then clicking on the link to the Adobe website to find the link specifically for Linux).
    2. Into a temporary directory, extract the tarball via tar zxvf thefile.tar.gz
    3. Copy the file into ~/.mozilla/plugins/, overwriting any file that will be there.
  6. Reinvoke Firefox
  7. In the Address field, type about:plugins
  8. You should not see any Gnash references under any Shockwave Flash entry
  9. Test it out on a YouTube video:
    1. Browse to
    2. Right mouse click on the video and insure it does not say HTML5. If it does, keep looking for other videos that are true flash videos.
    3. Right mouse click on the video and it should say "About Adobe Flash player ".
  10. Test it out on
    1. Click on the tiny blue speaker symbol to the right of the "browser" word in the definition. It should pronounce the word.
    2. Right mouse click on the icon and it should also say "About Adobe Flash Player ".


I am using the Firefox version 7.0.1 that was downloaded directly from the Mozilla website, and not the one provided by Debian (i.e., I did not want the one rebranded as Iceweasel).  I did this because I want to be able to upgrade Firefox using the built-in Firefox upgrade mechanism versus be held up by the Debian release schedule.

I had recently upgraded my 32-bit laptop to use a recent version of Debian. I reused my existing Firefox installation that was installed into my HOME directory.  Everything was working smoothly, until today when I discovered that clicking on the pronunciation icons for definitions inside the site no longer played the pronunciation links, but Flash YouTube videos would play properly.  This post shows what I did to fix the problem.

This post pertains to Firefox 7.0.1 and not Iceweasel running on a 32-bit Debian system.

From what I can gather, the main problem was that the gnash package was being used as the Shockwave Flash player and not the Adobe Flash player plugin.  Why Gnash could not handle I do not know.

I discovered that there were two different kinds of flash plugin being referenced in my Firefox sessions. This may not be the underlying cause of the problem, but having both in the mix seemed wrong in concept, so this shows how I removed the Gnash plugin from my system, and install the latest version of Adobe Flash plugin.

The key trick is to step 167 which states (grammar editing applied):
  1. Type about:config in the address bar and press Enter. Find the option plugin.expose_full_path and change the value to "true" (double-clicking the preference name will toggle the setting).
  2. type about:plugins and locate the flash plugin.
I saw two flash plugins be displayed from the about:plugins page:
Shockwave Flash
File: /home/brentg/.mozilla/plugins/
Shockwave Flash 11.0 r1
MIME Type    Description    Suffixes
application/x-shockwave-flash    Shockwave Flash    swf
application/futuresplash    FutureSplash Player    spl

Shockwave Flash
File: /usr/lib/gnash/
Shockwave Flash 10.1 r999.
Gnash 0.8.8, the GNU SWF Player. Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
Gnash comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of Gnash under the terms of the GNU General Public License. For more information about Gnash, see
Compatible Shockwave Flash 10.1 r999.
MIME Type    Description    Suffixes
application/x-shockwave-flash    Shockwave Flash    swf

Setting the "plugin.expose_full_path" option inside about:config to true is what causes the about:config output above to show the "File:" lines highlighted above.  That was the key information I needed, since with that file path, I could find out what provides the gnash plugin and remove the corresponding Debian packages:

brentg@bg1:~/Downloads/flash$ apt-file search /usr/lib/gnash/
browser-plugin-gnash: /usr/lib/gnash/
gnash-dbg: /usr/lib/debug/usr/lib/gnash/
brentg@bg1:~/Downloads/flash$ sudo apt-get remove browser-plugin-gnash gnash-dbg
Reading package lists... Done
Building dependency tree      
Reading state information... Done
Package gnash-dbg is not installed, so not removed
The following packages will be REMOVED:
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 369 kB disk space will be freed.
Do you want to continue [Y/n]? y
(Reading database ... 116648 files and directories currently installed.)
Removing browser-plugin-gnash ...
I believe that the removal is required so as to prevent Firefox from even considering gnash as the plugin that handles Flash videos when using the Adobe Flash plugin is the one I had intended to use.

I did try step 165 below but it turns out that I did not have the flashplugin-nonfree package(s) installed (but I left in that step in the procedure for completeness).