Archive for 2010

Screenshots in LDXE

This is how I setup lxde (on Fedora 14) to take screenshots.

  • Install the gnome-utils package. This contains the gnome-screenshot program. It’s possible to avoid this by using imagemagick or scrot, but I couldn’t find a way to make them take shots of the active window (the usual alt+printscreen behaviour)
  • Insert the lines below into the keybind section of ~/.config/openbox/lxde-rc.xml


    <keybind key="Print">
      <action name="Execute">
        <command>gnome-screenshot</command>
      </action>
    </keybind>
    <keybind key="A-Print">
      <action name="Execute">
        <command>gnome-screenshot -w </command>
      </action>
    </keybind>

Simples 😀

Vim Nano

Or, how to make vim behave a lot more like nano

My vimrc:

" backspace anything
set backspace=indent,eol,start

" indent plz
set autoindent

" I never liked vi
set nocompatible

" can haz shiny
syntax on
filetype plugin indent on

" +++ Make it obvious which mode we are in
set laststatus=2 " always show status line
set statusline=%F%m%r%h%w[%L][%{&ff}]%y[%p%%][%04l,%04v]
highlight Comment ctermfg=lightblue
highlight StatusLine ctermfg=yellow ctermbg=red cterm=BOLD

" no wrapping plz
set nowrap

set insertmode

" mappings
inoremap <C-l> <C-o>
inoremap <C-o> <C-o>:w
inoremap <C-c> <C-o>:q!
inoremap <C-x> <C-o>:q<CR>
inoremap <C-w> <C-o>/
inoremap <C-k> <C-o>dd
inoremap <C-u> <C-o>P

" i like to paste
set pastetoggle=<F4>

This gives you some basic nano shortcuts, ^x to quit, ^o to write, ^w to search. It can do nano style cut/paste, but only with a single line (so far). Use ^l to type regular vim commands.

Lucid, Upstart & Bridge Networking

New server arrived last week. Installed lucid (Ubuntu 10.04) and planned to run some VMs there with werdz‘s awesome rbvm.

Spent my first few hours at the machine tripping up over this nasty bug, but I’ll save that for a separate rant, this is a rant just about upstart.

Upstart is the kind of thing that’s great for laptops, they boot often, and you want them to boot quickly. Servers don’t boot quickly, they have network cards, remote access cards, raid controllers and other junk to initalize when they start. Because of this, trying to start everything on a system in parallel adds massive complexity without having anywhere near the same effect on the overall boot time.

Apart from this upstart, as it is, is half baked. It’s not ready to be included for a server distribution to go into production for 5 years. Most of the important services I have running here (bind, exim, apache, nginx) don’t even come with upstart configs, so half the system is still relying on old init scripts anyway.

The man page for mountall(8) sums it up pretty well:

This is a temporary tool until init(8) itself gains the necessary flexibility to perform this processing; you should not rely on its behaviour.

I noticed that after enabling bridge networking (for rbvm) on Monday that the dhcp server was no longer starting. After some investigation I concluded this was because of the delay between upstart finishing bringing up the network, and br0 actually being ready (about 15 seconds).

Writing an upstart config for dhcp didn’t help, it still ran before br0 was up, even though it was dependent on ‘started networking’. The only solution I could come up with was to add a prestart script to force upstart to wait before starting the dhcp server. This is what I came up with.

# dhcp3-server
#

description “DHCP Server”

start on (started networking and started dbus)
stop on (stopping networking)

expect fork

pre-start script

brstat() {
ifconfig |grep -c $BR_INTERFACE
return 0
}

BR_INTERFACE=”192.168.1.1″
BRSTAT=`brstat`

while [ $BRSTAT -lt 1 ]; do
sleep 2
BRSTAT=`brstat`
done

# allow dhcp server to write lease and pid file
mkdir -p /var/run/dhcp3-server
chown dhcpd:dhcpd /var/run/dhcp3-server
if [ ! -e /var/lib/dhcp3/dhcpd.leases ]; then
touch /var/lib/dhcp3/dhcpd.leases
fi
chown dhcpd:dhcpd /var/lib/dhcp3 /var/lib/dhcp3/dhcpd.leases
if [ -e /var/lib/dhcp3/dhcpd.leases~ ]; then
chown dhcpd:dhcpd /var/lib/dhcp3/dhcpd.leases~
fi

end script

exec /usr/sbin/dhcpd3 -q -cf /etc/dhcp3/dhcpd.conf

Why the need for the brstat() function? Upstart executes all it’s scripts with ‘/bin/sh -e’, so grep returning 1 caused the script to fail. The documentation didn’t indicate any way to change that behaviour.

After all that effort, I noticed the same problem was affecting ircd-hybrid this morning, so I’ve set a similar hack to run from /etc/rc2.d before anything else, to ensure none of the init scripts will run without the interface being up.

Home Finally

This is the second of two entries on our journey home from Nerja. Read the earlier one here

The last few hours of the journey home were significantly less eventful then the earlier ones. We left the Internet cafe about 3.30 pm, picked up some doughnuts, wandered abbout Camden for a while and then headed back to the station about 5.30. Train had loud annoying women getting drunk and yabbering in welsh. I was unimpressed. They seemed to take great enjoyment in discussing our donuts, perhaps they don’t have doughnuts in wales. One of them got up and spilled her drink all over herself at one point. I lol’d.

Arrived in Holyhead about 11pm, where the only entertainment was drinking tea and making journey small talk with other passengers, well Ornat talked, I was too tired. Coach brought is on to the boat about 2am, found our cabin and was pretty much asleep when the boat was leaving the port. Woke up a few hours later in Dublin, and back to the house by about 7am.

As planned travelled Nerja -> Granada -> Madrid -> San Sebastian -> Hendaye -> Paris -> Le Havre -> Portsmouth -> London -> Holyhead -> Dublin in 4 days, about 2900 km according to Google Maps.

69 Hours

Last Thursday we were supposed to fly home from Nerja. Due to the ash clould we had to move this to the following day. When that flight was cancelled ryanair would not offer us another flight until at least Wednesday. We began to research other options to get home, but, decided they were too expensive when Aer Lingus had reasonable priced seats on their Monday flight. On Sunday when our third flight was cancelled we decided it was time to leave anyway. This is the story of how we got from Nerja, Spain to London, England.

Sunday

5:30pm – Leave Internet cafe in Nerja with plans made to start travelling later that evening. Suddenly in a rush to pack and get out in time for the bus.

6:15pm – Leave the apartment with all the bags packed and head back into town and drop off the keys. Have enough time at the bus stop to eat the icecream that had nearly been forgotten in the fridge in the rush to pack and go.

7:15pm – On the first bus of the day, leave Nerja for Granada. It’s about a two hour journey, through some cool looking hills and tunnels.

9:15pm – Arrive in Granada. Have a few hours to kill here, so we decided to keep going past burger king and head in towards town. Didn’t manage to find much town, ended up walking in a huge circle to get back to the bus stop – at least it killed some time that would otherwise have been spent in the bus station. Got a Mc Donalds when we got back up towards the station and then waited for the bus.

Monday

12:30am – Bus left Granada for Madrid, 5 hour journey. Bus was pretty nice, had things to plug headphones into with some radio/music stuff. Was mostly awake for the first half of the journey, there was a pit stop about 2.30 and managed to get a bit of sleep after that.

5:30am – Arrived in Madrid, with two hours to make it to another bus station to catch our bus out of town. Met some guy here who’d got a flight up from lanzarote and was trying to get home too. He asked us if he was in a train station, I don’t think he’d had much sleep. After this we went down to the metro station and waited for the first train at 6am – the next bus station was on the same line a few stops away.

6.30am – All bus stations are horrible places, number three wasn’t much different. We found a crappy little cafe in the place, ornat had coffee and some kind of pastry thing. I got a can of coke which I forgot to take with me when we got up 🙁

Not much else to do around here, walked outside and there was nothing open at all, so went back downstairs to hang around and wait for super bus.

7.30am – Super Bus. Madrid to San Sebastian was next on our itinerary. Buses and trains to all other more central places were all booked up, so we were heading for the border. We had a train booking from the far side of the border but weren’t exactly sure how long it’d take to find transport accross so we wanted to leave Madrid as early as possible. The first bus of the day to San Sebastian was the afformentioned super bus.

It cost a little extra (€45 as opposed to the €30 for regular on that journey) but was totally worth it. Not only did we arrive in plenty of time, but the thing had large leather seats (3 across, not 4), extra leg room and a fucking hostess. So, on bus number three we were served snacks, coffees and sandwiches. Well, I missed the sandwiches cause I was asleep again, but ornat got some. There was also a TV with some awful Eddie Murphy movie awfully dubbed in spanish. Luckily you only had to listen to it if you had head phones.

12.45pm – Arrive in San Sebastian. This was a pretty cool looking place, and the weather was far better than what we’d left behind in the south the day earlier, but, no time to stay around and enjoy it 🙁

As soon as we got into town we started looking for a bus back out. Helpfully, the bus ticket people told us we actually wanted to get a train. Destination: Irun, the last place on Spanish side of the border we were planning to cross.

We found the little train station after a few minutes walking up into the town – Just a couple of suburban lines, nothing major looking. Got a train to Irun pretty quickly, journey was something like 15 minutes.

We were planning to get to Irun so we could walk to Hendaye on the French side of the border, but, it turned out that there were some trains that kept going past Irun and on to Hendaye.

We briefly left the station and walked around Irun. It was middle of the afternoon and pretty much everything was shut, so we headed back after a few minutes for the next train two stops down the line to Hendaye, France.

2:00pm – We arrived in Hendaye totally unprepared for what happened next. We’d met some people trying to get home and chatted with them, but, we had yet to encounter mobs of people trying to get home. In France, home of the ongoing rail strike, this all changed.

Our tickets were booked, all we needed to do was collect them from the small station’s ONE ticket machine. However, there was a queue of people that filled most of the station between us and the machine.

Between the people with no tickets and unable to get them, the people trying to get bus transfers, and the people with cancelled trains this place was… busy. I didn’t hang around too long anyway, Ornat waited in the queue while I went in search of Internet to check on our Ferry plans for the next day. Got back to the station about an hour later, Ornat had got tickets and was talking to two guys also trying to get that train and head for a ferry. The four of us found a small bar just up the hill a little and had some lunch, headed down to the station about a half hour before the train was due to leave expecting to walk up to the train and find our seats.

Our seats were gone, as were most of the seats and much of the standing room. It seems many of the people who had cancelled trains or bus connections had been told to board our train. There was one seat left, which I suggested Ornat grab. She did.

The journey pretty much continued to go downhill for the next 2/3 hours after this, as, everytime the train stopped more people tried to get on. By the time we were approaching Bordeaux half way into the journey there was no standing room left in the asiles at all that we could see.

Luckily, at this point there was an announcement that everyone who did not have a booking for the train would have to get off at Bordeaux and get on another train there that would go direct to Paris. Shockingly most people actually seemed to get off and the atmosphere qucikly improved. I don’t think I would have gotten off to wait in uncertainly for another train mob, especially since we didn’t see a single ticket inspector (probably due to the strikes).

Anyway, with things cleared up, I headed to the bar carrage. In front of me was the older woman who had been occupying my seat, who insisted on buying us drinks for all the trouble. I accepted her offer 🙂

While we were down there we got talking to the man who had been standing behind me by the train door, self appointed in charge of making sure not too many people got on our carrage at each stop – the first person we’d met who was travelling further than us – this guy (and his family) were trying to make it back to Sweden.

After heading back towards our seats we got chatting with the other people travelling with the swede. A few more drinks were had. In the end I didn’t spend much more time sitting during the second half of the journey than the first.

11.45pm The train fun had to end eventually 🙁 and we arrived in Paris a little before midnight. Ahmed, who was letting us stay with him, met us at the station. Great thing he did too, cause we’d have been totally stuck if he hadn’t come in. When we arrived in St Lazare to catch the train back to his place it turned out that it had been cancelled. The only way for us to get out there was to run and try catch the RER to La Defense.

We ran. Caught the train, although with just seconds to spare and Ornat losing her shoes running up the platform. Quick sit down on the train and then we had to run again for the next one. Slight problem, we didn’t have the right tickets for this one and no time to buy them. Solution: Jump right over the barriers and keep running…. so that’s what we did.

At the train station there was a long walk up a long hill to get to Ahmed’s. We arrived there sometime around 1am and I showered helped inflate the matress while Ornat booked the hotel for the next night and sorted out other stuff we’d need on the trip to London.

Tuesday

3:00am – Finally get to sleep.

8.15 am – Woke up about now, took great effort to acually get up. It seems that blow up matresses can be really comfortable if you’re tired enough. We were. Luckily we were able to get a bus back to the train station which only took a few minutes. We stopped down here for coffee (and totally stayed longer than planned, but it was nice)

9:30am – Back on the train to paris. We were lucky, it only made a few stops and we got into St Lazare just before 10. Our next train was at 10:50 and we had to find food and other essentials. After the mess of the previous day we wanted to be plenty early for this train.

In half an hour we made it to subway and H&M – ornat bought better shoes, I bought clean socks.

10:30am – We were the first people onto the train after they announced what platform it was leaving from. It never got as busy as we expected and there was plenty of room when it pulled out of the station at 10:50.

We had a pretty relaxing trip to Le Havre from here, I ate my subway and wore clean socks, then napped for a bit.

12.50pm – Arrive in Le Havre. It’s way bigger than I’d expected. Not entriely sure where the port is we follow the croud in front. After a few minutes we can see a ferry, and figure we’re probably heading in the right direction.

Get to the ferry terminal expecting to see lots of people trying to get home. There’s suprisingly few. We get in a queue and are checked in after a few minutes.

1.45pm – Ornat minds the bags in the ferry terminal while I head back down towards the shops to get some stuff. Get a little lost on the return, and it was far too hot. Eventually got back with wine, Jameson and a phone charger for Ornat. Forgot to buy more bottles of water 🙁

2.55pm – People are already bording as I get back to the terminal. We quickly jump in the queue and after having to wait a few minutes to get the bags loaded we walked onto the ship and found nice seats in great proximity to windows and bars (well, the only bar).

Sometime after this an announcement is made that the Port Authority in Portsmouth won’t allow the ship to dock until 10:15pm and not 9:30pm as planned. This meant that the ship would arrive after the last train to London. Some people looked worried. We looked worried.

Ornat went off to find somewhere to use her new phone charger, and came back having met two women from Belfast who were getting a minibus straight to Holyhead. A minibus that might have extra seats. We called the guys organising it, no luck on the free seats. About this time there was an announcement that there was going to be an extra train to London at 11:30. At least we had someway to keep going.

10:15pm – After piling up around the exit door for some time we were allowed off the ship. Expecting great numbers of people to be trying to get the train to London we split up at this point – I stayed waiting for the luggage to arrive while Ornat went to find the station and get train tickets.

Cold. It was cold waiting for those bags – never even thought when packing the bag up that we’d land up somewhere cold and closer to home and should have kept coats out. After about 15 minutes we were able to get the luggage unloaded and rush through passport control.

Got a taxi up to the train station after a few minutes in the queue, trying to keep going quickly expecting the piles of other people to arrive.

11:36pm – The train leaves the station for London with us on it. Us, and about 20 other people. I overheard some people saying some big ship that was expected hadn’t arrived. However they got home, I didn’t see any of the people from out boat at the train. Maybe some people made other plans, but, the demand for this special 8 carriage train was significantly less than supply.

Got the number for hotel and some details about tubes/buses (thanks Eoghan). Call the hotel to let them know we’ll be arriving later than planned.

Hotel is less central than would have been ideal, guess we weren’t the most awake when thinking about it in Paris. Would have been fine if the ferry had been allowed in on time and we’d made the tube. Start planning bus journey.

Wednesday

1:10am – Got into Waterloo station. Considered getting a taxi, but, decided to try out the bus option. Walked to the first bus stop.

1:38am – First bus arrives on time. Great start. The second bus was also on time, and the driver didn’t charge us cause we had no coins 🙂 Great service was great, arrived at the hotel without any more drama, though later than we would have liked.

5:45am – Alarm goes off. We were planning to leave at 6am to get a 7am train from Euston to try get the early ferry.

6:45am – Realise we’ve fell back asleep. We decided at this stage that since we’d missed the train we wanted to just get an extra few hours sleep.

9:30am – With the tube running journey back into London is much easier and faster than the journey the previous night.

Get into Euston station and try buy sail/rail tickets. They say they don’t sell them anymore and it has to go through the ferry. Ring the ferry. Seems the deal has been suspended temporarily. Not surprising really, the journey that a week ago would have cost us £30 is now going to cost over £100 buying the tickets seperatly.

Go out in search of an Internet cafe to plan tickets for the ferry. Found one eventually, had tea and croissants while searching 🙂

The only sailing we can get tickets on and make in time is the 2.30 am ones. Decide it’d be better to spend more time in London than in Holyhead, booked direct London -> Holyhead train for 7pm.

One last thing to check on the Internet – the location of the nearest pizza hut – something I hadn’t been able to find all week (really, I looked everywhere).

1:00pm – Having got day tickets and grabbed a tube from Euston we eventually find the Oxford St Pizza hut, and enter for it’s tasty buffet delights. This is the cleanest and best staffed Pizza Hut I’ve ever been to, would totally recommend if you’re in London and need huge amounts of buffet pizza.

2:30pm – After a few minutes walking about find an Internet cafe near the Hut. Start writing this blog (had to finish it in Dublin) 69 hours after leaving the internet cafe in Nerja.

The remainder of the journey is covered in the next entry.

LXDE Part 2

So, I’ve been using it for a few days, and it’s working nicely now.

Power Management

The battery applet on LXPanel seemed to eh, not work for me. I decided to try loading in gnome-power-manager for this. Not only does this put an accurate power gauge on the panel (in the tray area), but controls things like brightness when on power/battery. Best of all, the brightness control buttons on the keyboard now work. Created an autostart entry to start this on login.

Note (October 2012): Updating to gnome3 broke using the power manager like this, I now use the xfce power manager. I have updated the autostart entry below to reflect this. (Thanks to @lil_cain for pointing this out)


[andrew@Callandra ~]$ cat .config/autostart/power.desktop
[Desktop Entry]
Name=Power Manager
Exec=/usr/bin/xfce4-power-manager
Comment=XFCE4 Power Manager
Encoding=UTF-8
Type=Application
StartupNotify=false
X-KDE-autostart-after=panel
Icon=setroubleshoot_icon

Keyboard Indicators

For some reason this laptop comes with no indicator lights for the keyboard. I don’t understand why something would be designed like this, but there is an indicator available on LXPanel, which mostly works.

It seems to work fine when started, but, if it’s set to show only caps lock (the only one I really needed) it loads up on next login only indicating scroll lock. Only solution to this I’ve found is to keep all three indicators enabled.

Fedora, LXDE and the Dell Mini 10

So, last night I won a Dell Mini 10, and decided to try out LXDE rather than XFCE for a change (using the LXCD spin), so it’s been a little more fun to get working than it otherwise would have been 😀

LXDE

This seems pretty light and cool. The default applications are very light, but most are functional enough to use. The panel comes with just the right amount of gadgets and configurations to do everything I need in the smallest possible amount of screen space.

Software

Browser

The default web browser Midori seems cool, but just doesn’t have enough functionality to use as a firefox/chrome replacement, so I installed chrome. This mostly worked fairly well, but, it couldn’t open downloads because of xdg-open not being at all LXDE friendly.

Hacking up the terrible default path to be sensible and putting a new xdg-open in /usr/local/bin got around this though.


[andrew@Callandra ~]$ cat /usr/local/bin/xdg-open
#!/bin/bash

[ -z "$1" ] && exit 1

if echo "${1}" | egrep -q "^(https?://|www.)"; then
    exec google-chrome "${1}"
    exit 0
fi

pcmanfm "${1}"

Terminal

My biggest criticism of the LXDE terminal is that it was clearly designed by someone who didn’t love terminals like I do. It’s functional, but I can’t live without clickable links.

I tried installing the gnome-terminal, but, it too seemed to fail at opening links. Luckily the xfce terminal worked perfectly 🙂

For some reason though, F11 is mapped to FullScreen by OpenBox, which is a real pain cause I use that for screen. Eventually I found to disable that in ~/.config/openbox/config

Hardware

The hardware seems mostly good, the screen and keyboard size are most excellent (though, there’s enough room here that there could have been a Page Up/Page down button). The wireless (Broadcom 4312 *shudder*) works fine with kmod-wl from rpmfusion, and the network manager applet works great in LXDE.

Biggest problem with the hardware is the trackpad, which has the buttons integrated (like the ones on the new Mac). This is at best ‘tricky’ to use, it’s possible better drivers would help, I’m still looking.

Fedora: Please get your default paths right

Just noticed this on a clean Fedora 12 install (that I’ll talk about later).


[andrew@Callandra ~]$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/andrew/bin

Compare that to the default Ubuntu paths:

home@racetrack:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Ubuntu are right here, and Fedora is very wrong (much as it hurts me to have to say that). The point of the path is that default applications can be overridden at every level. Start from the back end, /bin. I may as the network administrator put a program of the same name (packaged) into /usr/bin to make it the default for system users. Similarly, as a local administrator I may want to put custom software, wrappers etc., into /usr/local/bin so they appear before the packaged defaults. As an end user, I might want to use my homedir to do similar

Requirements For A Usable Package Manager

Jeff writes:

What I would like to explain is why the impedance mismatch between Linux and Solaris packaging is not so much a technological divide as it is a philosophical one.

Philosophical differences are fine. Infinite diversity in infinite combinations, etc., however, regardless of the philosophy the goal of the package manager should be to make the life of the sysadmin easier, otherwise it’s not much use.

For a change this won’t be a rant about how the package set is an ancient pile of crap, we’ll assume for the sake of this discussion that you’re so concerned about stability you’re willing to live with a 6 year old version of bash. We won’t discuss how incompatible 3rd party sites are a poor substitute for the ports tree, because maybe you’re happy with a 5 year old version of nano.

The point is the tools should be independent of the packaging philosophy. They should minimise the amount of effort required to manage the system – automation is a good thing ™. On that basis, I propose that there is a minimum set of functions these tools should provide.

  • Automatic Dependency Resolution. Pretty obvious, you can’t call anything a package manager if it can’t do this.
  • Simple Upgrade. All upgrades to the packages should of course be available as packages, and there should be a simple command to upgrade all packages for which there is a new version (thanks Cian for reminding me of this one)
  • Remote Repo Support. HTTP is preferable for this, because, everyone has a http server. I don’t want to carry the Solaris 10 DVD in my pocket everywhere, and I don’t want to go around mounting NFS directories. The vendor doesn’t have to provide the package server, just support in the tools for a package server so I’m free to make my own (and, so are others)
  • Support For Multiple Repos. Blastwave has it’s own tools (yes, multiple) to actually install it’s packages. SunFreeWare relies on you doing your own manual dependency resolution (*shudder*). This is a load of shite. The package tools supplied by the operating system should allow me to define multiple sources, and rules for which source should be used. I should be free to build custom packages with dependencies against base packages if that’s what I choose (and, there’s lots of reasons to want to do this), or to maintain a separate hierarchy of independent software (like blastwave etc.) if that’s what the situation requires.
  • Simple tools to query packages, search for packages, query files. We don’t need all the bells and whistles of apt, but, we do need equivalents for ‘apt-cache search’, ‘yum info’, and ‘dpkg -S’.

Regardless of the philosophy, the point of a package manager should be to manage all the software on the system. I don’t have time to compile things, and I don’t enjoy patching things. There is no reason that you can not achieve separation of components, (eg, base and ports) while still providing binary packages for everything. The whole system should be package managed, apart from the handful of shell scripts I have sitting in /usr/local/bin ( the one place the package manager should never touch. /usr/local/ is for me to manage. This is what both FHS and the debian package policy says)

The problem with modern content management systems

Something is rotten in the state of Denmark. Seriously.

Basically, I believe that modern content management systems (Drupal, Joomla, and to some degree WordPress) have got it all horribly wrong. The fact that processing power is fast and cheap is the only factor that has allowed them to succeed in spite of this.

All of the above systems generate pages dynamically, everytime the page needs to be displayed. This works for a blog like this that no one reads, but, what about systems that do have readers? Thousands of readers? Thousands of Readers per hour? The only solution is to start to generate caches, put things behind reverse proxies, and then try to manage these systems. This is not efficient.

Rather than generate each block each time it is viewed, why not generate it each time the contents change? This is difficult to do with the above mentioned systems, but, would it be any more difficult to implement a system that did this if you were to start from scratch – I think not. I’m not proposing we abandon php, WYSIWYG editors or databases, just that we reverse the pattern, generate the html only when it changes, rather than everytime it’s viewed, or at an arbitary cache refresh interval.

On this basis, I’m going to define features that a content management system designed from the ground up for large volume systems should have:

  • HTML generated when it needs to change, as described above. This should just be written to flat files. There’s no need for a cache, operating systems are designed to cache these. There’s no need to compromise on the reuse of elements or the look and feel, generated elements and template elements can easily be combined with SSIs.
  • CSS/Js combination, compression that’s actually well desgined. Drupal tries to do this, but it fails. Firstly, it has no js compression because this feature didn’t work, but, more fundamentally, the system is designed so that the hashed file name stays the same when the file changes? What the hell use is this? How can I attach an expires header to this when the name doesn’t change with the file version?
  • Image Compression. PHP scripts and databases eat RAM and CPU, images eat bandwidth. Like memory, bandwidth is expensive. Any CMS desgined for large scale usage should handle this by default, with options that support image compression and other optimisations.
  • CDN support. Even if you don’t actually have a CDN budget, you may want to host your static content on a cookie free domain. This isn’t a new idea, it’s a well discussed way to improve performance and reduce bandwidth usage. Does drupal support this without accepting a compromise solution or hacking the core with ducttape solutions? No. There’s no technical reason not to do it, the code isn’t difficult, the thinking is just wong.
  • Content goes in the database. Settings go in the settings file. There’s two reasons for this, firstly security, if there’s a bug found in $CMS and the settings file can only be read by the executing user then the damage is somewhat more limited. The more important issue though is release management, actually being able to use your version control system. Once you combine the content and the configuration in a database ball of mud, if becomes almost impossible to make site changes in development and push them automatically into the live environment, because the changes depend on settings stored in a database. It’s just easier to do it manually than try to get a trustworthy system do do ‘stuff’ to your production database.

Other suggestions on a postcard please 🙂