Rss 2.0 via FEED

About...

cc128-large_01 I recently bought a device to monitor our household energy consumption. After looking at a few I lumped for a CurrentCost Envi. this is a great little device that comes in two parts – a transmitter with jaws that wrap around the main power cable coming into your home and a desktop display unit. The communication is all wireless and I have found that it works okay through two thick brick walls.

the reason for going with this particular unit was that it has a data port that can connect to a USB port and feed it’s readings to a PC – I wanted to be able to monitor the readings on my PC and chart/analyse them at will.

imageThe communication to the PC is basically via USB, but emulating a serial port COM connection – the CurrentCost website has links to the drivers you’ll need for this.

I wanted to, not only, record the readings but to chart them (on my website), get regular updates via various notification methods and a few other bits. Unfortunately, none of the software applications listed on their website covered all the items that I wanted – so I set about writing something myself…

My initial thoughts were around just sending the data to Google PowerMeter, but at that stage the API was not public and their forums/groups were not very active (6 posts in about 18 months), so I abandoned that and decided a ‘DIY’ approach was needed. 
UPDATE: It looks like there may be some substance to it now, so that is another area to look at (another plugin)…

imageThe requirements were pretty simple – I wanted a service that grabbed the readings as they came in, decoded them into something intelligible and then pushed them out to a number of ‘modules’ that would do something with the reading. the ‘modules’ would be self contained and new modules could be added at any time. The initial modules would be :-

  • Tweet the reading at a regular interval
  • Record the reading (in a database, Xml file or the like)
  • Send the reading to a website / webservice

It seemed a simple Windows Service with a COM port would be enough to grab the reading, the readings are all in Xml so another class to parse the Xml would be needed and then for the ‘modules’ a ‘plugin’ type architecture was called for. I came up with an interface that all plugins would implement and a method of loading them in dynamically.

Each plugin would inherit from the IPowerMonitorPlugin interface and to load the plugins, each one would be specified in the app.config file with a filename and classname. The service would look at each plugin entry, load the DLL and create an instance of the plugin class :-

    private void LoadPlugins()
    {
        plugins = new ArrayList();

        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        foreach (string key in appSettings.AllKeys)
        {
            if(key.ToLower().StartsWith("plugin"))
            {
                string path = AppDomain.CurrentDomain.BaseDirectory;
                string[] config = appSettings.Get(key).Split(':');
                Assembly ass = Assembly.LoadFile(path + config[0]);
                IPowerMonitorPlugin plugin = (IPowerMonitorPlugin)ass.CreateInstance(config[1]);
                if (null == plugins)
                {
                    plugins = new ArrayList();
                }
                if (!plugins.Contains(plugin))
                {
                    plugin.Init();
                    plugins.Add(plugin);
                }

            }
        }
    }

When the service was working and decoding the readings correctly, I started adding plugins – first was a simple ‘RawXmlWriterPlugin’ – this simple wrote the raw Xml reading data (Reading.RawXml) out to a text file – just to make sure it was working and we were decoding the Xml correctly.

imageThe next service was posting the data to a website – I found this great website (pachube.com) which allows you to track environmental data measurements, have multiple feeds, multiple measurements and has a lot of options for getting data in and out. The API that they provide is pretty simple to push data into and their website allows plenty of ways to visualize the data – for example here is a link to my last 24 hours energy consumption in a chart format, here is my latest temperature reading and here is an archive of all the energy data I have ever posted. there are also mash up to things like iGoogle widgets, Google’s Visualization API, Google Sketchup, iPhone Apps, Android Apps and this rather neat gauge.

From there I started the Twitter service….

 imagePachubePosterPlugin

The plugin for posting to Pachube requires that you have already create a feed with two datastreams (datastream 0 is energy and datastream 1 is temperature). You will need an API Key and the feed id. Both these items are configured in the app.config file also.

 TwitterPlugin

The plugin for ‘tweeting’ to twitter is also pretty simple – all you need is an account (username and password) and the ‘handle’ of the person/account you want to send the message to (if you want to send a direct message). You also specify the message text you wish to send (with placeholders for the energy and temperature values) an the interval (in minutes) of how frequently you wish to send the tweets.

SQL / Xml Storage Plugin

Watch this space … ;-)

Source and Package

For the time being either send me an email or post in the comments if you’d like access to the source code.

If you want to run this software yourself then here is a link to a zip file containing the full package. To get it installed, do the following :

  • imageUnzip the package contents into a folder (“C:\Program Files\PowerMonitorService\” would be good)
  • Open a command prompt and change to the folder above
  • Run the following command line…

“C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe” PowerMonitorService.exe     (if you are running a 64 bit machine… or)
“C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe” PowerMonitorService.exe     (if you are running a 32 bit machine… or)

  • Open the PowerMonitorService.exe.config file (in Notepad) and edit your configuration as needed – save when done.
  • Now start the service (Windows..Run..services.msc, find the one named PowerMonitorService, right click and choose “Start”)

Enjoy…

GEO 51.4043388366699:-1.2875679731369

Share/Bookmark

Posted: Tuesday, May 11, 2010 5:13:16 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: .NET | C Sharp | Development | Software | Technical | Twitter

USBdriveThis post is for my own benefit more than anything. I frequently have to ‘google’ for the instructions to make a bootable USB drive to install some version of Windows from. So, to save time in the future, here are the instructions :

Open a command prompt As Administrator. Run diskpart. Enter list disk – this will list all the attached disks, make note of the USB drive disk number (2 in my case, so substitute 2 in the commands below for whatever number it shows on your system :- image

  • select disk 2
  • clean
  • create partition primary
  • select partition 1
  • active
  • format fs=fat32
  • assign
  • exit

GEO 51.4043388366699:-1.2875679731369

Share/Bookmark

Posted: Saturday, April 03, 2010 1:31:03 AM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Software | Technical

imageI ran into some trouble with Hyper V the other day – I had booted from a VHD into Windows Server 2008 R2 and was trying to start a VM – I got the usual  ‘The virtual machine could not be started because the hypervisor is not running” error.
I had just had a BIOS failure on the machine so I figured it may have switched hardware virtualization support off in the BIOS when it reloaded the defaults.

Checking the BIOS, I found it was switched on – strange. I Googled a bit but everything seemed to be around flipping the setting in BIOS, when I knew to be correct.
Some further investigation around the boot environment and BCDEDIT settings I found the parameter “HypervisorLaunchType”, thinking this could well be connected, I set the parameter to “auto” in the BCD configuration:

BCDEDIT /set {big-long-guid} hypervisorlaunchtype auto 

This fixed it !!
So now all my BCD configurations go like this:

BCDEDIT /copy {current-or-guid} /d "New Boot Option"
BCDEDIT /set {new-guid} device vhd=[V:]\vmimage.vhd
BCDEDIT /set {new-guid} osdevice vhd=[V:]\vmimage.vhd
BCDEDIT /set {new-guid} detecthal on
BCDEDIT /set {new-guid} hypervisorlaunchtype auto

GEO51.4043502807617:-1.28752994537354

Share/Bookmark

Posted: Monday, November 23, 2009 9:51:31 AM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Productivity | Software | Support | Technical | Windows 7

Yesterday as I was trying to install Exchange 2007 on Windows 2008 R2 Enterprise Edition, I got a pretty strange issue.

imageEverything worked well up till the ‘installing mailbox role’ phase – it seemed to fail pretty quickly when it got there. Subsequent retries also failed (quickly) with exactly the same error - ‘Access Denied’

A little bit of Googling uncovered that the ‘Setup’ for Exchange 2007 had to be run in ‘Compatibility mode’ for it to work correctly. Crazy I know, but it works.

Open a Windows Explorer to the DVD, right click on the setup.exe file and choose the Compatibility tab, then set it to Vista Service Pack 2 – now run it, and it should all work as expected.

 

GEO51.4043502807617:-1.28752994537354

Share/Bookmark

Posted: Tuesday, November 10, 2009 6:43:12 AM (GMT Standard Time, UTC+00:00)  #   Comments [1]
TAGS: Exchange | Technical

imageIt is official, dual booting is now dead – Boot from VHD is the new king.

On my flight to BoS2009, I was inadvertently reliving some nostalgic milestones from the past 10 nay 20 years.

I had my Windows 7 laptop, booted from a VHD (see Scott’s great post for some easy instructions on how to configure this) – the OS I had booted into was Windows 2008, I had installed the Hyper-V role and was running an install of Windows XP on a virtual machine at the same time was running a command line install of Exchange 2007.

If only I had brought my Windows 3.1 diskettes with me I’d have had a straight flush…. here’s how it looked…

installl-capture

 

GEO51.4043502807617:-1.28752994537354

Share/Bookmark

Posted: Tuesday, November 10, 2009 6:29:25 AM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Exchange | Software | Technical | Windows 7

logo_windows WindowsMobileDeviceCenter After upgrading to Windows 7 on my laptop I found that I could no longer sync with my Sony Ericsson X1 (Windows Mobile 6.1) Phone. It didn’t even seem to be charging (over USB).

Looking in the system Device Manager I found a missing driver for the ‘Generic RNDIS’ device.

A bit of goggling uncovered that this was something required for syncing mobile devices. Although there are comments around that Windows Mobile devices are not supported on Windows 7 beta, and a number of people seem to be having the same problem, the good news is it does actually work.

I simply downloaded the Windows Mobile Device Center 6.1 for Vista (from Microsoft), installed it and everything was rosy.

It installed the driver for the ‘Generic RNDIS’, I connected the phone, it was recognised a Microsoft USB Sync device was installed and it all started working as expected.

GEO 51.4043694884482:-1.28756761550903

Share/Bookmark

Posted: Thursday, February 26, 2009 8:17:23 PM (GMT Standard Time, UTC+00:00)  #   Comments [1]
TAGS: Software | Technical | Windows 7 | Windows Mobile

logo_windows StickyNotes I am loving the Sticky Notes app in Windows 7. The only issue I have with it is the dreadful font it uses – well my issue is not the font, it is the fact that you cannot change it to something more ‘normal’.

I mean, I can easily change the font for Outlook Notes. I know, I know, you want it to look like handwritten notes that you would stick on your fridge at home, but hey – this isn’t my fridge at home, it’s my PC at work (and unfortunately there is no cold beer inside it !!).

Eileen Brown confirmed for me that there is no way to change it right now (in the beta – build 7000), but there may be a ‘Non UI’ way of changing it in the official release…

GEO 51.4043243116043:-1.28760516643523

Share/Bookmark

Posted: Thursday, February 26, 2009 3:13:14 AM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Software | Technical | Windows 7

kameleon1 I bought one of these about 4 years ago - initially loved it, but it chewed through batteries at an incredible rate, so after a few months of use and another instance of needing fresh batteries (and none being available) it sat in a drawer for some (considerable) time.

Now that I am a (proud ??) owner of an Xbox 360, I wanted to rationalize all our disparate remotes - my suggestion of buying a Harmony One (currently £88 on amazon) was met with "What! we already have one of those - that blue thing that lights up" from Sarah...

She's right  (of course) so I dug it out and brought it back into play - reprogrammed the devices for the new HD TV and DVD player, it still had the Pace Twin PVR programmed and bingo it  worked again.
I wanted to be 100% sure it would do everything I needed (I guess I was looking for an excuse to buy a Harmony), so I looked at all the functions available and programmed - I found that the PVR button (which should bring up the recording library) didn't work correctly, but a bit of googling sorted that (Key Reprogramming - code 00536) and then I started considering the Xbox.

There is a little info around about getting a Kameleon working with your Xbox. I tried this advice for the 8060 (6 in 1), but it didn't work (apparently the 4 in 1 does not have the modem programing capability), so eventually I emailed One For All support.
A pretty quick response indicated that yes it could support the Xbox, but would need sending back for reprogramming (at a cost of £10, as I was outside the first year of purchase / warranty). This seemed like a fair price so I have just sent it off.

I'll post on the 'richness' of the Xbox support (and the best code) when I get it back.

 

Codes that might be useful :

  • Vistron 32" HD TV - Model VIS032HDID   : 0587
  • Yamada DVDSlim 5520 : 0665
  • Xbox 360 : ????
  • Pace Twin Freeview Recorder : 1423(with PVR key reprogrammed to function code 00536)

 

GEO 51.4043197631836:-1.28760504722595

Share/Bookmark

Posted: Thursday, January 15, 2009 6:06:27 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Hardware | Technical

xbox360 So before Christmas I bought an Xbox 360 (60GB HDD version). Reasoning was "it will be good for the kids hand eye coordination" which in reality was a thinly veiled "I want one and the kids might like it too" (as it turns out they don't)...

Anyway, one of the first tasks was networking it -linking it to the home PC and DSL router. I read a bunch of stuff online about the Xbox wireless adapter being over the top and the same could be done with any old wireless router that you had lying around around - so, having an old WRT54G lying around that was my first step.wrt54g

It was pretty successful in that I already had reflashed it with DD-WRT firmware and it was pretty simple getting the wireless side acting as a client to my Linksys WAG160N and the unit bridging connections from the LAN side. Now this configuration requires that you set the LAN side side up on a different subnet to the existing (wireless) network - otherwise the routing gets screwed up. i.e. The LAN side might be on 192.168.2.X while the existing router is on 192.168.1.x (this is what routing is all about - Xbox gets an address of 192.168.2.x and a default GW of 192.168.2.1, the router bridges any data sent to 192.168.2.1 over to the wireless side which has an address of 192.168.1.xxx and a default GW of of 192.168.1.1 that then bridges it over to the WAN side of the DSL connection that then routes it to the Internet...

This worked fine initially, I could connect to Xbox Live and the like, but where it fell down was on the connection to the Media Centre PC - for some reason any Media Centre PC must be on the same segment as the Xbox (which is not the case here as Xbox = 192,168.2.x and MCPC = 192.168.1.x). It does this to make 'discovery' of the MCPC easy fro an Xbox, but I am surprised (read disappointed) that there is not an advanced / manual setting that allows the user to specify the IP address. I reckon this is around needing a good quality network connection between the devices (which is generally the case if they are on the same subnet, but not always when on different subnet's), but a simple disclaimer could have sufficed.... It forces users into either running an Ethernet cable, buying a wireless adapter or living without media centre capability.

xbox360wireless Anyway I caved and bought an Xbox wireless adapter, but the speeds are still not up to streaming HD TV, so now I'm considering powerline adapters (Homeplug) - be glad to hear of any experiences you have with this...

 

GEO 51.4043197631836:-1.28760504722595

Share/Bookmark

Posted: Thursday, January 15, 2009 2:34:54 AM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Hardware | Technical

I just found this Microsoft KB article which is a very comprehensive list of what services use what ports. Anyone working with enterprise software solutions or Microsoft back end infrastructure should find it useful.

GEO 51.4043197631836:-1.28760504722595 

Share/Bookmark

Posted: Thursday, July 24, 2008 11:23:29 AM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Software | Technical

imageToo much effort reading my ramblings ? Want to listen instead ? Now you can !!

Courtesy of the excellent odiogo, the excellent text to speech service. This is a free service that bloggers can use, it takes your RSS feed, splits it out to each separate post and then creates a MP3 for the post.

The text-to-speech quality is really good, only about 1 in 50 words is corrupt/unintelligible - easily high enough quality to get a good rendition of the post. Obviously it depends on the content of the post, I have not yet listened to a post with lots of sample code or the like, but I expect it would be pretty hard going.

Get the audio for this blog here. You can even subscribe in iTunes. I will also update the site to include the links in the sidebar.

GEO 51.4043197631836:-1.28760504722595

Share/Bookmark

Posted: Monday, July 21, 2008 4:22:56 PM (GMT Daylight Time, UTC+01:00)  #   Comments [1]
TAGS: Dasblog | RSS | Technical | Tools | Web

One of the things I find really helpful in terms of motivation (for running) is having easy visibility of weekly, monthly and total mileages, times, paces etc.

nikeplus_sportband So, a couple of weeks ago I bought myself a Nike+ Sportband. This promised it all - a senor that fits in your shoe and automatically records your distance, time and speed and wirelessly transmits it to a wristband. The wristband also has a detachable USB connector / screen that you simply plug into your PC and the data is auto uploaded to the Nike+ web site.

For too long I have been using an Excel spreadsheet and manually copying it between PCs, in the past couple of months I had started getting to grips with WCF by putting together a running log application that I had planned to host on my web site (just for me) - no need for that any longer, Nike+ was going to solve all my problems and more...

How wrong I was. I cannot tell you (although that is exactly what this post is trying to do) how technically inept this product is, not just the wristband but also the web site, the whole experience in fact.

coding-horror-official-logo-small If you are familiar with the class book 'Code Complete' you will know about a 'Coding Horror' (things you really should not do when writing software), Jeff Atwood even used the term for the name of his great blog - well this isn't all software, so lets call them 'Design Horrors'.

The first 'Design Horror' comes from trying to invent a new and snazzy way to secure a piece of technology to your wrist. Watch straps have been around for hundreds of years, everyone knows how to use it right ?, the only advancement in wrist fastening / securing technology ever was to use a Velcro patch to secure the two separate lengths of strap together (typically in sports pieces, for added speed). Did this stop the Nike engineers, no way - they came up with a new paradigm in wrist strap technology. One length of strap has 10 small holes, spaced by about 2 or 3 mm, the other length has two stud like protrusions that (using one hand) you must line up with the required two holes and push into place with a force just less than that required to push your thumb through the flesh of your wrist.

'Design Horror' 2 (DH2) is similar to that of DH1, remember the detachable USB connector / screen thing I mentioned, well to secure it the USB connector pushing into a slot in the wristband and then it is secured by one of these studs pressed into a hole, however the button on the face of the screen is exactly above that stud and pushing the USB thingy down to make sure it is secured typically results in the button being forcibly pressed for a few seconds (resulting in the device trying to locate the shoe sensor), also I'm not comfortable with the amount of pressure placed upon the button this regularly (thumb through the wrist pressure)....

nikeplus_logo 'Design Horror' 3 (DH3) is the 'clock' facility of the wristband. I may be being unfair here, this could be a 'by design' issue that was never part of the requirements (which would make it a Product Requirements Horror instead). The wristband has the ability to display the current time, as well as the mileages, pace etc. Naturally you would think that Nike position it as a watch replacement for runners, however I cannot believe that is the case. how could they imagine it would replace my watch which not only has alarms, date functions, countdown timers etc with something that only shows the time, nothing else, and does so without any form of backlighting, so that trying to read it outside the core hours of 10am to 4pm result in a painful headache and a trip to the optician for thick lenses. Obviously the decision to save what couldn't be more than 10p, for a tiny surface mount device giving date/time features, in the cost of materials seemed important to them.

'Design Horror' 4 (DH4) is the orientation of the display. This is in the most difficult to read position available (regardless of how the thing is worn). The display does not read along the length/drop of your arm like most watches - no, it reads perpendicular to the length/drop of your arm. So, now, instead of just squinting at the display with no backlighting you are also skewing your arm / wrist into some crazy angle like a contortionist.

nikeplus_utility 'Design Horror' 5 (DH5) brings us to the client side software that you need on your PC to interface with the USB thingy and auto upload your run data. When you plug the USB thingy in it auto starts the 'Nike+ Utility', however it is started behind all other application windows. Further, on first using it it displays a login facility pre-populated with the username of 'Guest'. Clicking in the username textbox to try and change it results in nothing ?? Nowhere does it mention it, but I have since determined that you log into the site via a browser and then the Username is picked up for the 'Nike+ Utility' from a cookie or something...
What part of "we'll show a username that the user knows is not theirs and give them no visible means of changing it" seemed sensible at the design stage ??

'Design Horror' 6 (DH6) falls into the areas of calibration and uploading runs. You can see from the screen shot that there is a calibration tab (the sensor is basically a pedometer and it needs to be calibrated to your stride length for accuracy) - the problem is that as soon as the USB thingy is plugged in the Nike+ utility starts and uploads any outstanding runs, before you calibrate. So my very first experience with this, when I'm still in the 'happy' zone about my purchase is a run being uploaded that is the wrong distance. All the shiny graphics depict that I am considerably slower and run shorter distances than I actually do - what a deflation. of course, my first though is that I'll just edit the run and update it with the correct distance  - leading me nicely to DH7.

'Design Horror' 7 (DH7) is the fact that I cannot edit any of the runs I upload, neither can I manually upload/input runs. With all the (fun) challenges available on the site, design to further motivate people, not providing this feature is a big letdown. Just in terms of personal motivation, Nike+ shows my Total for this year as 18 odd miles, but I didn't buy it till July, being able to correct that with accurate values should be possible, unfortunately it's not. Likewise some kind of import facility for all my old runs, should be - but isn't...

'Design Horror' 8 (DH8) is the communication between the wristband and the Nike+ web site - it seems to be one way, certainly none of the totals from the web site are reflected in the wristband figures - I 'reset' my wristband the other day to recalibrate (the distances suggested by the unit were 1.05 miles in 8 out, even after calibration) and now it tells me my total is 1.93 miles (even though I calibrated it to 2 miles exactly).nikeplus_run

The final 'Design Horror' (DH9) is the accuracy of the data. The run depicted in the image was an 8 miler I did, steady pace, no walking, flat terrain and a fast finish. the data does not reflect that, it looks like I actually stopped around 2.5 miles and slowed at the end. Nice graphs are great, but if I don't trust your data then what's the point.

The whole web site is flash/shockwave based and pretty slow, it is also difficult to navigate and non intuitive.

On the flip side, it is a great idea, some of the web site features are really neat - the ability to challenge other runners, join 'virtual teams' and have team challenges - it's a pretty good social networking for runners site all in all. It only costs £40 for the kit (sensor and wristband), so it doesn't break the bank.
BUT - It could be incredible if the hardware and software are sorted out !!

My message to Nike - Just Do It

GEO 51.4043197631836:-1.28760504722595 

Share/Bookmark

Posted: Sunday, July 13, 2008 10:57:15 PM (GMT Daylight Time, UTC+01:00)  #   Comments [5]
TAGS: Hardware | Running | Technical | Web

So a while back (31st Dec 2007), my beta license for Windows Home Server (WHS) expired and I hacked together an alternative quicklinks_whs_logosolution.

I have been updating my (almost) free/opensource alternative (it still needs a Windows OS) over the past couple of days and now have a pretty viable solution.

I have a machine (the Home Server) running Windows (any version would do) with two large additional drives in it (Data1 and Data2).
Data1 is the primary data drive and on there I created a number of folders / shares:HomeServerFolders

  • Photos
  • Documents
  • Music
  • Videos
  • Software
  • Backups
  • Downloads

I re-homed each of my 'special' folders in Vista (Docs, Music, Video, Photos) to these shares, so all data is stored on the Home Server. You could create a separate shared folder for each user with the correct permissions, but I share all the docs/photos etc between all machines so no need for me.

Next I wanted the WHS feature of duplicating the stored data across more than drive, so I grabbed a copy of the Robocopy and created a batch file with the following commands :

  • robocopy d:\documents e:\documents /MIR /SEC /LOG:c:\robocopy.txt /NDL /NFL
  • robocopy d:\music e:\music /MIR /SEC /LOG+:c:\robocopy.txt /NDL /NFL
  • robocopy d:\videos e:\videos /MIR /SEC /LOG+:c:\robocopy.txt /NDL /NFL
  • robocopy d:\software e:\software /MIR /SEC /LOG+:c:\robocopy.txt /NDL /NFL
  • robocopy d:\photos e:\photos /MIR /SEC /LOG+:c:\robocopy.txt /NDL /NFL
  • robocopy d:\backups e:\backups /MIR /SEC /LOG+:c:\robocopy.txt /NDL /NFL
  • robocopy d:\downloads e:\downloads /MIR /SEC /LOG+:c:\robocopy.txt /NDL /NFL

This replicates all the folders across to the other data drive (Data2) thereby mitigating against a single drive failure. All the replication results / logs are stored in a file (c:\robocopy.txt) and I wanted that emailed to me so I grabbed a copy of Blat and added the following command line to the batch file :blat

  • c:\tools\blat262\full\blat.exe c:\robocopy.txt -to YOUREMAILADDRESS -subject "RoboCopy Results" -server mail.YOURMAILSERVER.com-f "RoboCopy on Home Server" -u YOURUSERNAME -pw YOURPASSWORD

I named the batch file 'replicate.bat', put it in the c:\tools folder and then scheduled the batch file to run every night at 2am with this command line :

  • SCHTASKS /Create /SC DAILY /TN Replicate /TR c:\tools\replicate.bat /ST 02:00

Excellent - now the data is replicated across two drives, and I get an email every day with the results of the replication process (in case anything goes wrong).

HTTPFSNext I wanted to ensure I have remote access to my files from anywhere. I grabbed a copy of the excellent HTTP File System and put that on the Home Server.

HFSScreenshotI set the root to the Data1 drive, created a user account for myself and gave it 'upload' ability and that gives me fully web based access to upload and/or download any file.

The next piece in the puzzle is to get full backups of the machines. For this I had planned to use VMware Server and the excellent VMware Converter tool, however it seems the command line options for the tool they provide p2vtool only works with a licensed version.

It's a great tool and pulls a whole physical machine image into a VMware virtual machine - and is a great way to get the failed machine back to life - what it doesn't do is restore a machine, but I'm most likely to rebuild any failed machine anyway - I simply need access to any files / data on there that might not have made it to the shared server folders...

 

GEO 51.4043197631836:-1.28760504722595

Share/Bookmark

Posted: Wednesday, February 13, 2008 12:46:49 PM (GMT Standard Time, UTC+00:00)  #   Comments [2]
TAGS: Software | Technical | Tools

The king is dead, long live the king.

Over the Christmas break the license for my beta of Windows Home Server ran out, so I needed an alternative backup / storage solution. I briefly considered Linux with some iSCSI software, Windows with DFS or FRS, or indeed forking out some of my scheckles for a folder sync application.quicklinks_whs_logo

The requirements were as follows:-

  • NTFS, for large file support (12 Gb in some cases).
  • Easy duplication of the data (including hierarchy) across multiple drives.
  • UNC pathname support, so I could 'rehome' my docs, music, photos etc to it.ide_newlogo

In the end I opted for a fairly simple solution :-

  • A windows machine with a drive for the OS and two additional data drives.
  • One of the additional drives would be the primary where folders are 'rehomed' to and all data is stored.
  • A batch file would fire off 'Robocopy' (free in the Windows Resource Kit) to mirror this primary data drive to the secondary data drive.
  • Another batch file would fire off 'Robocopy' for copying to external USB drives.
  • Batch files would be scheduled using AT command line tool and would email results files using the free Blat! command line tool.flickr_logo_gamma_gif_v1_5
  • The primary data drive would also be backed up to my 'iDrive Pro' account (online 150 Gb storage facility for $50 / year).
  • Of course, photos are also backed up to my Flickr Pro account (unlimited online storage of images for $25 / year).

GEO 51.4043197631836:-1.28760504722595

Share/Bookmark

Posted: Saturday, January 05, 2008 12:43:15 AM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Scripting | Software | Technical

ruby_kaiserchiefs Sarah wanted 'Ruby Ruby Ruby' by the Kaiser Chiefs as her ringtone. Her mobile doesn't have any easy way of connecting to a PC, so she joined one of the rip-off 'Ringtones R Us' services that force you into paying £4.50 / week for as many ringtone downloads as you want (aside: I must be getting old - why would anyone want to change their ringtone that often ??).

Anyway, after downloading the mp3 she found it start relatively quietly and she was missing some calls. What she had actually wanted was the chorus....

So cue Kens Do It Yourself Ringtone Creater and Transferer... image

Step by step instructions :-

  1. Rip the song to an MP3 (from the CD which we do own - no copyright issues) 
  2. Download Audacity.
  3. Cut the chorus out of the original track (loaded MP3 file)
  4. Create a new stereo track and paste the chorus into the new track.
  5. Mute the original tracksimage
  6. Play / listen to the new track, make sure you are happy with it.
  7. Download lame_enc.dll to allow Audacity to export as MP3 (see this Audacity FAQ)
  8. Export the new track from Audacity as an MP3.
  9. FTP the MP3 file to your website
  10. Using 3G / GPRS etc on the mobile phone connect to the internet
  11. Browse to the MP3 file and download it to the mobile
  12. Set the MP3 as the ringtone.
  13. Cancel the expensive MP3 ringtone service (if applicable).
 
GEO 51.4043197631836:-1.28760504722595

Share/Bookmark

Posted: Thursday, October 11, 2007 2:29:31 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Family | Software | Technical | Web

I was spending far too much time installing OS's - virtual machines, lab machines etc.

Unattended In order to automate / streamline this I wanted to look at not just the Windows tools as well as other options. Remote Installation Service (RIS) and unattended.txt files go so far, but during my investigations I came across 'Unattended'. This open source tool takes unattended.txt, mixes in silent installs for hundreds of other common applications and supercharges the whole lot...

So the deal is, you extract some files from 4 zip archives, configure a DNS alias, share the folder, copy over the i386 folder from your OS CD/DVD, burn an ISO (or create a boot disk) image and your done - 25 minutes end to end.

The boot CD/Disk loads some network drivers, maps a Z drive to '\\ntinstall\install' (the machine and share with the files and OS on it) and passes control to a bunch of Perl scripts, these ask some questions from which it creates an unattended.txt file and executes the OS install (reboots and all). When the install completes it can also (optionally) run silent installers for other applications (Office, Open Office, Acrobat Reader, PDF Creator, Visual Studio, Perl etc..) as well as Windows Updates and critical fixes (they keep an up-to-date list on the homepage).

So, in summary, after booting from the install CD then 2 minutes of console based questions I can leave things for an hour or two and come back to a fully installed Windows OS, office applications, sales tools, developer tools - whatever. The scripts that install the additional apps are customizable (you can even enter your product keys) and you can build up suites from individual scripts (so I can have a script to install Visual Studio, another for the MSDN library, another for each of the various developer tools and then I can combine them all into a 'developer_machine' script...

Have a look - if you are doing more than one install (even just two) then this can save you time...

Share/Bookmark

Posted: Monday, August 27, 2007 9:21:51 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Productivity | Scripting | Software | Technical | Tools

This is pretty cool. Microsoft (in the UK) are creating downloadable dictionaries for Office that contain words from local dialects.
It is only a matter of time before I can type:

It wisnae me that smashed the windae wi the fitba!     (TRANS: it was not I that smashed the window with the soccer ball)

Without the little red squiggles underneath.

Share/Bookmark

Posted: Thursday, June 14, 2007 5:51:27 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Technical | Office

The company I work for (C2C) are hiring.

We are looking for Technical Support Engineers to work in our Reading, UK office.

We'll consider any experience level as long as the individuals show commitment, determination to learn / succeed and have a passion for technology.

You might be right out of school / college, looking for your first step into an IT career, you might be an Exchange expert with many years of experience.
We can promise variety, leading edge technology, in depth technical problems to investigate and input into the product direction.

Want to apply ?, email us at hr@c2c.com

Share/Bookmark

Posted: Monday, February 12, 2007 12:55:15 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Archiving | Exchange | Software | Support | Technical

This week (so far) has been good - in terms of completing things, productivity and new products.

First off, Microsoft finally released PowerShell for Vista. No more having to 'play' on my old lab machine to get to grips with this stuff. There seem to be a number of people reporting failed installs(due to EFS encryption being disabled), just read the comments of the PowerShell blog announcement.

Next, we're just coming to the final couple of days of a 'Supporting Exchange 2007, Office 2007 and Vista SPRINT' at work (we use a form of SCRUM as our development process) - all is looking good and we have beta sites lined up.

Then, I noticed Eileen's (the most communicative Microsoft employee on the planet) post about Office 2003 to Office 2007 command references. An interactive demo from Microsoft when you can click the toolbars and menus of an Office 2003 application and it tells you how to find the equivalent command/function in Office 2007. I spent some time finding the 10 or so commands I'd been having difficulty with and increased my productivity.
Here's her post : http://blogs.technet.com/eileen_brown/archive/2007/01/31/old-to-new-reference-guides.aspx

Then late last night (again at work) we just completed our internal testing before sending our Archive One product for Microsoft Platform testing. We are testing against 5 of the 6 platform tests (we don't fit into the 'Managed Code' test category as we make extensive use of MAPI which basically requires C++ / Unmanaged code)

Share/Bookmark

Posted: Thursday, February 01, 2007 10:42:07 AM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Archiving | Development | Exchange | Outlook | Scripting | Software | Technical | Tools

After a bit more investigation on the AV connection front for my Creative ZEN, I found the following :

A definition of the AV pinouts for various media equipment and particularly the Creative ZEN.

I already have a Camcorder Cable, so one of the tricks I found in some AV forums is to fully insert the 3.5mm connector and then pull it out by one click. If you do the maths it means you get Video, Ground and Right Channel Audio.

Trying this on my unit (with my Camcorder Cable) it works pretty well.

Share/Bookmark

Posted: Wednesday, January 03, 2007 9:56:41 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Hardware | Technical

Isn't Santa a nice guy.
For no other reason that I had been 'good' all year, he brought me a shiny new black Creative Zen Vision:M 30GB. Thank You !!


So far I have loaded it up with :

  • 200 CD's of music
  • Just shy of 3000 photos
  • Star Wars 4, 5 and 6 (ripped from DVD)
  • Two episodes of the DotNetRocks podcast
  • One episode of DNR TV
  • All my Outlook contacts (114)

and it still has over 14GB free.

It comes in a box about the thickness of 3 DVD titles. The package includes :

  • The unit itself measuring 100mm x 60mm x 20mm (my rough measurements)
  • The obligatory install CD with 1 gem (Creative's Zen Explorer) and a bunch of other freeloading applications (Audible Manager, Creative's own Media Player, blah..)
  • A manual in about 18 languages
  • A small dongle (Sync Adaptor)
  • A crappy set of in-ear headphones
  • A fabric pouch to fit the unit
  • A USB cable (Sync Cable).

The dongle connects to the bottom of the unit and split out from the all-in-one connector to :

  • USB (small type B) for data transfer and charging
  • A mini DC jack (5V) for charging
  • AV out (for connecting to a TV)

Odd that there is no DC Power adaptor for it - the only supplied option is the USB charging (another purchase I suppose)

The AV out connector is a 3.5mm headphone type plug, but you have to buy a cable to split this out to video and L/R audio (my Panasonic Camcorder uses a similar cable - I plan to try this out with the Zen)

My initial reactive is that it's a great device, lots of storage, the audio is as you'd expect from a MP3 player, the screen / photo display / video playing is very sharp and large enough (2.5 inches) to make it watchable. The user interface is clear, logical and easy to use and buttons and scroll pad are all well laid out.

The Creative Zen Explorer software basically consists of a driver and Shell Extension to allow you to browse the device from Windows Explorer, add media and play lists etc and also to sync Outlook data (Tasks, Calendar and Contacts). Audio transfers seemlessly but video is a bit more involved - if the video is not supported by the device (codec or size - the unit uses 320 by 240) then the transfer fails and you need to hit the 'convert' button when then converts it to the correct format / size and transfers it (this should all be hidden within the 'transfer' option instead of a seperate, manual, task).

There are no real instructions on any video transfer options other than "if it doesn't work then try converting it first". However, with a little googling I found a method of ripping and transferring DVDs etc (more on that in another post).

 

All in all - Very Impressed.

Share/Bookmark

Posted: Sunday, December 31, 2006 9:22:02 AM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Family | Hardware | Technical

I recently persuaded Sarah to let me buy a High Definition (HD) TV, a 32" LCD job.

After much research, I decided on a Vistron model from eBuyer - there are over 50 customer reviews on their site and it seems most of them are pretty good.

It was delivered in a couple of days (eBuyer's delivery has always been top notch) and then sat around the house for about 3 days waiting for me to return from the States.

I have it all installed and working now and I can certainly see it is a great TV - I plugged in my Acer laptop and played some of the free HD WMV clips that Microsoft have available on their website. The screen runs at 1366 * 768 and is real sharp, the HD WMV's look great.
There are also plenty of inputs on the unit including :

  • HDMI (720p with support for HDCP)
  • 2 SCART connectors (1 is full IN/OUT, other is IN only)
  • Component Video
  • Composite Video & Audio (YRL)
  • S-Video
  • Antenna (for the Analogue and Digital, Freeview, DVB-T signal)

That said, in the UK there is no HD content over DVB-T (Freeview), except the trial stuff for 550 user going on around London. I don't have a Xbox 360 (yet) nor a Sky HD box nor a HD DVD player so basically I'm stuck with Standard Definition (SD) for the time being...

I knew this would be the case, but I didn't expect the visual experience of SD on a HD TV to be quite so bad. The artifacting is really noticeable, it's a real pain trying to get a decent (stretched) picture from 4:3 to fill the whole screen.
OK it's not too bad with widescreen stuff, DVD's etc, but it's just not the experience I was expecting.

The next options are basically to spend another £300 on a Sky HD box (and £10/month subscription) or maybe a Xbox360 for he DVD aspect - there are other less expensive HD DVD options but I like the thought of using the Xbox360 as a media extender and going with Windows MCE 2005 on my PC.

In summary, I'd recommend the HD LCD TV if you have Sky HD or do lots of XBox360 gaming, otherwise I'd skip it.

Share/Bookmark

Posted: Wednesday, November 01, 2006 5:54:57 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Family | Hardware | Technical

Released today, a new version - get it here. They have added the following (list extracted from the Windows Liver Writer blog post)

The following is a summary of the changes in the Writer 1.0 (Beta) Update:

  • Tagging support
  • Support for Blogger Beta
  • Categories are sorted by name and support scrolling, plus improved support for reading categories from your blog
  • Improved startup performance
  • Paste is enabled for Title region and TAB/SHIFT+TAB navigation between title and body supported
  • Insert hyperlink added to context menu when text is selected
  • Title attribute in Insert Link dialog
  • Custom date support for Community Server
  • Improved keyboard shortcuts for switching views
  • Change spell-check shortcut key to F7
  • Add ‘png’ to insert image dialog file type filter
  • More robust image posting to Live Spaces
  • Improved style detection for blogs 
  • Fixed issues with pasting URLs and links
  • Remember last window size and position when opening a new post
  • Open post dialog retrieves more than 25 old posts

From what I have noticed :-

  • It still takes an age to open.
  • There is still no support for adding a file to a post (and having it uploaded / FTP'd), so my 'Insert File (via FTP) plugin' is still valid.
  • There is still no support to add new categories (you can choose from existing categories)
  • The insert 'task box' does not provide a scrollbar (so some items get hidden as you create more drafts)

Other things I noticed about the SDK when writing my plugin :

  • No way to get a ref to the current blog provider
  • No way to get properties for the current blog (this would be great as my plugin would be able to automatically pick up the FTP settings)
  • The icon size for displaying on the Insert tab is a crazy 20x18. Why didn't they simply go with a standard size (16x16 for example).

See 'Insert File (via FTP) icon on the embedded image for how it looks when trying to scale a standard image to this custom size - AWFUL.

However, I can't complain, overall I'm pretty happy - it's FREE, it makes my post creating MUCH FASTER and the way it shows me how the post will look on the website (automagically using my website CSS / formatting) is just AMAZING

Share/Bookmark

Posted: Thursday, September 28, 2006 10:30:11 AM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Development | RSS | Software | Technical | Tools

So I tidied it up a bit, added error handling and added a deployment project. Zip files are here :-

Windows Installer (msi) in a zip file

C# Source Code

Enjoy...

Share/Bookmark

Posted: Thursday, September 21, 2006 5:54:59 PM (GMT Daylight Time, UTC+01:00)  #   Comments [2]
TAGS: C Sharp | Technical

Having raved about WindowsLive Writer recently,  I've been using it extensively over the past few days.

I'm using Dasblog 1.8 for this site and apparently it doesn't support the API required to automatically upload images etc (Writer recognizes this and offers me FTP instead - which works well). That's all fine and good for images, but sometimes I want to give links to files...

Writer provides a pretty easy API and plug in architecture so I thought I'd write my own Plugin which allows the user to browse for a file, upload it and insert a link to the file into the post content.

This was a really exercise, taking only about 2 hours total for coding and testing. You can get the binary files here and the source code here. This was really for my own use (and doesn't do any error handling), but feel free to use it...

Basically, copy the binary files to the Plugins sub folder of your Writer folder and restart Writer, it should be automatically recognized and you'll get a new item in the 'Insert' tab of the sidebar

Click on the item and you get a dialog allowing you to specify the file to upload, which site to upload it to and the text to display as the link in the post.

 

The XML file allows you to specify what sites you want to upload to. Specify the correct settings for your FTP server / path.
Only one item should have 'default' set to true (this makes it the default selected item in the ComboBox) and if you have 'debug' set to true then you will get a messagebox indicating the Uri it is trying to send the file to.

Share/Bookmark

Posted: Thursday, September 21, 2006 12:51:15 PM (GMT Daylight Time, UTC+01:00)  #   Comments [10]
TAGS: C Sharp | Technical

I've just read Joel's review of the free phone that Sprint gave him (hoping that he'd blog about how great it is and how great their Power Vision Network (their content) is.

Virtually everything he says about the phone itself (UI, build quality, features) stands for the Samsung D600 - I've been meaning to do a similar in depth review of the Samsung for a couple of months now - no need now that Joel has done it.

Samsung, in fact all phone manufacturers - yes we love features, but it is not enough to cram them in, in a haphazard, non integrated, non intuitive way that basically does not work correctly.

Apple, get on and make a mobile phone in the genre of the iPod, people will buy them in their hordes.

Share/Bookmark

Posted: Wednesday, September 20, 2006 10:37:41 AM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Technical

I recently purchased a Linksys ADSL2MUE, I was a bit dubious of it at first as it seemed to take forever to connect and the connection was very flaky.
Also the configuration options were pretty poor in the 4.12UK version of software.

I then found that in the 4.12UK version of software it provides NAT for outgoing connections but drops ALL anonymous Internet requests - meaning I cannot initiate a connection for a remote machine to my home network - NOT GOOD as I like to have access to my files (FTP), my source code (Subversion) and my desktop (VNC).

After much googling and a very close call with parting with more cash for another DSL modem, I came across an Australian version of the firmware for this box that apparently enabled many more features.

Why not give it a go, I was planning on getting something else anyway, so if I 'brick' the device I'm still no worse off.

I found the firmware and a post about it here. The guy posting about has the files hosted on esnips, which requires a login etc, so to make it easier I've posted them here also.

This new firmware is actually BETA (I think) and designed for the Australian market but hey - it works like a charm and gave me lots of new features AND A MUCH MORE STABLE CONNECTION.

I now have it configured to pass all ports through seamlessly and all the firewall rules and port forwarding is handled by my Linksys WRT54GG (running DD-WRT v23.SP2 firmware).
So, full access to my home services, remote management capability and many more diagnostic facilities... Exactly what I need.

 Some Screenshots

Share/Bookmark

Posted: Tuesday, September 19, 2006 10:06:43 AM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Technical

The Linksys WRT54G is a wireless 4 port router / firewall. It has 4 wired Ethernet ports, a Wireless Access Point and router/firewall functionality. It does NOT have a DSL modem built in (so it will NOT connect to your phone line to link it up to your BTBroadband, Talk Talk Broadband or any other Broadband account.
It is a small box with a little computer inside running a customized version of Linux.

Until recently I was running this plugged into a DLink DSL-300T DSL Modem (this does the conversion from DSL to Ethernet and passes the data to/from the WRT54G box). The DLink modem failed so, when replacing it I immediately looked to Linksys (as I have been very happy with the WRT54G).
I found they do a ADSL2MUE box which is a pure DSL Modem and it stacks really well on top of the WRT54G, also it's only about £22 so it was a done deal.

I'm fairly comfortable linking these together configuring it as necessary, so I was really surprised to see the amount of people having difficulty when I looking for reviews of the ADSL2MUE.

Most 'getting you started' guides seem to outline how to get the box working on it's own but never 'how it all works in a typical environment'. So here's my comments on how you go about it in a generic manner (any router and DSL modem)...

So, how do I configure them to work together.

Both units come with a default IP address of 192.168.1.1, also, both units have a web interface to allow configuration. So... you do NOT want to plug them both into a switch/hub at once as you'll get an IP address conflict.

So, take the modem and plug it into the switch/hub. Configure your PC to have a static IP address of 192.168.1.2 (Actually the router provides DHCP by default, so you could leave your PC configured to Dynamically Assigned, but just in case...)
Open your web browser and enter the address 192.168.1.1 - enter your username and password (by default admin & admin) and your in.

Now change the network settings so that your modem has an IP address of 192.168.2.1
When you commit the changes you will no longer be able to access the web interface - so change your PC to a static IP address of 192.168.2.2
Configure your modem to connect to your ISP as usual. Also configure the modem to provide DHCP to the Ethernet clients
Now we have the modem working we need to connect it up to the router and get that configured.

So, take the router and plug it into the switch/hub. Configure your PC to have a static IP address of 192.168.1.2 (Actually the router provides DHCP by default, so you could leave your PC configured to Dynamically Assigned, but just in case...)
Open your web browser and enter the address 192.168.1.1 - enter your username and password (by default admin & admin) and your in.

Now configure the router to use Automatic IP Configuration on the WAN side. Configure your normal router settings and your all set.

I've done that, but what is actually happening.

OK, your PC  has been automatically assigned an IP address in the range 192.168.1.X When you try to make a Internet connection (Web, Instant Messenger, Online games etc) then it is trying to connect to an IP address (lets say 80.12.23.45) your PC cannot connect to that IP address (it can only connect to other machines in the 192.168.1.X range) so instead it sends the request to the default gateway (which is your router).
Your router does all it's filtering and firewall stuff and eventually (if allowed) the request goes to the WAN port of the router - this is connected to the modem and has been assigned an IP address automatically (lets say 192.168.2.2, because that's the range it's in) the router forwards it to the modem which passes it through to the DSL connection and on to your ISP etc etc until it gets to the right location.

Points To Note

The router and modem MUST be on separate subnets (i.e. 192.168.1.X and 192.168.2.X - it doesn't have to be these address but they MUST be different - at least one of the first 3 sets of digit must differ)

This post outlines how to configure the modem in MODEM mode, not BRIDGED mode - that is a different discussion (email me directly)

Share/Bookmark

Posted: Monday, September 18, 2006 1:37:38 PM (GMT Daylight Time, UTC+01:00)  #   Comments [2]
TAGS: Technical

I've just downloaded and installed Windows Live Writer.

After playing with it for two minutes, I've decided it will replace w.Bloggar my current incumbent blogging tool.

Don't get me wrong, w.Bloggar is a very good tool. There site was down for a couple of weeks (which made me worry it was dead) but is now back up (to a degree) and they have a new partner for hosting their site.
It supports all the functionality that I require

BUT...

Windows Live Writer just does it better !!   It automagically detected my CSS and formatted itself with it (so my posts, as I am writing them, now look they way they will on the website).
I can create the posts in HTML view, including insertion of images etc.
The method of selecting/configuring FTP uploads was a breeze.
Also (maybe this is just perception/rose tinted glasses), I seem to be creating posts A LOT quicker than I could with w.Bloggar

Screenshots

Writer has a much slicker interface and just seems so much more intuitive. In my simple terms w.Bloggar looks Win2000 and Writer looks Win2003

I just cannot rave about Writer enough. It's still a BETA, but it rocks..

Share/Bookmark

Posted: Monday, September 18, 2006 12:38:28 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Technical

So I've spent a lot of time (seems like a huge amount) trying to get to grips with the XMLSerializer in .NET. I think I have pretty much come to the conclusion that what I'm trying to achieve is not possible (even though it seems like a logical thing)...

I'm trying to serialize a bunch of class data into XML format. The actual objects seem to Serialize correctly (if I set the ArrayList, al, to public in the collection) and I can modify the element names in the XML that is produced by using the [XmlElement("new_name")] attribute.

However, trying to set the ArrayList to non public and have the XMLSerializer use the C# indexer to get the objects gives me no end of hassle.

  1. If I set the indexer to return objects of the interface type it will always fail
  2. If I change the indexer to return objects of the concrete class then I cannot seem to modify the element name of the concrete class in the XML - it always comes out as 'MyClass'
I've tried overrides, but these also fail telling me I cannot apply a RootAttribute or TypeAttribute to the class

Looks like it's going to have to be implementing IXMLSerializer instead...

Here's a snippet of the code that I can't get working...

public interface IMyInterface

{

    double BigNum { get; set;}

}

 

public class MyClass : IMyInterface

{

    private double mBigNum = 0;

    public MyClass() { } // default contructor

    [XmlElement("bignumber")]

    public double BigNum // property

    {

        get { return mBigNum; }

        set { mBigNum = value; }

    }

}

 

[XmlRootAttribute("gpx")]

[XmlInclude(typeof(MyClass))]

[XmlInclude(typeof(IMyInterface))]

public class MyCollection : ICollection

{

    private ArrayList al;

    public MyCollection() { } // default constructor

    public Add(IMyInterface obj) { al.Add(obj); }

    public IMyInterface this[int index]

    {

        get { return (IMyInterface)col[index]; }

    }

 

    // ICollection members all implemented correctly

    // IEnumerable members all implememnted correctly

}

 

// code you want to run to do the serialization

MyCollection mc = new MyCollection

XmlSerializer xSer = new XmlSerializer(typeof(WaypointCollection));

TextWriter writer = new StreamWriter(@"c:\myfile.gpx");

xSer.Serialize(writer, mc);

writer.Close();

 

Share/Bookmark

Posted: Wednesday, August 30, 2006 4:11:46 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: C Sharp | Technical

I've recently implemented the SCRUM methodology at work (C2C Systems).

It has been a really interesting process, has taught us some very valuable lessons and provided a number of benefits :

  1. There are many things that go into the development process that people do not view as (or understand are) part of the software development lifecycle (SDLC). During the first couple of Sprints we didn't have all of these surrounding tasks in the backlog so our time estimates for getting features complete were a good deal off. However this was made visibile by the daily SCRUM meeting very quickly and sorted out on the subsequent Sprints.
  2. Developers really appreciate the kind of visibility it gives them of what is going on. What is left to do and in what sort of timescale, also what the objective for the Sprint is and the (non changing) list of tasks for the Sprint are.
  3. It doesn't work well when you have interdependant tasks in the same Sprint. OK, maybe one or two would be OK but lots of dependancies are a bad thing. All design and investigation work should be in the first (or early) Sprint and the coding in the subsequent (or later) Sprints.
  4. It 's incredible the visibility you get of Impediments. ...and the difference it makes when you 'fix' them. Fixing them also demonstrate to the development team you are serious about helping them be successful.
  5. It 's incredible the difference it makes when you focus everyone on SCRUM work. For example we got a little behind during one Sprint, we focused all developers on the Sprint work, barred interruptions (I triaged all Support Escalations for the day) and the productivity for the day went through the roof.
  6. Our estimating (of timescales) improved beyond recognition. Instead of 'Oh that'll take about 2 weeks', you get accurate estimates (because the developers know that you have all components of the SDLC in the 'plan' they feel more comfortable providing accurate timescales instead of trying to cover their arses). I measure the delta between time worked on a task and the time estimated, then add all those together for all tasks and generate a percentage figure - last Sprint was 98% accuracy in our estimating

Here are some links that I found useful when planning / implementing SCRUM.

and here is a sample Excel spreadsheet I use for planning and tracking our SCRUM projects.

Share/Bookmark

Posted: Friday, August 25, 2006 12:18:09 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Archiving | Technical

OK, so we've moved house and I've found my study (computing area devoted to Ken) has been downsized to what I would call a 'cubby-hole' - Not Good !! Anyway, alongside trying to rationalize what I use on a day to day basis and moving the equipment around I've been thinking of what I really want.

To rationalize everything I currently have and get 'what I really want' I envisage :
A small / low powered PC providing email, instant messaging, file sharing and running Subversion (source code control). This would enable me to run it 24/7 using a minimal amount of power, it would allow Sarah to do email and IM and allow me to get access to source code and files remotely. Then the second (large, more powerful) PC can simply be switched on when needed (DVD burning, importing from camcorder etc).
I noticed a review recently of a ASUS device which is basically a wireless router with built in web server print server, ftp server, it can share USB printer, webcams and has a 160GB drive with RAID 1 option built in. I expect this is based around one of these small Linux based boards that are so prevalent these days - I have another one in the form of a Linksys WRT54G wireless router (running DD-WRT custom software)..... These devices can do much of what I need, the missing parts are email, internet browsing and IM - not present as the devices have no graphics capability (all the interaction with it is done via the clients web browser to a built in web server in the device)... The ASUS device goes a little further in that it can host other USB devices on it's ports and share those out also (webcams, printers etc), but still not quite far enough...

I guess I'm looking at putting a small form factor Mini ITX based system together that'll do the email, IM and Subversion and using an external USB drive as the mail store for file sharing.

Of course, this doesn't cover my HTPC utopia or my PDA utopia - more on those later.

Share/Bookmark

Posted: Tuesday, August 22, 2006 8:51:41 AM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Technical

I have now been with web hosts 1 and 1 for three years now, I chose them as they seemed to be big (giving the impression that I could
expect a quality service from them) and they were also reasonably priced £4.99 per month for basic ASP.NET hosting allowing ODBC
connections to an Access database.

Anyway there have been a couple of instances where they just stopped my account and locked me out, probably due to my credit
card expiring or something but I never seem to have been notified and the first I know about it is when I can no longer access my email.
The latest spat I'm having with them is the same thing, billing failed because my credit card had expired (for an amount of £25), I was
never notified and now they've sent it to a debt collection agency - no doubt it'll be incredibly difficult to it paid and have an extortionate
admin fee associated with it - I'm looking at weeks before I get my hosting and mail back.

Thankfully, this site (kenandsarah.co.uk) is hosted by ServerIntellect who have been nothing but professional. The hosting is miles better,
allowing me much better control (I'm only using their Starter Tier) , full ASP.NET (v1.1 or 2.0) and they send me an invoice every month
for $9.95 (about the same as 1 and 1)...

As soon as I get the mess with 1 and 1 sorted then I'm moving all other domains over to ServerIntellect as well - goodbye 1 and 1 !!

 

Share/Bookmark

Posted: Friday, July 21, 2006 7:28:36 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Technical

I have been looking at how to make improvements (in productivity) in our technical support team recently.
One of the 'tick list' items I always put on job Descriptions (when advertising) is "Must have a logical and methodical approach to troubleshooting technical problems". I went right back to basics and thought about 'how do I define / measure this and what, in fact, is a logical and methodical approach ?'

Heres what I came up with (at a high level) :

Step 1 - Determine who is reporting the problem.
This is gathering the contact information (email, phone, name, company, preferred method of contact etc) of the person reporting the problem to you. It has to be the first step - if the call drops mid way then you need to know who to call back, when troubleshooting you need to know who to communicate the troubleshooting steps / workarounds / resolutions to.

Step 2 - Determine the nature of the problem.
This is gathering the context information - what product is it, what they are trying to achieve, what they are seeing that they believe is incorrect functionality and what they are expecting to see (the users understanding of the problem).

Step 3 - Gather the supporting evidence.
This is where you get log files, screenshots etc. - i.e. the supporting evidence that allows you to troubleshoot in more detail / see exactly what the product was doing at the time of failure. Usually, the best way to do this is to enable whatever logging your software / system has and have the user / customer carry out the steps which result in the (perceived) failure. If it's reproducable then that is half the battle... I also suggest that you ask for screenshots as they are good solid evidence and nothing is lost in the communication "Oh, I get an error message about DCOM or something", or "The screen goes a funny color" - much better to have the a screenshot of the actual message / action that is happening. Of course the problem may be so obvious that you can already reproduce it without the need for support evidence - if so, then great, no need to bother the customer to get the supporting evidence, gather it yourself (ALL your support people have immediate access to a demo/lab system - right !!).

Step 4 - Outline the next actions.
TELL THE USER / CUSTOMER WHAT TO EXPECT NEXT. If you can commit to timescales, even better !! - but at a minimum let them know what the next steps are "As soon as I get the trace file from you, I will review it and get back to you, it is likely to be this afternoon sometime, what is the best number to get you on this afternoon".

This is at a very high level, obviously in a real world scenario the above steps are all interspersed with process steps related to your own systems / infrastructure / policies etc (for example, checking the customer has a valid maintenance contract, opening a ticket in the fault tracking application)

Share/Bookmark

Posted: Tuesday, May 16, 2006 12:05:47 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Support | Technical

I got hold of Philip Laureano and we've been discussing the best way to make this available publically (we'll probably lump for Sourceforge).

Interestingly he also mentioned that someone else has written a 'SchemaBrowser' style extension for it - giving the whole application much more power (on a par with Codesmith).

I rewrote the VS2005 addin so that instead of the UI being a 'non integrated' Windows Form, it is now embedded in a VS IDE ToolWindow. Some screenshots below...

 

Expect to see details of the sourceforge project name and possibly a CodeProject article from Philip soon...

Share/Bookmark

Posted: Thursday, May 11, 2006 7:22:20 AM (GMT Daylight Time, UTC+01:00)  #   Comments [1]
TAGS: C Sharp | Code Generation | Technical

I logged a feature enhancement to allow the KB article RSS feed to include articles from ALL categories.

This was set as a LOW PRIORIY by Kayako, but is a high priority for me - nothing else for it, I had to fix it myself.....
Here's how I added the feature to enter 0 as the category id in the RSS feed url to provide articles from ALL categories.

Edit /modules/knowledgebase/functions_clientkb.php

Change Line 167 from :
if ($key == $kbcategoryid)

To :
if (($key == $kbcategoryid) || ($kbcategoryid == 0))

The url for the feed includes the category id for the artciles you want to see. Enter a category id of 0 to return ALL articles :

http://[your_domain]/rss/index.php?_m=knowledgebase&_a=view&kbcategoryid=0

 

Link to the post I entered on the Kayako forums

Share/Bookmark

Posted: Monday, April 24, 2006 12:31:49 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: PHP | Scripting | Support | Technical

I found an issue in SupportSuite (3.0.0.32) where if a client (user) did a KB search they would get the subject line and first 255 characters of each result match - some of these matches would be PRIVATE or DRAFT knowledgebase articles.

I guess this is a bug, but based on the responses (timeframe to even review reported issues) to bugs I reported to Kayako recently, I decided to fix it myself...

Here is what I did :

MODIFIED /modules/core/client_search.php
In the section commented as : // ===== SEARCH ALL MODULES ======== CHANGED if ($module->isRegistered(MODULE_KNOWLEDGEBASE)) { $_searchresults = searchKnowledgebase($_POST["searchquery"]); } TO if ($module->isRegistered(MODULE_KNOWLEDGEBASE)) { $_searchresults = searchClientKnowledgebase($_POST["searchquery"]); } also in the else if block directly below : CHANGE } else if ($_POST["searchtype"] == "knowledgebase" && $module->isRegistered(MODULE_KNOWLEDGEBASE)) { $_searchresults = searchKnowledgebase($_POST["searchquery"]); TO } else if ($_POST["searchtype"] == "knowledgebase" && $module->isRegistered(MODULE_KNOWLEDGEBASE)) { $_searchresults = searchClientKnowledgebase($_POST["searchquery"]); So, you've now forced the client search functions to use a new function (called seachClientKnowledgebase)
that we will now define...
  • Open the file /modules/core/functions_clientsearch.php
  • Copy the whole function named searchKnowledgebase and paste another copy into the same file.
  • Now rename the function to searchClientKnowledgebase.
In the newly pasted and renamed function look for the section starting with // ========BUILD THE CATEGORY LIST FOR THIS GROUP ===== ADD // KH get the status of each article and only use the 'published' ones $_finalpublishedarticlelist = array(); $dbCore->query("SELECT * FROM `". TABLE_PREFIX ."kbarticles` WHERE
(line wrapped) kbarticleid IN (". buildIN($_finalkbarticleidlist) .");"); while ($dbCore->nextRecord()) { if ($dbCore->Record["articlestatus"] == "published") { $_finalpublishedarticlelist[] = $dbCore->Record["kbarticleid"]; } }
DIRECTLY AFTER while ($dbCore->nextRecord()) { if ($dbCore->Record["categorytype"] == SWIFTPUBLIC) { $_finalkbarticleidlist[] = $dbCore->Record["kbarticleid"]; } } Then modify the next block of code to read as follows : if (!count($_finalpublishedarticlelist)) { return $_queryresult; }

Alternatively simply make a backup of your existing files :

  • /modules/core/functions_clientsearch.php
  • /modules/core/client_search.php
and replace them with the files in php_mods.zip

Share/Bookmark

Posted: Friday, April 21, 2006 12:48:34 AM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: PHP | Scripting | Technical

OK, so I've been modifying my (personal) organisational processes recently - how I track my tasks / projects etc...

I've kind of moved over to Getting Things Done (GTD) by David Allen. It's quick and easy and gets rid of all the 'non critical' crap that you really don't need to keep in your (short term cache) head - allowing you to focus what's important.

Anyway, in addition to understanding an organisational process, there is an element of making it work in your own environment (e.g. configuring your laptop / desktop with the tools to allow you to follow the process easily). There are a number of reviews etc of the Getting Things Done Add In for Outlook by Netcentrics (http://gtdsupport.netcentrics.com/home/). It seems like a pretty good application, but being a bit of a miser / skinflint and having a tendancy to play around with coding / scripting, I decided I didn't want to spend $70 and that I would hack something together myself.

What I came up with is a set of fairly simple Outlook macros, but it covers all the aspects of GTD that I use. The macros cover :-

  • Make Task - This takes an email and generates a new task. The task gets the body of the email copied into it and it also gets a copy of the email embedded into it.
  • Schedule - This takes an email and generates a new appointment. The appointment gets the body of the email copied into it and also gets a copy of the email embedded into it.
  • Delegate Via Task - This takes an email and generates a new task. The task gets the body of the email copied into it and it also gets a copy of the email embedded into it. It also starts the 'Assign Task to User' process.
  • Delegate Via Email - This takes an email and generates a new task with the original email subject preceded by 'FOLLOW UP'. The task gets the body of the email copied into it and it also gets a copy of the email embedded into it and the line 'Follow up on task sent by email (Date) to XXXXX' appended. It then also starts the 'Forward Email' process. The original email is 'Stored for Reference'
  • Store For Ref - This Copies the email into a subfolder of the 'Reference' folder with the name of the category assigned to the email. If the email is assigned multiple categories then multiple copies are stored (one in each subfolder)

There are also a bunch of other macros that allow a specific category to be assigned to the item. These are ObjectCat_[CategoryName] or TableCat_[CategoryName]. I simply add the ones I use most so they are available from the toolbar.

The reason there are (seemingly) duplicated functions (one starting with ObjectXXXXXX the other being TableXXXXXX) is that we need to provide the features whether we are in 'tableview' (and possibly have multiple emails selected) or if we have the email object itself open

Anyway, here is the code :

' Ken Hughes
' 21 March 2006
' Macros to implement 'Getting Things Done'


' Config variables
Const ReferenceFolder = "Reference"
Const TempFileName = "GTD_Temp_Msg.msg"

These are the constants that I use within my system / folder set - you may have to customise these to your own environment. Reference is the top level folder that all my 'stored for reference' subfolders are under (e.g. Development, Helpdesk, Personnel etc)
' For the currently open object, display the categories dialog.
' No need for a Table version of this as you can simple highlight the items in the table view, 
'
right click and choose Categories... Public Sub ObjectCategorise() ' Shows the categories dialog for the item. Dim obj As Object Set obj = Application.ActiveInspector.CurrentItem obj.Display obj.ShowCategoriesDialog obj.Save obj.Close 2 Set obj = Nothing End Sub ' Takes each highlighted email in the tableview and creates a task for it.
' Also copies the email body into the task body and attaches the email object into the task body.
Public Sub TableMakeTask() ' Convert an email into a task Dim objEmail As MailItem, objNewTask As TaskItem For Each objEmail In Application.ActiveExplorer.Selection Set objNewTask = CreateTaskFromEmail(objEmail) objEmail.Move GetMAPIFolder(ReferenceFolder) objNewTask.Display Next Set objEmail = Nothing Set objNewTask = Nothing End Sub ' Takes the currently open email object and creates a task for it.
' Also copies the email body into the task body and attaches the email object into the task body.
Public Sub ObjectMakeTask() ' Convert an email into a task Dim objEmail As MailItem, objNewTask As TaskItem Set objEmail = Application.ActiveInspector.CurrentItem Set objNewTask = CreateTaskFromEmail(objEmail) objEmail.Move GetMAPIFolder(ReferenceFolder) objNewTask.Display Set objEmail = Nothing Set objNewTask = Nothing End Sub ' Takes each highlighted email in the tableview and creates an appointment for it. ' Also copies the email body into the appointment body and attaches the email object
' into the appointment body.
Public Sub TableSchedule() ' Convert an email into an appointment Dim objEmail As MailItem, objNewAppt As AppointmentItem For Each objEmail In Application.ActiveExplorer.Selection Set objNewAppt = CreateApptFromEmail(objEmail) objEmail.Move GetMAPIFolder(ReferenceFolder) objNewAppt.Display Next Set objEmail = Nothing Set objAppt = Nothing End Sub ' Takes the currently open emailobject and creates an appointment for it. ' Also copies the email body into the appointment body and attaches the email
' object into the appointment body.
Public Sub ObjectSchedule() ' Convert an email into an appointment Dim objEmail As MailItem, objNewAppt As AppointmentItem Set objEmail = Application.ActiveInspector.CurrentItem Set objNewAppt = CreateApptFromEmail(objEmail) objEmail.Move GetMAPIFolder(ReferenceFolder) objNewAppt.Display Set objEmail = Nothing Set objAppt = Nothing End Sub ' Takes each highlighted email in the tableview and creates an assigned task for it. ' Also copies the email body into the task body and attaches the email object into the task body. Public Sub TableDelegateViaTask() ' Creates a task from an email and lets user assign owner Dim objEmail As MailItem, objNewTask As TaskItem For Each objEmail In Application.ActiveExplorer.Selection Set objNewTask = CreateTaskFromEmail(objEmail) objEmail.Move GetMAPIFolder(ReferenceFolder) objNewTask.Assign objNewTask.Display Next Set objEmail = Nothing Set objNewTask = Nothing End Sub ' Takes the currently open email object and creates an assigned task for it. ' Also copies the email body into the task body and attaches the email object into the task body. Public Sub ObjectDelegateViaTask() ' Creates a task from an email and lets user assign owner Dim objEmail As MailItem, objNewTask As TaskItem Set objEmail = Application.ActiveInspector.CurrentItem Set objNewTask = CreateTaskFromEmail(objEmail) objEmail.Move GetMAPIFolder(ReferenceFolder) objNewTask.Assign objNewTask.Display Set objEmail = Nothing Set objNewTask = Nothing End Sub ' Takes each highlighted email in the tableview and creates a task for it (that you track yourself) ' and also forwards the original email (allowing you to delegate it via email). ' Also copies the email body into the task body and attaches the email object into the task body. Public Sub TableDelegateViaEmail() ' Creates a personal task from an email and forwards the original email Dim objEmail As MailItem, objNewTask As TaskItem For Each objEmail In Application.ActiveExplorer.Selection Set objNewTask = CreateTaskFromEmail(objEmail) objEmail.Move GetMAPIFolder(ReferenceFolder) objNewTask.Subject = "FOLLOW UP: " & objNewTask.Subject objNewTask.Body = " Follow up on task sent by email (" & Date & ") to XXXXX" Set objEmail = objEmail.Forward objEmail.Display objNewTask.Display Next Set objEmail = Nothing Set objNewTask = Nothing End Sub ' Takes each highlighted email in the tableview and creates a task for it (that you track yourself) ' and also forwards the original email (allowing you to delegate it via email). ' Also copies the email body into the task body and attaches the email object into the task body. Public Sub ObjectDelegateViaEmail() ' Creates a personal task from an email and forwards the original email Dim objEmail As MailItem, objNewTask As TaskItem Set objEmail = Application.ActiveInspector.CurrentItem Set objNewTask = CreateTaskFromEmail(objEmail) objEmail.Move GetMAPIFolder(ReferenceFolder) objNewTask.Subject = "FOLLOW UP: " & objNewTask.Subject objNewTask.Body = " Follow up on task sent by email (" & Date & ") to XXXXX" Set objEmail = objEmail.Forward objEmail.Display objNewTask.Display Set objEmail = Nothing Set objNewTask = Nothing End Sub Public Sub TableStoreForReference() ' Stores the email object in the reference folder Dim obj As Object For Each obj In Application.ActiveExplorer.Selection StoreObject obj Next Set obj = Nothing End Sub Public Sub ObjectStoreForReference() ' Stores the email object in the reference folder Dim obj As Object Set obj = Application.ActiveInspector.CurrentItem StoreObject obj Set obj = Nothing End Sub
These following macros are the 'quick access' macros I use to assign categories to a email object (so it can be stored in the appropriate place)
Public Sub ObjectCat_Blank()

    ' Assigns the specified category to the object
    ObjectAssignCategory ""

End Sub


Public Sub TableCat_Blank()

    ' Assigns the specified category to the object
    TableAssignCategory ""

End Sub



Public Sub ObjectCat_IT()

    ' Assigns the specified category to the object
    ObjectAssignCategory "IT"

End Sub


Public Sub TableCat_IT()

    ' Assigns the specified category to the object
    TableAssignCategory "IT"

End Sub


Public Sub ObjectCat_Helpdesk()

    ' Assigns the specified category to the object
    ObjectAssignCategory "Helpdesk"

End Sub


Public Sub TableCat_Helpdesk()

    ' Assigns the specified category to the object
    TableAssignCategory "Helpdesk"

End Sub


Public Sub ObjectCat_Development()

    ' Assigns the specified category to the object
    ObjectAssignCategory "Development"

End Sub


Public Sub TableCat_Development()

    ' Assigns the specified category to the object
    TableAssignCategory "Development"

End Sub


Public Sub ObjectCat_Sales()

    ' Assigns the specified category to the object
    ObjectAssignCategory "Sales"

End Sub


Public Sub TableCat_Sales()

    ' Assigns the specified category to the object
    TableAssignCategory "Sales"

End Sub


Public Sub ObjectCat_Partners()

    ' Assigns the specified category to the object
    ObjectAssignCategory "Partners"

End Sub


Public Sub TableCat_Partners()

    ' Assigns the specified category to the object
    TableAssignCategory "Partners"

End Sub


Public Sub ObjectCat_Customers()

    ' Assigns the specified category to the object
    ObjectAssignCategory "Customers"

End Sub


Public Sub TableCat_Customers()

    ' Assigns the specified category to the object
    TableAssignCategory "Customers"

End Sub

Private Sub TableAssignCategory(ByVal sCat As String)

    ' Assign a category to the object
    
    Dim sCurrent As String, obj As Object
    
    For Each obj In Application.ActiveExplorer.Selection
        sCurrent = obj.Categories
        If sCat = "" Then
            sCurrent = ""
        Else
            If sCurrent <> "" Then
                sCurrent = sCurrent & ", " & sCat
            Else
                sCurrent = sCat
            End If
        End If
        obj.Categories = sCurrent
        obj.Save
    Next
    
    Set obj = Nothing
    
End Sub


Private Sub ObjectAssignCategory(ByVal sCat As String)

    ' Assign a category to the object
    
    Dim sCurrent As String, obj As Object
    
    Set obj = Application.ActiveInspector.CurrentItem
    sCurrent = obj.Categories
    If sCat = "" Then
        sCurrent = ""
    Else
        If sCurrent <> "" Then
            sCurrent = sCurrent & ", " & sCat
        Else
            sCurrent = sCat
        End If
    End If
    obj.Categories = sCurrent
    obj.Save
    
    Set obj = Nothing
    
End Sub

This final macro does the filing of the email objects based on the categories they have been assigned
Public Sub DeferItem(ByRef objEmail As MailItem)

    ' Stores the email object in the reference folder
    
    Dim objEmail As MailItem, frm As frmDefer, sInterval As String, iInterval As Integer
    Set frm = New frmDefer
    
    For Each objEmail In Application.ActiveExplorer.Selection
    
        frm.Show vbModal
        Select Case LCase(frm.Result)
    
            Case "someday"
                ' move it to the 'someday' folder
                objEmail.Move GetMAPIFolder(SomedayFolder)

            Case "cancel"
                ' do nothing
                
            Case Else
                ' add a reminder to the email
                objEmail.Move GetMAPIFolder(DeferredFolder)
                objEmail.FlagRequest = "Follow up"
                sInterval = Right(frm.Result, 1)
                iInterval = CInt(Left(frm.Result, 1))
                objEmail.FlagDueBy = DateAdd(sInterval, iInterval, Now())
                objEmail.FlagIcon = olRedFlagIcon
                objEmail.FlagStatus = olFlagMarked
                
        End Select
                
    Next
    

End Sub



Private Functions used as helpers
Private Function CreateTaskFromEmail(ByRef objEmail As MailItem) As TaskItem

    ' Creates a task from an email object.

    Dim objTask As TaskItem
    Set objTask = Application.CreateItem(olTaskItem)
    objTask.Subject = objEmail.Subject
    objTask.Body = "     " & vbCrLf & objEmail.Body
    objEmail.SaveAs (GetTempFolderPath & "\" & TempFileName)
    objTask.Attachments.Add GetTempFolderPath & "\" & TempFileName, , 1
    Set CreateTaskFromEmail = objTask

End Function

Private Function CreateApptFromEmail(ByRef objEmail As MailItem) As AppointmentItem

    ' Creates an appointment from an email object.
    
    Dim objAppt As AppointmentItem
    Set objAppt = Application.CreateItem(olAppointmentItem)
    objAppt.Subject = objEmail.Subject
    objAppt.Body = "     " & vbCrLf & objEmail.Body
    objEmail.SaveAs (GetTempFolderPath & "\" & TempFileName)
    objAppt.Attachments.Add GetTempFolderPath & "\" & TempFileName, , 1
    Set CreateApptFromEmail = objAppt

End Function

Private Function GetMAPIFolder(ByVal FolderName As String) As Object

    ' Returns a MAPIFolder object of the specified name
    Dim objNS As NameSpace, objParent As MAPIFolder, objChild As MAPIFolder
    Set objNS = Application.GetNamespace("MAPI")
    Set objParent = objNS.GetDefaultFolder(olFolderInbox)
    
    Dim aFolders() As String, vFolder As Variant
    aFolders = Split(FolderName, "\")
    For Each vFolder In aFolders
        Set objChild = objParent.Folders(CStr(vFolder))
        Set objParent = objChild
    Next
    Set GetMAPIFolder = objChild
    Set objParent = Nothing
    Set objChild = Nothing
    Set objNS = Nothing
    
End Function

Private Function GetTempFolderPath() As String

    ' Returns a string value indicating the temporary public folder path
    Dim objFS As FileSystemObject, objTemp As Scripting.Folder
    
    Set objFS = New FileSystemObject
    Set objTemp = objFS.GetSpecialFolder(2)
    'returns the path found in the TMP environment variable
    GetTempFolderPath = objTemp.Path
    Set objTemp = Nothing
    Set objFS = Nothing
    
End Function


Private Sub StoreObject(ByRef obj As Object)
    
    Dim vCat As Variant, aCats() As String, o As Object, sFolder As String, bOK As Boolean
    
    bOK = True
    If obj.Categories <> "" Then
        aCats = Split(obj.Categories, ",")
        For Each vCat In aCats()
            sFolder = ReferenceFolder & "\" & Trim(CStr(vCat))
            If CreateMAPIFolder(sFolder) Then
                Set o = obj.Copy
                o.Move GetMAPIFolder(sFolder)
            Else
                MsgBox ("Could not create folder : " & sFolder)
                bOK = False
                Exit For
            End If
        Next
        If bOK Then obj.Delete
    End If
    
End Sub

Private Function CreateMAPIFolder(ByVal sFolder As String) As Boolean

    ' Create a MAPIFolder object of the specified name if none exists
    Dim objNS As NameSpace, objParent As MAPIFolder, objChild As MAPIFolder
    Set objNS = Application.GetNamespace("MAPI")
    Set objParent = objNS.GetDefaultFolder(olFolderInbox)
    
    Dim aFolders() As String, vFolder As Variant
    aFolders = Split(sFolder, "\")
    For Each vFolder In aFolders
        On Error Resume Next
        Set objChild = objParent.Folders(Trim(CStr(vFolder)))
        If Err Then Set objChild = objParent.Folders.Add(Trim(CStr(vFolder)))
        Err.Clear
        Set objParent = objChild
    Next
    If (InStr(objChild.FolderPath, sFolder) > 0) Then
        CreateMAPIFolder = True
    Else
        CreateMAPIFolder = False
    End If
    Set objParent = Nothing
    Set objChild = Nothing
    Set objNS = Nothing
    
End Function
modGTD.bas (12.72 KB)

Share/Bookmark

Posted: Wednesday, April 19, 2006 5:57:39 PM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Scripting | Technical

Mr Burford and I went to a TechNet evening at Microsoft last night. The topic was 'Exchange 12 Overview'

It proved to be very interesting, lots of good info. Below are some (sketchy) notes I made...

  • Release date is likely to be late 06 / early 07.
  • The installer will run Best Practices Analyser (ExBPA) by default - if you don't meet the prereq's the install will terminate.
  • You cannot install EX12 into a domain / forest that has EX5.5 on it.
  • Exchange 12 CTP is likely to be available on the March 06 TechNet and MSDN packages.
  • Outlook 12 will have a 'autoconfigure' feature where you can simply enter your email address and password and it will find the server your mailbox is hosted on and do all the necessary configuration (Outlook profiles will not be needed - not clear if they are dissappearing or staying as an option). This autoconfigure is going to based / served from DNS. It may provide hooks for 3rd parties to load / configure their addins.
  • ESM will use MMC version 3.1 (the same as MOM currently uses). This provide a treeview on the left, the content in the middle and then access to specific tasks / wizards on the right
  • There will be 'Policy Rules' on the back end that all messages will pass through. This is a sort of ethical firewall - Bob is not allowed to send emails to Jane unless it has the word Emergency or the word Fire in the subject. This is along the lines of Inbox rules but everyone's email will pass through it.
  • There will be a increase in the limit of Storages groups and Databases per group. 50 storage groups with up to 50 databases in each. Prefferred architecture is 1 DB per SG
  • Disk and Memory are the current bottlenecks in EX2003. MS have seen this internally with 4K users per server, users that are a member of many Security groups put a much increased load on the server (ACLs for each user are cached in memory - lots of groups = more memory required to cache)
  • Cached mode puts an increased load on the server as it open multiple MAPI connects per user concurrently.
  • As they are using 64bit only this increases the memory addressable to 4 exabytes (??), but they reckon the 'sweetspot' for EX12 will be 32GB of memory.
  • The will be increasing the amount of data cached from XX (something fairly small) to 5MB per user. The disk IO should also improve as it means the same data can be loaded in half the IO ops. They are also doubling the page size to 8K (for increased performance)
  • OWA architecure is changing - these are now called Client Access Servers (CAS), they provide all access to mailboxes except MAPI (which can speak directly to a Mailbox Server). The CAS will generate all the HTTP / HTTPS etc that the user sees but it will speak to the users mailbox via MAPI.
  • OWA is using AJAX (a technology that allows you to update webpages without having to submit the whole page, get the blank screen and wait for the refresh to happen - our new helpdesk app uses this also)
  • All the MAPI client bits will be removed from the Mailbox Server service, so you will be able to install OL on a MB server and it is a supported environment (no MAPI conflicts etc)
  • You will be able to access Sharepoint shared documents areas through OWA
  • They will be able to define (virtual) folders in users mailboxes that have different retention policies. For example you will be able to set the retention policy for peoples Inboxes as 90 days and tell them anything that is legal related then move it into the legal folder where it will get a retention policy of 7 years. BUT - it relies on the user moving it into the folder. You can have multiple of these folders each with different retention periods.
  • Full Text Search is switched ON by default, you will also be able to conduct multiple mailbox searches.

The other area was unified messaging (UM). I come from a VoIP / Multimedia call centres / telecoms background that were to some extent dealing with UM / intelligent voicemail platform. With EX12 this technology comes of age and becomes mainstream. They showed us a live working demo last night of someone calling into a VoIP gateway / PBX and accessing EX12. Here was the flow :

  • EX12 : Please enter your account number and password
  • User : [enters numbers]
  • EX12 : Hello [firstname], tell me what you would like to do. For appointments say 'Calendar'... etc
  • User : Calendar
  • EX12 : Accessing your calendar, which day would you like
  • User : Tuesday
  • EX12 : First appointment for Tuesday 21st March is [appointment details]
  • user : I will be 10 minutes late
  • EX12 : [sends updates to all meeting attendees telling them you will be 10 minutes late]
  • User : Clear my calendar
  • EX12 : Clearing your calendar, how long for
  • User : 2 hours [or 2 days]
  • EX12 Would you like to recod a message to all the meeting attendees
  • User : [records a message]
  • EX12 : [Cancels all the meetings scheduled within the period by sending out cancellations with the recorded message attached]

It will also read text, emails etc to you. When someone leaves you a VM it arrives in your mailbox as a messageclass of 'Voicemail' (basically a message with a WAV or WMA file attached). You can listen to the audio (and jot down notes into the VM message object as your listening - e.g. writing down a phone number). If your viewing the message on your PDA or Phone via active sync or OWA you can have EX12 telephone your mobile and play the audio stream to you. Very cool stuff

Share/Bookmark

Posted: Friday, March 17, 2006 10:07:59 AM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Exchange | Technical

This phone is getting very annoying. The user interface / experience is crappy, clunky and unintuitive.
Samsung would do well to take a leave out of Nokia's book - much slicker interfaces.

The annoyances are :

  • Too many steps to simply send a text message.
  • Speed Dials only work from the main screen (do not work in text message mode etc)
  • Not possible to change from speaker to bluetooth headset when listening to MP3's (even
    though the headset is connected and the phone shows it's in headset mode, try changing
    from speaker to headset and it'll tell you it couldn't find any headsets attached.
  • Charger / USB connection on the bottom of the phone is far too fiddly
  • Many other that I cannot think of right now (enough for an O'Reilly book - Samsung D600 Annoyances).

As soon as I find an alternative it's getting canned!

 

Share/Bookmark

Posted: Thursday, March 16, 2006 5:11:39 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Technical

I have been in my current role for almost 12 months now (Technical Director for C2C Systems). During this time I have refocused the support group from being Application Support people to Technical Support people.
So, what does this mean and why did I do it...

Application Support - adj
The process of helping customers install, configure, operate and maintain an application by having a detailed knowledge of that application.

Technical Support - adj
The process of helping customers install, configure, operate and maintain an application / system by having a knowledge of that application and skills / knowledge in the surrounding technologies.

Basically, I view Application Support as helping by telling customers what buttons to press to achieve XXX, and Technical Support as understanding the actual technologies involved, so when something doesn't work they know what areas to probe / test / configure.

We have been through a lot of knowledge sharing (within support and with development), improved (immensely) the level and text of log file tracing in our products so that problems do not automatically have to go to the development team for investigation. Now there are more technology / area messages in the log files the support folks can do considerably more troubleshooting of the technology areas to find the issue without involving the development team (letting them focus their energies on coding !!).

My reasoning behind this is two fold. Firstly it means the Support team can now add significantly more value. Secondly it' better for the Support folks, they are typical techies and much prefer solving the issues themselves (if they can), learning more about the product and technologies and ultimately improving customer satisfaction.

 

Share/Bookmark

Posted: Monday, December 19, 2005 1:31:23 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Technical | Support

I just spent a few hours setting up nGallery on my site. It was real easy, very simple install, just worked !! AND IT's FREE !!

I then hacked around with a template for a bit and got it looking the same as the rest of my website (which uses the Dasblog Portal - Compass theme)

Basically I have a welcome screen which is a hacked version of a single blog entry, that is static and then 'under' that I now have my weblog (Dasblog) and my photos (nGallery). Everything has the same theme and it all looks pretty good (even if I do say so myself).

If you'd like details of my hacks or a copy of the nGallery theme then let me know, I do plan to make it publically available (on the nGallery site) but it's not quite at that stage yet - stay tuned...

 

Share/Bookmark

Posted: Monday, December 05, 2005 11:56:58 AM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Technical

The excellent RSSPopper (version 0.31) expired on me this morning. After visiting their website I found stable version 0.32 which is valid until 1 Dec 2006.

Downloaded it, installed (over the top of the 0.31 expired version) - it just worked, all my feeds intact etc.

 

Share/Bookmark

Posted: Thursday, December 01, 2005 11:13:31 AM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Technical | RSS

For 'ad hoc' scripting of Exchange Server, you just cannot beat Dmitry Streblechenko's Outlook Redemption.

It is basically a set of COM objects (in a DLL) which wrap many of the Outlook / Exchange objects, saving you from having to put some C++ code together to get around the horrible 'Another application is trying to access Outlook' security messages (and requiring user interaction).

I had a quick 'squiz' at Dimitry's site and saw the 'SafXXXXItem' objects. I didn't think these would meet my needs so almost wrote my own wrapper for the 2 or 3 particular objects / calls I needed, when I spotted his Redemption Data Objects (RDO), giving full access to the GAL, Public Folders, Mailboxes etc. In the end it did everything I needed and I got my script running in no time (see functions below).

Function AddUserToFolder(byref oFolder, byval oUserID, byval oUserName, byref objSession)

        '*********************************************
        ' oFolder                    Public Folder object
        ' oUserID                    EntryID of the user (from the GAL) 
        ' oUserName                Name of the user (from the GAL)
        ' objSession                Session object
        '*********************************************
	Dim sTempUsername
	sTempUsername = ""
	Set objACL = CreateObject("MSExchange.aclobject")
	objACL.CDOItem = oFolder
	Set objFolderACEs = objACL.ACEs
	
	' delete the user if they exist already
	For each objFolderACE in objFolderACes
		sTempUsername = GetACLEntryName(objSession, objFolderACE.ID)
		if sTempUsername = oUserName then
			Log "Deleting User : " & sTempUsername
			objFolderACEs.Delete objFolderACE.ID
		end if
	next
	
	' add user if they did not exist
	Log "Adding user : " & oUserName
	Set objNewACE = CreateObject("MSExchange.ACE")
	objNewACE.ID = oUserID
	objNewACE.Rights = "&H7FB"
	objFolderACEs.Add objNewACE
	objACL.Update
	
	if err then
		AddUserToFolder = false
	else
		AddUserToFolder = true
	end if
	
	Set objACL = nothing
	Set objNewACE = nothing
	Set objFolderACEs = nothing
 	
End Function


Function GetACLEntryName(byref objSession, byval oACLEntryID)
	
        '*********************************************
        ' objSession                Session object
        ' oACLEntryID              EntryID from the folders' ACL
        '*********************************************
	Dim sResult
	sResult = ""
	Select Case oACLEntryId
		Case UDefault 
			sResult = "Default" & vbTAB & "Default"
		Case UAnonymous 
			sResult = "Anonymous" & vbTAB & "Anonymous"
		Case Else
			sResult = objSession.GetAddressEntryFromID(oACLEntryID).Name
			
	End Select
	GetACLEntryName = sResult
	
End Function

 

Share/Bookmark

Posted: Wednesday, November 30, 2005 11:32:19 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Technical | Scripting | Exchange

There are some tools I find myself adding to every machine I work on. Some of these come from Scott Hanselmans' Ultimate Tools List. Currently I install the following on every machine :-

I also use a bunch of others (Cropper, Magnifixer, Snippet Compiler etc), but the first list is my 'MUST HAVES' on every machine. To make it all a bit easier I put together a short script to copy the apps over to the new machine, install all the apps, do the necessary with reg entries etc. Code is as follows :-

Dim objFS, WshShell, link, bDebug, sDestinationFolder

bDebug = false
sDestinationFolder = "C:\Windows\KensTools\"


Set objFS = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")

' Create the new folders (dont care about errors)
On Error Resume Next
objFS.CreateFolder sDestinationFolder
Err.Clear

' Copy the files over
objFS.CopyFolder ".\*.*", sDestinationFolder, true
If Err then 
	Log ("Failed to copy folder over:" & vbcrlf & vbCrlF & err.description)
	Err.Clear
Else
	if bDebug then Log "Copied folder over"
End If

objFS.CopyFile ".\*.*", sDestinationFolder, true
If Err then 
	Log ("Failed to copy files over:" & vbcrlf & vbCrlF & err.description)
	Err.Clear
Else
	if bDebug then Log "Copied files over"
End If

' Do the apps
InstallApp "regedit.exe /s " & sDestinationFolder & "Notepad2\n2_shell_integration.reg", "Notepad2"
InstallApp "msiexec /i """ & sDestinationFolder & "CmdHere Powertoy For Windows XP.msi""", "CmdHere Powertoy"
InstallApp sDestinationFolder & "VNC-4_1_1-x86_Win32.exe", "VNC"
InstallApp sDestinationFolder & "Winzip90.exe", "Winzip"
InstallApp "msiexec /i " & sDestinationFolder & "CommandBarSetup.msi", "CommandBar for Explorer"


' Create the BG Info shortcut
Set link = WshShell.CreateShortcut("C:\Documents and Settings\All Users\Start Menu\Programs\Startup\BGinfo.lnk")
link.Arguments = sDestinationFolder & "kens_default.bgi /TIMER:3"
link.Description = "BGinfo"
link.TargetPath = sDestinationFolder & "BGInfo.exe"
link.HotKey = "CTRL+ALT+SHIFT+B"
link.IconLocation = sDestinationFolder & "BGInfo.exe,1"
link.WindowStyle = 1
link.WorkingDirectory = sDestinationFolder
link.Save
If Err then 
	Log ("Failed to install BGinfo shortcut:" & vbcrlf & vbCrlF & err.description)
	Err.Clear
Else
	if bDebug then Log "Installed BGinfo shortcut"
End If

Set link = nothing
Set WshShell = nothing
Set objFS = nothing




Sub InstallApp(byval cmdLine, byval appName)

	Set oShell = CreateObject("WScript.Shell")
	Set oExec = oShell.Exec(cmdLine)
	
	Do While oExec.Status = 0
		WScript.Sleep 100
	Loop
	If Err then 
		Log ("Failed to install " & appName & " :" & vbcrlf & vbCrlF & err.description)
		Err.Clear
	Else
		if bDebug then Log ("Installed " & appName)
	End If
	
	Set oExec = nothing
	Set oShell = nothing
	
end Sub

Sub Log(byval Message)

	Wscript.echo Message
	
End Sub

 

Share/Bookmark

Posted: Tuesday, November 29, 2005 11:32:06 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Technical

I have been working in Support / Technical Services for many years now and have seen my fair share of CRM / Helpdesk Applications. These vary from the big guys Seibel, Remedy, HEAT all the way to free PHP scripts with a messy web front end.

One I've seen recently is Kayako's SupportSuite. This is a web (PHP) based front end with a mySQL back end. It is incredibly feature rich, covering just about ALL of the needs of a typical ISV type company. It is certainly not one of those boxy, bordered table basic HTML front ends either, it actually looks really cool.

Some of the features I've explored so far include :-

  • Multiple SLA's depending on customer
  • Good choice of integrated login scenrios (LDAP, vBulletin and many others)
  • Intelligent email parser
  • Customizable workflow
  • Excellent customer facing front end so they can view / edit their cases
  • Good knowledgebase, with internal and external articles and an option to auto suggest relevant articles
  • Integrates with Outlook
  • RSS'able absolutely everywhere (tickets, knowledgebase, news etc) 
  • Add ons for instant desktop alerts and for live support (web IM)

The only things that I can see that lets this gem down are :-

  • A lack of decent support, so far I've had a couple of poor answers to one good one and the response times can be lengthy.
  • A lack of decent documentation, their docs are so far behind the code it's untrue - that said it is very intuitive

These guys really could clean up with this, I can see how I could have easily used this (and improved productivity) at all the companies I've worked for. It's a real shame about the support and docs, it just makes it that much harder to implement, extend and operate. Does a busy support department really have the luxury to wait a day or two for support on their issues.

Although you get 98% of the source code when you purchase (a snip at $500 USD) the 'owned' version (I guess the 2% is their licensing code), how cool would it be to take a 'Integration / Customization guide', work through it and end up with a neat product streamlined to your business processes and systems - not going to happen right now with no docs, instead you'd have to pick through the PHP code by hand

I love this application, come on guys, you've got most of the NEEDED features in there already, get the docs and support sorted out, you could clean up !!

 

Share/Bookmark

Posted: Monday, November 28, 2005 11:31:43 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Technical

The much awaited version 4.2 of Archive One Policy (from C2C Systems, my employer) is now available. You can find details here.

The aspect I'm excited about is the Integration Framework (see here for the announcement). This opens up a whole new arena for us - we can be both subservient to other systems; and take control of other systems. We're using open file formats and hooks for any of the common scripting languages.

I'm looking forward to developing a bunch of useful scriptlets to make (archiving) life easier.

 

Share/Bookmark

Posted: Tuesday, November 22, 2005 5:33:12 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Technical | Archiving

I have just changed my mobile phone to the new Samsung D600 (perviously I had always used Nokia models). The Samsung phone is pretty good, it provides me with a 2 mega pixel camera, micro SD slot (which I filled with a 512MB card, so now my phone are over 600MB of storage available), MPEG4 capability, 240 by 320 262K colour screen and Picsel Viewer software (read Word, Excel, PDF and html docs).

I like the phone, but the software is a bit clunky, sending an SMS to someone in the phonebook is a lot of steps - after composing the message I have to hit :-

  • Options
  • Send Only
  • Options
  • Phonebook
  • Then 'browse' to the contact
  • OK (to check the checkbox for the contact)
  • Select
  • Options
  • Send
This is just to long. I use txt message to send very short snippets when I don't want to disturb the receipent, having to go through this rigmarole is going to stop me using txt messaging.

Another feature I like is being able to configure the USB connection as 'Mass Storage' making the phone look like a removeable drive to my PC. However there seems to be a issue with this option in that it always reverts back to 'Modem' when I switch the phone off.

Final dissapointment is the lack of open standards / information about the thing. On the display settings I can choose what theme to apply - there is a choice of 2, imaginatively named Pattern 1 and Pattern 2 and the other setting is where I want to display the operator logo (top, bottom or off). I have to ask, 'Why is there no option to modify these or to add your own themes ?' - a little bit of thought on this side would have bumped the phone up from 'good' to 'killer' - I already have a USB connection, just publish the format / schema or whatever and let me get creative...

 

Share/Bookmark

Posted: Monday, November 21, 2005 12:00:54 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Technical

I'm a great fan of the excelllent and free RSS Poppper which aggregates all my chosen feeds into a mailbox folder in Outlook (Outlook is my main daily workspace, I do everything from there).

Yesterday, I found myself considering using Glen Scales' Public folder RSS Feed Event sink v2 to create an RSS feed from one of our company's shared Public Folders (PF) so that I could pull it directly into my mailbox via RSS Popper.

This kinda sounds a bit stupid but it gives me direct access (in a standard place) to all my chosen information - I can read the PF posts along side my other feeds.

The other option is to set my email in the Public Folder properties as a 'forward all to' in addition to having the posts delivered to the PF - either way I'm duplicating data and increasing the size of the exchange store....

Luckily I work for an email archiving company and we use our products inhouse, so I don't have to worry about exchange store size, we're also just about to release SIS (Single Instance Storage) so data will not duplicated either...

 

Share/Bookmark

Posted: Wednesday, August 03, 2005 11:36:52 AM (GMT Daylight Time, UTC+01:00)  #   Comments [0]
TAGS: Exchange | RSS | Technical

Blank entry, simply to list out the categories.

Share/Bookmark

Posted: Saturday, January 01, 2005 5:32:53 PM (GMT Standard Time, UTC+00:00)  #   Comments [0]
TAGS: Archiving | C Sharp | Code Generation | Exchange | Family | Mountaineering | PHP | RSS | Scripting | Support | Technical | .NET | Design Patterns | Hardware | Dasblog | Running | Tools | Development | Software | TaHoGen | GPS
Copyright © 2010 Ken Hughes. All rights reserved.

Creative Commons License
This work is licensed under a Creative Commons Attribution 2.0 UK: England & Wales License.