About this blog
Now Showing: And now... The end is near...
Entries in this blog
Yes, it has been a long time.
Well, the time has come to close this down, I think. Lets face it, it was never orientated towards game development much.
So I'm taking my exploits off elsewhere, to www.aidanwalsh.net, if anyone is interested. I'll also be taking new projects and ideas with me, so I do hope you'll join me.
I'm quite enjoying my Digital Image Processing course. Not only am I getting an excuse to force myself to learn C, but I also get to work with a Playboy centerfold.
And who doesn't enjoy that?
Still haven't heard much back about the timetable/subjects not running messup, except for an email telling me that I will have to come back next year to finish, and an offer of an appointment to talk about it. Which has yet to be followed up.
I have until the fourteenth of this month to get my project proposal ready to hand in at college. The problem is, I have no real idea yet of what I want to do.
Its my final year (HAH!) project, so it has to be something that "reflect[s] the particular interest of the student and the aims and objectives of the course of study. The completed project must demonstrate the student's ability to plan, execute and present the findings of a suitable applied research or software development project." Or, at least thats according to the specification document.
Last time we got one of these projects to do, I ended up doing an initial (fugly) version of my current installer project.
I have two ideas, but they both sound kind of like things that would probably get rejected:
An instant messaging application for mobile phones
A podcasting suite - record, edit, encode and announce your cast
Anyone got any ideas\opinions on those?
Its amazing how fast the bubble bursts on somethings.
Talking to one of my friends who did his final year last year, I have since discovered that there are a lot of courses that I need to complete not being run by the college this year. They run on a two year rotation you see, and so they will be run next year instead.
This essentially leaves me with the following options:
1) Continue this year with the subjects that are running, and go back again next year to complete the lot
2) See if I can defer the year in the hopes that all subjects will be running next year (not currently a reasonable assumption)
3) Quiz the college for other alternatives
Either way, what was supposed to have been a two year course is now looking like its going to take four years. Hows that for an ego boost?
I think I'm going to go and cry now.
June. Its been since June since I wrote anything to do with the installer. Don't wory though, it hasn't gone away. I've been in an awful slump lately that I have been having trouble pulling myself out of. I've been working on a couple of small side projects, such as webpages and some small toy stuff in C#, playing with new components. (Actually, I might be able to combine some of that as a second smaller scope project, combined with some of the stuff I have already done for the installer. Basically, I'm pretty much just procrastinating writing the vcdiff stuff, in spite of the fact that it needs to be done.)
The fact that I am now back at college, with a semester of classes and a full year Final Year project to work on isn't going to help that much I suspect.
I finished work last Friday week, and got a very nice send off the following Friday. It was good to see so many of the people I worked with outside of work for a change. I picked up a bit of valuable general computer experience during my 19 months there, though not much in the way of coding. Such is the price of an admin job, I guess.
I started back to college yesterday. Given that we only have a 10 week semester of classes (give or take a week or two), most of what we are doing are only very condensed courses, or really just primers. Digital Image Processing looks like it will be interesting, Object Orientated Databases is going to be excruciating. I haven't made my mind up on the business course yet.
My timetable also blows big green hairy chunks. Two days a week, I have one class in the morning, followed by four hours of a break before the next one. That wouldn't be so bad except for the fact that this campus, in its six years of existance, hasn't done much in the way of entertainment. Hell, the sports pitches are only being opened tomorrow. None of the societies meet until after college hours, when the rooms become available to them, so there is nothing that can be done in that regard. The only option is really a 20 minute walk into town, but unless there is something you are specifically looking for, there isn't much available there either. I badly need to learn how to drive so I can get home in these times.
Spent the week off basically arsing about, caught up on Battlestar Galactica Season 2 now that its on dvd, just in time to be able to watch the new season when it starts here in the New Year. I'm also after working about a third of the way into Code Complete. Damned interesting book, that.
The pirate speaks,"And so ends another o' me attempts t' burn four hours. I think I'll crack open Dev-C++ and start takin' a look at some o' t' Borland BGI stuff. Avast!"
In order to get myself out of the rut I have been in since I got home, I have decided to try a new approach that I read about last week called Structured Procrastination.
The problem is now that getting around to implementing it is at the top of my list...
Sorry for the poor image quality...
Much Autographed First Page
EDIT: Changed to hyperlinks for the time being to fix the annoying "broken page". If I think of it I'll change them to thumbnails when I get home.
I haven't seen anything special there so far, but then I haven't had too much of a look at it. I'll try to spend some time there either tomorrow or Sunday and get some stuff. It might have to be Sunday, because the crowds are expected to be massive tomorrow.
Activision have had a large stall for their upcoming Ultimate Alliance, which (if the video is anything to go by) is going to be a pretty cool game. 140 playable super-heros means that nobody will see the final ending for quite some time I think.
I had a quick go at Final Fantasy XII (beautiful, if annoying to me that they have pretty much totally changed the battle system to make it quite a bit more traditional third person actioneer.
I ws also able to sit in to see a sneak peak of Richard Donner's recut of Superman II. They showed about 15 minutes of new footage - one hilarious scene where Lois thinks she has discovered Clark's secret, and the new opening sequence which dipicts the verdict and banishment of General Zod. We've been promised that the new edition will be 80% of the original Donner footage, along with some new footage that was created digitially to act in place of footage that was never shot, but crucial to the storyline. We were told its going to be released November 28th, though it wasn't mentioned if thats a world-wide release of just in the States.
Unfortunately the line for the Snakes on a Plane panel and trailer premiere went from the convention centre to Tijuana and back again, so I hope to have more luck getting into the Spider-man III panel tomorrow, where there is an announcement expected to be made.
To finish, might I just mention that both Bryan Singer and Richard Donner are both wonderfully professional, courteous and polite people in the face of a thousand fans bearing down upon them. It was a pleasure to meet them both today.
Thanks to ApochPiQ, I have pretty much sorted out my TreeView drawing problems. All I have to do now is go back and add some sorting to push the folder to the top of the tree, and line everything up alphabetically.
The main reason I haven't gotten this done yet is because of the shiney new black NintendoDS I got two weeks ago. MarioKart DS and New Super Mario Brothers have been pretty much keeping me away from my PC for the last while.
And I won't be at it for the next few either. Tomorrow morning at 11.10 a.m. I will be taking off for Comic-Con 2006, followed by a week of general tourist stuff around the San Diego area.
After that I hope to be back fighting fit at it again.
I feel like an utter noob at this rate. My main mission for a period of time I won't embarass myself by revealing has been to get the files in each Component to list themselves out in a directory tree. As you can see, its only been going from bad to worse.
The problem is that there is some absolutely maddening self referencing going on, and while I can see the problem and where it exists, I cannot for the life of me figure out whats been going wrong. I want this over, so I'm going to turn to the people of GDNet to see if they can offer assistance on a way around it.
private void RefreshImageModel()
TreeNode component, file, folder, current, next = null;
QueueString> folders = new QueueString>();
foreach (Component c in image.Components)
component = new TreeNode();
component.Tag = "Component";
component.Text = c.Name;
component.ImageIndex = 1;
component.SelectedImageIndex = 1;
foreach (InstallFile ifile in c.Files)
current = component;
foreach(string s in ifile.RelativePath.Split('\\'))
foreach (string s in folders)
if (current.Nodes.Count > 0)
foreach (TreeNode tn in current.Nodes)
current = tn;
if (next == null || next == current)
folder = CreateDirectory(s);
current = folder;
folder = CreateDirectory(s);
current = folder;
file = new TreeNode();
file.Tag = "File";
file.Text = ifile.Name;
file.ImageIndex = 2;
file.SelectedImageIndex = 2;
BotH: If anyone wants to give me the thrashing I so justly deserve for that pun, drop me a PM and we can arrange a time and place.
I promised myself I'd never do it.
I've been around them all my life. I live in a town renowned for them.
All the same, all of them. All the same. They disrupt life for the ordinary, decent folk. Yet at the same time a thriving business revolves around them, a business run by the ruthless, no mercy for those caught in the middle.
I feel dirty. It was never supposed to happen to me, but somehow it has. Or at any rate, it will.
I will be like them. I will become one of them.
I will be a tourist.
See you in three weeks, San Diego.
Huzzah! My college results came out on Saturday. I got a B, which is somewhat higher than I was expecting (especially with my craptacular project). So back to school full time come September. Time to start dreaming up a new project...
Boo! 3.1Gigs and 4 hours later, my initial download of Vista beta 2 bombs out on me, claiming the file is 0kb long. Well, thankfully the torrents seem to be fairly healthy, even if it is taking longer to grab this way than straight off the MS server.
So, its been a bit. And not a lot has gotten done in the last few weeks, for one reason or another.
However, in the last few days I have managed to pull mu finger out a small bit. Figuring that its more important to have a working version that isn't quite everything I want just yet is better than having something that just doesn't work (which I suppose is "The Right Thing"), I decided to scrap the idea of using the LZMA algorithm and 7z format for the time being. Instead, I used SharpZipLib to use zip, and so far everything is working wonderfully. I abstracted the functionality out to an IArchiveHandler interface, so when it comes to actually getting the original idea in there, the changes will be trivial. Famous last words.
Apart from that, the only changes made have been getting some more of the GUI up and running. Nothing overly exciting just yet.
And now I have Half-Life: Episode 1 to provide further distraction. See you all again in another two weeks [rolleyes]
BotH: Since work has been pretty slack lately, I have been spending a few of my paid hours indulging in one pleasure that I really don't give myself a lot of time in - reading. Finally getting through Lawrence Lessig's wonderful Free Culture, I have just finished the slightly less wonderful, somewhat out-dated UNIX Haters Handbook, and have just discovered Prentice Hall's Bruce Perens' Open Source Series. Between these, two Asimov's and a few programming books competing for my attention at home, I think I'm going to be kept going for some time yet.
Nothing major, I just want to get a reaction from a few people here.
One of the abilities in an Installer Image is that of breaking the files to be installed into Components. This is pretty much as it suggests, a collection of related files that the user has a choice of installing or ignoring.
However, when I was designing my structures first, I put each component inside a single BaseDirectory, that being the folder that the component is installed into. Each file is installed to a path relative to the base directory.
However, it has struck me that perhaps I should restructure this the other way around, make the Component the top level structure, and put the directories inside that.
What do you guys think?
So this morning one of my indirect managers comes up to me with his laptop in hand. This has been a bad thing to see coming in the past. Following on from that experience, there was one application that had been copied across that he wanted to be able to work with. Now the program was running fine, bar one little problem. It couldn't print.
The problem is that we are talking about a pretty up to date laptop, and a not-too-shabby home printer. The biggest problem was going to be the program, a word processor from 1988. This beauty comes with its own print engine, that if you want to set up a printer in, you have to supply the drivers yourself. Confident that this may not recognise drivers designed to work on Windows XP, I decided that I was probably going to have to place an emulated layer between the app and the printer.
After some time Googling, I found an suite that sounded like just the job. It would emulate an LPT port, print the sent information to a file, and then redirect that data to the printer. Wonderful. Or at least it would be, if it had installed properly, and not taken down Windows spooler service either when you went to configure the process, or five minutes had elapsed since you had restarted the spooler. Two uninstalls and one reinstall later (the first one botched and didn't remove the emulator drivers), I hit Google again.
Experts Exchange came to the rescue this time. with a little functionality straight out of the annals of "Coo, I didn't know Windows could do that", I discovered that by sharing the printer, and using net use I could map the port to the shared printer. Nice.
But does that work? No. For some reason, even though typing the UNC path into Windows Explorer will show the printer to be very much alive and kicking on the workgroup, net use refuses point blank that its there. I have restarted, I have disabled firewalls, I have done everything I can think of that might be the cause and searched for hours on end for anything else.
Anybody have any ideas?
Listening to this weeks Java Posse podcast, they had a feedback item on a topic that was raised a couple of casts ago, the question of the increased difficulty in distributing Java applications to the common user due to the necessity of, at least once, having to face the possiblility of sourcing, downloading and installing the JRE. The usual options of bundeling the JRE, etc were also discussed.
The feedback item came from Romain Guy, who suggested that rather than having the user self source the JRE, why not just bundle the version of the JRE that you are using for your application and, during your application installation, run the JRE installation in the background silently. He draws the idea from the Java Distribution Team's own Stanley Ho, who suggests that "[the] users will also see a single user experiecence during application installation because the JRE installer will not present any UI."
No. No, no, no, no, no and no again. Please.
In my opinion, silent installations should only ever be used by one type of user, and that is the administrator. While perhaps nobley intended, there are simply too many things that can go wrong with this. Compatability for other applications can be broken if a different version of Java installed, especially if for any reason your application uses a customised distribution, or install an older version of the JRE than was previously installed. Installers have traditionally not been very good at determining if it should overwrite a newer version.
The problem with Java being that even if it does install beside the newer version, the damage is done when the CLASSPATH variable is changed. There are other problems that can exist is a customised distribution has been installed, such as Oracle JInitiator.
The user should always be informed as to what is taking place. Unless someone who can tackle any possible problems caused by installing the software is at hand to help through any issues, silent installations should not be invoked. They should never be invoked automatically.
What should happen is that the installer should check to see if the necessary version has already been installed - or in the case of Java necessary or higher - and prompt the user to install if it isn't. But please don't do anything behind my back.
I've been working on the 7z archive handler, as its really the last stumbling major block on getting the current version of the builder out. Everything after that is either a variation of what already exists, or bug fixes.
Since managed handlers for the 7z format seem to be non-existant, I had decided that I would end up having to write my own. After a couple of false starts (incorrect downloads, wrong code, trying to figure out what the heck was what), I finally managed to get my hands on the unmanaged dll, and its source code.
So, at the moment, my options are:
attempting to rewrite the dll as native C# code
compiling 7za.dll to managed code and working from there, or
leaving it as it is and working with the unmanaged code through DllImport statements
Since what I am working on now is more of a proof of concept builder than anything else, I think the first one is out of the question. The second sounds like more trouble than its worth at the moment.
The third sounds like my best bet at the moment (well, actually abandoning 7z for a different format sounds better, but I'm still attracted by the high compression rates that the LZMA algorithm offers when combined with the format). However, Igor doesn't seem to believe in commenting or documenting his code. Answers to questions tend to be along the lines of "You can find a small example in the source code", or "read the 7zFormat.txt file". So here's me with the task of trawling through the C++ code, again, trying to find what methods do what, what ones I will be needing, and what ones I can leave behind, again.
In future, before I settle on a library, I think I'm going to pay a little more attention to what the documentation is like. if there is a plus side to be had, at least I'll have a better understanding of where to begin when it comes to taking care of this aspect of the installer client.
If anybody needs me, I'm going to put my head down in a dark room for a while...
Igor Pavlov, meet Jef Raskin. Enjoy.
In part one, I wrote a little on my opinion of the current state of GUIs in installers. This entry is about taking a different approach, and why I think it needs to be taken.
Of course, everything listed here is intended to be universal across platforms.
The first method I decided to take a look at was the most traditional - launching the installer by double clicking.
I decided that wizards were going to have to go as the default method of installing software. While they do have their place, as I have commented before they are not necessary for most installations.
The primary goal of the design is to take out as much of the delay and redundant clicking between launching the installer and getting down to the meat and bones of the job as possible. As well as just being annoying, there is also the problem of that "one click too many", where you accidentally do something you didn't mean to.
I also wanted to remove the disjointedness and immeasureability that exists when there are installers bundled within installers. Having another window pop up after one is complete only to start another installation process can be annoying, as you have no real indication of how far through you are.
So what I have in mind is something far more akin to inserting data onto a web form, with default values already in place. The most important options are available to you up front, with other options kept out of the way where most users needn't concern themselves with them. At this moment, the option not presented up front is pretty much just the list of components that will be installed. Options that are presented up front are where the application will be installed to, shortcut options, and the license agreement.
Apart from these, there are three other buttons presented to the user, the Cancel button, the Change Options button, and the Install Now button. By keeping buttons that do indivisual tasks, it makes it a lot harder for the user to accidently do something they don't mean to.
The only thing that I admit seems to fit the idea, but still doesn't sit very comfortably with me is license agreement. As it stands, what I have is a checkbox that the user must check to be able to proceed with the installation, and a link that leads to the license. This has the side effect of the user just being able to check the box without reading the agreement at all (just in case any of us are under the illusion that any do anyway). Unfortunatly, I can't think of a solution that gives the license up there that doesn't either break the flow, or revert back to the wizard structure. Perhaps someone will be able to suggest something.
To help with this section of the entry, I put together a (very) quick demo that should help people see the benefits of what I am proposing. Created with C# 2005, you will need to have the .NET 2.0 framework installed on your system. Not everything works as advertised, but it should be enough to help get the point across.
Download here. Any and all feedback is much appreciated.
Happy little bushes
Simply double clicking on the file needn't be the only way to launch an installation.
As such, all supported installation features will be accessible from a context menu, available on your favourite file manager by means of your favourite context menu access method. Opening this menu will give the options:
Install - Launches the installer as if it had been double clicked.
Install Here - Launches the installer, changing only the value of the target directory from the default value to the path of the directory the file is currently in.
Repair - Launches the installer in Repair mode.
Uninstall - Uninstalls the application.
This is hardly revolutionary, Windows Installer offers the same functionality with msi files (this is usually little noticed, since it seems to be traditional to wrap the msi files in an exe). The only new option is the Install Here option.
One common complaint that I have heard is that a lot of users would prefer to bypass the fuss of a GUI altogether. The most common way they would prefer to set up their software is in the same manner they extract files from their compressed archive files.
One way that we can look at this is to allow users to drag the installation file to the folder they want to install into with the right-click button, and allow them to install the application into that folder with the same ease they would unzip a file.
Bringing up the menu in this way should give a slightly altered version of the Install Here option, called Install Here Now. This will allow the user to launch an installation that uses the folder the file has been dragged into as the target folder, and proceed straight to the installation using the default values.
Feedback or questions?
... I show off my web design skills (or lack there of).
Tomorrow, definately part two of the GUI entries, with a demo to boot.
So today I sat down with the intention of writing up the second part of my GUI posts, and creating a small C# program to demo it - just to give people a proper feel so they can give better feedback.
Instead, I hit the Lounge, read a thread on webcomics, recognise one title and end up reading the entire Mac Hall archives. Over 5 years, 371 comics. Thank Christ that guy took on a programmer style lethargy in the last year or two, is all I can say, or I would still be there this time tomorrow.
Well, I also got tired of having to sync my notes between work, lappy and desktop computers, so I wiki-fied them. Still some cleaning up to do, but its really only minor.
Tomorrow, actual work.
As I promised before, I'm going to throw up one or two posts about what I want to do with the Installer. First up is the client GUI system.
This topic is a bit of a stretch, so I decided to break it over two entries.
Tonight I'm going to throw out some ideas, thoughts and observations on the current state of GUIs in installers. I'm confident that everyone who reads this will have at some stage had to install an application on a computer, so hopefully everyone will be able to relate to what I am saying, and hopefully have an opinion.
In a day or two, I will post what I have in mind for the system I am putting together myself. Hopefully, I'll have enough feedback that I will have to either delay or rewrite that entry [grin]
Where better to start than:
Windows - Wonderful Woeful Wizards
By and large, if you're installing something on Windows, you're going to encounter a wizard.
We all know the generic template - splash screen (optional), "this app is going to install that app" screen, script compilation progress screen, license agreement, serial number entry(optional), change directory path, choose the components to be installed (optional), advert (thank you, iTunes), progress bar, "you're done/would you like to open the read-me file" screen. Tedious, at best. What typically happens here is that the user just keeps bashing the "Continue" button until the thing is done.
Wizards were designed to be about data entry - a way of grouping common, relevant boxes and options so as to help set up a feature properly. Where is the data entry on the majority of screens in a modern, Windows installer? Don't get me wrong, wizards still have their place in this process, but really only where they allow the user to perform pre-startup configuration on the applications settings.
There have been attempts to move away from this, toward an x-copy model of installation. However, for the most part these attempts have been based around one particular technology, e.g. Sun's Java Webstart, and Microsoft's ClickOnce. Unless your application is written in Java or .NET 2.0 these are pretty much not an option. Even where these technologies are available, take up can be slow, or it may just not be suitable for your application.
Also, many installers allow any user to put their application on any computer. There is little to no regard for system security. This is a double edged sword - on the one hand, users won't need to have administrator privilages to set up their IM client on their box (although the benefits of this are equally debatable [grin]), but that also leave it open for any application to be installed through a silent installer.
*NIX - Theres a GUI!?!
Commonly, Unix application installers don't come with a graphical method of installing an application. Usually, an authorised user will take the privilages necessary for the system in question, open a console (if using a window manager) and use one of the many systems available to automatically, and with very little fuss, download and install the application in question from one of a chain of registered repositories. The systems have their own ways of ensuring that everything necessary is there, and at the right version needed to work. There are graphical versions of these systems, but they don't deviate from the original idea massively.
For the most part, these systems follow the same pattern, be it RPM, DEB, etc. By and large, the installer consists of an archive, commonly gzip in structure, with an enclosed script that determines how the process works. Its a nice simple system, and for the most part it works great. The only issue that can be taken is the need to track down faster or backup repositories, but Linux users generally enjoy challenges like this. [/sweeping statement]
In some versions, distros such as Fedora Core have included an application that automagically generates a wizard for RPM files should you double-click on one. Generally, these suffer the same problems as the wizard structure on a Windows based machine. Thankfully though, we are spared a lot of the chaff that has been finding its way into those installers, since the RPM graphical wizard is an after-thought rather than a design decision. Unfortunately, its still another needless wizard that doesn't really serve much purpose in its role.
This is where you come in...
Right, I have an idea of what I want to do to try to muddle through some of these issues, and if possible help make the entire process smoother. But I know every user is different, so what are your thoughts? What do you like or not like about the various systems? Is there anything you would do differently? is there anything you violently disagree with me about?
I finally pulled my finger out and created the task list I always wanted. I decided to theme it around the rest of the site's default skin (ya-boo if you're viewing from the black theme!), and hopefully turning things from black to green to red will be one extra little motivation to get to work.
Should you feel like thieving it, here is the fuglyness
border-left: 1px solid #46A4D1;
border-top: 1px solid #46A4D1;
border-bottom: 1px solid #035180;
border-right: 1px solid #035180;
border-left: 1px solid #FFFFFF;
border-top: 1px solid #FFFFFF;
border-bottom: 1px solid #D7D7DF;
border-right: 1px solid #D7D7DF;
"3" class="longBar">Version 0.1 Roadmap
class="inProgress">Item in progress
"3" class="longBar">Status: Blah - Legend - To do - class="inProgress">In Progress - class="done">Done