Category: Blog

  • CaseDetective Beta 3 Released

    As well as releasing my UNIXCrypt RealBasic module, I’ve also released the latest, and hopefully last beta of CaseDetective.

    This one doesn’t look like much on the outside, but has a few fixes on the inside, and a bit of mutli-threading chucked in to make things a little more responsive in the GUI while grabbing data from the database.

    ALso, I’ve put in the framework for the Help system. It’s a little sparse at the moment, but should be improved plenty in time for the 1.0 release.

    I had seriously considered making some big changes in this version (as discussed in an earlier post), but decided that they ought to wait until 1.0 is out the door. I’ve got users who are pretty happy with the way CaseDetective works at the moment, so I don’t want to rock the boat just yet, I’ll leave that until 1.1, giving me plenty of time to make sure I get it right. This release is made with RelBasic 2005r2, but doesn’t include any of the stuff I need to do to support MS Access databases.

    I’m chomping at the bit to get onto v1.1, but I know I should finish off the docs and final polish of 1.0 first, and make sure this final beta is as solid as I hope.

  • UNIX Crypt For RealBasic

    A little while ago I mentioned that I had initially built the user authentication in CaseDetective so that it used the user’s FogBugz website to do an automated physical login, and then parsed the resulting page for specific variable names that can only be there if the user had logged in successfully. This was a bad idea, and not even my preferred method, but I’d done this way to avoid asking Fog Creek about the encryption they use for user passwords stored in the database. Anyway, once I wised up and asked Michael Pryor if he’d let me in on the secret, he of course told me that it was the UNIX Crypt algorithm (funnily enough, I’ve recently found a discussion forum post where he had already mentioned it, but it was after I released Beta 1).

    I was over the moon when Michael told me it was UNIX Crypt because I figured there’d be thousands of ready made modules that I could choose from that would give me instant access to the one-way crypt I needed, it’s so old, so ingrained in the UNIX world that it was surely going to be a breeze.

    So I checked out my Einhugur plugins only to find no simple “UNIX Crypt” functions. Not worry, there are a tonne of different algorithms in the e-CryptIt module, it’s probably just down to me not knowing what the underlying cryptographic algorithm is, so I search the net…

    I spent a few hours searching the net, eventually finding out that UNIX Crypt is a derivative of the Data Encryption Standard (DES). I learnt a lot about encryption in these few hours, including that UNIX Crypt is pretty weak, but also that it’s pretty easy to password check with because the “salt” is embedded in the encrypted string as the first two characters. I also leant that in a lot of systems the DES algorithm has been superseded by using Blowfish or Twofish.

    Back to my plugins … nope, nothing about DES, not a sausage. Bugger! So I sent an email off to the Einhugur list asking if I was right, maybe I’d missed something, but alas, DES and UNIX Crypt are not supported by e-CryptIt, and no-one knew of another plugin that would help. Double bugger! At least e-CryptIt has Blowfish and Twofish, but that doesn’t help me just now as I need the DES version.

    There are very few modules out there (“out there” being the internet) that do UNIX Crypt, and most are for Windows and would require that I bundle another dll with my application, which I really didn’t want to do, I already bundle the eSellerate dll and didn’t want to have to bundle any more.

    Even if I did buy a dll (most of these dll files require payment) and distribute it for Windows, it would still have left me with having to find a solution on Mac OS X.

    I played around with RealBasic Declares on Mac OS X as it comes with a “unistd” library that I found I could potentially call to do a crypt. But I had very sporadic results, and many crashes, and relying on the placement of a library outside of my control gave me the hebees (you’re supposed to be able to just use the sort name for the library without it’s full path, but that never worked for me, I had to use the full path to get anywhere at all).

    What next, write my own UNIX Crypt module from scratch, in RealBasic? Surely not, that’s got to be painful!

    Well, I had no choice, I either wrote a module to do UNIX Crypt from within my RealBasic application where I had full control and no cross-platform woes, compile up some freely available C code for both Windows and Mac OS X, keep searching fruitlessly for an existing robust cross-platform solution (that isn’t there), or forget the whole thing and go back to looking at building Integrated Windows authentication into my FogBugz web logon code (shivers with dread).

    During my research on the web I found various bits of C code that did DES and UNIX Crypt that had BSD or other unencumbered licenses, so I had at least some code I could look at for inspiration. Now, I’m no C coder, I can read it a bit as long as it doesn’t get too hairy, and I’ve even written a few modules and applications for clients where we needed to wrap third-party libraries with C code, and then in some cases wrapped this with Informix 4GL code. I’ve had some great success with that kind of thing. But I’m telling you now, people that devise encryption algorithms are seriously deranged, how on Earth they come up with this stuff beats me, and how some of these C developers got to the place where they do certain things they do I don’t know. It’s just plain scary looking at encryption code.

    I’d found via Wikipedia.org a great DES Algorithm Illustrated page (WARNING: if you go to that site, don’t bother looking at other parts unless you’re in the privacy of your own home as your boss may not appreciate the scantily clad ladies) that explained bit by bit (literally) how the DES algorithm worked with a known input and output. Without that site I’d have been right royally stumped, it allowed me to build a stand alone project in which I could test my UNIXCrypt module with a known input and output not only to the entire algorithm, but to each little segment of the calculations.

    It took a few days, and a lot of hair loss, but eventually I had straight DES working fine, I could perfectly replicate the inputs and outputs from DES Algorithm Illustrated. Woohoo!

    All I had to do then was implement UNIX Crypt. Sounds easy don’t it? I thought so too. The problem is that UNIX Crypt doesn’t use straight DES, oh no, that would be too easy, it has to be mucked about a bit first! 😉

    UNIX Crypt sets the DES key in just the same manner as normal DES does using the string (password) passed in. So far so good. Then it runs DES encrypt 25 times using that key, but starting off with a message containing just zeros. This also sounds pretty straight forward doesn’t it? Well, on each of those 25 runs of DES crypt, at each point that the “E-Box” is expanded (you’ll have to go look at that DES Algorithm Illustrated site to see what that means) the resulting bits (which by the way have already been mucked about enough thank you very much) are mucked about again depending on some XOr criteria derived from the two “salt” characters.

    Luckily I had various bits of C code to check out, but they don’t really explain anything, and try as I might I just couldn’t get the bloomin’ thing working.

    I tried for two weeks to get UNIX Crypt working, it was so frustrating. I had DES working, I knew it, so why could I not get these seemingly small changes to adhere to the UNIX Crypt algorithm working?! I think I must have lost at least half my hair over those two weeks (that’s my story and I’m sticking to it, I haven’t been losing my hair at all before that, not one 😉 ).

    Finally I sent out a plea to the RealBasic Network Users Group (NUG) for anyone who knows any way of getting UNIX Crypt working reliably cross platform from RealBasic. I was prepared to throw all my work away if anyone came up with anything good. No one had suggestion that would work for me, it seems no one on the group had needed to do it before cross platform, although there was a Mac OS X solution for encrypting passwords.

    Eventually a guy called Mark Nutter found some Java code I hadn’t seen before that did UNIX Crypt, I looked at it and found that it very closely matched the C code I’d used as a template for my own development. I followed it through and compared to my own RealBasic code, just like I had the C code, but alas could not find anything that looked wrong.

    When I reported back to the NUG that I still couldn’t find the problem Mark then offered to take a look at my code to see if anything jumped out, so I took him up on his offer and sent him my test project. Later that day he wrote back, unfortunately not having been able to find the problem. Here’s a quote from his email:

    … I’m checking your RB code against that, and
    everything seems to check out, except that the results
    aren’t matching. But encryption algorithms are so
    twisted! My brain hurts after only a couple hours, I
    can imagine you’ve been going bonkers.

    At this point I’m fairly stumped also. 🙁

    I wrote back thanking him for trying and telling him not to try looking at it any more, I didn’t want to be held responsible for his decline into madness! I’d just have to try and step through the code bit by bit and see if I can find the place where it went astray.

    When Mark wrote back to say good luck he casually mentioned that I should try and compile up the C code I’d used as a template and output to a buffer every now and then and compare with my RealBasic code. Doh! Why the hell didn’t think of that sooner, I had code that I knew should work, tried and tested, but just in another language.

    So I jumped into XCode created a new project and copied in the C code I’d been using and set about creating a command line app that would simply print out the bit strings at various points. I started off by making it simply do the UNIX crypt to make sure it was doing the right thing, outputting the input and output strings. It worked.

    Then I decided I’d start off slowly, I just added one intermediate output of a “bit string”, the bits as accepted by the setkey function which is called right at the beginning before doing the real DES stuff. Then did the same in my RealBasic code. Ran the two of them, and guess what, I already had a miss-match! Bugger, bugger bugger! If I had a problem this early on in the process, it was going to take me bloody ages to find and fix all the other errors.

    When I looked closely at the two bit strings, that should have been the same, but weren’t, I noticed that my code was creating a string very similar, in fact it was almost identical except for an extra “0” at the beginning of the string, and then again before the next recognizable pattern of “1”s and “0”s. Damn, my code was passing in 8bits per character rather than the 7bits per character for the key that the C code was using. Checked my code, sure enough, there it was, an extra “0” in my bit mask when converting the ascii characters to binary!

    Oh well, delete one “O”, recompile and run again to find the next error. Except there wasn’t an error, my test project only bloody went and spat out the correct encrypted string! Woohoo! Do a little jigg!

    It only took me a couple of minute to import my UNIXCrypt module into my CaseDetective project and hook it up to get it working, finally I could authenticate a user’s FogBugz login id and password against the database, cross platform and without any dependance on external modules or applications. Phew, I can’t tell you how much of a relief that was, I was so happy.

    So, after all that hard work, fretting and nearly going insane, I’m going to do one last insane thing, I’m releasing my UNIXCrypt RealBasic module as a free download. You can grab it from my IMiJ Software website, it’s in the “Free Stuff” section.

    You can download or check out the UNIXCrypt REALbasic module and test project that I created from the rbunixcrypt Google Code project. It’s under a MIT license, so you can do pretty much anything you like with it.

    You can use the UNIXCrypt RealBasic module to simulate UNIX Crypt by simply calling “UNIXCrypt” with a string and two character salt.

    Thank you to everyone who helped or tried to help me get this done, hope someone finds it useful.

  • Started to use RealBasic 2005r2

    Just yesterday I started to use RealBasic 2005r2 for my development of CaseDetective.

    I had been holding off from using the latest version of RealBasic because of two things:

    1. I was happily using v5.5.5 for my project and didn’t want to risk breaking anything by moving to new versions of my tools.
    2. Didn’t feel v2005 was quite stable enough (from comments in the RealBasic mail lists).

    So given those two very important reasons, why have I decided to move to v2005r2 before v2005r3 has been released?

    The prime reason is that there are features in v2005 that I think I need now to be able to develop features I’m planning and to improve some other areas of my software.

    In particular, I’ve been struggling with trying to support Microsoft Access databases as a data source in CaseDetective. It’s not that I can’t connect to the database etc, that’s easy with ODBC, it’s that Microsoft Access does not support the advanced SQL I can use in the other supported FogBugz databases, namely Microsoft SQL Server and MySQL.

    By moving to RealBasic v2005 I think I can now make changes to the way I handle the data so that I can keep all the extra fields I give the users of CaseDetective (such as Last Updated By, Closed By, Resolved By etc) and also support MS Access. Whereas at the moment I simply can not keep those fields and support MS Access too, the SQL I’m using just doesn’t work no matter which way I do it, so I’m going to have to split the grabbing of the extra data into separate queries.

    Splitting the retrieval of data into separate queries means I can’t use SQL “sort by” for when the user wants to sort by those extra fields, I’m going to have to bring the sorting back into the application only. This means sorting arrays of data, which will hopefully be easier to do using RealBasic 2005’s new “SortWith” method.

    I first came across the new array SortWith method in a post about new features in RealBasic 2005 by Jonathan Johnson on his NilObject blog. The new SortWith method allows you to sort an array and keep other arrays that have the same number of elements in step with the re-organising. So, if you sort the LastNameArray you can keep the FirstNameArray in step, so that elements 1, 2, 3 … n are always locked together across the two arrays. And you can do this for multiple associated arrays at the same time…

    LastNameArray.SortWith(FirstNameArray, MiddleNamesArray, EmailAddressArray)

    This would mean if the 3rd element of LastNameArray was moved into position 1 as a result of the sort, then elements 3 of FirstNameArray, MiddleNamesArray and EmailAddressArray would also move into position 1 of their respective arrays.

    I’ve yet to try this out (so I don’t know whether sorting by one array and then another would allow me to get what you’d expect from “sort by LastName, FirstName”), and haven’t fully planned my new architecture, but I think this will help me get to where I want to be, and will hopefully open up the possibility to add more sort fields too as once this is implemented I can’t see anything stopping me from sorting by every field I make available, whether basic FogBugz or derived field. It’ll just take a little extra work to make sure all dates and times have a SQL format string (or TotalSeconds integer) companion to get around the restrictions of the SortWith method, but I already have this for most fields.

    Update: Stuff arrays, me thinks RealSQLDatabase (a.k.a SQLite3) is the way to go, can you say “super fast in-memory SQL database”! This to be honest was my prime reason for moving to RB2005, but I wasn’t sure it would work. I’ve just spent my lunch hour looking into this further, and as soon as I found out that I can do in-memory SQLite3 databases in RB2005, and can then save the contents out to disk by attaching a file based database and inserting my in-memory table’s data into the file based database’s tables, I was sold. This totally opens the door to some features I want to implement in the future. I’m a very very happy man! 🙂

    A nice thing I’ve already noticed with RB 2005 is that a disabled listbox on WinXP actually looks disabled now, whereas in RB 5.5.5 it looked active, but you couldn’t do anything with it, which was very confusing. On the flip side I seem to have lost one of the separators in a menu, so I need to sort that one out.

    I think I’ll finish off a couple of small changes to CaseDetective and release another (final) beta made with RB 2005, and then I’ll tackle the MS Access problem for a separate release, so look out for a new version of CaseDetective in the next week or so with some minor updates and fixes.

  • OpenBase Adds RealBasic Stored Procedures Support

    In the wee hours of this morning, while I was sound asleep, my server received an email from OpenBase announcing that OpenBase 9.1 will be released on September 14th.

    Usually I’d just delete such an email as I’ve yet to use OpenBase in anger, and haven’t really played with it for a couple of years now, when I first had a dabble with WebObjects. However, in their list of new features for this version was support for RealBasic Stored Procedures, which caught my eye.

    This sounds great, I’ve spent the last year writing RealBasic code, and so am slowly getting more and more comfortable with it, to the point that I miss it’s features when working in other languages. So this announcement along with the much anticipated “Swordfish” web application framework from Real Software is starting to make my investment in time and money in RealBasic a good bet.

    Of course, I haven’t got OpenBase, don’t as yet have a really good use for it that would warrant spending that kind of money (I’ve always felt it costs just a little more than I can afford), but with all the other improvements and new features that are in v9.1, I’ll certainly be looking at it again soon. It’s maturing nicely.

  • Just like buses…

    Just like buses, no posts for ages and then three come along at once!

    So, apparently it’s Blog Day today, you’re supposed to link to at least five blogs. So I’ll highlight a few blogs that have recently entered my regular feed list from my “New Subscriptions” quarantine list, all related to making a business out of writing software, in one way or another.

    .NET Undocumented is a mixture of .NET (well, dah!) and entrepreneurship. Bit too much about .NET for me really, but there’s a fair bit about business to keep me interested.

    ToDoOrElse.com is the blog of MasterList Professional developer Safari Software. Nice interviews in the Micro-ISV Tip series of posts, plus productivity and general business and blog related stuff.

    I guess Tim Weiler is as busy as I’ve been recently, so hasn’t updated in a couple of weeks, but his Syncura blog tells his microISV story.

    Realmac Software – Blog. This one goes into my “Apple” category. RapidWeaver is what I use to create my company website, I like Realmac Software’s products and the fact that they’re a small UK company that listen to their customers.

    Talking of RapidWeaver, if you want to see a great website built with it and some superb photography to boot, scoot on over to Pixels Everywhere.

    If you’re writing software you’ll appreciate OK/Cancel and Bug Bash.

  • When and why you should be using Threads

    When and why you should be using Threads:

    Quite often I see people making programming mistakes that will cost them dearly in the long run. They’ll do things like use App.DoEvents to keep UI updating properly, or they’ll make their program inaccessible by leaving tight loops run with no way to cancel them. These situations are perfect examples of when you should be using a thread.

    Aaron Ballman has written a couple of posts about using threads in RealBasic, wish he’d written them a couple of days sooner as I’ve just recently made a couple of changes to CaseDetective using threads to help make the interface more responsive while grabbing data from the database.

    My changes have turned out pretty good, working well, and a lot simpler in the end than I thought it might be. But I’ve still learnt a couple of things from Aarons post, in particular I’ll be changing my code to use a “MessageReceiver” to do the progress bar updates. That was a great idea Aaron, thanks!

    He mentioned he might talk about resource management between threads and how to properly use the locking mechanisms REALbasic provides, which would be useful. I had to work out how to use semaphores myself because I was getting conflicts whereby the interface was in the process of updating from new data but another thread changed the data it was trying to use. Bang! OutOfBoundsExceptions all over the place! One App.DatabaseAccesssSemaphore signaled as soon as a thread started to run, and released when finished and all was back in control. And I didn’t really lose any responsiveness in the GUI.

    Me likee threads!

    Update (2005-09-02): Aaron has now written a nice article on Locking Mechanisms In REALBasic.

    (Via Ramblings.)

  • Of Mice And Machines

    So, a couple of days ago I listened to Adam’s interview with Leo Laporte on the MacCast (which was very good by the way). One of the many subjects they discussed in the podcast was the impending move to Intel chips by Apple and what they think will or won’t happen with regards to Mac OS X being released for generic non-Apple hardware.

    I’ve held back in airing my thoughts on this subject for some time, but I thought I’d just get it out of my system now and move on as some of Leo’s opinions mirrored mine (but I doubt we agree on everything). It’s been sitting here as a draft for way too long, this subject is starting to get old.

    Hardware Release Schedule

    Leo said that he does not expect us to have to wait until next summer for the first MacTel, and I agree whole heartedly. In recent times Apple hasn’t released any information on products much more than a month ahead of release, they are very good at officially being tight-lipped even if the rumour sites do get the scoop ahead of schedule now and then. Steve Jobs said in his WWDC keynote in June that they would have Intel based hardware “Starting next year, we will start introducing Macs with Intel processors in them… so when we meet here this time next year, our plan is to be shipping Macs with Intel processors by then.”, I’m hoping that Apple really expects their first product to be out before that.

    I predict that by the end of January 2006 we will be able to buy a Intel CPU’d Mac mini, we’re not going to have to wait until summer. Further more, I expect there to be a variation specifically targeted to the Home Media Centre segment, which may have either new software for full screen TV compatible Music, Movies and watching/recording TV, or at least extensions to iTunes for full screen simplified control (e.g. via bundled remote control).

    By summer 2006 we will have the first PowerBooks (or whatever they will be called) based on intel chips, what’s the date of next year’s WWDC event with all those developers milling around with PowerBook in-hand? 😉

    I would expect that the Intel based replacement to the PowerMac G5 should be easier to create than any other Apple hardware model purely due to the extra room you have for part placement. However, I expect the G5 replacement (G6 anyone?) to be based on the recently announced “proper” dual core Intel chips, and I seriously hope that they are dual processor too giving us effectively four way processing. Drool. This may delay release a little, so we may be looking at end of 2006/begining of 2007 for this one. What’s the betting that Apple’s deal with Intel includes them getting first dibs on the new chips as “guinea pigs”, with release to Intel’s major volume partners soon after.

    iMac G5 replacement. This is a little tricky, with any luck we’ll get these for Paris Expo next year, I expect them to be out before the PowerMacs, but after the much needed PowerBook replacements. Don’t get me wrong, I love my PowerBook, it rocks, but Apple needs to get the Intel laptops out the door as they’ll be a key seller.

    Mac OS X On Intel

    A lot of the discussion recently has centred around whether Apple will release Mac OS X for any old generic PC, or whether they will ensure Mac OS X can only run on hardware made by themselves.

    Well, I reckon they will (and should) take steps to make it fairly difficult to run Mac OS X on anything but Apple hardware, but not waste time in making it very difficult. It doesn’t matter how hard Apple tries, someone will have it running on generic PCs within a month of release, so why bother trying to make it impossible. Apple should do as most software vendors do, just make it hard enough that the casual user won’t bother, and make it extremely clear that Mac OS X running on anything other than Apple hardware will not be supported in any way. Apple simply could not afford to support Mac OS X running on generic hardware, their support costs would sky-rocket. But, after the first iteration, once a fair chunk of business has been buying Apple hardware or looked at OS X, and a sizeable segment of the software market has made noises about porting their apps to Mac OS X to satisfy the demands of the new switchers, I can see Apple taking another look at the generic PC market as a platform for OS X. It would in my opinion be a shame to decouple the hardware from OS, quality will suffer, but they’ll sell a lot of copies and iLife will sell by the truckload too, not to mention the Pro tools.

    Where Apple will gain is in people buying Apple hardware that they know can run MS Windows, but also that sexy Mac OS X that everyone is raving about. They’ll take the plunge because the hardware just looks fantastic and has a superb build quality, and if their current computer usage depends on Windows based software, they’re not going to miss out. Security is a real head-turner in todays virus ridden world, Mac OS X in inherently more secure and so I think this will make a lot of sales just in itself as people look for a safe platform to do their email and web surfing while still having Windows as a fall-back.

    What About Mice?

    Why did I title this post as “Of Mice And Machines”? Well, I’ve talked about machines, and the OS that runs on them, but what about mice?

    It occurred to me as soon as I saw the Mighty Mouse that one of the major reasons that Apple released it was not because it’s existing users have been requesting it or that they have been buying replacement 3 button mice forever, but because Apple is trying to remove as many obstacles from the path of potential switchers. These mice, when bundled with a new Mac that can run both Mac OS X and MS Windows are what the switcher expects, three button mice are the norm in the Windows world.

    OK, I’ve made enough of a fool of myself, better leave off now!

  • CaseDetective Beta2 is out!

    Finally, I’ve managed to work around all the connection problems users of CaseDetective Beta1 were having, and added a few other little fixes and cosmetic updates too.

    It’s a little late at night (actually early in the morning) for me to launch into a review of what I’ve been up to over the last few weeks, but I will do so in the next day or so.

    Time for bed me thinks, need some energy just in case anything is amiss with Beta2. Catch yer later.

  • Sometimes an iPod on random is sublime

    Led Zeppelin – Bron-Y-Aur Stomp
    Prince – Sign O’ The Times
    Eals – Fresh Feeling
    Sex Pistols – Problem
    Supergrass – Lenny
    AIR – Mike Mills

    And there were many more before. Superb.

  • Beta Release == Very Busy

    Well, as expected once the CaseDetective for FogBugz beta 1 was released, things got a whole lot busier around here.

    I’ve had a tonne of great feedback on the first beta, and have been working hard on Beta 2.

    One of the biggest problems I expected users of CaseDetective to have would be actually connecting to the FogBugz database, I imagined that there would be configurations that I’d not tested that would have problems, but tried really hard to counter this (including making the connection method options sparse and testable outside of caseDetective). Well, this fear has turned out to be true, but not in the way I’d thought (if I’d expected it then I guess I would have tried to make sure it wasn’t a problem!).

    Turns out that a lot of people use Digest and Integrated Windows authentication on their FogBugz websites, not to actually log into FogBugz (it don’t do dat), but on their web server that hosts their installation of FogBugz. This is a right royal PITA, as it pretty much requires that you use IE to use FogBugz and meant that I’d have to find a way of supporting Integrated Windows authentication in CaseDetective.

    Well, Fog Creek came to the rescue, I asked Michael Pryor whether he’d consider telling me how they encrypt the passwords in FogBugz, if I know that then I don’t need to use the FogBugz web site at all. Of course he told me straight away, and I’m working on getting it integrated into CaseDetective.

    I should have asked Michael months ago when I first approached this problem, but instead I went around the houses and implemented the web logon stuff instead. Michael even (verbally) slapped me over the wrist for not sending him the first Beta before making it public, he said he’d be more than happy to give it a test on a few of their different configurations, I should have done so. Michael also set up a Copilot session where he showed me a couple of the problems he had with CaseDetective, which helped immensely (Copilot is way cool by the way, a breeze to use).

    I don’t know what my problem is, every time I’ve asked Michael and Fog Creek anything they’ve always helped me out, but still I’m reticent to ask. I think I’ve learnt my lesson now, Fog Creek seem really happy to help me out, and I should not be shy to ask.

    I’m hoping to have Beta 2 ready in a week or two, depending on how well this work goes (It was going well, but I’ve hit a stumbling block that’s taking a lot of research and testing to get over) and free time to actually do the work. Got a few real life things happening over the next couple of weeks, and my current day job is taking a lot at present too due to an impending Beta, Pilot and release.

    No rest for the wicked!