Setting up office from a building site

Well actually, it's been a case of a building site taking over my office. As a freelancer, I have the luxury of being able to work from home, but for the last four months, our home was being renovated.

We've completely remodelled the kitchen and bathroom, added a new bedroom downstairs and added a new level upstairs with bedroom, ensuite and office — essentially the whole back half of the house was demolished and rebuilt. We were without water or electricity for nearly the whole build and had to move out to a neighbour's house around the corner. Being able to live so close to home was a blessing in so many ways — being out of your own home is disruptive enough but travel arrangements to work, school and daycare remained unchanged. There's also the financial aspect with the next best option we found to be an on-site van in a caravan park for $700/week 20 minutes away from home.

The neighbour's house did have unlimited broadband and I did spent a lot of hours working from there, but it wasn't ideal for full-time work: I couldn't easily set up my second monitor or my PC and my own particular workflow involves serving sites in development from my laptop via DynDNS which requires my IP address to be added to a setting, and the router running the network I'm on to be able to forward ports. I didn't really feel like I could move in and say: Oh and by the way, I need to fiddle with your modem.

So I actually ended up working from another neighbour's house, the one behind us, from which I could access my own network via wifi from the room closest to our house. Yes, we do have good neighbours (and it's amazing how many comments just like that we got).

The routine

We have two dogs, a labrador and a border collie (you can see them on the 404 page) and they've never been to a kennel or lived anywhere for an extended time without us so we never really considered keeping them anywhere other than at the house while it was being renovated. They're easy-going enough and don't worry about having strangers around but they fret a bit if they're left on their own and bark a bit and get destructive around the yard so we didn't want to leave them alone at the house at night after all the builders had gone for the day.

So I would actually sleep at the house every night, using a torch to find my way in where I could turn on a lamp plugged into the powerboard that was plugged into an extension cord that ran out to the temporary metre box in the back yard.

An average day would involve:

  • getting up about 6am and taking the dogs for a walk
  • go around to the neighbour's house where the rest of the family were for breakfast
  • take our eldest to school at 8:30am (he's in his first year)
  • go back to the second neighbour's house to work
  • pick up my son from school again at 3pm
  • work until 5pm when the rest of the family would get home
  • take the dogs for their afternoon walk
  • go back to the first neighbour's house for the evening — dinner, kids' bath/bedtime etc.
  • go back to our house to sleep

That routine changed a little bit for the last couple of weeks of the renovations, but that was how it worked for the majority of the time. We were staying in a granny flat under the neighbour's house so we had our own space which was great but at times it did feel a bit cramped especially when you had a three- and four-year-old getting up to crazy kid antics while you're trying to make dinner. There was also a few occasions, as I was walking out of the neighbour's at ~11pm to walk back to our house, that I wished I could just stay put. But for the most part, being out of home, and living by an unusual routine wasn't as stressful as I thought it might've been. (There was stress, but that's a story for another time.)

The build

Our renovation was relatively painless from a building point of view. There were no hidden surprises that forced us to mortgage a child to cover the extra expense. We did go over the originally quoted price, sure, but the over amount fell within the standard 10% and we'd already budgetted for it.

We had a good builder who communicated with us well and regularly, and the team of tradies he had working for him were a good bunch who did good solid work. The same can't be said of all the subbies who did different parts of the job though. But then if everything had gone completely smoothly, we wouldn't have any funny stories to tell.

Like the subbie who came to replace a broken window, without actually bringing the replacement glass with him. He didn't waste his time entirely while he was on site though; he did remove the broken glass — by just shoving it out from the second storey so that it smashed on the ground below and then left it there for someone else to clean up.

Or the chain-smoking plasterer, who was in his 70s, who apart from being a bit sloppy at his job, flicked a cigarette butt into the skip and set it on fire. He had to get a few buckets of water to put it out.

Or the guy who installed our mirrors who broke one of them getting it out of his truck. And then had the same thing happen on his second attempt. (Do you reckon glaziers live their whole lives with bad luck?)

 

The result

We're pretty happy with the way things have turned out. There's a few minor little things that still need attention that we'll have to get back to the builder about, and we're still finishing off painting the interior (doing inside ourselves and the downstairs storey outside; will need a professional to do the second storey), and we can't put carpets in upstairs (all polished floors downstairs) or blinds or curtains until the painting's finished. Which means that I have to use a sheet tacked over the window next to my desk at the moment.

But they're just minor annoyances that are easy to put up with. The kids are loving being back in their own place with all their toys and plenty of room to run around in, and we're liking the fact they have plenty of room to run around in that's not necessarily right on top of us. ;) All the extra space is great too and seems to make the place seem much tidier (because we're able to put stuff away that would normally have been left out or stored more visibly) although the house does seem a bit more echoey than before.

Of course, with any talk of renovations, there has to be the obligatory before and after shots:

The kitchen — before. Demolition had already started (didn't get around to getting a good pre-demolition photo of it).
The kitchen — after. All shiny and new and existing wooden floors which were sanded back and polished came up a treat.

There have been no comments on this entry so far. Why not be the first?

Responsive layouts with ExpressionEngine

In July I wrote about an idea I had about serving responsive images with ExpressionEngine, dynamically delivering images sized appropriately for the device on which they're being viewed, i.e. small images for mobile devices and larger ones desktop computers.

Most of the solutions that had come to light at that time involved detecting the user's screen size on the client side and then manipulating images based on that. To me, that concept didn't seem to work too well if you were using your CMS to dynamically serve up differently-sized images from the same source file. I thought there needed to be some sort of server-side involvement so that information could be passed to templates and then processing carried out appropriately. Some time after I published my post, Luke Wroblewski discussed the same sort of thing and dubbed the process RESS: Responsive Design + Server Side Components.

The idea I had originally was to use PHP to carry out device detection, AKA user agent (UA) sniffing, and then set a variable based on whatever value was returned. There are a couple of problems with that approach:

  1. As Jeremy Keith pointed out, UA sniffing can result in false positives and missing out devices not included in the device detection script.
  2. Once you've detected the device, you then need to set another variable for its size. If you want to cover a lot of devices/sizes, you have to set your script up to set a lot of variables, rather than the size variable being set dynamically as is the case when you use javascript on the client side.

So ideally, you want a combination of both client side to dynamically detect the screen size, and then server side to set that as a variable which can be accessed in your templates.

Just a day after I posted my previous article on the subject, Matt Wilcox wrote about a technique that has now become Adaptive Images, and was recently featured in 24 Ways. The basic idea is you use javascript to set a cookie and then use PHP to access that value and serve up appropriately sized images. A couple of months later and Matt Stauffer took that idea and combined with the concepts that Luke Wroblewski proposed, created a Github project called Simple-RESS, which does exactly what I mentioned above, uses client-side detection to create a server-side variable.

I'm working on a responsive design at the moment and the Simple-RESS technique seemed ideal so I created an add-on based on it (my first attempt at writing an extension too), which you can find on Github. It comprises a plugin which checks if a cookie for the screen size has been set or not, and if not, injects the javascript to do so. (I'm using jQuery to access $(window).width() I was but now I'm not and the Github repo has been udpated. See the changelog for further details.) To do this, you need to add {exp:ress:cookie} somewhere in the <head> of your templates.

With the cookie set, that value is then checked by the extension in the package which sets a global variable {ress} which you can then use in your templates, e.g. { if {ress} > 768}show desktop-only content{/if }. The extension also lets you set a default screen size for those that don't have javascript enabled. What that value should be will depend on whether you want to a take a mobile-first, or desktop-first approach.

This approach is much more flexible than the one I originally proposed because the screen size variable is set dynamically using javascript, rather than having to create a case statement that matches a screen size to every user agent string you want to check for. You can then use the variable with conditionals and case statements in your templates that match up with media queries in your CSS.

Find out what others have had to say and join the discussion.

Last mix of the year — Xmas 2011

Standout track on this mix is Ace Ventura's remix of Subinya by Loud.

The last mix for this year is (somewhat predictably) another psy trance journey, and with 28 tracks and just a touch over two hours, is one of my longer efforts (hey, I've got a lot of tunes to choose from at the moment).

Standout track on this mix is Ace Ventura's remix of Subinya by Loud. Ace has to be close to one of my favourite psy trance producers and this effort features a nice meat slab of 303 action towards the end. Other notable tracks coming from Chilean producer Ovnimoon (another favourite) and Paratech (appearing on Ovnimoon Records).

Tracklist is below and you can download it from the Mixes page.

Tracklist

  1. John 00 Fleming – Sym*bol*ism [JOOF Recordings]
  2. Nick Sentience – Stimuli
  3. Ovnimoon – Love is the Key [Ovnimoon Records]
  4. Loud – Subinya (Ace Ventura remix) [Nano Records]
  5. Allaby – Glade (Zen Mechanics remix) [Nano Records]
  6. Nick Sentience – Sub Atomic
  7. Magnus – Raven Rock [JOOF Recordings]
  8. Mantra Flow – Behind the Shadow [Panzar Produktionz]
  9. Unconscious Mind(s) – Dimension 13 (ReCreation remix) [Psychoactive Records]
  10. Dreads Control – Mr. Black (Acid Lizard remix) [Mind Tweakers Records]
  11. Ekoplex – Liquid Eyes [Sun Station Records]
  12. Mantra Flow & Resiliance – Chat Perché [Panzar Produktionz]
  13. Monkey Machine – The Holy Cure [Altar Psychedelic]
  14. Psycoholic & Alfida – Kuzlaring [Psy Spy Records]
  15. Psycho Abstract – Ketamine [Sun Station Records]
  16. The Grey Guy – Planet Rising [Cyan Music]
  17. Mesca – Weakness [Psytrance.pl]
  18. Space Element – Crows Symphony [Psytrance.pl]
  19. Paratech – Paratechnology [Ovnimoon Records]
  20. Paratech – The Key [Neurotrance Records]
  21. Keamia – Detecting Signals [Elephant Head Records]
  22. Sufi vs Digicult – Antilope [Dacru Records]
  23. Aya – Ping [Dacru Records]
  24. Hypnoxock – Future Xock (Cosmic remix) [Astronautic Records]
  25. RAZ – My Path [Side Wave Records]
  26. Hypnoxock – On a Way of Life (Live Edit 2004) [Astronautic Records]
  27. Neospherix Project – America [PsyRussia]
  28. Alien Bug – Total Eclipse [Psytrance.pl]

There have been no comments on this entry so far. Why not be the first?

When server moves go feral

Server moves, they're never ever really fun, but sometimes they're a necessity, and by the following the right sequence of steps, they are usually straightfoward: download files from current location and upload to new location; export any databases, and then import them on the new server, change config files to point to the new databases, and you should be all good.

But sometimes things don't quite go as planned and what works fine on the old server ends up broken on the new server. The first thought is usually that there's something different in the configuration of the two servers that is causing the problem. And that's what happened to me this week. I had to move a site which just had plain ol’ HTML in the root directory but a ShopperPress store in a subdomain. Transferring the static HTML files and previewing at http://ipaddress/~account-name/ was fine, but when trying to view the Wordpress installation at http://ipaddress/~account-name/store/ I got a white page with a bunch of random code being printed out and viewing the source of the page looked like this:


<?php
 
i?set($_GET['logge?']))?ession_d?oy();
}
/* ============================= PREMIUM PRESS GLOBALS ========================= */
 
 
$GLOBALS['???']['price_tag'] 			=??ion(??_pricetag");
$GLOBAL???ess'???rice?ra'] = get_optio???rice?ra");
$GLOBALS['???']['StockControl']		= ge?tion("display_ignoreQTY");
 
$GLOBALS??mpress']['showpages'] 			= get_option("displ???");
$GLOBALS??mpress']['checko?rl'] 		=??ion("che??l");
 
 
if($GLOBALS['prem??']['?lay_themecol?'] =="3" ){
$GLOBALS['ga?yblo?op'] = 2; //<-- ??ermi?hen the margin i?opped within the? ite?else{
$GLOBALS['galleryblock?'] = 3;
}
 
$GLOBALS['display_sidebar_ba?'] 		= get_option("displ?idebar_basket");

Pretty ugly and weird, huh? :? So after trying a few different things including checking permissions, uploading the files again, I thought it must be a server issue because it's working fine in it's current location. So I contacted server support and basically got told to do what I'd already done: upload all the files again. Then they said they'd have a go themselves if I uploaded the unextracted backup I'd made on the original server. Still no dice.

So then they suggested disabling all Wordpress plugins — already done — and themes. I couldn't even log in to the site's control panel to do that so changed the theme settings manually in the database which did indeed bring both the control panel and the front end of the site back to life. But of course, it looked like the default TwentyTen theme which wasn't much good to me. So I enabled the ShopperPress theme again. The control panel was still working but the front end of the site turned to spaghetti again.

Right, so it's a problem with the theme itself, I thought. OK, all I have to do is update the theme. So I downloaded an up-to-date copy of ShopperPress, uploaded and all good. But I'd made some modifications to the store on its original server recently which I wanted to retain, so redownloaded only the theme files I'd made edits to and uploaded them to the new server. Bam! Spaghetti code was back. :?

Finally, I took fresh copies of the theme files again and manually added back in my changes after comparing the files in Kaleidescope and uploaded them to the new server, and this time my changes stuck and I didn't end up with a broken site.

Using edited files from the original server, which worked fine on that server, killed the site on the new server, but using files directly from the theme download which were then edited, didn't. :? The only thing I can think of that might have made a difference is that the files that were edited were done so by mounting the old server as a disk using Transmit, whereas the changes I made for the files for the new server were done locally before being uploaded. Shouldn't make a difference, but it's the only thing I can think of.

All up, there was about five hours wasted trying to get to the bottom of this problem. In cases where I've battled against a problem but eventually found a solution, the consolation over all the time spent is usually a lesson or some new skills learnt, but in this case I don't think I really came away with anything worthwhile.

There have been no comments on this entry so far. Why not be the first?

New mix — November Rain

This mix features all three of the tracks from Wizard's Night by SETI Project.

No, not a tribute to Guns 'n' Roses, not only is this mix the second Goa Trance one I've done this year, it's also the second one whose name has been inspired by the weather, or more specifically, the lack of rain. November set a new record for lack of rain in Brisbane this year and the day I did the mix was coincidentally the same day we got some rain.

Unlike the last Goa Trance mix I did, Inner Peace, which featured tracks mostly from NeoGoa label, this mix is made up from tracks from a bunch of different labels although NeoGoa and PsyRussia feature heavily and I've used all three tracks from a single EP by SETI Project, Wizard's Night.

Tracklist is below and you can download it from the Mixes page.

Tracklist

  1. SETI Project – Insomniac [Underground Alien Factory Records]
  2. Artha – Mahabharta (Short Version) [Phototropic Records]
  3. Trinodia – Scientific Mechanism [Underground Alien Factory Records]
  4. SETI Project – Wizard's Night [Underground Alien Factory Records]
  5. Trinodia – Wars of the Gods [Underground Alien Factory Records]
  6. Ephedra – Acid Rain [Underground Alien Factory Records]
  7. Microcosm – Eternal Circle
  8. Astrancer – Blazar [Phototropic Records]
  9. Noble Savage – 7th Seal [Liquid Tune Records]
  10. SETI Project – Demons [Underground Alien Factory Records]
  11. SETI Project – Endorphin [Underground Alien Factory Records]
  12. Cyan – New Galaxy (Remix 2002) [Phototropic Records]
  13. Libra – Psychedellic Entertainment [PsyRussia]
  14. Qlipadelic Rythm – Sand Storm [PsyRussia]
  15. Microcosm – Ultimatum
  16. Pan Psychic – My God, It's Full of Stars (Remix 2007) [PsyRussia]
  17. Rabitza – Conscious [PsyRussia]
  18. Sky Technology – Back to the Future (Nova Fractal Remix) [Neogoa]
  19. Sky Technology vs Nova Fractal – Dark Energy (Versus Mix) [Neogoa]
  20. Noble Savage – Razzia [Liquid Tune Records]
  21. Amanians – Acida [Phototropic Records]
  22. Toï Doï – Worm Twist [Underground Alien Factory Records]
  23. Toï Doï – Oxigen [Underground Alien Factory Records]
  24. Noble Savage – 2012 [Liquid Tune Records]
  25. Javi – Wie Een Put Graaft Voor Een Ander Heeft Flink Gewerkt [Neogoa]
  26. Sulima – Back to Goa [PsyRussia]

There have been no comments on this entry so far. Why not be the first?