Home > Blog

Attackmonkey Blog

Disaster Planning

I moved recently, and in the process I cleared out my home office. One of the many things I found and binned was a bunch of evelopes from around 2006. What was in the envelopes? All of the source code, along with instructions of what to do with it, for eavery one of my clients at the time, all neatly addressed and sat in draw.

Why did I do this? Well, back in 2006, not long after I went freelance, I was diagnosed with very advanced Hodgkins Lymphoma (a Cancer of the immune system). I was pretty ill, and I wasn't 100% sure what would happen, so I made a bunch of backups just in case!

I'm fine now (touch wood) but I still think about work in terms of what would happen if anything were to happen to me. These days all of my client work is on distributed source control, which makes getting the code out to clients very easy if anything bad were to happen. I also try and store any useful/important information about the code that can't be gleaned from the comments in readme files as well to help things along.

It might seem a bit morbid, but as a developer, I've come across many, many instances where a developer has buggered off mid project, not leaving much behind and then had to go in and try and salvage the project. So I'm always keen to make sure that if anything does happen to me, my client's aren't screwed.

Do you have any contingency plans in place in case anything happens to you? I'd be interested to know what others do for this sort of thing!

Time to Upgrade

You may have seen my laptop at various UK hackathons and conferences. It's a bit of a monster. It's got a full sized 17" screen (none of this widescreen malarkey), contains a desktop motherboard and processor (a fast quad core one at that), has 16GB of RAM, and can hold up to 3 hard drives (it's currently sportins 1.5TB worth of SSD and spinners). It's the most powerful machine I've ever owned, there's nothing on it that can't be replaced or upgraded (indeed it's had several life prolonging upgrades in the 5+ years I've had it) and it's by far and away one of the best laptops I've owned in the last decade.

That's the good stuff. Here's the downside, it's big. Think of the biggest 17" laptop you've owned, then double it, in both size, and weight. It's bulky, it weighs nearly 10KG including the power brick (which is actually the size of a house brick, if not slightly larger), and the battery life is a comical joke. Brand new, I got a mighty 1 hour and 15 minutes unplugged, and these days I'm lucky if I get 5 minutes. I cycle to work a lot now, and it's got to the point where I have a power brick at home and one in my client's office, just so I don't have to carry the extra weight. Taking it to events like Codegarden or other European events isn't practical, the machine accounts for pretty much my entire carry on allowance all by itself (plus carry it around for three days would be a nightmare).

Now that the battery is on it's way out, I'm starting to think about upgrading to something new, and this time, rather than just going for something that's a powerhouse, I'm going to try and balance power and practicality.

My criteria are that it must be powerful enough to do serious dev work on, enough grunt for some light RTS gaming would be a bonus, but not essential. Light enough that I can chuck it in a bag with other stuff, rather than it's own dedicted bag of doom. I'd quite like it to last at least 4 years as well.

I'm currently mulling over one of three options:

1) Bite the bullet, and get a Macbook Pro, a lot of web devs I know use them now, and I can run all the Windows stuff I need in either a VM or Bootcamp (probably a VM though). Pros: it weighs fuck all, it's well built, they hold their value well, the retina screen is nice, and hipsters will think I'm one of them. Cons: it's expensive, the specs aren't great for the money, it's not user upgradeable/repairable, I have to buy a load of additional adaptors for things like Ethernet/DVI/VGI that most real businesses use, oh and the freaky keyboard layout. This one is tempting on the weight alone though and the amount of good things I've heard from the folks I know who've made the jump.

2) Get something with plenty of grunt, that's big, but not as berzerk as my current rig. I'm thinking Alienware M17, or one of the 17" Clevo laptops that isn't a full desktop in a box like my current one. Pros: much better bang for my buck, bigger screen, easily repairable/upgradeable, all the ports I'll need are actually built in. Cons: still quite big and heavy (albeit almost half of what my current setup weighs in at).

3) Something halfway inbetween, like a Lenovo or something. Not really sure what's out there on this front, as I normally tend towards the more powerful end of laptops. Pros: cheaper! mosty upgradeable. Cons: probably won't last quite as long as my current rig.

I'd be interested to hear what other web dev types are using laptop wise. Are you one of the hip Macbook kids? How do you find it? Is it all sunshine and roses, or are there downsides too? Do you have a workhorse Windows laptop that's a good balance of performance and practicality that you'd recommend? Anything to avoid like the plague (back in the day I remember there being some terrible build issues with Vaios for example).

Please let me know your thoughts in the comments! I'm genuinely interested to find out what folks are using!

Using URL Rewriting to Restrict Access

If like me, you use Umbraco, you'll probably be familiar with the UrlRewriting.Net module that the site uses that can be used to create rewrites and redirects on your site. However, if your site is running IIS7 or later, you should really be using the IIS Url Rewrite Module instead. It's MUCH faster, supports more advanced rule matching and conditions that UrlRewriting.Net, and is extensible too if you want to write your own rewrite matching code.

If you've never come across the module before, you can learn all about it's many features and there's a ton of useful tutorials and info over on the IIS.net website.

I'm going to assume that you're familiar with how the module works, and I'm going to show you a couple of nifty tricks that you can use to use the module to restrict acess to your site, say during testing, or an Umbraco upgrade, and how to do it in an SEO friendly way.

First, how can you restrict access to the site?

Lets say you're updating a section of your website and you want to lock people out of the section temporarily. I'd normally create a page that tells the user about this, and then create a rule something like this:

<rule name="Restrict Access to Umbraco" stopProcessing="true">  
    <match url="^/umbraco/(.*)" />
    <conditions>
        <add input="{REMOTE_ADDR}" pattern="123\.123\.123\.123" />
    </conditions>
    <action type="Rewrite" url="/update-notice/" />
</rule>

How the rule works is that it checks the path for the path ("/umbraco/" in this example) and if their IP address doesn't match a specified address (you can add as many clauses as you want for different addresses), they're shown a rewritten update notification page ("/update-notice/"). IN this example, the original URL is kept, but you could change the rule to a redirect if you'd prefer.

Secondly, how can we make it more SEO friendly?

The above approach is fine for quick stuff, or things that need to be permanently locked down, but what about SEO? What am I talking about? Let's say you lock everyone out of your site while performing an Umbraco upgrade, what happens when Google or any of the other search engines try and spider the site while you've locked them out? They'll probably see the page you've set up, and flag that the content has been redirected (or re-written, depending on how you've implemented the rule). This can negatively affect your SEO. What you REALLY want to do is return a 503 HTTP status. This tells the visiting client that the page is unavailable, but only temporarily, due to server maintenance. This will mean that Google will ignore the fact that your site is down, and stop indexing and try again later (and most other search bots will do the same).

So here's an example rule that returns a 503 status for the entire site, EXCEPT for a specific IP address:

<rule name="Return 503 For Whole Site" stopProcessing="true">  
    <match url=".*" />
    <conditions>
        <add input="{REMOTE_ADDR}" pattern="123\.123\.123\.123" />
    </conditions>
    <action type="CustomResponse" statusCode="503" subStatusCode="0" statusReason="Site is unavailable" statusDescription="Site is down for maintenance" />
</rule>

This works very similarly to the previous rule, except that the ENTIRE site returns a 503, unless you are coming from the specified IP address. Using this technique, it is possible to safely make the site unavailable for users/search bots, while still having it available to you for testing etc.

There's a lot more that you can do with the module, and I shall post some more tutorials soon, mostly focused around SEO!

:)

Upgrading Umbraco

I was recently asked to upgrade the second ever Umbraco site I built from 4.0, all the way up to 6.1.6 (if possible). I was expecting the process to be quite painful, as they used a lot of old legacy DataTypes and packages (to be expected with the age of the site), but I was actually pleasantly surprised that performing the upgrade went pretty smoothly. It's just a bit time consuming!

I erred on the side of caution, and stepped through several versions to get from A to B. You could probably get away with less versions, but I wanted to play it safe! The versions I jumped through were:

  • 4.5
  • 4.6.1
  • 4.8
  • 4.9
  • 4.11.4
  • 4.11.10
  • 6.0.5
  • 6.1.6

Before you get started, I would recommend downloading the excellent WinMerge (or similar). A decent merge tool will make the upgrade process so much easier! Also read up on the general Umbraco upgrade advice, and the version specific upgrade advice. You can also check the release notes for each version you step through, as they sometimes have additional useful information in. These can be reached from the downloads page on our.

Make sure that you take a database backup at every step of the way, and a backup of the site files (I put everything into source control so I can step back to different versions if need be, and checked in after each successful upgrade).

For most versions, the process is the same, copy the "/bin", "/umbraco_client" and "/install" folders from the updated version into your site. Then copy everything in the "/umbraco" folder EXCEPT for the "/config" folder. Next, fire up WinMerge, and merge the following folders and files from the new version to your site:

  • /config
  • /umbraco/config
  • /web.config

This step is extra important, as if you just overwite these files, you will lose all of your custom settings and dictionary items, which is a MASSIVE pain. Once that's done, run the site. You will get the installer, and step through it to upgrade the site. Test your site thoroughly, and repeat for each version!

In addition to the gotchas that are mentioned in the version specific upgrades documentation, I ran into a few additional gotachas which I'll list here for anyone else attempting the same thing:

  • if you step through 4.7, in addition to the DLLs that the version notes say to remove, delete the formHandlers DLL and the VistaDB DLLs. Otherwise all of your XSLT macros will break!
  • At 4.8, if you are upgrading from v4 (I'm not sure if this will be an issue if upgrading from later versions), you may find that your images embedded in the Richtext editor don't work any more. This is because there is a ~ in all of the paths. If this happens, run the script here and republish your site content.
  • Also at 4.8, if you have a Richtext Editor with the context menu disabled, it may stop rendering in the back office. Switch the context menu back on to fix this, and then turn it off again once you've finished upgrading your site.
  • 4.8 also breaks uComponents, you'll need to either update uComponets, or use the assembly binding workaround found here.
  • At 4.9, it's highly likely that Contour will stop working. Upgrade Contour and you should be good. This was caused by some updates to JQuery in the CMS breaking some dependencies in the CMS.
  • 6.0.5 you may find that you need to restart the app pool and clear the Examine indexes, otherwise you'll get null reference errors on the front end and back office. Restarting the app pool fixes these.

Also be sure to test all of your 3rd part DataTypes and extensions. I was pretty lucky, all of mine worked, bar one, which use log4net, which broke when I hit 4.11.10 (when log4net started shipping with umbraco). I fixed it by updaing the package, but I could also have used assembly binding like the uComponents fix.

That's pretty much it! It's a bit daunting if you're not overly technical, but as long as you're patient and careful, performing the upgrade didn't seem to be too painful. I hope this helps anyone else who attempts such a big jump!

Fixing a Bug with the RTE Editor in Chrome

Last year, there was an update to Chrome that caused a bit of a headache for some my client's editors. In the back office, if they tried to merge block level items, like paragraphs or list items, wierd stuff started happening.

Here's some example copy in the RTE in an affected site:

RTE1

Now, I stick the cursor at the beginning of a paragraph and hit delete to merge two paragraphs, and this happens (note the second paragraph has gone tiny):

RTE2

WTF? This doesn't happen in any other browsers, just Chrome. Lets look at the HTML source of the RTE text and see what's going on:

RTE3

As you can see, Chrome has caused the RTE to wrap the second paragraph in several spans, and has added a load of inline line heights to the anchor tags. Not good. I waited to see if a future update to Chrome would fix this, it didn't. I have however figured out what causes it to freak out. Chrome doesnt like font sizes or line heights on the BODY or P tags in your RTE stylesheet to be defined in EMs for some reason. Switch the units to PX in your CMS stylesheet, clear your browser history and reload the CMS, and the issue should disappear.

I hope this helps anyone else who's run into this issue!