<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-930637731409800108</id><updated>2012-01-30T09:46:49.346+11:00</updated><category term='Python'/><category term='SQL'/><category term='Game'/><category term='Annoyances'/><category term='AJAX'/><category term='SVG'/><category term='Windows'/><category term='MS-Excel'/><category term='Oracle'/><category term='CPlusPlus'/><category term='Programming'/><category term='Web'/><category term='Greasemonkey'/><category term='Windows Cmd'/><category term='Nethack'/><category term='PowerShell'/><category term='Graphics'/><category term='SharpDevelop'/><category term='Oracle Hyperion'/><category term='Networking'/><category term='Software'/><category term='VB/VBA/VBScript'/><category term='Gawk'/><category term='Miscellaneous'/><category term='OO-Calc'/><category term='Apache'/><category term='Spam'/><category term='MS-Word'/><category term='Yahoo'/><category term='Facebook'/><category term='GnuWin'/><category term='Reviews'/><category term='jQuery'/><category term='MySQL'/><category term='CSS'/><category term='Subversion'/><category term='Javascript'/><category term='MS-Outlook'/><category term='Perl'/><category term='DotNet'/><category term='Java'/><category term='Blogger'/><category term='MS-Visio'/><category term='Google'/><category term='Groovy'/><category term='C#'/><category term='PHP'/><category term='Vim'/><category term='Firefox'/><category term='Ruby'/><category term='Database'/><category term='Weblogic'/><category term='Stylish'/><category term='GameMaker'/><category term='Internet Explorer'/><category term='CSharp'/><category term='VB.Net'/><category term='MS-Access'/><category term='Optimization'/><category term='Visual Studio Express'/><title type='text'>Software Salariman</title><subtitle type='html'>Nuts and bolts about programming applications, databases and spreadsheets. Note: Comments are moderated to filter comment spam. &lt;a href="http://www.google.com/reader/m/view/feed/http://softwaresalariman.blogspot.com/feeds/posts/default"&gt;Mobile version&lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default?start-index=101&amp;max-results=100'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>387</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-329285336451011233</id><published>2011-12-14T11:30:00.002+11:00</published><updated>2011-12-14T11:35:36.066+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annoyances'/><category scheme='http://www.blogger.com/atom/ns#' term='MS-Outlook'/><title type='text'>Outlook Locks Newly Created Folder / Directory</title><summary type='text'>When saving an attachment in Outlook 2007, you can create a new folder in your filesystem first. However, Outlook locks that folder, so you can't move or rename it. You can unlock that folder by ...


Saving the attachment in another folder.
Creating another folder (though not a sub-folder of the one you just created).
Restarting Outlook.


There's an extra method listed in Folder or drive lock </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/329285336451011233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/12/outlook-locks-newly-created-folder.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/329285336451011233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/329285336451011233'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/12/outlook-locks-newly-created-folder.html' title='Outlook Locks Newly Created Folder / Directory'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-168051006279304324</id><published>2011-12-05T10:20:00.001+11:00</published><updated>2011-12-05T11:04:41.110+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle Hyperion'/><title type='text'>Google ChromeFrame incompatible with Oracle Hyperion DRM</title><summary type='text'>If you have installed the Google ChromeFrame add-on for Internet Explorer (MSIE) 7 or 8, you may find that you cannot login to Oracle Hyperion Data Relationship Management (DRM) 11.1.2.1. After MSIE loads the DRM login page, you may see some Javascript errors and when you press the Log on button, nothing happens.

Coincidentally, I started seeing this error message on another web site: ERROR: </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/168051006279304324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/12/google-chromeframe-incompatible-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/168051006279304324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/168051006279304324'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/12/google-chromeframe-incompatible-with.html' title='Google ChromeFrame incompatible with Oracle Hyperion DRM'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5745098381249990473</id><published>2011-12-02T18:00:00.000+11:00</published><updated>2011-12-02T18:00:11.622+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>Specify Rows or Columns for Excel AutoFit</title><summary type='text'>If you use the Excel AutoFit Method to resize cells to display their contents nicely, remember to specify whether to AutoFit rows or columns in Excel, i.e. use Range().Columns.AutoFit or Range().Rows.AutoFit, not just Range().AutoFit. If you don't specify rows or columns, Excel produces Run-time error '1004': AutoFit method of Range class failed.</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5745098381249990473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/12/specify-rows-or-columns-for-excel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5745098381249990473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5745098381249990473'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/12/specify-rows-or-columns-for-excel.html' title='Specify Rows or Columns for Excel AutoFit'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-7809684298898992472</id><published>2011-11-26T06:20:00.000+11:00</published><updated>2011-11-26T06:20:36.907+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Minimal JavaBean introspection example</title><summary type='text'>Just playing with JavaBeans, so here's a small example to create a simple JavaBean, set a property and read it.


import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class SimpleBean {

  private final String name = "</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/7809684298898992472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/11/minimal-javabean-introspection-example.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7809684298898992472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7809684298898992472'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/11/minimal-javabean-introspection-example.html' title='Minimal JavaBean introspection example'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5380705494603961515</id><published>2011-11-11T09:03:00.001+11:00</published><updated>2011-11-12T16:59:32.601+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GnuWin'/><title type='text'>Grep -f: No blank lines</title><summary type='text'>
If you search for a list of patterns in a data file using grep like below, don't include a blank line in the pattern file otherwise grep prints the entire data file.

grep -f patterns.txt data.txt


It's as if you had typed:

grep "" data.txt


See GNU Grep Manual</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5380705494603961515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/11/grep-f-no-blank-lines.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5380705494603961515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5380705494603961515'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/11/grep-f-no-blank-lines.html' title='Grep -f: No blank lines'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3972267277931634425</id><published>2011-09-18T17:00:00.000+10:00</published><updated>2011-09-19T13:44:15.566+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>Create an MSIE Favorite using VBA &amp; WSH</title><summary type='text'>A little sub-routine to create MSIE Favorites for MS-Office users. It uses Windows Scripting Host (WSH) which has a shell object that has functions to find a computer's Favorites folder (SpecialFolders()) and create a URL shortcut (CreateShortcut()).
Option Explicit

'Add references:
'1. Microsoft Scripting Runtime (Scripting namespace)
'2. Windows Script Host Object Model (IWshRuntimeLibrary</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3972267277931634425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/09/create-msie-favorite-using-vba-wsh.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3972267277931634425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3972267277931634425'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/09/create-msie-favorite-using-vba-wsh.html' title='Create an MSIE Favorite using VBA &amp; WSH'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-6151396577124086567</id><published>2011-05-29T17:00:00.078+10:00</published><updated>2011-05-29T17:00:06.774+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Avoid multiple instances of a task in Windows Task Scheduler</title><summary type='text'>Using Task Scheduler, one way to run a task more often than once a day was to repeat the task within the day. For instance, if you wanted to run a task every hour, you would repeat the task once an hour for that day. Now, if the task's running time is longer (e.g. the task is delayed by a slow network connection) than the repeat interval then another instance would be started even if you specify </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/6151396577124086567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/05/avoid-multiple-instances-of-task-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6151396577124086567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6151396577124086567'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/05/avoid-multiple-instances-of-task-in.html' title='Avoid multiple instances of a task in Windows Task Scheduler'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1396384699987551442</id><published>2011-04-16T17:00:00.026+10:00</published><updated>2011-04-16T17:00:07.824+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vim'/><title type='text'>Running Batch Files in Vim Ex-Mode</title><summary type='text'>To modify a file using vim in ex-mode, you should be able to do this:
vim -esn &lt; modify.ex File.txt. The -esn option starts vim in ex-mode, a non-interactive session and no backup is created. The modify.ex file can contain a sequence of editing commands, ending with wq to write and close the file. However, in a Windows cmd session, the editing commands in modify.ex are executed but vim doesn't </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1396384699987551442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/04/running-batch-files-in-vim-ex-mode.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1396384699987551442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1396384699987551442'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/04/running-batch-files-in-vim-ex-mode.html' title='Running Batch Files in Vim Ex-Mode'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-2988794984510617323</id><published>2011-03-26T17:00:00.001+11:00</published><updated>2011-03-26T17:00:02.376+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CPlusPlus'/><title type='text'>Configure NetBeans to Statically Link MinGW C &amp; C++ Libraries</title><summary type='text'>Installed MinGW g++ 4.5.2 and got the following Windows error when trying to run a C++ program I just compiled: The program can't start because libgcc_s_dw2-1.dll is missing from your computer. After fixing that error, Windows displayed a similar message regarding libstdc++-6.dll. Basically, g++ doesn not statically link the C and C++ standard libraries with an executable by default.


In Windows</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/2988794984510617323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/03/configure-netbeans-to-statically-link.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2988794984510617323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2988794984510617323'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/03/configure-netbeans-to-statically-link.html' title='Configure NetBeans to Statically Link MinGW C &amp; C++ Libraries'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3468120268960620139</id><published>2011-03-05T17:00:00.000+11:00</published><updated>2011-03-05T17:00:02.859+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Cmd'/><title type='text'>Leading Semicolon Comments a Line in CMD FOR /F</title><summary type='text'>I wondered why the following CMD script was not processing some lines ...

for /f %a in (test.txt) do @echo %a

... with this sort of test where the semicolon is a field separator. All the lines were processed when the field separator is a space, tab or comma.


x;y;z
;y;z


When I ran the script, the echo command is only called for the first line. It turns out that, by default, for /f regards </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3468120268960620139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/03/leading-semicolon-comments-line-in-cmd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3468120268960620139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3468120268960620139'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/03/leading-semicolon-comments-line-in-cmd.html' title='Leading Semicolon Comments a Line in CMD FOR /F'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-4642254506806431567</id><published>2011-02-12T17:00:00.033+11:00</published><updated>2011-02-12T17:00:04.503+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GnuWin'/><category scheme='http://www.blogger.com/atom/ns#' term='Gawk'/><title type='text'>Negate Numbers as String in Gawk</title><summary type='text'>I had to negate numbers in a data file. My initial script simply negated the required field.  Here a test:


gawk "{ print -$1 }"
123
-123
123.45678
-123.457


I wanted to preserve all the digits after the decimal point so I tried printf() (the multiple double-quotes is to escape double-quotes in Windows CMD):


gawk "{ printf("""%10lf\n""", -$1) }"
123
-123.000000
123.45678
-123.456780
123.456
-</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/4642254506806431567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/02/negate-numbers-as-string-in-gawk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4642254506806431567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4642254506806431567'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/02/negate-numbers-as-string-in-gawk.html' title='Negate Numbers as String in Gawk'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-4243035909067026807</id><published>2011-01-01T17:00:00.005+11:00</published><updated>2011-01-01T17:00:07.654+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>NTFS Compression versus Compressed (zipped) Folders</title><summary type='text'>A New Year posting!

While playing with WMI to compress folders, I realised that NTFS compression is different from ZIP files. At the start, I wondered why my script didn't seem to create any ZIP files even though the call to SWbemObjectEx.Compress procedure was successful. Turns out that my test folder was being compressed in NTFS but I wasn't looking for it correctly; in Explorer, the folder's </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/4243035909067026807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2011/01/ntfs-compression-versus-compressed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4243035909067026807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4243035909067026807'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2011/01/ntfs-compression-versus-compressed.html' title='NTFS Compression versus Compressed (zipped) Folders'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1635304537467945850</id><published>2010-12-11T17:00:00.071+11:00</published><updated>2010-12-11T17:00:02.124+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>Creating ZIP files with VBA / VBScript</title><summary type='text'>I wanted to create a Windows scheduled task to regularly compress a log file on several servers. The simple solution would be to install a command-line ZIP program and write a CMD script. After some searching, it became more interesting to write a VBScript program that uses the Compressed (zipped) folder feature in the Windows Explorer.

The result is the ZipFile VBA and VBScript program at the </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1635304537467945850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/12/creating-zip-files-with-vba-vbscript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1635304537467945850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1635304537467945850'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/12/creating-zip-files-with-vba-vbscript.html' title='Creating ZIP files with VBA / VBScript'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-115270704273829675</id><published>2010-11-27T17:00:00.222+11:00</published><updated>2010-12-04T09:20:07.292+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>Converting VBA Programs to VBScript using SED</title><summary type='text'>Writing VBScript programs can be a pain without an IDE with early-binding to ensure that the name and arguments of procedures are correct and you have start the Microsoft Script Debugger to debug your code separately from your editor. How very 90s! On the other hand, MS-Office has an IDE for writing and debugging VBA programs. What's more, since VBScript is very similar to VBA (and VB), it can be</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/115270704273829675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/11/converting-vba-programs-to-vbscript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/115270704273829675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/115270704273829675'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/11/converting-vba-programs-to-vbscript.html' title='Converting VBA Programs to VBScript using SED'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1519527504808491280</id><published>2010-10-17T17:00:00.001+11:00</published><updated>2010-10-17T17:00:03.913+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GameMaker'/><title type='text'>GameMaker 8.0: First Impression</title><summary type='text'>Finished GameMaker (GM) Tutorial 1, the Fruit Game. The GM IDE is pretty basic and allows you to build a simple 2-D game without too much fuss. The generated executable is 2.3 MB, which is pretty good considering that the game engine is included.

After using other mainstream IDEs such as Visual Studio and NetBeans, my preferences for the IDE would be:


Use a tab and property sheet for each </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1519527504808491280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/10/gamemaker-80-first-impression.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1519527504808491280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1519527504808491280'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/10/gamemaker-80-first-impression.html' title='GameMaker 8.0: First Impression'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-4981796502366329516</id><published>2010-10-15T17:00:00.041+11:00</published><updated>2010-10-15T17:00:01.779+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OO-Calc'/><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><title type='text'>Automatically Update Last Row in Range Formulas</title><summary type='text'>In OpenOffice Calc, worksheet formulas that apply a range of rows, such as SUM(), need to be updated when an extra row is added just above the cell with that formula. For example, if you start the following worksheet values and formulas ...


  A
1 4
2 7
3 9
4 =SUM(A1:A3)


... then when you insert a new row between rows 3 and 4, OO-Calc does not automatically update the second argument to the </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/4981796502366329516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/10/automatically-update-last-row-in-range.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4981796502366329516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4981796502366329516'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/10/automatically-update-last-row-in-range.html' title='Automatically Update Last Row in Range Formulas'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-8726561484481379918</id><published>2010-10-11T17:00:00.001+11:00</published><updated>2010-10-11T17:00:05.857+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><title type='text'>Starting Excel 2003 Faster</title><summary type='text'>I start two or three Excel 2003 sessions at the same time so that I can use multiple displays and work on a couple of tasks at a time. To start a new Excel session, you launch it from the Windows Start menu instead of opening an Excel file in Explorer (opening an Excel file loads it in the active Excel session). A new Excel session has, by default, a Task Pane (a panel titled 'Getting Started') </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/8726561484481379918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/10/starting-excel-2003-faster.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8726561484481379918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8726561484481379918'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/10/starting-excel-2003-faster.html' title='Starting Excel 2003 Faster'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3827571275292272379</id><published>2010-09-13T17:00:00.004+10:00</published><updated>2010-09-13T17:00:07.004+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Cmd'/><title type='text'>Name Log Files in a Consistent Format</title><summary type='text'>I expect developers to program like I do, which didn't happen this week.

The task is to concatenate log files in a folder into a single file to import into a database. The Windows command to do the job is for /f %a in ('dir /b *.csv') do type %a &gt;&gt; dest.csv. (dir /b lists entries in a folder without any heading.) While testing using echo in place of type, I noticed that due to the way dir sorts </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3827571275292272379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/09/name-log-files-in-consistent-format.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3827571275292272379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3827571275292272379'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/09/name-log-files-in-consistent-format.html' title='Name Log Files in a Consistent Format'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-6578357374088925724</id><published>2010-09-10T13:39:00.002+10:00</published><updated>2011-11-26T07:09:26.168+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Cmd'/><title type='text'>SetLocal EnableDelayedExpansion in CMD Scripts</title><summary type='text'>In a Windows CMD for loop, variables within the loop aren't, by default, resolved into a value for every iteration of the loop. Here's a script that should list all files in a folder.


@echo off
for /f %%a in (*) do (
  set test=%%a
  echo %test%
)


However, when you run the script, only the first file found is output (the variable test is only set in the first iteration of the loop). Turns out</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/6578357374088925724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/09/setlocal-enabledelayedexpansion-in-cmd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6578357374088925724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6578357374088925724'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/09/setlocal-enabledelayedexpansion-in-cmd.html' title='SetLocal EnableDelayedExpansion in CMD Scripts'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5574565708490528187</id><published>2010-08-01T17:00:00.002+10:00</published><updated>2010-08-01T17:00:01.370+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Outlook'/><title type='text'>Restoring Standard Outlook Forms</title><summary type='text'>If you can't see any of the standard Outlook forms, there are two solutions:


Clear your Outlook forms cache:

In Outlook, select menu item Tools, Options.
In Options dialog, select Other tab.
In Other tab, press Advanced Options… button.
In Advanced Options dialog, press Custom Forms… button.
In Custom Forms tab, press Manage Forms… button.
In Forms Manager dialog, press Clear Cache button, </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5574565708490528187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/08/restoring-standard-outlook-forms.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5574565708490528187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5574565708490528187'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/08/restoring-standard-outlook-forms.html' title='Restoring Standard Outlook Forms'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-2586823316721341786</id><published>2010-07-29T17:00:00.002+10:00</published><updated>2010-07-29T17:00:04.823+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Outlook'/><title type='text'>Fixing Broken Image Links in Outlook</title><summary type='text'>If Outlook stops displaying images embedded in HTML e-mail, the fix is to delete files in its temporary file folder. On my WinXP computer, that temporary folder is: C:\Documents and Settings\&lt;user&gt;&gt;\Local Settings\Temporary Internet Files\OLK&lt;random&gt;.

To find the location of Outlook's temporary folder on your PC, open an e-mail message with a Word or Excel attachment, open the attachment and </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/2586823316721341786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/07/fixing-broken-image-links-in-outlook.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2586823316721341786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2586823316721341786'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/07/fixing-broken-image-links-in-outlook.html' title='Fixing Broken Image Links in Outlook'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-4913884562903702023</id><published>2010-07-25T17:00:00.000+10:00</published><updated>2010-07-25T17:00:03.798+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Invisible USB Drive</title><summary type='text'>If you plug in a USB drive and Windows doesn't assign a letter to it, you can assign a letter yourself using the Disk Management console:


Run diskmgmt.msc
In Disk Management window, locate the box corresponding to your USB drive.
Select context menu item Change Drive Letter and Paths....
Assign a letter to your drive.


This problem happened after I had mapped a remote drive to Z: then plugged </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/4913884562903702023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/07/invisible-usb-drive.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4913884562903702023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4913884562903702023'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/07/invisible-usb-drive.html' title='Invisible USB Drive'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1641895032203369969</id><published>2010-07-13T17:00:00.002+10:00</published><updated>2010-07-13T17:00:05.356+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Vim Delete Lines With Regex</title><summary type='text'>To use vim to delete all lines that have a specific string: :g/s1/d. To delete all lines that don't have a specific string, add an exclamation mark before the string: :g!/s1/d. If there are alternative strings to match (logical OR), insert an escaped vertical bar, e.g. :g/s1\|s2/d.</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1641895032203369969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/07/vim-delete-lines-with-regex.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1641895032203369969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1641895032203369969'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/07/vim-delete-lines-with-regex.html' title='Vim Delete Lines With Regex'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5122417372483240309</id><published>2010-05-31T17:00:00.004+10:00</published><updated>2010-05-31T17:00:01.510+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>VBA One-liner to Concatenate Excel Cell Values</title><summary type='text'>Here's a VBA one-liner to concatenate a column of Excel cell values, with a separator, into one string: Join(Application.Transpose(&lt;column range&gt;), ","). The column range is an Nx1 array, Transpose() returns a one-dimensional N-element array and Join() function a one-dimensional array as the first parameter.

To concatenate values from a row of cells, you have to use Transpose() twice like this: </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5122417372483240309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/vba-one-liner-to-concatenate-excel-cell.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5122417372483240309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5122417372483240309'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/vba-one-liner-to-concatenate-excel-cell.html' title='VBA One-liner to Concatenate Excel Cell Values'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-8519733877431625224</id><published>2010-05-27T17:00:00.012+10:00</published><updated>2010-05-27T17:00:04.699+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><title type='text'>Avoiding #N/A in Range VLOOKUP</title><summary type='text'>I was using VLOOKUP to put percentages in buckets. Here's the lookup table:


   a b
1  0 1
2 25 2
3 50 3
4 75 4


And here's the formula I added to my data sheet: =VLOOKUP(input, A1:B4, 2, TRUE). When the fourth parameter, Range_Lookup is set to TRUE, the function will match a range instead of an exact input value. If the input value was greater than 0 (e.g. 0, 25.5), VLOOKUP returns a bucket </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/8519733877431625224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/avoiding-na-in-range-vlookup.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8519733877431625224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8519733877431625224'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/avoiding-na-in-range-vlookup.html' title='Avoiding #N/A in Range VLOOKUP'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-8550219823942204936</id><published>2010-05-23T17:00:00.002+10:00</published><updated>2010-05-23T17:00:07.850+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio Express'/><category scheme='http://www.blogger.com/atom/ns#' term='SharpDevelop'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Rudimentary C# COM Interop Client for Excel</title><summary type='text'>I started writing some basic C# COM Interop clients for Excel to keep a hand in C# and be able to develop more sophisticated applications than VBA could provide. Here are some basic things I learnt and a complete working example to read data from an Excel workbook.

Configure your project


Add to this project reference in the IDE: GAC (or COM) Microsoft.Office.Interop.Excel.
Add to the source </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/8550219823942204936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/rudimentary-c-com-interop-client-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8550219823942204936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8550219823942204936'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/rudimentary-c-com-interop-client-for.html' title='Rudimentary C# COM Interop Client for Excel'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-4901162811472284253</id><published>2010-05-19T17:00:00.009+10:00</published><updated>2010-05-20T15:45:40.377+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>Excel Inplace (or embedded) without ActiveWorkbook</title><summary type='text'>An Excel workbook in a SAP InPlace view (or embedded in within a window) stopped working, displaying a run-time 1004 error: Method 'Sheets' of object '_Global' failed. The problem was caused by a UserForm dialog in that workbook which the user can open to enter a value. The code in the dialog then filtered the data in all the sheets based on the user's input. The code failed when it tried to call</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/4901162811472284253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/excel-inplace-or-embedded-without.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4901162811472284253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4901162811472284253'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/excel-inplace-or-embedded-without.html' title='Excel Inplace (or embedded) without ActiveWorkbook'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5443486991250367269</id><published>2010-05-17T17:00:00.003+10:00</published><updated>2010-05-17T17:00:04.568+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio Express'/><category scheme='http://www.blogger.com/atom/ns#' term='SharpDevelop'/><title type='text'>Start External Program to Debug a Class in Visual C# 2008 Express</title><summary type='text'>While playing with an automation server for MS-Excel, I wanted to debug my class method by starting Excel in Visual C# Express and using the formula in a worksheet. After the usual couple of minutes of hunting through the project property sheets, it dawned on me that you can't define the start program in the Visual C# Express IDE.

So I reopened my project in SharpDevelop (another .Net IDE), </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5443486991250367269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/start-external-program-to-debug-class.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5443486991250367269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5443486991250367269'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/start-external-program-to-debug-class.html' title='Start External Program to Debug a Class in Visual C# 2008 Express'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3729334261976905712</id><published>2010-05-13T17:00:00.001+10:00</published><updated>2010-05-13T17:00:05.614+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Access'/><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><category scheme='http://www.blogger.com/atom/ns#' term='MS-Outlook'/><title type='text'>Prevent VBScript in Custom Outlook Form From Executing</title><summary type='text'>My custom Outlook form added some canned text in the message object in the Item_Open() function. Annoyingly, when I open the form in design mode, the Item_Open() is called, cluttering up the message object. It turns out that you have to hold down the Shift key when opening a form to prevent VBScript in the form from executing.

Holding down the Shift key while starting MS-Access also prevents </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3729334261976905712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/prevent-vbscript-in-custom-outlook-form.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3729334261976905712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3729334261976905712'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/prevent-vbscript-in-custom-outlook-form.html' title='Prevent VBScript in Custom Outlook Form From Executing'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-2963473601523334541</id><published>2010-05-11T17:00:00.002+10:00</published><updated>2010-05-12T11:05:46.481+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><category scheme='http://www.blogger.com/atom/ns#' term='MS-Outlook'/><title type='text'>Adding Text To Message Body in Outlook Custom Form</title><summary type='text'>I had a simple request to add some canned text to the message body of a Outlook custom form when the form was first opened, so I did this in VBScript:


Sub Item_Open()
  ...
  Item.HTMLBody = "Blah blah blah"
  ...
End Sub


Yet when I created a new item, the message body was empty! The same problem occurs with Item.Body. After the usual bit of trial-and-error, I discovered that the text only </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/2963473601523334541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/adding-text-to-message-body-in-outlook.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2963473601523334541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2963473601523334541'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/adding-text-to-message-body-in-outlook.html' title='Adding Text To Message Body in Outlook Custom Form'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-6111346496482865026</id><published>2010-05-01T17:00:00.001+10:00</published><updated>2010-05-01T08:11:01.381+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><category scheme='http://www.blogger.com/atom/ns#' term='MS-Outlook'/><title type='text'>Outlook To: Field Unexpectedly Shrinks</title><summary type='text'>While developing a custom Outlook form, I found that the To: field would unexpectedly shrink to a few pixels tall and pull the remaining controls in the form upwards. The problem occurred when I added Item.Recipients.Add "test" in my VBScript code to populate the To: field with a dummy e-mail address then clicked in the To: field. (I was using a dummy address to avoid accidentally sending test </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/6111346496482865026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/outlook-to-field-unexpectedly-shrinks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6111346496482865026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6111346496482865026'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/05/outlook-to-field-unexpectedly-shrinks.html' title='Outlook To: Field Unexpectedly Shrinks'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-423679350422292362</id><published>2010-04-19T17:00:00.003+10:00</published><updated>2010-04-19T17:00:09.296+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Outlook'/><title type='text'>Notes on Developing Outlook 2003 Forms</title><summary type='text'>I just finished developing a simple e-mail workflow system implemented using Outlook forms and VBScript and thought I should jot down some things that made development easier:

Configuring Your Development Environment


Disable Outlook Autosignature, otherwise your signature is inserted into the message object each time you create a new form and you cannot clear the text in the message object </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/423679350422292362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/04/notes-on-developing-outlook-2003-forms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/423679350422292362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/423679350422292362'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/04/notes-on-developing-outlook-2003-forms.html' title='Notes on Developing Outlook 2003 Forms'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1923405825503411694</id><published>2010-03-01T17:00:00.004+11:00</published><updated>2010-03-01T17:00:05.970+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Visio'/><title type='text'>Visio Shape Positioning Annoyance</title><summary type='text'>In technical diagrams, I align the positions and dimensions of shapes with a grid so that the spacing and sizes are consistent. Using Visio 2007, after I resize a page using File, Page Setup, Page Size, Size to fit drawing contents, every shape's position is slightly modified. For example, if I position a shape at x = 40mm, y = 30mm, the shape's position becomes something like x = 40.0847mm, y = </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1923405825503411694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/03/visio-shape-positioning-annoyance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1923405825503411694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1923405825503411694'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/03/visio-shape-positioning-annoyance.html' title='Visio Shape Positioning Annoyance'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3345338551102609785</id><published>2010-02-23T17:00:00.001+11:00</published><updated>2010-02-23T17:00:05.226+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Vista Ctrl+Space IME Toggle Workaround</title><summary type='text'>If you start using Windows Vista Input Method Editor (IME) for Chinese, you may find that you can no longer use Ctrl+Space in some applications (e.g. to select a column in Excel, to activate autocomplete in IDEs such as VBA, Netbeans or Visual Studio, or to activate Firefox Ubiquity). One workaround is to define a different hotkey, such as Ctrl+Shift+F12, to toggle the IME.

If you have only one </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3345338551102609785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/02/vista-ctrlspace-ime-toggle-workaround.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3345338551102609785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3345338551102609785'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/02/vista-ctrlspace-ime-toggle-workaround.html' title='Vista Ctrl+Space IME Toggle Workaround'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-8062717596508751926</id><published>2010-02-21T17:00:00.002+11:00</published><updated>2010-05-01T08:11:01.384+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>VBA Is*() Functions Only Apply To Variant Types</title><summary type='text'>VBA has several informational functions prefixed with "Is", such as IsNull(), IsMissing() and IsEmpty(), that only work with Variant types. I didn't realise it until I tried to apply them to non-Variant variables and noticed that they didn't work as I expected or always returned the same result.

For instance, if you define optional parameters for a procedure, you can only test if they are used </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/8062717596508751926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2010/02/vba-is-functions-only-apply-to-variant.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8062717596508751926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8062717596508751926'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2010/02/vba-is-functions-only-apply-to-variant.html' title='VBA Is*() Functions Only Apply To Variant Types'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5234124748206311397</id><published>2009-12-07T17:00:00.002+11:00</published><updated>2010-05-01T08:11:01.392+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>Simple cache in Excel using VBA static variables</title><summary type='text'>Static variables in VBA functions, like their counterparts in C, retain their values between function calls. A common use for static variables is to maintain a running total or count. This article describes how static variables can be used for cacheing in Excel VBA, compares the performance of a simple approach versus a cache in Excel, and some discussion for using this approach.

Excel </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5234124748206311397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/12/simple-cache-in-excel-using-vba-static.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5234124748206311397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5234124748206311397'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/12/simple-cache-in-excel-using-vba-static.html' title='Simple cache in Excel using VBA static variables'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-6945822788043980185</id><published>2009-12-03T17:00:00.001+11:00</published><updated>2010-05-01T08:11:01.403+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>R1C1 notation in Excel VBA</title><summary type='text'>Excel supports both A1 and R1C1 notation for referencing cells in formulas. Almost everyone uses A1 notation but it can be easier to use R1C1 notation to generate column references in VBA. For instance, to generate a formula that references a column in A1 notation, you need a function that returns A to Z for the first 26 columns, then returns two letter column names (such as AA) for columns past </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/6945822788043980185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/12/r1c1-notation-in-excel-vba.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6945822788043980185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6945822788043980185'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/12/r1c1-notation-in-excel-vba.html' title='R1C1 notation in Excel VBA'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-4420699425988080422</id><published>2009-12-01T17:00:00.006+11:00</published><updated>2010-05-01T08:11:01.404+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>Excel VBA programming with run-time errors</title><summary type='text'>When writing VBA programs for Microsoft Excel 2003, you quickly find that you have to detect and handle run-time errors in your programs. VBA provides On Error and Resume statements for handling run-time errors. This article discusses how run-time errors can be used, explicitly or implicitly, in VBA programs.

Let's start with a script below, which calls the WorksheetFunction class' Match() </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/4420699425988080422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/12/excel-vba-programming-with-run-time.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4420699425988080422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4420699425988080422'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/12/excel-vba-programming-with-run-time.html' title='Excel VBA programming with run-time errors'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-9170436949841666088</id><published>2009-11-29T17:00:00.003+11:00</published><updated>2010-05-01T08:11:01.406+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>VBA IIf() as a ternary conditional expression (sometimes)</title><summary type='text'>VBA doesn't have a ternary conditional expression (e.g. C-style ?:), which leads to a long-winded conditional statement like this when you just want assign a value to the same variable based on a condition:


If &lt;condition&gt; Then
  x = 1
Else
  x = 2
End If


In C-style languages, you would just write x = &lt;condition&gt; ? 1 : 2. You can mimic the ?: ternary operator using VBA's IIf(expr, truepart, </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/9170436949841666088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/vba-iif-as-ternary-conditional.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/9170436949841666088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/9170436949841666088'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/vba-iif-as-ternary-conditional.html' title='VBA IIf() as a ternary conditional expression (sometimes)'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1527303085157399441</id><published>2009-11-23T17:00:00.000+11:00</published><updated>2010-05-01T08:11:01.407+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><title type='text'>Optimising VBA for Excel 2003: Avoid EntireRow.Insert</title><summary type='text'>While optimising an Excel 2003 VBA program to write thousands of rows of data, I noticed that Excel's EntireRow.Insert consumed most of the program's processing time. To quantify the time, here's a simple test that just inserts rows into a workbook ...


Option Explicit

Sub Insert10kRows()
  Dim wks As Worksheet
  Set wks = Sheets("Sheet1")
  Dim intI As Integer
  For intI = 1 To 10000
    </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1527303085157399441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/optimising-vba-for-excel-2003-avoid.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1527303085157399441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1527303085157399441'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/optimising-vba-for-excel-2003-avoid.html' title='Optimising VBA for Excel 2003: Avoid EntireRow.Insert'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-7506791899613349375</id><published>2009-11-21T17:00:00.001+11:00</published><updated>2009-11-21T17:00:00.045+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharpDevelop'/><title type='text'>SharpDevelop MSB3105 Error for duplicate form</title><summary type='text'>When you create a new Windows Application project in SharpDevelop 3.1, the IDE creates a default form called 'MainForm'. If you add an existing form with the same name to this project then build this project, you may get this error: The item "MainForm.Designer.cs" was specified more than once in the "Sources" parameter.  Duplicate items are not supported by the "Sources" parameter. (MSB3105).

</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/7506791899613349375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/sharpdevelop-msb3105-error-for.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7506791899613349375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7506791899613349375'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/sharpdevelop-msb3105-error-for.html' title='SharpDevelop MSB3105 Error for duplicate form'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-8820158899760831505</id><published>2009-11-17T17:00:00.000+11:00</published><updated>2009-11-17T17:00:01.851+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><title type='text'>Local data files in Visual C# Express 2008</title><summary type='text'>While learning data binding for Windows.Forms, I noticed that changes made to data in the DataGridView weren't written back into the local SQL Server database file when the form was closing, even after calling TableAdapter.Update(). Turns out that Visual C# Express 2008 (and VS 2008 in general) copies your local data file each time you build your project to the output folder. The original version</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/8820158899760831505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/local-data-files-in-visual-c-express.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8820158899760831505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8820158899760831505'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/local-data-files-in-visual-c-express.html' title='Local data files in Visual C# Express 2008'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3528348333821196603</id><published>2009-11-15T17:00:00.002+11:00</published><updated>2010-05-28T10:29:49.254+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Access'/><category scheme='http://www.blogger.com/atom/ns#' term='VB/VBA/VBScript'/><category scheme='http://www.blogger.com/atom/ns#' term='MS-Word'/><title type='text'>Microsoft Word MailMerge Run-time error '5922'</title><summary type='text'>When a MS-Access 2003 VBA script tried to open MS-Word and run the mail merge function, VBA displayed this error message:


Run-time error '5922':
Word was unable to open the data source


The problem was tracked to this statement:


    Dim objWordApp As Object
    Set objWordApp = CreateObject("Word.Application")
    With objWordApp
      ...
      .ActiveDocument.MailMerge.OpenDataSource Name:</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3528348333821196603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/microsoft-word-mailmerge-run-time-error.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3528348333821196603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3528348333821196603'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/microsoft-word-mailmerge-run-time-error.html' title='Microsoft Word MailMerge Run-time error &apos;5922&apos;'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-7059796590675627158</id><published>2009-11-05T17:00:00.001+11:00</published><updated>2010-05-16T16:45:55.493+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio Express'/><title type='text'>Visual Studio 2008 Express Data Source Limitations</title><summary type='text'>Visual Studio Express 2008 for C# or VB only allows you to choose a limited number of data sources in the IDE. Open the Choose Data Source dialog using menu item Tools / Connect to Database, and in the Data Source list, there are only three items:


Microsoft Access Database File
Microsoft SQL Server Compact 3.5
Microsoft SQL Server Database File


According to VS 2005 express: ".NET Framework </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/7059796590675627158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/visual-studio-2008-express-data-source.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7059796590675627158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7059796590675627158'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/visual-studio-2008-express-data-source.html' title='Visual Studio 2008 Express Data Source Limitations'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-6780095096217182794</id><published>2009-11-03T17:00:00.001+11:00</published><updated>2009-11-07T10:57:43.702+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.Net'/><title type='text'>Visual Basic short-circuit evaluation of expressions</title><summary type='text'>Visual Basic seems to be the only language that evaluates all the operands of AND and OR operators instead of implementing short-circuit evaluation. In all other programming languages, such as C# or Java, expressions are evaluated from left to right, and the evaluation of expressions in statements exp1 AND exp2 and exp3 OR exp4 stop when exp1 = false or exp3 = true, respectively. This difference </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/6780095096217182794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/visual-basic-short-circuit-evaluation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6780095096217182794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6780095096217182794'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/11/visual-basic-short-circuit-evaluation.html' title='Visual Basic short-circuit evaluation of expressions'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-52126384879521299</id><published>2009-10-29T17:00:00.003+11:00</published><updated>2010-05-16T16:45:55.495+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio Express'/><title type='text'>Changing indent and tab size in Visual Basic 2008 Express</title><summary type='text'>Minor annoyance in Microsoft Visual Basic 2008 Express Edition: To change the indent and tab size in Options dialog, Text Editor Basic / Editor node, you have to highlight the number in the field, then type in a new number in the Tab Size and Indent Size text fields. You can't delete the existing value first, then type in a new one.

2-Nov-2009: In Visual C# 2008 Express Edition, in Options </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/52126384879521299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/10/changing-indent-and-tab-size-in-visual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/52126384879521299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/52126384879521299'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/10/changing-indent-and-tab-size-in-visual.html' title='Changing indent and tab size in Visual Basic 2008 Express'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-8354203317054721655</id><published>2009-10-19T17:00:00.001+11:00</published><updated>2009-10-19T17:00:00.912+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><title type='text'>Hiding Facebook Application Posts</title><summary type='text'>Following a tip from Steven S., I've hidden posts from friends' Facebook applications that don't interest me, resulting in a much cleaner home page. In only a month, I found that I have hidden more than a hundred (!) applications, which led me to wonder if Facebook shouldn't provide a reverse option, to only show certain applications instead.

To hide applications, I can imagine that there is a </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/8354203317054721655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/10/hiding-facebook-application-posts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8354203317054721655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8354203317054721655'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/10/hiding-facebook-application-posts.html' title='Hiding Facebook Application Posts'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5639175893320509116</id><published>2009-10-15T17:00:00.001+11:00</published><updated>2009-10-15T17:03:04.811+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='Spam'/><title type='text'>Blog Comment Spam</title><summary type='text'>What a pain in the nether regions when spammers decide to use your blog as a vehicle for their crap advertisements. My blogs are moderated, so I see every comment before they are posted. I only twigged that my blog was being spammed when I saw the same comment twice for different postings on the same day (that spammer was enthusiastic). It seems (naïve, perhaps) that any comment with a URL, </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5639175893320509116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/10/blog-comment-spam.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5639175893320509116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5639175893320509116'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/10/blog-comment-spam.html' title='Blog Comment Spam'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-639542235013667290</id><published>2009-09-24T17:00:00.001+10:00</published><updated>2009-09-24T17:00:03.955+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Auto-arranging multiple application windows in Vista</title><summary type='text'>If you're taking notes or eyeballing a couple of documents at once on screen, you might tile your application windows so that they are arranged side by side and fill up the screen. In Working with windows, Arranging windows automatically, the Vista desktop provides two commands for tiling your windows: Show Windows Stacked and Show Windows Side by Side. (If you Cascade Windows, your windows are </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/639542235013667290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/09/auto-arranging-multiple-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/639542235013667290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/639542235013667290'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/09/auto-arranging-multiple-application.html' title='Auto-arranging multiple application windows in Vista'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-4709179108805521832</id><published>2009-09-03T17:00:00.001+10:00</published><updated>2009-09-03T08:10:14.073+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Floating IFRAMEs in Blogger</title><summary type='text'>In my other blog, I wanted to show images to one side of the text, like this:


XXXXXX +--------+
XXXXXX | iframe |
XXXXXX +--------+
XXXXXX
XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXX


The images, generated by Amazon, are within an iframe element. After some false starts, I found that the simplest solution was to wrap the iframe elements in a div element, and float the div:


&lt;div style="float:right"&gt;
</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/4709179108805521832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/03/floating-iframes-in-blogger.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4709179108805521832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4709179108805521832'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/03/floating-iframes-in-blogger.html' title='Floating IFRAMEs in Blogger'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5445437952597053025</id><published>2009-08-27T18:00:00.003+10:00</published><updated>2009-09-03T08:09:47.086+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Access'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Microsoft Access 2003 finding the minimum and maximum column values using a VBA function</title><summary type='text'>If you may have to write a query in MS-Access 2003 to get the maximum or minimum of the values of two columns, you could use the iif() expression like this:iif(n1 &gt; n2, n1, n2) or iif(n1 &lt; n2, n1, n2) to obtain the maximum or minimum, respectively. The expression becomes more complicated when you have to compare three columns:


IIf(n1&gt;n2,
  IIf(n1&gt;n3,n1,n3),
  IIf(n2&gt;n3,n2,n3))


Such </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5445437952597053025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/08/ms-access-2003-finding-minimum-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5445437952597053025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5445437952597053025'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/08/ms-access-2003-finding-minimum-and.html' title='Microsoft Access 2003 finding the minimum and maximum column values using a VBA function'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3786252530662521842</id><published>2009-08-14T18:00:00.000+10:00</published><updated>2009-08-14T18:00:00.340+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Google Reader and Firefox's maximum popup limit</title><summary type='text'>If you browse using Firefox and use the Google Reader keyboard v shortcut that I wrote in an earlier post, you may find that Firefox will eventually generate this message, Firefox prevented this site from opening a pop-up window, although you have added www.google.com to the Allowed Sites - Pop-ups dialog. This behaviour occurs because Firefox prevents any site from automatically opening too many</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3786252530662521842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/08/google-reader-and-firefoxs-maximum.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3786252530662521842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3786252530662521842'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/08/google-reader-and-firefoxs-maximum.html' title='Google Reader and Firefox&apos;s maximum popup limit'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1600221447583194586</id><published>2009-08-12T18:00:00.004+10:00</published><updated>2009-08-18T16:25:08.765+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Keyboard shortcuts for navigating Google Reader and Gmail</title><summary type='text'>After using any application for a while, I start using some keyboard shortcuts to speed up common operations. Desktop applications usually have keyboard shortcuts while web applications don't; luckily for me, two of my most used Google applications, Reader and Gmail, have keyboard shortcuts. You can find the list of shortcuts easily so rather than going them, I'll just highlight useful keystroke </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1600221447583194586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/08/keyboard-shortcuts-for-navigating.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1600221447583194586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1600221447583194586'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/08/keyboard-shortcuts-for-navigating.html' title='Keyboard shortcuts for navigating Google Reader and Gmail'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1147555259197768917</id><published>2009-08-09T18:00:00.003+10:00</published><updated>2009-08-09T18:00:01.134+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Read 'Times Online' article comments earliest first</title><summary type='text'>The comments appearing after articles in the Times Online are displayed in reverse chronological order (latest first), which I find difficult to read, so I wrote this GreaseMonkey jQuery script to click the Oldest first link after the page is loaded:


// ==UserScript==
// @name         Timesonline.co.uk earliest comment first
// @namespace    kamhungsoh.com
// @description  Show an article's </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1147555259197768917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/08/read-times-online-article-comments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1147555259197768917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1147555259197768917'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/08/read-times-online-article-comments.html' title='Read &apos;Times Online&apos; article comments earliest first'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-7899314843592747539</id><published>2009-08-05T18:00:00.002+10:00</published><updated>2010-10-10T19:03:01.592+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OO-Calc'/><category scheme='http://www.blogger.com/atom/ns#' term='Annoyances'/><title type='text'>OpenOffice Calc AutoInput capitalization annoyance</title><summary type='text'>When you enter text in a cell in OpenOffice Calc, you might find that your text is incorrectly capitalized and you cannot correct it! For example, while writing a vocabulary list, I entered 'sun' and it was capitalized as 'Sun' (maybe referring to a certain technology company). If you type Ctrl+Z to undo this capitalization, all the text in the cell is removed, not just the capitalization. It </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/7899314843592747539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/08/openoffice-calc-autoinput.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7899314843592747539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7899314843592747539'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/08/openoffice-calc-autoinput.html' title='OpenOffice Calc AutoInput capitalization annoyance'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1775905138885397703</id><published>2009-07-12T17:00:00.008+10:00</published><updated>2009-07-22T16:11:50.817+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stylish'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>java.sun.com - improve online readability</title><summary type='text'>Since I read a lot of Sun Java development documentation online, here is a more readable style. I only applied a small number of changes to avoid accidentally screwing up the site's presentation:


Set text columns' maximum width to 30em. Elements which may be naturally wide, such as &lt;img&gt; (for images) and &lt;pre&gt; (for sample code), are not affected. Text is easier to scan if the columns aren't too</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1775905138885397703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/07/javasuncom-improve-online-readability.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1775905138885397703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1775905138885397703'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/07/javasuncom-improve-online-readability.html' title='java.sun.com - improve online readability'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3602473319620603080</id><published>2009-07-05T17:00:00.001+10:00</published><updated>2009-07-05T17:00:18.871+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stylish'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Blogger full window width edit box</title><summary type='text'>The text pane in Blogger's edit page is rather cramped and becomes full when you're writing more than a couple of paragraphs. After looking at Blogger Wide Screen Editor, I thought it should be possible to write a style to automatically fit the edit box in a browser's window.

My Blogger full window width edit box style just changes the width of &lt;div&gt; elements from fixed values to auto so the </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3602473319620603080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/07/blogger-full-window-width-edit-box.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3602473319620603080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3602473319620603080'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/07/blogger-full-window-width-edit-box.html' title='Blogger full window width edit box'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-7831516069159356570</id><published>2009-06-28T17:00:00.000+10:00</published><updated>2009-06-28T17:00:09.257+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stylish'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>CSS inheritance and selector specificity for max-width</title><summary type='text'>While finding it easier to read text using narrower columns using my custom CSS definition, I noticed that it didn't work on pages that use table rows for grouping sections, such as the following structure:


table
  tbody
    tr
      td
        &lt;headings&gt;
        p …


Here's the CSS definition I was using:


@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document domain(java.sun.com)
{
</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/7831516069159356570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/css-inheritance-and-selector.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7831516069159356570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7831516069159356570'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/css-inheritance-and-selector.html' title='CSS inheritance and selector specificity for max-width'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-7085219175970384743</id><published>2009-06-24T17:00:00.000+10:00</published><updated>2009-06-24T17:00:01.473+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stylish'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>CSS max-width versus width properties for text columns</title><summary type='text'>It's easier to read on a web page if the columns aren't too wide. This presentation Ideal line length for content suggests setting the values of the min-width and max-width CSS properties around 30 em. Columns of 30 em sounds very narrow for a PC-based browser, but I expect it makes sense for browsers on handheld devices.

Using the Stylish Firefox add-in, here's my Narrow Paragraph rule for </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/7085219175970384743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/css-max-width-versus-width-properties.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7085219175970384743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7085219175970384743'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/css-max-width-versus-width-properties.html' title='CSS max-width versus width properties for text columns'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5789437583829708684</id><published>2009-06-21T17:00:00.000+10:00</published><updated>2009-06-22T09:11:58.991+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Subversion'/><title type='text'>Installing and configuring Subversion for personal use</title><summary type='text'>I decided (finally!) to migrate my version control system from CVS to Subversion so that I could have atomic transactions when committing multiple files. There's plenty of tutorials on using and setting up Subversion on the net, so here's the simplest way to get started on Windows …


Install and run Subversion on Windows
Create a repository.
Import a project into the repository.
Check-out a </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5789437583829708684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/installing-and-configuring-subversion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5789437583829708684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5789437583829708684'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/installing-and-configuring-subversion.html' title='Installing and configuring Subversion for personal use'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-2505239251385446774</id><published>2009-06-17T18:00:00.002+10:00</published><updated>2009-06-17T18:00:00.734+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Escaping special characters in Windows International Keyboard</title><summary type='text'>The Windows International Keyboard allows you to enter letters with accent marks. For example, to type é, just type Apostrophe e. But what if you just want to enter (or escape) an apostrophe (for example, when entering a string literal while programming)? The trick is to type a space after the apostrophe, as per this bullet point in the support page: If you press the space bar, the symbol (</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/2505239251385446774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/escaping-special-characters-in-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2505239251385446774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2505239251385446774'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/escaping-special-characters-in-windows.html' title='Escaping special characters in Windows International Keyboard'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-2440541413923330662</id><published>2009-06-14T18:00:00.006+10:00</published><updated>2009-06-14T18:00:00.578+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo'/><title type='text'>Merging multiple blog feeds into Facebook Notes with Yahoo Pipes</title><summary type='text'>I started a second blog, Vibogafi, for writing about media, and wanted to display updates from that and this blog using the Facebook Notes application. Notes only allows users to import one RSS feed, so I had to merge both my RSS feeds first.

One aggregation or mashup system that came to mind was Yahoo Pipes. If you have a Yahoo account, then you can create your personal pipes. I followed the </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/2440541413923330662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/merging-multiple-blog-feeds-into.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2440541413923330662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2440541413923330662'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/merging-multiple-blog-feeds-into.html' title='Merging multiple blog feeds into Facebook Notes with Yahoo Pipes'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-223526271315138425</id><published>2009-06-10T18:00:00.004+10:00</published><updated>2009-06-10T18:00:00.316+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Localize dates in Scientific American</title><summary type='text'>Scientific American formats dates in its pages as m/d/yy, while I prefer d/m/yy. Like an earlier post about formatting dates in Blogger's Dashboard, this Greasemonkey script uses a regular expression to find date strings in a page, and switches the month and day values.


// ==UserScript==
// @name           Scientific American localize dates
// @namespace      kamhungsoh.com
// @description    </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/223526271315138425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/localize-dates-in-scientific-american.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/223526271315138425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/223526271315138425'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/localize-dates-in-scientific-american.html' title='Localize dates in Scientific American'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-6280874960773651505</id><published>2009-06-07T18:00:00.003+10:00</published><updated>2009-08-06T17:18:59.197+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Reformatting post dates in Blogger Dashboard</title><summary type='text'>In the Blogger Dashboard, the posting date of your entries are in mm/dd/yy format and Google doesn't provide a way to localize it or choose a date format. Here's how you can use a Greasemonkey script to convert dates in Dashboard to dd/mm/yy format.

The dates in Dashboard have this structure:


&lt;td class="date"&gt;
  &lt;span&gt;3/6/09&lt;/span&gt;
&lt;/td&gt;


The following script uses jQuery to iterate through </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/6280874960773651505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/reformatting-post-dates-in-blogger.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6280874960773651505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/6280874960773651505'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/reformatting-post-dates-in-blogger.html' title='Reformatting post dates in Blogger Dashboard'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1490268004311588914</id><published>2009-06-03T18:00:00.005+10:00</published><updated>2009-06-10T15:27:24.580+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Filtering busy mailing lists in Gmail</title><summary type='text'>I subscribe to a busy mailing list and find that I only keep some of the messages and delete the rest. Then I realised it would be less work to automatically delete all messages from this list first and only keep the ones that interested me.

Here's how I set up my mailing list filter in Gmail:


Specify the criteria (e.g. the mailing list name).
Mark Skip the inbox (Archive it).
Pick a label </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1490268004311588914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/filtering-busy-mailing-lists-in-gmail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1490268004311588914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1490268004311588914'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/06/filtering-busy-mailing-lists-in-gmail.html' title='Filtering busy mailing lists in Gmail'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3086322150147004816</id><published>2009-05-31T18:00:00.005+10:00</published><updated>2009-05-31T18:00:00.422+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Simple loading of HTML fragment using jQuery AJAX</title><summary type='text'>jQuery provides a simple load() function to load an HTML fragment using AJAX. To test it, create a test data file called data.html:


&lt;html&gt;
  &lt;body&gt;
    &lt;ul&gt;
      &lt;li&gt;Item 1&lt;/li&gt;
      &lt;li&gt;Item 2&lt;/li&gt;
      &lt;li&gt;Item 3&lt;/li&gt;
      &lt;li&gt;Item 4&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/body&gt;
&lt;/html&gt;


Next, create a target HTML file called testLoad.html in the same folder with the following jQuery statement:


&lt;html&gt;
  &lt;</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3086322150147004816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/simple-loading-of-html-fragment-using.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3086322150147004816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3086322150147004816'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/simple-loading-of-html-fragment-using.html' title='Simple loading of HTML fragment using jQuery AJAX'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-976846030647616168</id><published>2009-05-29T18:00:00.003+10:00</published><updated>2009-05-30T19:09:26.827+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Selecting parent or ancestor of a node in jQuery</title><summary type='text'>When manipulating an HTML document (especially one that you didn't generate), it can be easier to find a node by matching its descendant's unique id or class attribute and value first, then selecting that descendant's ancestor (which is the node you wanted to in the first place), compared to finding that node by referring to its position in the DOM, which is not obvious and isn't easy to maintain</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/976846030647616168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/selecting-parent-or-ancestor-of-node-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/976846030647616168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/976846030647616168'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/selecting-parent-or-ancestor-of-node-in.html' title='Selecting parent or ancestor of a node in jQuery'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1481820268957185060</id><published>2009-05-27T18:00:00.000+10:00</published><updated>2009-05-30T19:07:57.139+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Zebra-stripe table rows with jQuery's custom selectors</title><summary type='text'>I thought I had a simple way to zebra-stripe table rows in jQuery:


$('table tbody tr').each(function(i) {
  $(this).addClass(i%2 ? 'OddRow' : 'EvenRow');
});


While I was looking up jQuery selectors, I found that the library has two custom selectors, :odd and :even, to select the odd and even elements in a matched element set, respectively, so you could zebra-stripe a table like this:


$('</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1481820268957185060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/zebra-stripe-table-rows-with-jquerys.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1481820268957185060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1481820268957185060'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/zebra-stripe-table-rows-with-jquerys.html' title='Zebra-stripe table rows with jQuery&apos;s custom selectors'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-2613295060410333360</id><published>2009-05-26T18:00:00.001+10:00</published><updated>2009-06-24T19:33:51.348+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Read 'The Economist' article comments earliest first</title><summary type='text'>A simple GreaseMonkey script using jQuery to show the comments to articles in The Economist, from earliest first. Basically, this script looks for &lt;a&gt; tags with specific text in their href attribute and appends &amp;sort=asc. It's shorter and easier to read than the original plain Javascript version.

See Also


GreaseMonkey jQuery script in userscripts.org
GreaseMonkey plain Javascript version, </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/2613295060410333360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/read-economist-article-comments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2613295060410333360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2613295060410333360'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/read-economist-article-comments.html' title='Read &apos;The Economist&apos; article comments earliest first'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-7313575267667543583</id><published>2009-05-25T18:00:00.000+10:00</published><updated>2009-06-17T09:30:49.228+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>CSS @media for Firefox Stylish Add-in</title><summary type='text'>In an earlier entry, I wrote about using the @media print rule in a CSS file to insert the value of URLs in the print version of a web page. If the webmaster of the site didn't provide this rule, can you still print the URLs?

If you are using the Firefox Stylish add-in, you can provide your own CSS file to apply to a web site. I tried this:


@namespace url(http://www.w3.org/1999/xhtml);

@-</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/7313575267667543583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/css-media-for-firefox-stylish-add-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7313575267667543583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7313575267667543583'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/css-media-for-firefox-stylish-add-in.html' title='CSS @media for Firefox Stylish Add-in'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1162405401252637076</id><published>2009-05-24T18:00:00.000+10:00</published><updated>2009-05-24T18:00:00.125+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>XPath selectors no longer supported in jQuery</title><summary type='text'>It's old news, but being new to jQuery, I didn't realise that XPath selectors were no longer supported by this library until I read Upgrading to jQuery 1.2 (jQuery is now up to version 1.3).</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1162405401252637076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/xpath-selectors-no-longer-supported-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1162405401252637076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1162405401252637076'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/xpath-selectors-no-longer-supported-in.html' title='XPath selectors no longer supported in jQuery'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-122391401110895909</id><published>2009-05-23T18:00:00.001+10:00</published><updated>2009-05-23T18:00:00.727+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Show URL When Printing a Page</title><summary type='text'>When you print a web page, you'd naturally expect to see the URL of a link, instead of just the name of the link (usually the underlined text). If you are the webmaster of a site, you could generate a different page formatted for printing (for example, look for the print link in many news sites). Another way is to add the following rule into your CSS file:


@media print {
  a:after { content:" (</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/122391401110895909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/show-url-when-printing-page.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/122391401110895909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/122391401110895909'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/show-url-when-printing-page.html' title='Show URL When Printing a Page'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-7025106430361210527</id><published>2009-05-21T18:00:00.001+10:00</published><updated>2009-05-21T18:00:00.812+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>Playing with PHP Data Objects (PDO)</title><summary type='text'>Just migrated the database access code of my PHP sample page from the original (and old) mysql_* functions to PHP Data Objects (PDO). Some advantages of making this change:


You can write more general code because your application is not tied to a specific PHP database extension library.
PDO is similar to other database APIs, such as ADO or JDBC, so it was easier for me to write code in PDO than</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/7025106430361210527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/playing-with-php-data-objects-pdo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7025106430361210527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7025106430361210527'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/playing-with-php-data-objects-pdo.html' title='Playing with PHP Data Objects (PDO)'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-2044560583390174922</id><published>2009-05-18T18:00:00.000+10:00</published><updated>2009-05-18T18:00:01.027+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache'/><title type='text'>Configuring Apache and PHP libraries</title><summary type='text'>Problem when configuring Apache, PHP and MySQL on Windows XP. Here's my environment:


Microsoft Windows XP Professional Service Pack 3
Installed apache_2.2.11-win32-x86-no_ssl.msi as a service.
Installed php-5.2.9-2-win32-installer.msi

Used Apache 2.2 option
Added MySQL and MySQLi extensions.

Installed mysql-essential-5.1.34-win32.msi.


Checked that the PHP configuration file, php.ini, has </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/2044560583390174922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/configuring-apache-and-php-libraries.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2044560583390174922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2044560583390174922'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/configuring-apache-and-php-libraries.html' title='Configuring Apache and PHP libraries'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-589745307144884556</id><published>2009-05-11T18:00:00.000+10:00</published><updated>2009-05-11T18:00:01.373+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Rename Folder in Google Reader</title><summary type='text'>Oh, erm … you can't rename folders in Google Reader. The workaround is to move all your subscriptions from one folder to another folder, then delete the original one. Here's the steps:


In the Subscriptions panel, select Manage Subscriptions. The Settings page should be displayed.
In the Settings page, filter your subscriptions by the name of folder you want to remove using the Filter by name, </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/589745307144884556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/rename-folder-in-google-reader.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/589745307144884556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/589745307144884556'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/rename-folder-in-google-reader.html' title='Rename Folder in Google Reader'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-4504946850672443957</id><published>2009-05-08T18:00:00.000+10:00</published><updated>2009-05-30T19:14:24.532+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Modify URL to Read Comments From Beginning</title><summary type='text'>When I read responses or comments to articles, I prefer to read them from the earliest to the latest. Some sites order comments in reverse (that is, latest to earliest). If a site's comment link can take an 'order' argument, just modify that URL to specify your preferred order and save yourself an extra click. Below is a sample GreaseMonkey script that can specify the order of comments in The </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/4504946850672443957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/modify-url-to-read-comments-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4504946850672443957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/4504946850672443957'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/modify-url-to-read-comments-from.html' title='Modify URL to Read Comments From Beginning'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-2800157348003291465</id><published>2009-05-06T21:00:00.002+10:00</published><updated>2009-05-30T19:13:52.849+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Simple Data Grid Using PHP and jQuery</title><summary type='text'>Introduction

This article walks though the process of writing a simple Web-based data grid application for browsing a database table, using the PHP Web scripting language, jQuery Javascript library and MySQL DBMS.

Requirement and Design

The grid is just an HTML table, with filters for each column and pagination controls at the bottom of the table. The filters are implemented using drop down </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/2800157348003291465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/simple-data-grid-using-php-and-jquery.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2800157348003291465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2800157348003291465'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/05/simple-data-grid-using-php-and-jquery.html' title='Simple Data Grid Using PHP and jQuery'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1887671263559360280</id><published>2009-04-25T18:00:00.004+10:00</published><updated>2009-04-27T09:19:19.166+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><title type='text'>Internet Explorer Submit Button Bug</title><summary type='text'>While testing a simple form in Firefox and MSIE 7, I found that my server-side program got different values for HTML submit buttons depending on the browser. Below is a test HTML file to demonstrate the problem. Copy and paste the text below into a test file, open the file in your browser and press the Test button.


&lt;html&gt;
  &lt;body&gt;
    &lt;form method='get'&gt;
      &lt;button name='testSubmitButton' </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1887671263559360280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/04/internet-explorer-submit-button-bug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1887671263559360280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1887671263559360280'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/04/internet-explorer-submit-button-bug.html' title='Internet Explorer Submit Button Bug'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-8051158929165366495</id><published>2009-04-23T18:00:00.003+10:00</published><updated>2009-04-24T15:29:04.389+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Internet Explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='Annoyances'/><title type='text'>Enabling and Disabling Javascript in Internet Explorer 7</title><summary type='text'>How to enable or disable Javascript in MSIE7:


Select Tools / Internet Options.
In the Internet Options dialog, select Security tab.
In the Security tab, select Custom Level button.
In the Security Settings dialog, scroll down the tree of properties in the Settings list until you find the Scripting / Active Scripting node, then select the Disable or Enable radio button to disable or enable </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/8051158929165366495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/04/enabling-and-disabling-javascript-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8051158929165366495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8051158929165366495'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/04/enabling-and-disabling-javascript-in.html' title='Enabling and Disabling Javascript in Internet Explorer 7'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-8622201675808471924</id><published>2009-04-22T18:00:00.002+10:00</published><updated>2009-06-17T10:06:10.199+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stylish'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Make Columns Narrower with GreaseMonkey or Stylish</title><summary type='text'>It is hard to read a lot of text in a wide browser window, so below are two GreaseMonkey scripts to make the text columns narrower. They both work by changing an element's CSS width to a percentage of the window width.

If the text is within a known element tag (e.g. p), try the following script, which iterates through the collection of elements and sets the elements CSS width.


for each (e in </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/8622201675808471924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/04/make-columns-narrower-with-greasemonkey.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8622201675808471924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8622201675808471924'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/04/make-columns-narrower-with-greasemonkey.html' title='Make Columns Narrower with GreaseMonkey or Stylish'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-717935965455048486</id><published>2009-04-21T18:00:00.000+10:00</published><updated>2009-04-21T18:00:00.818+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Open WinCVS in a Directory or Folder</title><summary type='text'>WinCVS' tips.txt file includes this tip: If you run WinCvs with a file or directory name as a command line argument, then WinCvs will locate and select it for you so you can operate on it right away. To use this feature in Windows, create a new shortcut, and in the shortcut's Target field, enter: &lt;path to wincvs.exe&gt; &lt;directory path&gt;. When you click on this shortcut, WinCvs will open in the </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/717935965455048486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/04/open-wincvs-in-directory-or-folder.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/717935965455048486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/717935965455048486'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/04/open-wincvs-in-directory-or-folder.html' title='Open WinCVS in a Directory or Folder'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-7208556930267375026</id><published>2009-04-20T10:35:00.000+10:00</published><updated>2009-04-20T11:20:05.590+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GnuWin'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Annoyances'/><title type='text'>Outlook 2003 Paste Special disabled</title><summary type='text'>When you write or respond to a HTML-formatted message in Outlook 2003, and paste some text from another source (e.g. a Web page), the pasted text looks out of place because Outlook uses the string's original formatting, which is almost always different from the formatting in the message. If, like me, you find multiple fonts in a message ugly, you'd want to paste the text into the message without </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/7208556930267375026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/03/outlook-2003-paste-special-disabled.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7208556930267375026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7208556930267375026'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/03/outlook-2003-paste-special-disabled.html' title='Outlook 2003 Paste Special disabled'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1826202092519585462</id><published>2009-04-07T15:18:00.004+10:00</published><updated>2009-08-29T13:02:03.593+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS-Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>Microsoft Access dummy row</title><summary type='text'>If you want to generate a dummy or extra row, say for a combo box control, then you can write a SQL statement like this: select col1 from table union all select 'All' from table. What this statement does is create an extra row with text All in the last row in your combo box.

While testing, we found that this statement works in Microsoft Access 2003 but not in Access 2000. In Access 2000, it </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1826202092519585462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/04/microsoft-access-dummy-row.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1826202092519585462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1826202092519585462'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/04/microsoft-access-dummy-row.html' title='Microsoft Access dummy row'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5017154561327422741</id><published>2009-03-25T18:35:00.007+11:00</published><updated>2009-06-07T20:03:29.132+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><title type='text'>Facebook News Feed workaround and RSS feeds</title><summary type='text'>The new Facebook News Feed is pretty useless because, unlike the old one, you can't filter notifications based on type, nor does it collapse multiple notifications from the same application into one. What you end up with is a long list of notifications from every friend and application each time, and you simply miss notifications that interest you (e.g. x is now a friend of y) in all the noise.

</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5017154561327422741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/03/facebook-news-feed-workaround.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5017154561327422741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5017154561327422741'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/03/facebook-news-feed-workaround.html' title='Facebook News Feed workaround and RSS feeds'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-9041171606564769511</id><published>2009-02-05T20:12:00.003+11:00</published><updated>2009-02-05T20:31:49.107+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox most popular browser</title><summary type='text'>Unbelievable. The browser statistics for W3 Schools show that in January '09, Firefox was more popular than all versions of MSIE combined: 45.5% vs 44.8%. Also, there are more visits with browsers that support SVG (Firefox, Chrome, Opera and Safari) than with browsers that don't (MSIE family): 54.7% versus 44.8%.

Yes, it's only one site frequented by web developers, not representative of the </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/9041171606564769511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/02/firefox-most-popular-browser.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/9041171606564769511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/9041171606564769511'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/02/firefox-most-popular-browser.html' title='Firefox most popular browser'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-8525068971353863480</id><published>2009-01-29T09:58:00.003+11:00</published><updated>2009-01-29T13:41:42.188+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Annoyances'/><title type='text'>Outlook 2003 rules don't support wildcards</title><summary type='text'>I use MS Outlook 2003's rules to sort notification e-mail from a bug reporting system into different folders, one folder for each combination of product and major customer. Each message is sorted based on a keyword in the message subject or body. Sorting by product name easy because it is a sub-string in the subject. Sorting by customer name requires a rule to examine the body of message and find</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/8525068971353863480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/outlook-2003-rules-dont-support.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8525068971353863480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/8525068971353863480'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/outlook-2003-rules-dont-support.html' title='Outlook 2003 rules don&apos;t support wildcards'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-2477486538042191106</id><published>2009-01-25T18:45:00.000+11:00</published><updated>2009-01-26T11:01:11.842+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Miscellaneous'/><title type='text'>Writing a good bug report</title><summary type='text'>Have you ever reported a bug to a forum or mailing list, only to have developers pester you with dumb questions or, even worse, no one seems to be interested in helping you? Why do they keep asking you for more and more information? Aren't they interested in fixing bugs? Why won't anyone help you?

Being on the sending and receiving end of bug reports for years, I find that most developers take </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/2477486538042191106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/writing-good-bug-report.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2477486538042191106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/2477486538042191106'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/writing-good-bug-report.html' title='Writing a good bug report'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5147971147433912026</id><published>2009-01-24T09:39:00.001+11:00</published><updated>2009-01-26T12:18:58.599+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Beginning Firefox Ubiquity</title><summary type='text'>Been playing with Firefox Ubiquity add-in for the past month and found myself using these commands:


define (def) word
Gives definition of a word in Ubiquity popup.

map &lt;location&gt;
Shows Google Map in Ubiquity popup. If you press Enter, it opens Google Maps in a new tab.

tab &lt;tab name&gt;
Displays the named tab. For example, tab gmail would display the Gmail tab. Useful if when I open too many </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5147971147433912026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/beginning-firefox-ubiquity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5147971147433912026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5147971147433912026'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/beginning-firefox-ubiquity.html' title='Beginning Firefox Ubiquity'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1881181355983911729</id><published>2009-01-22T09:55:00.000+11:00</published><updated>2009-01-26T11:01:11.843+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox spell check requires dictionary</title><summary type='text'>Maria H.'s version of Firefox didn't highlight misspelt words in multi-line fields, although the Check my spelling as I type option is checked. I found that I had a English / United States dictionary installed (probably from a previous installation) while she didn't, so the spell check worked on my PC but not on hers. It seems that the Firefox spell checker only works after you install a </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1881181355983911729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/firefox-spell-check-requires-dictionary.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1881181355983911729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1881181355983911729'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/firefox-spell-check-requires-dictionary.html' title='Firefox spell check requires dictionary'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1264083709459612956</id><published>2009-01-21T14:05:00.000+11:00</published><updated>2009-01-26T11:01:11.843+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annoyances'/><title type='text'>Microsoft Visio 2003 insert page annoyance</title><summary type='text'>When you insert a new page in MS Visio 2003, the page added in the right-most position, after all other page tabs. This behaviour is different from MS Excel, where a sheet is added before the current sheet. Visio's behaviour is annoying because after I create a new page, I have to move it to the position I want.</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1264083709459612956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/microsoft-visio-2003-insert-page.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1264083709459612956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1264083709459612956'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/microsoft-visio-2003-insert-page.html' title='Microsoft Visio 2003 insert page annoyance'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1602062740046243843</id><published>2009-01-12T12:20:00.000+11:00</published><updated>2009-01-26T11:01:11.843+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Microsoft Word 2003 symbol dialog</title><summary type='text'>By accident, I found that if you double-click on a symbol character in your document in Microsoft Word 2003, the Symbol dialog is displayed. However, how does MS Word define a symbol? For instance, the dialog doesn't appear if you click on a copyright symbol but it appears if you click on a smiley face symbol.

References


6 tips for adding international characters and symbols to your document
</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1602062740046243843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/microsoft-word-2003-symbol-dialog.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1602062740046243843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1602062740046243843'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/microsoft-word-2003-symbol-dialog.html' title='Microsoft Word 2003 symbol dialog'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-219408898479173175</id><published>2009-01-09T09:31:00.000+11:00</published><updated>2009-01-26T11:01:11.844+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Dispatch, Static versus Dynamic, Single versus Double or Multiple</title><summary type='text'>I read Stuart Holloway's Java.Next #3 Dispatch and decided to make clear to myself the concept of Dispatch and how it is used.

Dispatch means to call a method of an object and is normally applicable in the context of object-oriented programming. The rest of this summary assumes that there is more than one function with the same name and revolves around selecting the function (or method) to call </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/219408898479173175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/dispatch-static-versus-dynamic-single.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/219408898479173175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/219408898479173175'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2009/01/dispatch-static-versus-dynamic-single.html' title='Dispatch, Static versus Dynamic, Single versus Double or Multiple'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3098608364476284309</id><published>2008-12-13T19:36:00.001+11:00</published><updated>2009-04-24T16:01:49.761+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Gimp 2.6: Order drawing tools by keyboard accelerators</title><summary type='text'>It may be easier to remember keyboard accelerators (or shortcuts) if an application's tools follow the arrangement of the keys in the keyboard. Here's how to apply that idea to the Gimp 2.6 Toolbox.

The default arrangement of tools has this key order: E (ellipse select), R (rectangle select), F (free select), U (fuzzy select), Shift+O (select by colour) …



The new arrangement follows the </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3098608364476284309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2008/12/gimp-26-order-drawing-tools-by-keyboard.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3098608364476284309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3098608364476284309'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2008/12/gimp-26-order-drawing-tools-by-keyboard.html' title='Gimp 2.6: Order drawing tools by keyboard accelerators'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-3241151274980532773</id><published>2008-12-12T21:00:00.000+11:00</published><updated>2009-01-26T11:01:11.844+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Visio 2003: Order drawing tools by shortcut keys</title><summary type='text'>By default, Visio 2003's drawing tools are in divided between two toolbars, Standard and Drawing, and the tools are ordered by importance or frequency.



Julian W. and I worked out that it's easier to remember the tools' shortcut keys if you move all of them into a single toolbar and arrange them by the shortcut keys, i.e. from Ctrl+1 (Pointer) to Ctrl+9 (Ellipse). Drawing tools which use Ctrl+</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/3241151274980532773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2008/12/visio-2003-order-drawing-tools-by.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3241151274980532773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/3241151274980532773'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2008/12/visio-2003-order-drawing-tools-by.html' title='Visio 2003: Order drawing tools by shortcut keys'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-208697853078715548</id><published>2008-12-04T18:06:00.000+11:00</published><updated>2009-01-26T11:01:11.844+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Annoyances'/><title type='text'>Microsoft Project 2007 print time scale problem</title><summary type='text'>It seemed like a simple job: print Gantt Chart of my project such that the time scale fits on one page in Microsoft Project 2007. Below is a picture of what I wanted to do:


+------+
|Page 1|
+------+
|Page 2|
+------+
|Page n|
+------+


Yet MS Project 2007 always printed the final milestone on an even page, so that I ended with twice the number of pages:


+---------+-------+
|Page 1   |Page 2</summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/208697853078715548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2008/12/microsoft-project-2007-print-time-scale.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/208697853078715548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/208697853078715548'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2008/12/microsoft-project-2007-print-time-scale.html' title='Microsoft Project 2007 print time scale problem'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-5891734571744820770</id><published>2008-12-01T15:34:00.000+11:00</published><updated>2009-01-26T11:01:11.845+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Microsoft Word 2003 extra find next and find previous keyboard shortcuts</title><summary type='text'>Unexpectedly found some extra keyboard shortcuts for Find Next and Find Previous functions in Microsoft Word 2003. The online help only lists Alt+Ctrl+Y for Find Next and no shortcut for Find Previous. You can also use Ctrl+PgDn for Find Next and Ctrl+PgUp for Find Previous. Bonus!

Later … Julian W. pointed out that this is part of the Browse Object feature. Press the circle icon below the </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/5891734571744820770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2008/11/microsoft-word-2003-extra-find-next-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5891734571744820770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/5891734571744820770'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2008/11/microsoft-word-2003-extra-find-next-and.html' title='Microsoft Word 2003 extra find next and find previous keyboard shortcuts'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-138460950284972589</id><published>2008-11-28T19:27:00.000+11:00</published><updated>2009-06-17T10:06:42.985+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stylish'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Theme a site with Greasemonkey and Stylish</title><summary type='text'>Motivated by Gmail's Terminal theme, I hacked a similar theme for an internal Web site using Firefox's Greasemonkey and Stylish add-ins. My approach was to write some small Greasemonkey scripts to touch up different parts of all pages independently, then use Stylish to apply style definitions (the theme) from one CSS file. If you want to create another theme for this site, just create a new CSS </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/138460950284972589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2008/11/theme-site-with-greasemonkey-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/138460950284972589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/138460950284972589'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2008/11/theme-site-with-greasemonkey-and.html' title='Theme a site with Greasemonkey and Stylish'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-1928555565645380351</id><published>2008-11-20T11:26:00.000+11:00</published><updated>2009-01-26T11:01:11.845+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Foxit PDF Reader Page Navigation</title><summary type='text'>The Foxit PDF reader lets you can turn to the next page using Space or Right, or to previous page using Shift+Space, Left or Backspace shortcut keys.  If you scroll a page, the page is moved up or down by the height of the view, so the next or previous page is always slightly shifted vertically in the view because the view is not the same height as the page.  After scolling several pages, you </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/1928555565645380351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2008/11/foxit-pdf-reader-page-navigation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1928555565645380351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/1928555565645380351'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2008/11/foxit-pdf-reader-page-navigation.html' title='Foxit PDF Reader Page Navigation'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-190880738730127466</id><published>2008-11-19T18:21:00.000+11:00</published><updated>2009-01-26T11:01:11.846+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Miscellaneous'/><title type='text'>Accelerate and Brake Moderately</title><summary type='text'>There's many ideas to save petrol, but which is the most effective?  As a starting point, my Magna TS consumed 16L/100km of petrol in city driving.  After some months of experimentation with different techniques, I found that the most effective method was (taa-daa!) … to accelerate and brake moderately.  Many other techniques (e.g. leaving appropriate space behind the vehicle in front, drive </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/190880738730127466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2008/11/accelerate-and-brake-moderately.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/190880738730127466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/190880738730127466'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2008/11/accelerate-and-brake-moderately.html' title='Accelerate and Brake Moderately'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-930637731409800108.post-7399545223012079742</id><published>2008-11-08T09:14:00.000+11:00</published><updated>2009-01-26T11:01:11.846+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='DotNet'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><title type='text'>Simple Clock Custom Control using Swing and Windows.Forms</title><summary type='text'>This article describes how to create a simple analogue clock using Java Swing and .Net Windows.Forms, and it will cover creating a custom control, simple 2D drawing, updating the display regularly with a timer.  In addition, the control can display the time in a user-selectable time zone and is resizable.

To give you an idea of the goal, below are images of the Swing and Windows.Forms control, </summary><link rel='replies' type='application/atom+xml' href='http://softwaresalariman.blogspot.com/feeds/7399545223012079742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://softwaresalariman.blogspot.com/2008/11/simple-clock-custom-control-using-swing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7399545223012079742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/930637731409800108/posts/default/7399545223012079742'/><link rel='alternate' type='text/html' href='http://softwaresalariman.blogspot.com/2008/11/simple-clock-custom-control-using-swing.html' title='Simple Clock Custom Control using Swing and Windows.Forms'/><author><name>Kam-Hung Soh</name><uri>https://profiles.google.com/107475180053147318205</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-H9H4FnSe38M/AAAAAAAAAAI/AAAAAAAAAAA/EZ69DZtH1NY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
