some quick bookmarks
These are really interesting/useful for explaining how the code that executes isn't the code you wrote as well as making you think about performance. A good example is the last one. As Mr Sutter explains, the swap from 80's architectures such as the VAX to modern systems was accompanied by a real change in speed of processor but without a large change in memory latency. As a result "elegant" algorithms that were right for 70s and 80s hardware are totally wrong for modern cache laden systems.
I stumbled over them a while ago, and then spent ages trying to find them again for a colleague. For some reason my google-fu was sadly deficient at work, but once sat back at home I found them within 15 minutes of trying.
Restoring Wordpress backups to a new host.
I've helped out a friend with their website recently, and it made me realise how difficult technology can still be for people who don't do this on a daily basis. Even smart people - she has a background as a professional scientist, artist and now successful businesswoman - can still require help with what on the surface appears to be the simple task of moving a website created on her mac using MAMP to the hosting company.
Although it's not hard it requires an understanding of how things fit together so here's a script I came up with for migrating her production site. I practised by restoring a wordpress backup to a clean CentOS/RHEL 6.4 server in EC2. The information was gathered from lots of blog posts, the Wordpress Codex, Mysql docs and some trial and error.
A quick post.
We have some home made cheapy frankenstorage, thats based around a low end celeron class desktop CPU. This is fine for moderate raid work, but recently I had to shovel a few terabytes between them, over the network. Making that run quickly enough led to a bit of experimentation with the speeds of the different ciphers.
Some times its hard to find a way of explaining to the technically less literate the power that the Unix shell hands you. The original ideas behing the combination wordprocessor and programmers work bench combined with the power of pipes make text processing easy.
So to today's problem - analysing GC logs for latency spikes. As we run the jvm with the following properties;
-XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime \ -XX:+PrintTenuringDistribution -Xloggc:/path/to/gc.logfile
A week ago Rhoda and I got married. It came together very smoothly, mainly down to Rhoda’s phenomenal organisational skills, as well as the wedding planner we hired – (W.E.D.). That by itself would be more than enough - but to top it off we also took a couple of side trips with our friends.
the role of the interruption monkey
I promised matt carter I'd start writing up aspects of how we run agile operations (aka devops) at LMAX. Apologies this is so overdue.
One of the major tensions in any small techical operations team is the tension between project work and "interrupt driven" work. Interrupt work is hard to define, other than the slightly circular "being anything that is not project work". In practise this ranges from problems in production through to getting users working mice.
Small IT teams are usually pretty bad at dealing with interruptions, so we've developed the concept of an "Interruption Monkey" to keep things manageable.
In this article I run through how to create a simple ticker app off the LMAX API using PHP.
LMAX is the London Multi Asset Exchange. This is a low latency financial exchange which can be accessed directly by retail customers over the web using JSON or XML over a REST based interface.
The raw protocol not that pretty, so there are client libraries written in C# and Java. For fun and monitoring, I have written an unofficial PHP client library which I'm using here.
Its a feature not a bug.
We do odd things with java, that most places would probably use C or python for. Having said that we have some very talented people who can make java do wonderful things.
However when those wonderful things require elevated privilege like CAP_NET_RAW for packet capture, we run into a problem, which is that the kernel treats any executable which has a capability assigned as being equivalent to one with the "setuid" bit set.
As Java loads shared libraries by relying on glibc doing expansion of the environment variable $ORIGIN this can get broken by the setuid bit and some rules introduced to close an exploit.