Archive for August, 2009
28/08/2009
I’ve been using Microsoft Visual Basic 2008 (Express Edition) recently to create some utilities. As part of this I needed to have an application start-up but only display as an icon in the system tray. After attaching a notify icon control to my main form I set the form’s load method to set the display in task bar and visible properties of the form to be false.
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
notifyiconMain.Visible = True
Me.WindowState = FormWindowState.Minimized
Me.Visible = False
End Sub
However this code doesn’t have quite the effect you think it should – i.e. hiding the form and displaying the icon in the system tray. What in fact happens (at least on Windows XP) is the window is squished up next to the start menu (the icon in the system tray is also there – as we would want).

That window shouldn't be visible
These few lines of code work fine once the form is created and displayed, so the issue is definitely linked to the initial creation of the form.
After trying several options (such as minimise, restore, minimise) I succumbed to Googling for an answer and whilst I found lots of answers they were all complicated, a little laborious or just bad coding practice. However I did find a different and surprisingly simple solution.
Rather than setting the window as minimised in the load method just set the WindowState property of the form to “Minimized“. The load method then simply becomes…
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
notifyiconMain.Visible = True
Me.Visible = False
End Sub
Posted in Programming, VB, VB.NET | Tagged hide, hide form, minimise, minimize, taskbar, VB, VB.NET, visible, visual basic | Leave a Comment »
28/08/2009
I was challenged to work out a little problem someone was having with Excel today. The expectation was that I could write some VBA to resolve it, but once I found out what the task was I quickly managed to put together a purely Excel function based solution.
The task was to pick the last entry from a vertical list of cells. The list is sequential so there are no blank lines which makes the choice of algorithm to find the last entry quite open. The algorithm I chose was based on a list length and vector approach.

Example
So to start with I needed to know how many entries were in the list. The COUNTA function will provide this. This in effect tells us how many rows we have to step down to get to the last entry. The OFFSET function allows us to carry out these steps based on the first entry in the list. Because we’re starting at the first entry then we don’t need to move if there is only one entry, so we need to subtract one from the count to give us the number of “steps” to take from the first cell.
The screen shot illustrates how this is built up for a list in column A starting at cell A1. The function we would use is simply =OFFSET(A1,COUNTA(A:A)-1,0,1,1)
However this does give us a #REF! if the list has no entries – which looks like an error if you give someone a blank list (essentially because it is). So if you need to account for this, just include an IF.
=IF(COUNT(A:A)=0,”",OFFSET(A1,COUNTA(A:A)-1,0,1,1))
Posted in Excel, MS Office, Scripting, VBA | Tagged counta, Excel, micrsoft excel, MS Excel, MS Office, offset, VBA | Leave a Comment »
24/08/2009
I run XBMC on a Mac Mini plugged into my TV. Sometimes XBMC gets a bit caught up and freezes or gets locked into some sort of loop. I have it running in full screen which makes it rather hard to quite when the application with focus is non-responsive. So to get past this, press F8 to bring up Spaces and navigate to another space. From here right click on XBMC in the dock to reveal and select Force Quit.
Posted in Mac, OS, Software, XBMC | Tagged Apple mac, Mac, mac mini, spaces, xbmc | Leave a Comment »
23/08/2009
Since Google Notebook went out of development earlier this year I’ve made the migration over to EverNote. It has many cool features one of the coolest being the ability to upload images and have EverNote run OCR to index the content of the image. The mobile phone EverNote applications allow a phone’s camera to be used to take a snapshot image and to upload it to EverNote over a 3G connection. Unfortunately the Windows desktop application has no functionality for capturing images in the same way through a web camera and with the proliferation of netbooks I feel that this is a feature that is sadly missing – well for me anyway. So after a bit of research I embarked on a quick weekend VB.Net project to put together a little application that could do this – and so I created SnapIT.

SnapIT Main Screen
SnapIT allows you to take a photo with an attached or built in camera (by pressing the “Capture Image” button) and save it (by pressing the “Store Image” button) to a specified folder as a JPEG with a file name based on the time at which it was taken. It also allows you to send the image off to an EverNote database with options to specify which notebook it gets sent to (it will of course default to the default notebook), a title and tags (separated by commas). Where the image ends up is determined by the checkbox options that have been selected (next to the “Store Image” button).

Settings window
It’s a standalone executable and stores a few settings in an INI file it creates in the same folder. When you first use it (assuming you want to save images or send them to EverNote) you will need to set a few file/folder paths. This can be done from File > Settings. You need to set a folder to store images in, the location of ENScript.exe (used to send the image to the database) and the location of the EverNote database file to which images should be sent.
This is just something I threw together for my own use and given that I wrote it in just a day or so it really hasn’t gone through much testing, so please keep that in mind when using it. That being said if you find a bug then add a comment to this blog post and if I can reproduce it I may just find the time to fix it and post a new version.
Posted in EverNote, Programming, Scripting, Software, VB, VB.NET | Tagged camera, enscript, EverNote, google notebook, image capture, notebook, ocr, snapit, web cam, webcam | Leave a Comment »
20/08/2009
I tried adding my Twitter RSS feed to FeedBurner a little earlier. Even though FeedValidator identified the feed as valid FeedBurner wouldn’t. Googling this suggested that either Twitter isn’t producing nice RSS feeds (which FeedValidator’s validation seems to contradict) or FeedBurner has blocked it.
I decided to try passing the RSS feed through another tool. I considered using Yahoo Pipes, but then decided that the feed aggregator from XFruits would be the quickest way. I set-up a feed as an aggregation of just a single feed, passed that to FeedBurner and everything now seems to work.
Posted in Internet, RSS, Twitter, Web 2.0, Yahoo Pipes | Leave a Comment »
08/08/2009
I briefly had a problem with the web server that’s running my personal wiki yesterday. Try as I might it just wouldn’t start-up. I hadn’t had a problem before and after three or four attempts at clicking the start option I took a step back and surveyed my machine – a useful option in many circumstances.
I spotted the culprit straight away as I had come across the issue before – Skype. When Skype starts up if the default port (51907 on my current instance of Skype) is unavailable (because another application is using it or more likely a firewall is blocking it) it tries to set-up on a port that is more likely to be available – 80 or 443 which are used by web servers for insecure and secure traffic respectively.
Whilst there is an advanced option in Skype to force it away from these two alternative ports often there are no other convenient ones to choose from. This is because it is good practice security to block unused ports and Skype isn’t always a top runner so to speak on ports to have open.
The moral of the story is simple – start your web server before you start Skype.
However this got me to wondering what else might pick a port that could conflict and how would you know what it was without just systematically working through all the applications and services you have running … which for me could be a large number. My solution was to use some DOS commands. NETSTAT can be used to examine what ports are in use by what processes. TASKLIST can be used then to identify the executable.
To smooth things over a little I’ve concocted a little script to automate this process. It’s really just a bit of a nicer front end to the whole thing and whilst several command prompt windows may briefly flash up as it runs, the script will take in the information from the commands and process them to filter out the pertinent information.
Option Explicit
Dim objCommandPort
Dim astrResults
Dim astrInfoLine
Dim strOutput
Dim strPortCommand
Dim strPID
Dim strApps
strPortCommand = "netstat -ano"
set objCommandPort = New clsDOSCommandExecutor
objCommandPort.ExecuteCommand(strPortCommand)
strOutput = objCommandPort.GetOutput
astrResults = split(strOutput, vbCrLf)
strApps = "PORT: APPLICATION" & vbCrLf
AssessPort "80"
strApps = strApps & vbCrLf
AssessPort "443"
MsgBox strApps, vbInformation + vbOKOnly, "Applications using web server ports"
Sub AssessPort(p_strPort)
Dim intCounter
For intCounter = 1 to Ubound(astrResults)
If inStr(astrResults(intCounter), ":" & p_strPort) > 0 Then
astrInfoLine = split(astrResults(intCounter))
strPID = astrInfoLine(ubound(astrInfoLine))
strApps = strApps & vbCrLf & p_strPort & ": " & AppOnPort(strPID)
End If
Next
End Sub
Function AppOnPort(p_strPID)
Dim objCommandPID
Dim strPIDCommand
Dim strPIDOut
Dim astrPIDOut
set objCommandPID = New clsDOSCommandExecutor
strPIDCommand = "tasklist /fi ""PID eq " & p_strPID & """"
objCommandPID.ExecuteCommand(strPIDCommand)
strPIDOut = Right(objCommandPID.GetOutput, len(objCommandPID.GetOutput) - inStrRev(objCommandPID.GetOutput, "=" & vbcrlf))
astrPIDOut = split(strPIDOut)
AppOnPort = Replace(astrPIDout(0), vbCrLf, "")
End Function
Class clsDOSCommandExecutor
Dim objShell, objExec
Dim strCommand
Dim strError
Dim objError
Dim objOutput
Dim strOutput
Sub ExecuteCommand(p_strCommand)
strCommand = "cmd /c " & p_strCommand
Set objShell = CreateObject("Wscript.Shell" )
objShell.Exec(strCommand)
Set objExec = objShell.Exec(strCommand)
Do Until objExec.Status
Wscript.Sleep 200
Loop
Set objError = objExec.StdErr
strError = objError.ReadAll
Set objOutput = objExec.stdOut
strOutput = objOutput.ReadAll
End Sub
Function GetOutput()
GetOutput = strOutput
End Function
Function GetError()
GetError = strError
End Function
Function Failed()
If strError = "" Then
Failed = false
Else
Failed = true
End If
End Function
End Class
Posted in DOS, OS, Scripting, Skype, VB Script | Tagged 443, 80, DOS, netstat, port, port 443, port 80, Skype, tasklist, VB Script, vbs, vbscript, web server, wsh | Leave a Comment »
08/08/2009
Posted in Batch, DOS, Scripting, VB Script | Tagged class, CMD, command, Command Line, command prompt, DOS, VB Script, vbs, vbscript, wsh | Leave a Comment »