How I manage my Wordpress

Apparently, Wordpress is famous for its 5 minute install procedure, and claims upgrading Wordpress is even easiier. And to be fair, it is a reasonably straightforward three (four?) steps:

  • Step 0: Before You Get Started: Backup and deactivate plugins.
  • Step 1: Replace WordPress files: Extract the new tarball over your existing installation. With special notes about what files you need to be careful to preserve.
  • Step 2: Upgrade your installation: Hit your wp-admin/upgrade.php URL, which nicely upgrades your DB.
  • Step 3: Do something nice for yourself.

My problem is I’m always, always recalcitrant in upgrading Wordpress, because I cannot help but shirk at Step 1. Have I preserved the correct files (I have a whole lot of custom static content that sits alongside Wordpress)? Did I make any changes anywhere that I need to keep (I once change a core Wordpress file to work around a bug)? How do I even tell if I’ve accidentally overwritten the wrong file? And at about this stage it gets thrown into the too-hard basket, to be retried next weekend.

But not anymore!

Thanks to funionfs I no longer have first-step fear. And while some of you may think that fiddling with /etc/fstab and yum is a level of complexity well beyond Step 1, I can honestly say that this is what I consider an elegant solution.

funionfs

funionfs is a union filesystem, and sits on top of FUSE (Filesystems in Userspace).

A union filesystem is something I’ve pondered the existence of before (and trust Ivan to know exactly what I wanted). They allow you to fold up a set of separate directory trees and have them appear as one. One of the directories is usually read-write (with copy-on-write), while the others are read-only.

I recently moved madbean.com to a new FC8 box, and low and behold — sudo yum install funionfs just worked!

What’s in my docroot?

I have a reasonable chunk of static content (images, flash animations, software archives, movie downloads, etc) that I keep in a Subversion repository and deploy to this website via rsync. This content existed before I started using Wordpress, and will exist if I ever stop using Wordpress, so it is not appropriate content for Wordpress to own.

I have Wordpress, which is a whole bunch of .php and what-not.

I have my all my files that sit on top of Wordpress. My wp-config.php config file, the .htaccess file that Wordpress generates so my URLs look cool, some plugins and my theme. It is these files that cause my Step 1 fears. (And in fact, these fears prevent me from making some much needed changes to my theme, too).

All these files, with their different sources and different life-cycles used to be clumped into the one scary directory.

What’s where now?

Now, I have three different directories:

  • /home/matt/madbean.com/static: My rsync-ed static content.
  • /home/matt/madbean.com/wordpress-2.1-orig: An extracted wordpress-2.1.tar.gz with no modifications.
  • /home/matt/madbean.com/wp_data: my Wordpress config, plugins, themes, etc.
  • /home/matt/madbean.com/wordpress_all: An empty directory.

After a bit of fiddling with funionfs options, I settled on a mount like this:

sudo funionfs -o dirs=\
/home/matt/madbean.com/wordpress-2.1-orig=RO:\
/home/matt/madbean.com/static=RO:\
/home/matt/madbean.com/wp_data=RW:\
 NONE /home/matt/madbean.com/wordpress_all

After running that, wordpress_all contains exactly what Wordpress wants to see: a big mishmash. Any writes Wordpress makes (e.g. to configuration or .htaccess) get written through to wp_data. Each time I rsync my static content to static it is automatically visible in wordpress_all. And as you will see below, upgrading is a scream.

To ensure this union mount exists next time the box reboots, I converted the above funionfs instruction into an /etc/fstab entry:

funionfs#/home/matt/madbean.com/wp_data /home/matt/madbean.com/wordpress_all fuse rw,nosuid,nodev,allow_other,dirs=/home/matt/madbean.com/wordpress-2.3.1=RO:/home/matt/madbean.com/static=RO 0 0

Upgrading

Having set that up, it was now time to finally upgrade from Wordpress 2.1. This is what it looked like:

$ cd ~/madbean.com
$ wget http://wordpress.org/wordpress-2.3.1.tar.gz
$ tar fvxz wordpress-2.3.1.tar.gz 
$ mv wordpress wordpress-2.3.1
$ sudo vi /etc/fstab
$ # change the line to refer to wordpress-2.3.1 instead of wordpress-2.1
$ sudo umount /home/matt/madbean.com/wordpress_all
$ sudo mount funionfs#/home/matt/madbean.com/wp_data
$ sudo /etc/init.d/httpd graceful   # for good measure
$ # hit upgrade.pgp in my browser

Do you know how happy that made me?

Next steps

I’m thinking of making the static and wp_data directories Subversion workspaces (checked out directories). I can then version control my Wordpress config. And by being able to remotely edit my theme and check it in (and check it out on a test Wordpress server) I’m finally likely to make some changes.

On Balance

There used to be an SBS program that aired late Saturday nights called Eat Carpet (on wayback). It featured a handful of short films each week and was standard viewing for me for quite a few years after I finished Uni.

I don’t know exactly when it was, but it was on Eat Carpet that I saw the best animated short I had ever, and still have ever, seen. After that I would often watch Eat Carpet just on the hope they would show it again. The animation itself was good — the movement, sound and mood where all perfectly matched — but I think it stuck in my mind mostly because of its poignant comment on the human condition.

For some reason that animation popped into my head today, so it was time to stretch my Google-search skills and see if I could find it. The combo of “short film animated four men box” finally did it. Which is lucky because it turns out it contain five men, not four.

The film is called “Balance” (Wikipedia, IMDb), and actually won the Oscar for Best Animated Short in 1989.

Good old internet. And on You Tube too, so without further ado:

Talking nerdy

So, as I said 3 months ago, I’m now at Atlassian. I couldn’t imagine a workplace more compatible with the old Cenqua lifestyle. I mean, we had a DnD group up and running in the first few weeks!

Atlassian has a rich and vibrant technical culture — the internal blogs are pure bliss. And there is always room for a bit of fun, which lead to the following little video blog:

Talking Nerdy

(Apologies if the sound is a little off. It’s not too bad considering it was all done with the movie-mode on my digital camera.)

Temporary Service Interruption

Once again, I forgot to renew my DNS hosting this year, so apologies to any problems that caused. It’s not like my DNS hosting provider didn’t send me enough warning emails (actually they rock) — I just didn’t read them.

This time I renewed for 5 years, so you won’t experience this problem again until late 2012.

The Pharyngula mutating genre meme

My parent is PZ Myers.

1) The best time travel novel in SF/Fantasy is…

Dirk Gently’s Holistic Detective Agency, by Douglas Adams.

2) The best romantic movie in historical fiction is…

Erik the Viking.

3) The best nerd song in rock is…

Code Monkey, by Jonathan Coulton.


The Pharyngula mutating genre meme

There are a set of questions above that are all of the form, “The best [subgenre] [medium] in [genre] is…”. Copy the questions, and before answering them, you may modify them in a limited way, carrying out no more than two of these operations:

  • You can leave them exactly as is.

  • You can delete any one question.

  • You can mutate either the genre, medium, or subgenre of any one question. For instance, you could change “The best time travel novel in SF/Fantasy is…” to “The best time travel novel in Westerns is…”, or “The best time travel movie in SF/Fantasy is…”, or “The best romance novel in SF/Fantasy is…”.

  • You can add a completely new question of your choice to the end of the list, as long as it is still in the form “The best [subgenre] [medium] in [genre] is…”.

You must have at least one question in your set, or you’ve gone extinct, and you must be able to answer it yourself, or you’re not viable.

Then answer your possibly mutant set of questions. Please do include a link back to the blog you got them from, to simplify tracing the ancestry, and include these instructions.

Finally, pass it along to any number of your fellow bloggers. Remember, though, your success as a Darwinian replicator is going to be measured by the propagation of your variants, which is going to be a function of both the interest your well-honed questions generate and the number of successful attempts at reproducing them.

Goodbye, Hello

Today, Atlassian acquired Cenqua. More details here.

Kinda seems surreal typing that in. But without a doubt exciting. Certainly seems surreal that I’ll be moving to Sydney, but that is real exciting too.

Not much more to say than that at the moment, other than it is full steam ahead on making FishEye, Crucible and Clover kick more arse than ever before. And looking forward to catching up with a lot of the Sydney crowd.

Just a theory

Creationism vs. Evolution is a hot topic at the moment. A common criticism (or more often: slur) against Evolution is that it is “just” a theory. It is so easy to roll your eyes at this, but it is a criticism that is not without merit if only because the word has an overloaded meaning:

  • Common usage; “in theory” as opposed to, and often different to, “in practice”.
  • Scientific usage.
  • Mathematical usage; a truth derived from fact.

To any slur against Evolution on its basis as a “theory”, you need to shift the person from the common usage of the word to the scientific. My problem is I’ve often found explaining the scientific method to a novice very hard. A slippery-slope of “weak” prepositions that seems a far cry from the popular view of science and scientific certainty.

So it was nice to find this quote today that I think sums it up quite well (via about.com):

“A theory is a meta-scientific elaboration, which is distinct from, but in harmony with, the results of observation. With the help of such a theory a group of data and independent facts can be related to one another and interpreted in one comprehensive explanation. The theory proves its validity by the measure to which it can be verified. It is constantly being tested against the facts; when it can no longer explain these facts, it shows its limits and its lack of usefulness, and it must be revised.”

This is from a 1996 writing by Pope John Paul II to the Pontifical Academy of Sciences (full text).

I like this quote because it moves a “weakness” of scientific theories — a theory is not a truth but merely something that matches the facts — to a strength: their explanatory power.

Explaining power and truth

Scientific theories are not truths.

Or rather, they may be true but we don’t care about that so much. We only care a) if they are demonstrably not true, and more importantly b) that they are useful. There is no better example of this than Newtonian physics, which is a theory of how objects should move. Newtonian physics is demonstrably false. But the predictions (explanations) it makes for every-day sized objects are very very very close to correct. In addition, Newtonian calculations are much easier to do than the calculations of Relativistic physics (which is the rival theory). So Newtonian theory is useful.

And many other things being equal, useful trumps truth.

Well, perhaps that is a bit hyperbolic. Maybe it just trumps being false.

Anyway, and going back to the late Pontiff’s quote, we must keep these two things separate:

  • the extent to which a theory matches observations made so far; and
  • accepting something as a fact.

The first of these is the domain of the scientific method. Which is a very interesting domain, and one I have had fair exposure to.

The second of these is the domain of philosophy, epistemology (study of knowledge) and belief. Which is also very interesting, but one to which I am new.

Serving one Apache site from two parallel directories

Some of you may say “whytf umofo”, and some may say “I’ve always wanted to be able to do that!”. This hack is for the later, but I will try below to explain to the former why it is useful. If anyone knows of an easier way to do it, please let me know.

Apache httpd serves static content out of its DocumentRoot :

DocumentRoot /usr/local/apache/htdocs
<Directory /usr/local/apache/htdocs>
  Order allow,deny
  Allow from all
</Directory>

The contents of that location in the filesystem might look like:

/usr/local/apache/htdocs/index.php
/usr/local/apache/htdocs/images/a.png
/usr/local/apache/htdocs/images/b.png
/usr/local/apache/htdocs/images/c.png

And to a web browser, the site looks like:

/index.php
/images/a.png
/images/b.png
/images/c.png

All very vanilla. But sometimes you want to be able to store the site in two parallel and overlapping directories in the filesystem, without changing the way it is presented to the browser.

/usr/local/apache/htdocs/index.php
/usr/local/apache/htdocs/images/a.png
/home/matt/alt_htdocs/images/b.png
/home/matt/alt_htdocs/images/c.png

If you don’t have parallel or overlapping requirements, then Alias is your friend. If you do, read on.

The Hack

Do this:

DocumentRoot /usr/local/apache/htdocs
<Directory /usr/local/apache/htdocs>
  Order allow,deny
  Allow from all
</Directory>

RewriteEngine on

RewriteCond "/home/matt/alt_htdocs%{REQUEST_URI}" -f [OR]
RewriteCond "/home/matt/alt_htdocs%{REQUEST_URI}" -d
RewriteRule ^/?(.*)$ /home/matt/alt_htdocs/$1 [L]

<Directory /home/matt/alt_htdocs>
  Order allow,deny
  Allow from all
</Directory>

If you don’t want to serve directories from the alternate docroot (Options +Indexes) then you don’t need the RewriteCond with the -d. Remove it and the [OR] from the previous line.

If you want to add a restriction to the alternate docroot, for example only allow the images directory, then put that in your regex:

RewriteCond "/home/matt/alt_htdocs%{REQUEST_URI}" -f [OR]
RewriteCond "/home/matt/alt_htdocs%{REQUEST_URI}" -d
RewriteRule ^/?(images/.+)$ /home/matt/alt_htdocs/$1 [L]

If you want three or four or five alternate docroots, just copy-and-paste the three rewrite lines as necessary. And remember you may need a <Directory> section for each location.

How it works

If you see a file or directory in the alternate docroot, then serve it. Otherwise: DocumentRoot.

The RewriteConds look into the alternate docroot, and checks if a file (-f) or directory (-d) exists under there that matches the REQUEST_URI, which is something like /index.php or /images/b.png.

If either/both of the RewriteConds match, then the RewriteRule runs. If its regex matches, then we give Apache the explicit filesystem path it should serve. If no such rules match, then the DocumentRoot comes into play.

In some situations (if you are doing further rewrites) then you may not want the [L], which instructs mod_rewrite to run no further rules for this request.

Untested

Today is the first day I’ve used this hack, so YMMV. But it seems to work very well for static files. Preliminary testing also indicates it works for .php files (in both the normal and alternate docroot). I doubt it would work if trying to include one .php into another across docroots.

The Use Case

Why would anyone, or even myself, find this useful?

Websites tend to end up like my son’s food at the end of dinner: all mushed up into a claggy mess. You may be running a couple of PHP apps, a couple of your own apps, in addition to a bunch of static files. And you may care about permalinks. And sometimes all these things overlap in the filesystem.

One solution is to copy everything into the one docroot. When it comes time to upgrade a component, you have to selectively pull out the old bits and dump in the new bits, without overwriting everything else. That sucks, and is why I always hate upgrading my WordPress instance.

The other solution is to put each component in its own directory. Upgrading a component is then the graceful process of deleting a directory and replacing it with new content. Separate directories can also have differing permissions, so that they can be edited by different people or programs.

If your components don’t overlap, then vanilla rewrites or Aliases work very well. Otherwise this hack may come in handy.

Further work

I’m sure this could be done much more easily with a custom module, in the vein of VirtualDocumentRoot. Ideally it would be nice to say (with options for specifying priority):

DocumentRoot /usr/local/apache/htdocs
AltDocumentRoot /home/matt/alt_htdocs

It would be also nice to be able to support parallel-overlapping views in the filesystem proper. A kind of “mount” that presented a view of several parallel directories.

JavaOne Wrapup: days 2 to 4

I’m now back here in Sydney waiting for my connecting flight back to Canberra. Great-googamooga the last few days have been a whirl, and hence a lack of blogging.

Day Two (Wednesday)

(I didn’t have my camera with me this day.)

A good day at the booth. I had a couple of Technical Sessions on my schedule, but it was a busy day on the floor.

The Java Posse was walking around interviewing the vendors, I’m sure it is going to be a very interesting podcast. They stopped by our booth, so listen in to that podcast if you want to find out what code-coverage our Clover product achieves.

The first event of the evening was the Adobe party, at the poolroom in Jillian’s (in the Metronone). Open bar, good food, lots of nerds, pool tables. What more could you want. Joe Nuxoll taught us how to play “cut throat”, which is an awesome 3-player (or 3 teams of 2) game. Kind of a cross between billiards, Risk and Diplomacy.

Next was the Google party, and while at a much swisher location, didn’t quite achieve the same vibe. But full of interesting people. I spent a lot of the night chatting with this very nice chap from the Google-mobile team in London.

Day ended around 3pm after a quick trip to Loui’s Diner for some pancakes.

Day Three (Thursday)

(I didn’t have my camera this day either… perhaps a good thing.)

This was the last day on the booth. Didn’t get to any technical session but spoke to a heap of interesting punters. In previous years, I was a reasonably dedicated schwag hunter, but there are only so many flashing buttons and mouse-pads that you need. I picked up a Duke plush doll, and a couple of Sun mugs with funny phrases on them (the details of which allude me right now, blame it on the timezone shift). One of the coolest schwag items (beside our own t-shirts, of course, of which we ran out earlier that day) was a cool blue/pink ball (from Terracotta I think). It was blue, and if you threw it up it would kind of turn inside out and when you caught it it would have turned pink. I suppose you had to be there.

Later that afternoon we decided to organize what will hopefully become the Inaugural Cenqua Just-In-Time JavaOne party. To protect the innocent, and perhaps not so innocent, I won’t go into too much details about who we managed to drag along. Let’s just say it involved a little obfuscation. There were some abstractions in the design that definitely did not leak, no matter how hard we looked.

The day ended again around 3pm, with another trip to Loui’s. Well, for some of us it ended at 3pm: some were still arriving back at the hotel when I was getting up for the General Session on day 4.

Day Four (Friday)

The last day. Fighting a hangover that was much smaller than it deserved to be, I headed out for the “Toy Show” General Session. This was pretty fun, and like each year James makes a great host. (I should really try getting to the other General Sessions and Keynotes next year.)

The show started with a set of “tycho” (spelling?) drummers, which was really fun.

Roman Sholopsk showed the “DTrace Light” / “DLight” visualizer. This would actually be really really useful if dtrace ran on something other than Solaris.

Tor Norbye a gave “mashup” presentation showing off the new Netbeans. I can’t say that the refactorings and tools on show in Netbeans were anything I hadn’t seen before in IntelliJ IDEA, aside perhaps from the great JRuby support. Tor’s style and presentation was top notch: even though he talked fast, clicked around the screen fast, and presented a lot of dense information, I was always able to grok what he was saying and as I then started to wonder about how you would do X, he started showing how to do X. A very cohesive and coherent and grokkable presentation.

There was a demo of the Blu-Ray technology: the whole menu-system jobbie in Blu-Ray is a Java derivative. Very impressive actually.

A couple of guys from Cinegistics showed an app for use when setting up video shots. Plug your HD camera into a laptop, and this (almost 100%) Java Swing app shows the scene, can highlight light/audio problems etc. The most impressive thing was that all the number crunching was done in Java. I have seen a few things at JavaOne that I wouldn’t have given credit as implementable in Java.

Those Java-enabled robots made an appearance. They are very cute, I went and checked out their booth the previous day. This following robotic arm was able of achieving rapid movements in access of 10g. All in RealTime Java. Impressive.

They “flew” in (suspended from wires) Paul Perrone’s remote helicopter, which has a 3D laser imaging system on the bottom. It was able to take these great 1000-scan-per-second 3D linear maps of the stage, with James and Paul lying on the floor. All the imaging and stability processing was done in RT Java. I think that’s great.

After a trip to the Pork Shop for breakfast, and Ritual Roasters for coffee, I headed back to JavaOne for Martin Odersky’s Scala talk.

Scala is very, very interesting.

And that, as they say, is the end. Another great JavaOne.

JavaOne day one

Woi, and intense, exhausting, exciting day yesterday.

In typical form, we managed to setup our booth (above) and demos just moments before the Exhibitor’s Pavilion opened. The first day on the floor is always a killer: 11:30am to 8:30pm. I was wise and kept up my sustenance over that period; an apple for breakfast and an Oreo for lunch.

It was my turn to be the media whore today. Lucky I had had a shave. First up was an interview with SYSCON-TV http://soa.sys-con.com/read/372918.htm (the title is a little OT, and I’m pretty sure I didn’t use any of those exact words, but the gist is right). I was also interviewed by Frank and Bill for an Artima podcast. They both ask great questions and it was a lot of fun chatting to them.

Against one of the far wall in the Pavilion is one of those Sun datacenters-in-a-cargo-box thingies on the back of a huge semi trailer. High candy value, I’ll try and take some internal photos tomorrow.

I managed to sneak away from the Cenqua booth to go see Neal Grafter’s Closure technical session. He does a lot of pointing.

Neal’s explanation of his Closure proposal is thorough and clear. I got up and asked him a question during the Q&A, but managed to completely dilute my real question with qualifications. I’ll try and write more about that later, if I can get my head together.

At the end of the day I hit the Closure and Java Posse BOFs. The Closure BOF ended up as mostly a re-cap of the previous technical session. The Posse’s BOF was great, though not all of us found it enthralling as others:

After that some of the people at the Posse BOF went to the pub for a few well-desereved coldies.

phew now starts Day Two…