• entries
53
56
• views
33865

Now Showing: And now... The end is near...

*cough* *hack* *pitooie*

Yeah, so that didn't happen. Tonsilitis, and all the accompanying headaches, weaknesses, and all that other fun stuff has kept me away from the computer for some time.

Hopefully I'll be back to it after I finish the antibiotics at the weekend.

Not much of anything really

I'm afraid I don't have much to show for anything so far this week. I have been pretty bogged down in stuff that has been taking a bit of my time and concentration.

Aside from some personal stuff that I'm not going to go into here other than to describe as an utter head wreck, in the last two weeks I have also started visiting the gym. About an hour a night, three nights a week. I only met with one of the trainers tonight, who has given me some pointers on what I should be doing to get where I want to go. Thankfully, I wasn't doing too badly on my own, so I don't have to deviate too much. Unfortunatly, while my head is fairly comfortable with the idea, my body is still a little bit "WHY ARE YOU DOING THIS TO ME!?!", so its killing my energy.

Work wise, this means that I haven't a lot to show since the last entry. I'm still struggling with the 7z documentation, though I do have a little head way made. I have figured out what the structure they intended to be so obvious was (only too three days of staring and quitely uttering curses on the authors family that should see them pretty much screwed until the Sun engulfs the Earth). As such, I have the beginnings of a class to write a 7z file. By beginnings, I mean about 10-12 bytes of header information...

I'm starting to get the feeling that I am being bogged down in something that I don't need to be paying that much attention to, so while I'll keep at it, I'm going to start alloting equal tiem to other aspects of it.

BotH: I do have a lot of other installer related stuff that I want to talk about, and while a lot of it is pretty well formed in my head, I don't yet have anything to back it up with. In the next week or so I intend to do a proper write up that will hopefully fully clear up the structure of the file itself, as well as some stuff that I want to get feedback on for the native application. I'll aim to get one done this week, and maybe try to get one out on a weekly basis. Somehow, the hard part is going to be getting snappy titles for them all...

But... it all comes from the same place...

Does anyone know how a company can justify selling electronic services for largely differing prices depending on where you are buying from?

Out of interest, and a desire to play with the Vista builds, I decided to take a look into the pricing of an MSDN subscription. Me being a starving student, I figured that the Operating Systems subscription was the way to go (bearing in mind that given the nature of my current project, I was also planning on looking into buying an Apple Developer Connection Select subscription).

I live in Ireland. I would expect to have to pay in Euro, especially if I need to give my address for any physical media to be sent to.

If I was to pay using the United States dollar, I would be charged $699.00 (EUR581.15 at this moment). When I use the Microsoft converstion to change the price to Euro, I'm told that I would owe EUR748.00 ($899.85).

Must have been a pretty funky exchange rate the day these prices were set...

Its an electronic service, its not costing Microsoft any more to supply the information to me than it is to someone in Delaware. The oly thing I can think of that might be causing the price to inflate so much is the different tax charges on the supplied software, but that makes no sense, as I have only told them that I live in the Eurozone and not which country so its not likely that they are looking at the tax details of where I live. The EU may have some ideas on what we should be paying, but its hardly unified. So whats the deal, I wonder? Are they simply charging me more because they can?

Progress! Actual, tangible progress!

Well, I finally managed to get up off my arse this week and get some work done.

I have the build controller for the Images created, all I have to do now is tweak the settings and finalise some of the details. The XML dictionary gets built pretty quick (the C# XML API is a beaut), and the files are then wrapped up using the LZMA compression algorithm.

7z, please work on your documentation. As it stands, it sucks. The code is largely uncommented, with nothing of significance explained. The text files you provide give a very basic overview of the file format, but they seem to be largely reminder sheets for people already familiar with the format. Personally, I have been having difficulty with them.

Right now the default values I have running are copied and pasted out of the example code. While they are grand for running some dirty tests to ensure that the method is working, its hardly giving back optimal results. I have been searching for a decent tutorial on the ins and outs of this so that I might be able to offer the user optimization settings, or play with some on the fly settings, but alas nothing yet...

My current thoughts on copy protection, or "Damn y

I wasn't planning on writing anything for a few days yet, so I'm afraid that like my last spontaneous writing, this might not read very well...

Whenever I get thinking about copy protection, I find myself getting flustered. Its a topic that I have trouble with, one that interests me, but my problem is that I can never really settle on a hard opinion.

Lets forget for a minute everything about money, about opening peoples computers up to harm, sticking it to the man, and any other reasons. The basic idea is fundamentally very simple. We don't trust them, and they don't trust us.

And no wonder.

Round and round and round we go

Anyone can make it very easy get a copy of software out there.

This isn't like the old days where creating copies of videos required a room full of interconnected VCRs. Today, creating a copy costs nothing. Putting that copy out on mass distribution costs nothing. Anything that benefits the person putting anything out there is an absolute profit, be it a monetary reward or simply other content.

And what do we do in response? We squander millions of dollars a year trying to figure out new ways to keep them from doing what they do. And they have them broken in a pittance of a fraction of the time it took to develop it.

Now, we also have legitimate customers. Many companies seem to have forgotten them, in a bid to get everyone else to actually be one, and pretty much all we do is hurt them. They wind up the victims of our war of wits with the pirate. Sometimes, depending on the implementation, they can cope with it better than others, but nobody needs to return to the days of copies of Colin McRae rally being returned to stores because the copy protection method meant the CD-ROM drive didn't work.

So what can we do?

No hard plan, I'm afraid, but there are a few ideas. We could try treating the customer like a customer, for example, rather than a criminal. Would you do business with a shop if they looked at you with contempt when you walked in the door?

How about we start to distribute the way they want us to? Get it cheaper, get what you want, get it now. Apple recently celebrated their one billionth sale on iTunes, and I have to wonder what kind of sales Direct2Drive get.

How about we start to sell to the user rather than to the device? How do we do this? Who knows. I don't. But at least we can relax in the theory that it can be used with downloaded sales to allow the user to port their purchases where they like, and if not make it difficult to share them, how about making it undesirable? If we have to lock people in, why not do it with information that they have to give to make the purchase, which they wouldn't want to make public. Base the encryption key off their credit card number, for instance. This can be stored on both client and server (or sent from the client to the server via an SSL connection during purchase). Have the user register this number on each device that they want to play the files on, and decryption works from there.

Of course, all these are algorithmic methods that could be very easily broken in one way or another, and they certainly don't suit the wide variety of media types that people want to be able to use.

Who knows.

I haven't said anything here that people don't already know. All I'm really doing is trying to articulate how I feel about the situation at the moment. Flustered and frustrated seem to about cover it.

I'm pretty sure I should probably stop reading ApochPiQ's journal until he sends me a PM promising he won't be upsetting me any more [grin]

"If you're Irish, come into the parlour..."

March 17th.

The day we celebrate the man came to Ireland, dressed in lots of green, converted the country to a new religion, caused mass confusion for generations by having his name given to every second Irish boy (with varients for every second Irish girl), and presumably drank himself under the table.

The only day where it isn't frowned upon to make children dress in uncomfortable outfits, and send them out into the streets in the cold and rain to walk for an hour down the middle of the main road behind a 30 year old tractor that pumps about 6 pounds of smoke into their faces while everyone else in the town just watches. And if we can't find enough of our own - which we never can, we'll recall our people from every small town and city in the US and Australia and get them to line up behind the children.

The best day of the year to make money out of American tourists. Young boys go out into the fields and woods, leading old Texans on leprechaun hunts. Sales of green cloth and bin liners are usually pretty good after the second week in February. They get their revenge though, as bog loads of harvested peat have been known to go missing after an American tour bus passes.

The only day where you can take the day off, go to the pub at 12pm, leave at 2.30am, and probably meet the boss there. But its ok, he'll be bladdered too.

The first mass pub congestion since Christmas. Packed like sardines in a tin, 3 hour queues to the bar, and the joys of trying to navigate back to the table with 3 pints in hand while everyone around you is dancing a jig to the diddly-ay-ay being played by three bearded fellas in the corner armed only with a guitar and a Wolfe Tones song book. Songs such as "The Fields of Athenry", "Danny Boy", and "The Langer" are sung through out the day.

The day our politicians prove how Irish they are in the best way they can. They feck off to every other country. We are the only country in the world with a standing, annual date with the President of the United States, irrespective of who he may be. And in all the time we have had this pleasure, not once have we diversified our gift. Oh no. Every year, we give the leader of the free world a Waterford Crystal bowl. Full of grass. In fairness, its usually a nice bowl.

The one day of the year sales figures for everything Irish hit the ioniosphere. Guinness, irish whiskey, Waterford Crystal, U2 and Corrs cds, Chinese built clay "Irish cottage" models, copies of The Crying Game, "Kiss This, I'm Irish" underware, etc. The only non-Irish product to take a boost as a direct consequence is Disprin.

The one day of the year that we have managed to make into a five day festival in Dublin. Nobody really knows which end of it the 17th marks, and it has occured that we have had the five day fesitval spread out over ten days. But thats ok, because nobody really pays any attention to the other four/nine anyway.

Happy St. Patrick's Day everybody. Make mine a lager.

Masochists United

Take two laptops, one spanky new, one a Win 95 relic. Add the fact that there are absolutely NO two common points of access. Be told that there are important files on the dinosaur that need to be transferred to the "I, Robot" wannabe.

Decide that the best bet is to connect to an intermediate machine. Only serial connection options available. Scour the building for a suitable cable. Find crappy and crappier guides on DCC. Finally get something resembling a connection to have Windows 95 bomb out demanding a password, in spite of the fact that I have explicitly stated no password connection 5 times now.

End result? A week long headache and a dentist looking at the powered residue in my mouth wondering how in hell that happened...

EDIT: Just after I posted this, I hit one checkbox on the Windows 2000 PC, "Enable modem speaker". It connected straight afterwards.

*cries*

Quick update

Mostly I am still sucking at getting work done (and still annoyed at myself for it), though I do have basic versions of much of the UI screens put together at this stage, there being 6 in all I have 5 done. Just to get some functional code behind it to map the UI to the data structures. You know, that little technicality...

I have also started skecthing some ideas for the actual installer UI itself, though work on that is some way off. Once I get some stuff out there, maybe I'll bang something together in C# to show you what I'm thinking.

I have also managed to get around to adding "The Mythical Man Month" to my reading pile, and may just bump it to the top.

Installer - #7 Anatomy of a Modern Bundler

(Cookie to anyone who gets the reference)

Right, as promised last night, here is an overview of the design of the installer project in general.

As I said way back(!) in January, the stated goal of this project is to offer a software delivery method that is as independant of the platform it is installing the software to as possible. Hopefully, I have designed a model that does not only that, but can also prove to be extensible, customisable and usable in more ways than the traditional "download and double-click" method.

The Architecture

One of the decisions I made early on at the start of this project (or rather, this incarnation of it) is that in order to be a truely platform independant distribution method, I would need to avoid as much platform specific information as possible in the file the user interacts with. The key as I saw it would be to take a largely meta-data approach, and let this be interpreted in a platform dependant manner using a native application type.

In this way, we save the overhead and stew of adding bootstraps for each platform in the file. Of course, there is the initial overhead cost of distributing the runtime to each platform

So like the RPM, YUM, DEB and MSI formats, the installation file is not in itself an executable file (well, MSI kinda is - AFAIK it contains a bootstrap that checks to see if the Windows Installer service is installed, and can optionally contain the runtime in case it isn't, but now I am getting beyond the point), but instead assume the role of a data file.

The Installer File

The Image

In the process of creating an installer, the developer will create at least two different files. The first is the file that contains all the information about the program - the metadata, the binaries, the settings and the dependency information.

It consists of a compressed archive, with a heading XML sheet (encoded as UTF-8) that acts as the information base for the image.

Files can be grouped into components of an application, for example the application data, the help files, example files, etc, and each of these can have a default weight that will determine whether they will be installed by default. All Images will have at least one component, that being the application data. This component is unique in that it will have a reserved name (all other components can be named as you wish), and it will be assaigned the weight of the primary component. Unless already installed (as in the case of a Repair), the user will not be presented with an option not to install it.

Image files have the file extension ".image".

The Install File

The second file is the installer file itself. Like the image file, it is an archive file with a UTF-8 XML header sheet. Images are assaigned weights to determine their importance to the installation in question.

All installers will contain at least one image, that being the store of information about your product. This is assaigned the weight of being the primary image. There is only one such image, and the installer file is named for it. Like the primary component in the Image, the user will not be presented with an option to not install the primary image, unless it has already been installed.

Install files have the file extension ".setup".

If you want to use a programming analogy, you can think of image files as being classes, and installer files as a namespace.

Q: Why the seperation?

There are a couple of benefits of seperating images from the actual installer profile.

* It makes it easier to incorporate third party dependencies in your application. Suppose you have written a package that requires the GTK+ Toolkit for Windows to be installed. By having the image seperate, you can easily incorporate different packages in your application without a need for a working knowledge of how they should be installed. It also has the effect of making it easy to share frameworks and other dependency methods that install themselves properly on the target system.

* Helps make the installation seamless. All images that have been selected to be installed are queued one after the other, so when one image has been recreated on the client machine, the next one will begin processing immediatly, all within the same viewport. Contrast this with current graphical installers, where running a second installation invariably means opening a new set of windows that clutter the users workspace.

* Reduces overall overhead. Queued images that run inside the same process reduce overhead incurred by other graphical packages that start a new process for each package to be installed.

* From a developmental point of view, it abstracts the distinction between a network installation and a local one. The same image can be used in either instance, all that changes is the address type used. The installer will be able to take the appropriate action when it comes to process the images.

The End

So, what does everyone make of it? I know is a bit of a departure from most current installation models, but I don't think it does anything that puts anyone too far out of their way. In fact, I hope that it will help to make distributing software over a number of platforms (or even just the one) easier for both the developer and the end user.

Installer - #6 "Gimme a G" redux

Well, tonight I decided that come hell or high water, I was going to get some work done. I reckon I'll just have to keep pushing myself that little bit more that I have until now for at least a few hours in the evening to get that bit more out of the way. As well as this, I'm going to do this entry tonight, and tomorrow I'll be talking about the structure of the installer. As always I'm open to any and all feedback ;)

Right, last time I talked about my ideas for a GUI ("Gimme a G"), I have to admit that my train of thought was somewhat all over the place. The main issue, as you can see from the image, is that I was stuck somewhere between trying to deliver an IDE like environment, combined with a wizard. All I can say now is that thats the last time I'm buying that brand of coffee...

So I sat down this evening and decided that for this version, I am going to stick to a wizard. This has had the effect of the application being tentativey named "setupWizard". A couple of scribbled diagrams later and I put down a first version of it in C#.

Thats the first page that you will be greeted with when you open the application. I'll explain the difference between an Image and an Installer tomorrow, so don't worry about that too much. Also, I know there is an awful lot of that one image about, but I got a little lazy ;) I will have to get someone to put together an icon set I think, I have a friend who might be able to find me the time to throw some test art together until I decide if I'm going to commission a professional set.

Help me, Derrick Evans!

I'm sure everyone has felt it sometimes. I know I have seen threads about it in the Lounge. I figured I would put this here so that it wouldn't clog there up with another one.

I'm really enthused by my current project. I have no shortage of big ideas, and very often a guideline of how that would work just rolls out in front of me. Pages of notes on ideas and their implementation, point and counterpoint reside on my disk. But when it comes to it, I am currently having a lot of difficulty actually getting code written. I have a bit done, but right now it seems that if I sit down in front of a computer I am quite content to just listen to music, or surf.

Take last night as an example. I sat down at the computer at 9, fired up my Linux box for SVN, loaded up VC# 2005 EE, opened the Textpad workspace with my notes. I decided at this point to check up on my emails, read my comics, catch the latest on GDNet and a few other sites, etc for a short while before getting to work. Before I knew it, it was 10.30. At this point I closed Firefox and browsed through my notes, decided on some jobs to get done. I think I must have decided on about 5 jobs to start, and in the end I only got one done. All that entailed was refactoring some code to a new class.

Its gotten to the point where it has really started to bother me how little I am getting done on it.

Its not like I am doing nothing at all. I work 9-5.30 Monday to Friday (though the commute makes the hours more like 8-6.30). Barring a few issues, its a job I enjoy - a good place with good people.

It also leaves me with lots of waiting time (in fact, I'm writing the first draft of this while waiting for Windows Update to patch up a fresh XPSP2 installation), which if I have no important tasks to look at, I tend to use to clarify my notes and perhaps do a little research on techniques, skim over these articles and bookmark them for at home. Of course, these might not be looked at again for days.

It doesn't help that for the last week or so my head has been stuffy, think I'm coming down with a headcold.

Perhaps I'm just being lazy, perhaps I'm just tired, but I would love to be able to overcome this lack of motivation and get some work done. I know many of you also work long hours, and work on personal projects at night. So I wonder, what do you do to overcome feeling like this?

Brainfart of the Hour: Music currently keeping me from productivity includes:
"The HitchHikers Guide to the Galaxy" - Joby Talbot
"Somewhere over the Rainbow/What a Wonderful World" - Israel "IZ" Kamakawiwo`ole
"Take on Me" - a-ha
"Little by Little" - Harvey Danger
"I'm with Stupid" - Aimee Mann

Installer - #5 The File Dictionary

Since its been a while since I did a proper blog on the installer, I thought I might get some feedback on the direction being taken with one of the data structures in particular - the File Dictionary.

This is the simpliest form a dictionary can take. This contains all wrapper information needed, as well as an entry for a single file in the project.

Step by step, this is what the above means:
* The files element declares the start of the dictionary. It contains two attributes, compressionmethod and hashalgorithm, both which contain a declared name indicating the algorithms used for the respective titular jobs.
* The basedirectory element defines the root directory that the files enclosed in it will be contained in. All path names listed in the inidividual file elements are relative to this path. In the example above, a program variable representing the user defined location that we are going to install to is used. Other base directory tags can be created to install files to other locations on the system, such as Windows\System32.
* The component tag (originally was going to be held back from the first version, but what the heck) groups files by their job in the application. In the example shown, the files are listed as "Program Files", or the files that make up the application being installed.
* The file tag represents a single file in the project.
* The platform tag holds platform specific information for an individual OS. The id attribute allows the installer to determine what OS the information relates to, and is either a named value listed higher in the XML sheet as being a compatible OS, or, as in the case above, the "all" value, which states that the file is the same in all installations. The length attribute tells us the length of the uncompressed file in bytes, and the hashcode attribute gives us a signature hash to compare the uncompressed file against to ensure that it has been recreated correctly.
* The shortcut tag is an optional tag used when you want to create a shortcut to a file. The args attribute specifies any arguments that might be passed to the file - usually only used with executable files. The locations attribute contains one or more high level descriptions of where to create the shortcut, seperated by a comma ( , ) character. This is probably the highest level information shown yet, and the interpretation of which is mainly dependant on the installer run time used. For example, in Windows the location "menu" will create the shortcut in "Start/Programs/$PROGNAME$ - $PROGNAME$ being a specified name for the application.

So what are you thinking right now? Is there anything that you can see that needs improving, or anything that you think is missing that will be needed?

Something and nothing

Just a little check in.

Owing to terrible levels of sleep the last few nights, I haven't a lot of work done on the installer - not code-wise anyway. Actually, its not fair to say that its just becuase I'm tired, it also has a little to do with Stargate SG-1 Season 7, and Battlestar Galactica miniseries and Season 1 having come through the letter box yesterday morning [wink]

However, I have taken the time to clean up some of my data structure for the installer itself. The section of the document that acted as the file dictionary was a mess from the first draft. I spent a bit of time yesterday going through it, deciding what needed to be kept and what could be cut out, and basically sreamlining the entire thing. I'm happy with the results. Not only is it much easier to read and understand the specifics of each file, but I have also managed to clean up the layout of extra file tasks like shortcut creation, and file type association.

On top of this, I decided to enclose the file tag inside another tag, basedirectory. This will allow files to be placed outside the installation base directory.

Now just to do some similar work with the setting tags, and I can show you what the first spec of the XML Installer file will look like.

I have also been doing a little work by way of an example to my post Coding Common Decency (a post that, on reflection, I wish I had given one or two more drafts to). Nothing that has hit the compiler yet, so they could be buggy to hell, but I have cobbled together some base classes in Java and C# to illustrate just how easy and simple an oversight it is.

Networkable.cs
namespace Application
{
abstract public class Networkable
{
NetworkPermissionListener listener;

/*
* Checks if a user has set this feature to always be allowed, otherwise prompts the user for permission
*/
public Networkable
{
if(HasPermission())
Activate();
else
{
listener = new NetworkPermissionListener(this);
Prompt();
}
}

/*
* Check the programs configuration to see if this option has been enabled.
* If not, prompt the user to decide whether to allow the class to connect
*/
abstract public bool HasPermission();

/*
* Activates the Networkable feature. This is used to generate the UI (if any), and create the actual network connectivity.
*/
abstract void Activate();

/*
* Prompts the user to decide whether or not they want to allow the feature to connect to the network.
*/
abstract void Prompt();

/*
* Notifies the registered NetworkablePermissionListener that the user has granted permission. This method should
* only be called from prompt when the user has agreed to allow the feature to connect to the network.
*/
private void NotifyNetworkPermissionListener()
{
listener.GrantedPermission();
}
}

public class NetworkablePermissionListener()
{
private Networkable n;

public NetworkablePermissionListener(Networkable nable)
{
n = nable;
}

public void GrantedPermission()
{
n.activate();
}
}
}

Networkable.java
package net.aidanwalsh.application;

abstract class Networkable
{
private NetworkablePermissionListener listener;

/*
* Checks if a user has set this feature to always be allowed, otherwise prompts the user for permission
*/
public Networkable()
{
if(hasPermission())
activate();
else
{
prompt();

listener = new NetworkablePermissionListener(){
public void grantedPermission(Networkable n)
{
n.activate();
}
};
}

}

/*
* Check the programs configuration to see if this option has been enabled.
* If not, prompt the user to decide whether to allow the class to connect
*/
abstract boolean hasPermission();

/*
* Activates the Networkable feature. This is used to generate the UI (if any), and create the actual network connectivity.
*/
abstract void activate();

/*
* Prompts the user to decide whether or not they want to allow the feature to connect to the network.
*/
abstract void prompt();

/*
* Notifies the registered NetworkablePermissionListener that the user has granted permission. This method should
* only be called from prompt when the user has agreed to allow the feature to connect to the network.
*/
private void notifyNetworkablePermissionListener()
{
listener.grantedPermission(this);
}
}

NetworkablePermissionListener.java
package com.walsh.Application;

public interface NetworkablePermissionListener()
{
public void grantedPermission(Networkable n);
}

Brainfart of the Hour: So France says that sharing of copyrighted material over P2P is legal, eh? The lines between "private copying" and "mass distribution" have never been so blurred. Fair use is one thing, but IMO that does not and should not extend to making it available for public consumption. Perhaps thats an oversimplistic view, however.

Why I Hate Frameworks...

Humour Portal Linkay. Even if you're not a Java programmer, this is worth a look.

In order to maintain a high quality of service...

This weekend I have mostly been setting up my testing environments. As I have noted before, I was fortunate enough to grab a cheap copy of Windows 2000 on Ebay. I also have a copy of Server 2003 that I got through the MSDN AA, and spent the weekend setting them up on a 45 day trial of Virtual PC 2004. Just waiting on a copy of ME in the post (the sacrifices made to ensure quality [grin]).

Boy, does this software rock. 2000 runs without a flaw, though 2003 does suffer the odd hiccup (my hardware is kinda modest these days). Setting up a new OS is as simple as though it were running on hardware. The only issue I have with it is that it doesn't seem to read past the first session on a burned DVD. Hopefully this has been sorted out by the service pack released for it, or at least in the next version.

I'll be playing with this for the duration of the demo, and am seriously thinking about picking up a copy. I'll also be running all builds through these, and having a couple of systems that I can abuse without fear of any serious failure is going to be a great boon for testing.

Unfortunatly this does mean that I didn't get the unit testing that I had hoped to done, thats scheduled for tomorrow night.

Coding common decency

Few people like to think that anyone else is looking over their shoulder, watching what they're doing. This goes especially so when it comes to computers and networks, when it is often far less obvious that it might be happening. Unfortunatly, there are so many ways that this can occur - from tracking cookies, badware snoops and all manner of other means, its no wonder that users are becoming increasingly paranoid about who can see them.

Whats not helping is the fact that many developers, companies and products don't yet recognise a users right to keep information about them to themselves. The recent uproar about the iTunes ministore, where iTunes sent temporary data about the users purchased songs in order to be able to recommend other tracks, albums and artists, showcases the point perfectly. Aside from a UID that identified the request, no data that could track the user was sent. No data was recorded by Apple. The problem was, Apple didn't tell the user in an obvious manner that the information was being sent.

Under pressure from the public outcry, Apple released an updated version of iTunes with the feature off by default. Now when you go to switch it on, iTunes will explain to you what it does, and why.

Its not enough to state in the license that the program can collect information, since the majority of users don't look at the license agreement. Aside from this, license agreements tend to be worded in a very broad manner, allowing the developer to do pretty much as they wish - their defense being "you agreed to it".

It should never be the responsibility of a third party application (such as a software firewall) to inform you of an applications intent to connect to another machine. This is a poor design, and leaves users who may not have such software installed on their machines in the dark about what your application is actually doing. As well as that, if your application depends on network connectivity - like iTunes - then its impossible for the average user to properly make up their own minds, since they can't tell that additional data about them is being sent.

The application needs to inform the user itself.

Any features for any applications that collect information about the user should make this point clear. The user should have the option to turn off these features, both from the menu and either on the first execution of the application, or the first use of the feature. The application should make perfectly clear what information is collected, and whether the information is kept in record. This gives the user the best chance to make a full, informed decision.

If the application does not require a record of the information to be collected, the information should be erased as soon as the transaction is complete.

On top of this, applications what you would not expect to open a network connection should ask the user before it tries to connect.

Imagine my surprise when I started to install Ubisoft's "King Kong" demo, to see my firewall telling me that the installer wanted to dial home. I could see no reason for this immediately, so I denied it. The installer refused to continue unless I let it connect to Ubisoft's server. It was never explained to me why this was needed, and I am still in the dark about it today.

Application user interface guidelines are changing. No longer are people restricted to a set of common gray controls, users are tolerant of even radical departures from the norm as long as its easy for them to figure out how to do what they want. There is a lot of work going into making language easier for the common user to understand. The whole process us becoming friendlier to look at, but not really any more so to play with.

I wonder will the day ever come that UI and/or UE guidelines contain common decency, like asking before doing something unexpected, or explaining if, when and what needs to be sent off your computer?

This is one aspect that I will be taking particular care to look at in my own applications, and I would urge all developers to do the same. Perhaps we can start a trend, or at least an expectation...

Installer - #4 Gimme a "G"

Apart from a couple of hour long IM meeting this afternoon, work was pretty quiet. As a result my mind got to wandering to my home projects, and as soon as I got it off data structures (since these are all I have been coding these last few nights), it started wandering towards things GUI. After some thought and firing up MS Paint, this is the current plan.

fear the programmer art

It'll most likely change between this and any kind of release, but this is what I have in mind at the moment for testing purposes. Just have to see if it feels right when it comes down to it.

Not gone away, you know...

Sorry I haven't been updating much lately, but to be honest I haven't made much progress on anything.

The most of my time these last few weeks were spent preparing for my college final exam. I also had a project due up the same day (last Friday). The exam should hopefully be ok (aside from graphical theory boring me numb for much of the week) and while OpenGL and I have something of a mutual dislike, I have the basics of what was required for my project done.

Craptacular, eh? The specifics of the project was to model a basic "robot" character, give him independently moveable parts, create a few of them and pose them in a scene. What I got was one character with severe skeletal problems in a skybox. Which is close enough...

Although, while I didn't get to understand OGL as much as I might have liked, I did manage to take the chance to play with some of the features of C++. All of the individual parts are structs, nd I even tried to play with pointers, and failed miserably when it came to pointer operations. Oh well, just more reading to do...

So thats college out of the way until September (hopefully), whats the plan now?

I'm still working full time, and have just registered myself some webspace so I'll be getting to work on getting that up and running. The installer of course is still underway, as are my somewhat neglected forays into XUL. But I'm still working away, so hopefully I'll have more for you soon.

Ooh, what chance...

Warning: This entry contains no technical content, and a tale of minor accomplishment blind, stupid luck.

So I just sat down to get some work done, and decided to check in on my comics, etc before starting.

Heading over to My Ebay to see how some bids are going, I find that I have been outbid on a copy of Windows 2000 I was grabbing for testing purposes, and I had 2 minutes to put in another bid. Afetr being outbid by a measly GBP1, I raise the stakes by the same and grab the prize.

Oh, happy day...

Brainfart of the Hour: One thing I need to see if I can get is some kind of a web based to-do list application. I keep trying to make a list of things that I decide through out the day that I need to do, and end up forgetting to check ny "idea.txt" file. Outlook is out of the question as that would require getting VPN access for home, and thats just too much red tape.

Installer - #3 The Roadmap 0.1d

As it stands, this is the roadmap for the initial version, 0.1d:

Initial GUI interfaces for the Installation Builder.
Initial CLI interfaces for the Installation Application.
Initial file formats for Image and Installer
Image definition
Compression\Decompression using LZMA, Bzip.
Installer writing
Installation modes
- Full: Application is written entirely to disk
- Uninstallation: Application is removed entirely from disk
- Rollback: An interupted installation can re rolled back, restoring the system as it was prior to the attempted installation.

As coding progress goes, I don't have a lot done (I have finals coming up at the end of the month, as well as a project that has to be handed in. I have been writing these entries as a welcome distraction). I have some basic version of some classes prepared, but until I decide that enough tweaking has been done on the specifics I can't do an awful lot more except play with what I do have, and get some basic testing done. Hopefully I will be able to make a much better run at it through February.

Installer - #2 The Structure

The task of installing an application is broken into three different parts:

-The Installation Builder
-The Installation Application
-The Installation File

The Installation Builder
The Installation Builder application is the tool used by the author of an installation package to build the Installation for deployment. Using this tool, the user can choose the platforms they wish to target, build the dictionary of files for each platform, create the initial settings (if they so choose - some programmers seem to prefer to allow the application itself to create the initial settings on first execution).

This application is currently being written in Java.

The Installation Application
The Installation Application is program the end user will have to install on their computer in order to run the installation files. While the general base for each platform will be the same, different platforms will require forks on certain aspects of the application due to different architecture.

This application is responsible for translating the data sent in the installation file into a working application on the end users computer. This includes decompressing the file data, writing the setting values to the system, registering the application with the system. It also creates the interface that the user uses to install the application, if applicable (silent installations use default data and do not prompt the user at all).

These applications will be written in C++, and will be offered with the Installation Builder application to developers.

The Installation File
The format of the Installation File borrows heavily in someways from the Linux RPM and DEB formats, although there are some key differences.

The Installation File is broken into two seperate components:
-The Installer
-The Image

The Image file is the file that contains all the data regarding the application. The Installer file is a wrapper that sits around the Image file. There may be multiple Image files in an Installer file, allowing developers to bundle additional applications that the core, installed application may be dependant on. All Installers will contain at least one Image.

The reasoning for seperating Image and Installer, is that having a standalone Image format allows for the simple packaging and deployment of third party components within the same installation process, saving on the overhead of having to start a secondary process to install required dependencies, or optional secondary applications.

Both Installer and Image files are simply archive files in the 7z format. The default compression method used to compact the data inside the files the LZMA algorithm, though another supported method may be chosen if preferred.

The dictionaries for both file types are in XML format, and hold all the information relating to the product, files, platform specific options, custom settings, contact details, etc.

The Installer File Structure
At the root of the archive is the dictionary.xml file.
Inside in the archive is a single folder called "images". Inside here the Image file(s) are kept.

The Image File Structure
Identical to the Installer File, at the root of the archive is the dictionary.xml file.
Inside the archive is a single folder called "files". In here is where the compressed files belonging to the application are kept.

As I still have some things I want to sort out about the XML file structure (mainly on the Installer side at the minute), I'm not going to go into too much detail about that yet. I can, however, show you a peek at an example Image dictionary I have been messing about with. Its not complete yet, and it will change, but here is the current version anyway. I know its still a little [sic] messy, especially in the file entry.

"1.0" ?>
"0.1d" xmlns="http://www.uberfantasticosupersiterahr.com/projects/installer/0.1d">
"" version="" uuid="">
Aidan Walsh
test@aidanwalsh.net

"" />
"" />
"" />
"" />
"" />

"Test resource" version="x.y" />

"Windows">

"" location="" value="" />

"compressionMethodname" hashalgorithm="algorithmName">
"" location="" length="" hashcode="" uuid="">
"windows" />
"linux" />
"this">

"windows">

"" hive="" key="" valuename="" value="" delete="" />

Installer - #1 The Idea

I think it might be time to start getting some feedback on what I have in mind for my first major project, the Cross Platform Installer.

Some examples of such applications already exist in the form of Java JAR files with the application, as well as the installer runtime, bundled inside. This was the same route I took when I was developing the project in college, but quickly discovered that that was a somewhat less that efficient was of handling it.

The first time I wrote this document was over 2 years ago, and as time has gone on and the idea matured, surprisingly little has changed in it. All that has been edited are some implementation ideas, which have been kept back for another entry.

Much (to all) of what is here is already available in existing solutions, and I realise that other packages offer more. The overall difference is that it is designed to work not only on a single operating system, but on many.

I hope that at least some of you might take the time to comment on the ideas here, and perhaps offer additions or suggestions to the list.

The Cross Platform Installer

The Problem
The problem of modern cross-platform software installations affects both software developers and end-users of that software alike.
The impact of which is users of multi-format software are forced to download/purchase multiple copies of software installation files, each one designed for a different root system type (e.g. Windows, Linux, MacOS). Developers are forced to distribute multiple copies of files, versions of which for less popular formats can often be less than intuitive,

The Solution
A successful solution would utilize the ease of a Windows software installation and deliver a single, identical package capable of mimicking this standard across a variety of platforms, easing the installation process and, ultimately, benefiting the end-user. The developer would have a tool that would be capable of creating a single customizable package that could install their software on this variety of platforms, allowing them to apply specific instruction sets to the installation depending on the platform in question.

Feature List
-Familiar, intuitive interface Both the Install Creator and the Installer should have an intuitive, powerful interface. In particular, both should be built upon existing practises of desktop environments, allowing for a degree of familiarity to be apparent from the first use of the application.

-Powerful Command Line Interface The installer should also be able to cater for people who do not use a graphical environment. In this case, a set of equivalent CLI commands should be in place to allow for a similar installation experience. The CLI should follow accepted conventions for command line installations.

-Single file deployment All files regarding the installation are compacted into a single, self-extracting file. This method cuts on the overall size of the installer. Except the case of Network Stub Installation.

-Network Stub Installation Create small, easily downloaded packages that connect to a central resource holding the necessary files, and download and install via the network. Also allows repair functions to be carried out using the most up-to-date versions of files.

-Platform independence Multi-format installers will be capable of installing applications regardless of the platform, maintaining the same overall layout and ease of use.

-Platform biasing The developer is capable of creating an installation routine that will only run on a specified platform (e.g. either Windows or Linux, but not both.). This allows the developer to use the same tool for platform specific installations as platform independent installations.

-System configuration The installer should be capable of making changes or adding entries to system files necessary for the use of the application. These include Windows registry settings and changes to root system files.

-Permissions options Installations can be set to be blocked unless the current user has administration (Windows) or root (Linux) access on the machine.

-Full installation logging An option will exist for an installation to create a text document outlining all changes made to the users system.

-Installation Repair Allow an installation file to analyse individual files and values, and repair any files that do not match those in the installation file. This would allow for easy recovery in the event of installation corruption.

-Automatic uninstaller Separate application created by the installation process capable of rolling back all changes and removing all files created by the system.

Brainfart of the Hour: I wonder why all installers have traditionally been offered in wizard format, even when all you will be offered to change is the path of the installation? Only in corporate/enterprise deployment models is this pattern broken.

God Rest Ye Merry GameDev Men (and women)

WARNING: The following post contains poor humour, Christmas plans, and a ripped off idea. May also contain traces of nut.

Ah Christmas.

That magical time of year when our lady Martha Stewart came down from on high (or rose up from below, depending on which version of the story you believe) and showed Jesus how much better his coffee can be with a hint of cinnamon and walnut, and taught the 3 wise men the art of decorating the perfect tree. It was the start of an entire religion...

Well, its Christmas week and here I am sitting in work migrating anti-virus clients to a new server (checking them twice before I cross them off my list). Compared to others I've seen, my desk decorations are a bit sparse (a single light, and thats there all year round anyway). But I'm off for a week come 4 o'clock Friday, and I have been trying to get in the mood by helping myself to the tins of Christmas chocolates, and homemade (Subway bought) cookies. Its all failing miserably. Fairytale of New York has since been joined by Il Divo's wonderful version of "O Holy Night", though.

I have been working away on my projects, and not making as much progress as I would like.

I promise to have a bit about the general structure of the installer, and perhaps the installation builder, at the start of the New Year. As it stands, I have a pretty good idea of what I want to do with the first three builds, so its really just a case of getting down to it. With a week ff over Christmas, I hope to be able to make a bit of a dent in at least the first version of the builder, if not the installer itself. Hopefully I'll be ready to give you a peek at the experimental version of the file format, open for critisism and ridicule suggestion. So far I have a pretty good idea of what I want to do with the layout, but I will need an idea of whether I am going the right way or not. Thats where you guys will come in.

I am also still going with the Firefox extensions, but am finding Gecko just a little more confusing that I had expected to. There are so many ways of doing everything (or so it looks), and its hard to descern whether or not I am on the right path all the time. I spent a week trying to figure one problem out, only to find I had been barking up the wrong tree all the time. Ah well, comes with the job I suppose.

So, others seem to have been posting what they're up to for Christmas, so I might as well join in.

I'll be staying home. Thats it so far. I have a couple of books that I would like to get through, as well as the usual playing with all my new toys, whatever they may be. And of course some college coursework to get done, and project work. If I can, I may see if I can find some time off to celebrate my 22nd birthday on Wednesday [wink] You have to love how relaxing Christmas is. With a bit of luck, I might also get to visit some friends who live out of town, but since I have only a week off before I have to go back to work, I might not be able to get the chance.

Anyhow, I hope everyone has a happy, healthy, fun filled Christmas (yes liberal America, I've been saying the "C-word") and that you all get what you want. Unless I make a short post between this and then (I don't intend to), I'll see you all again in 2006.

Merry Christmas Everyone, and a Happy New Year!

Brainfart of the Hour: What is BotH? Its a little ripoff of the After Blog Mint, created by Rory Blyth. Basically, its a dumping ground for ideas or thoughts that have crossed my mind of late that I haven't had the chance to expand on yet. They may or may not be developed into full journal posts, and may or may not be technical in nature. We'll see how it goes for a bit...

"Human sacrifice, dogs and cats living together -

As seen in the last part of this little series, I have decided to take a peek at Firefox XUL programing, and was having a little fun with getting to grips with the Venkman debugger. I had just gotten to know the layout, so now it was time to get into the flesh of it.

Getting Venkman to peek at Extension scripts
So, now I had a fair idea of how I have to go about getting things done, it wass time to get at it. Browse down through the loaded scripts and, oh... No sign of the extension's script.

Right, up to File, Open Web Location, chrome://foo/bar.js, set the breakpoint I want to look at, and off we go. Except we don't. Hmm, why did you skip the breakpoint, Venkman?

What I found interesting (read disappointing) was the seeming inability Venkman has of being able to determine that a script that has been added as part of an extension, as opposed one which is a part of the program. The only way it seems to be able to tell that a script is not intrinsically part of the browser is if its embedded or linked to in the webpage we are looking at. Perhaps this is down to the fact that Gecko considers all extension scripts to be merges with its own code.

So it transpires that opening the script on its own was unnecessary, but in order to be able to see my extension scripts I had to enable Venkman to see the browser files (Debug, unchecking Exclude Browser Files), and then I would have to sit through any errors that may have been thrown by the application, regardsless of whether they are related or not. This is somewhat unusual, especially in the context of any other development envoirnment I have come across. But still, perhaps this is a limitation of the technology that I have to live with for the time being, until some clever chap changes Venkman to pick out extension code and show it in its own context.

Getting Venkman to play fair
As unusual as it was to have my development envoirnment debugging itself, it was also a pain in the arse. It got to the point that even trying to pause the flow resulted in Venkman debugging itself, trying to step me through the code of pausing the flow. Telling the debugger to ignore that script did nothing, as it prefered to ignore me. Each and everytime I hit the Pause button, button.xml wanted attention. And when I hit continue, that would look for attention too... Grr...

Still, it wasn't a fatal problem. I was still able to set break points and continue along. I noticed that contrary to what I understood from Svend Tofte's tutorial, I didn't in fact need to keep hitting the Pause button to debug, and break points would halt automatically as I would expect them to.

Well, I admit it wasn't the Twelve Trials of Hercules...
So there it is. One man's struggle to get to grips with the idiosyncrasies of a somewhat underdeveloped development envoirnment. All in all, Firefox doesn't really prove itself the best platform for development of itself, though it can be tailored and tweaked to be better.

I find it a little unfortunate that it was so difficult to initially get to grips with Venkman (Bill Murray was more fun). The biggest problem of self debugging seems to be tied to the limitation of the Gecko's extension implementation, though I'm sure someone will find a way to seperate the add-in from the base one of these days. But in the mean time it will just have to do, I guess...

Now, back to the Gecko reference guide...

3H-GDC m.IV

[cue game show prize winner muzak]

Congrats to DrewGreen on coming second in the fourth 3 Hour Game Development Contest, with his entry International Cart Racing.

Drew wins a stylish top of the line gift voucher for either Amazon or NewEgg to the value of \$75.