• Go see Jack Dee!

    Just got back from seeing Jack Dee at the Edinburgh Play House, it was superb, a great night out.

    I drove into Edinburgh directly from work and met up with Mandy at a Tapas restaurant that we’ve enjoyed eating at before. The meal actually wasn’t that great this time, but the company was fantastic (I have to say that, she’s my wife)! We then went for a drink in a nearby pub followed by a wander for a couple more metres down the road to the theatre for a thoroughly good laugh, Mandy was even in tears of laughter a number of times! Jack was much better than I expected, I kind of expected it to be a bit of a rip-off, barely an hour of observational humour and tired old jokes already seen on the TV. But no, it was two hours of very funny commentary on life, funny situations and the occasional groan of revulsion at something disgusting (but very funny), and lasted well over two hours (with an interval to catch your breath).

    If Jack’s coming to a venue near you, go see him, you won’t be disapointed.

  • The joy of desktop apps

    Having linked to DrunkenBlog’s interview with Brent and Sheila Simmons last night, I’ve just downloaded MarsEdit and given it a whirl. Wow, I love desktop applications, what a difference it makes to be able to post to my blog without going to my website.

    This is why I think CaseDetective for FogBugz will be useful for a number of people, desktop apps just have so much of a nicer feel to them, you can do so much more, and quicker too. For example, I’ve got spell checking as I write this, no more copying to Word (yes I use MS Word on my Mac, so what of it?) just to check my atrocious spelling.

    So, what’s CaseDetecive I hear you ask? CaseDetective for FogBugz is the application I’m working on, a desktop companion to FogBugz by Fog Creek.

    My intentions are that CaseDetecive allow me (and anyone else who may be interested) to extract data from FogBugz and generally dig a little deeper than you can with the current release (4.0). I want to be able to extract to Excel or similar apps various fields that meet various criteria (filters), and I think there are quite a few others who would like to be able to do the same too.

    I’ve got a lot of ideas for what I want CaseDetective to allow me to do beyond just extracting data, but I’ll talk about that a little further down the line. If anyone reading this is a FogBugz user, and has any ideas on what they would like to be able to do from a desktop companion app, please add a comment to this post. All suggestions are very welcome!

  • A really nice interview with Brent and Sheila Simmons

    This excellent interview on DrunkenBlog with Brent and Sheila Simmons, a.k.a Ranchero Software, the makers of NetNewsWire, MarsEdit and other great software for the Mac, is a really nice insight into the life of a successful independent software vendor.

    A definite recommended read.

  • Dangerous Terms: A User’s Guide to EULAs

    microISV.com has pointed out indirectly that Annalee Newitz has written a very interesting white paper as a “A User’s Guide to EULAs”, with Donna Wentworth commenting on some excerpts. If you have ever scanned through a End User License Agreement (who actually ever reads them properly) and just clicked “Accept” to get past that load of legalese without a second thought, you might like to reconsider this approach in the future. There’s some really scary stuff in some of the examples, in some cases you can’t even share your opinions about a product publicly once you’ve accepted the license. In the case of a Beta program you can be quite happy about this, it’s understandable that the company doesn’t want their unreleased software talked about, but this is fully released software we’re talking about.

    Number 6 on the list of nasty clauses is the ubiquitous “We are not responsible if this product messes up your computer.”, and this is basically the only clause that I’ve thought about including in my EULA. Here’s what my EULA was going to be before reading these two posts:

    Terms Of Sale And License
    *IMPORTANT* Please read the below carefully *IMPORTANT*

    IMiJ Ltd grants one person per user license purchased the use of this software on one or more personal computers.

    Every effort has been made to make this a quality and feature rich application for you to enjoy. However, you install and use this software at your own risk and indemnify IMiJ Ltd against any claims should installation or usage of this software result in loss or damage of any kind. If you do not accept the terms of this license please do not install or use this software.

    This software is covered by a 90 day no questions asked money back guarantee. If you wish to surrender your license, please contact IMiJ Ltd at customer-service@imij.co.uk with details of your order number and serial number and we will refund your money and disable the serial number as soon as possible.

    What do you think, is this a fair license? I tried to make it as simple as possible, clear and to the point, but after reading the linked articles, I might end up saying something like this:

    Terms Of Sale And License
    *IMPORTANT* Please read the below carefully *IMPORTANT*

    IMiJ Ltd grants one person per user license purchased the use of this software on one or more personal computers.

    Every effort has been made to make this a quality and feature rich application for you to enjoy, if it does something that you didn’t expect or don’t want, please don’t take me to court! Be excellent to one and other!

    This software is covered by a 90 day no questions asked money back guarantee. If you wish to surrender your license, please contact IMiJ Ltd at customer-service@imij.co.uk with details of your order number and serial number and we will refund your money and disable the serial number as soon as possible.

    What do you think, an improvement?

  • Just upgraded to WordPress 1.5

    Well, just upgraded to WordPress 1.5, and decided not carry my 1.2 “theme” across for the initial upgrade, just to make sure it went smoothly. And smotthly it went, well, that’s assuming you can see this post!

    Couldn’t have been simpler, backed up my database, loaded the backup into a spare database, and then followed the really simple instructions. Took less than ten minutes, and at least 7 of those were spent reading through the instructions and making sure I had a good backup. Dead easy.

    Now it’ll just take me a couple of weeks to decide what to do for a new theme etc. 🙂

  • I had a chat with the vendor.

    In a previous post I mentioned that I was wondering whether I should contact the vendor of the web app that I’m writing my Desktop app to work with, I was worried about whether they would like the idea or not, whether they would think I was just taking advantage of their hard work.

    Yesterday I finally plucked up the courage to send an email to the vendor. They replied within about half an hour, when I saw the reply so quick I couldn’t help thinking it might be a pretty terse response. I shouldn’t have been so worried about their reaction. Although I won’t tell you what they said as I feel that is confidential, I think I can say that they were very encouraging about the idea, and offered to help me with any problems I might have!

    I can’t tell you how much of a weight off my mind it is to know that the vendor is more than happy with me writing an app to work with theirs. I really should have known better, the guys at Fog Creek are great, always very helpful, and very pragmatic. Just what you’d expect from the company run by Joel Spolsky.

    Yes, you read it right, I’ve let slip what I’m actually doing, don’t faint! 🙂 I’ve decided that I’ve really got no reason to keep secret what I’m developing, and as my good friend Gordon pointed out in his comment to my “The Big Think – Part 3” post, I may even get some feedback from the user community. And as I’ve said before, feedback is King.

  • Went to my first EDLUG meeting.

    Went to my first Edinburgh Linux User Group meeting on Thursday night, well worth going to.

    I’ve been a bit of a lurker on the mailing list for while, and always meant to go to one of their meetings; it took a chance mail to the group from a fellow Informix user to spur me to go.

    Not much more to say really, just that it was well worth the trip over the Edinburgh on the bus to have a few pints with some fellow Linux users, a nice relaxed evening, good to put a few faces to names. I’ll be going again.

  • Lost Focus, Now Regained

    I’ve been suffering from a spell of lost focus recently, just haven’t managed to get going on developing my app, and have been having some (continuing) problems in deciding on the app’s initial feature set.

    This is probably one of the most common reasons in delaying and possibly even killing a new product, because if you don’t know what the product is trying to achieve, and for whom, you lose focus and start developing features that may be irrelevant and really have no product as you have not properly identified the market.

    With Christmas and a faulty video card on my development box introducing some time away from development for the best part of the last month, I’ve had some time to re-think my product’s focus, who I am making the product for and what features they are going to want. However, what I’ve really come to believe over this little hiatus is that I’m wasting way too much time thinking about extended features, when in reality until people start using my software and giving me feedback I don’t really know what the customer wants, I can only think I know, even if I am a customer myself. I’ve said all this before, but this time I’m being ruthless in applying these principles.

    So, I’m chucking a lot of my ideas for the future out the window, and am going to concentrate on the few features that I want now, and think others also want now (deduced from posts to forums etc). At the moment I’m the only customer I can talk to, so I’m going to satisfy my needs first, and wait for feedback before spending time on any further features.

    As part of this re-focus I’ve designed a much better user interface, having some time away from the project and in particular using a few apps that I really enjoy using has made me realise that I was going down the wrong route, I was complicating the interface when I could really do a lot better with only a handful of controls. I was going to be using tabs to separate different views of the data (remember, this is primarily a reporting/data view tool), but this was a bit clunky and meant the user would need to use at least two clicks to change their view of the data, with a lot of eye movement in hunting down items to select in a newly visible tab. There are better ways to do this, there might be a slight increase in clutter in a particular control but subtle use of colour and visual separators can help the user quickly find the area they are looking for.

    Anyway, tonight I’ll be back on the development box and ripping the app apart, I think I have a fair bit of work to do now, but less than I would have if I hadn’t re-focused my view of the apps future, I’ve got my confidence back and am seriously excited about getting down and dirty with the code again.

  • Been Doing A Bit Of Housekeeping

    How do! It’s been a couple of weeks since my last post, in that post I said I was going to take a week to re-consider my application’s internal architecture, which I did. I’m now ready to proceed with a pretty heavy clean out of the app, moving some of the code out from gui objects into some sub-classed classes that can be re-used as and when.

    Before getting stuck into my “re-design” I had a quick re-read of some of the RealBasic User Guide, which turned out to be an extremely useful thing to do. I had read a couple of posts on the NUG that discussed Interfaces that piqued my interest. Interfaces are an area of Object Orientation that had totally confused me before; I just didn’t understand what their use was. It seemed to me that they were just an inconvenience, why would you make more work for yourself by creating interface classes that didn’t actually do anything, and then have to code those interface methods in any object that “implemented” that interface? Well, it turns out that this concept of interfaces is very useful indeed (yeah, I know, why would it exist otherwise 🙂 ).

    By creating some specific interface classes, and setting some objects to implement them, you can automate a lot of the relationships between objects, because of the fabbie IsA operand (in RealBasic). For example, say you have a gui object, a button say, and when pushed you want your program to go to the database and grab the latest data, and then all the other gui objects on that window should refresh to show that latest data. In normal programming you could end up writing a lot of code in that button’s action method or some other object’s method that specifically references those ListBoxes and other gui controls that need to be refreshed. Whereas if you use the concept of interfaces you can pretty much automate this refresh without any specific references to objects, which is great when you want to change the controls on your window etc. If those ListBoxes etc were actually a sub-class of ListBox, and also “implemented” a “DataConsumer” interface for example, and that interface had a function called DataAvailable, then an object that provides the new data could loop through all objects that are of type “DataConsumer” (e.g. IsA DataConsumerInterface) and call their DataAvailable methods so that they can refresh themselves. And, because the objects that implement the DataAvailable method of the DataConsumerInterface could be of pretty much any type of object, they could have very different ways of using the available data, but your DataProvider doesn’t care, it just tells the objects to do what they like with the data. This chaining of interface methods could go quite deep, here’s a noddy little example method calling chain:

    Button.Action –> DataProviderInterface.GetData –> DatabaseInterface.GetData –> DataProviderInterface.DataAvailable –> DataConsumerInterface.DataAvailable

    There could be many of the objects at the end of a “–>”, each getting called in turn to do whatever is required purely because they are of the right type (i.e. implement a specific Interface). This means your application gets quite loosely coupled internally, objects start providing services to others in a fairly loose knit way.

    So, I’m really starting to see the benefits of Interfaces, it’s kind of a way of implementing your own Events scheme. That was week one.

    Week two, I didn’t actually get around to coding any of these changes. Because I realised I needed to pull a lot of my code out into new classes, I also thought it might be prudent to change Source Control Manager (SCM) software, as CVS just wasn’t going to cut it. Why? Because I’ll no doubt be creating a number of external objects while refactoring my code, and that may including renaming them occasionally, and CVS is rubbish at that, history isn’t going to be maintained, and I would like to keep that.

    So, I went on a World Wide Wander in a search of a better SCM than CVS. The obvious upgrade would of course be Subversion, and I looked long and hard at it, and didn’t like what I could see. It doesn’t matter what some people say, there are dependencies that I can’t deal with, and I’m just not quite comfortable with it’s maturity just yet, and I guess I don’t like the idea of using a database to store the code. I just have some funny feelings about SVN, so I’m staying clear for the moment.

    I used c2.com and Version Control System Comparison to get a head start, whittling it down to a few candidates, including (but not restricted to) GnuArch, Monotone and Perforce.

    I’ve used GnuArch before, and really liked it, but it’s a bit fiddly, and the tools are a pretty basic, I was looking for something a little more mature and with a few nice gui interfaces.

    I’ve not used Monotone, and was tempted, but I’d have to build it (I’m using Mac OS X which doesn’t have a binary available), and frankly I don’t have a lot of time to go learning what seems to me to be a fairly complex application. And again, I couldn’t see any nice gui programs for it.

    So, I’ve gone for Perforce, and so far, I’m totally over the moon with it. It was an absolute delight to set up, just dropped a couple of binaries in my path (/usr/local/bin) and started up the server with a couple of environment variables set to tell it where I wanted to store the data. And that was it really, the Command Line Interface (CLI) is a doddle, very straight forward to use, but also very powerful, and there is a pretty good gui app too. And to round it all off, it’s got one of the best web interfaces I’ve seen. I like the fact that the meta-data is kept separate from the actual source control, and I particularly like that the source is held in RCS files, makes it really simple to extract from if I should want to change SCM, I trust RCS. It may be a little out of my budget to buy (even though it is pretty cheap), but thankfully it’s free for two users, and there’s only one person in my company, so I’m covered!

    So, this week I are be mostly getting my code into shape, honest!