Monday, February 27, 2012

Happy 17th Birthday Apache - Version 2.4 Ideal For Cloud Environments

The Apache Software Foundation celebrates the 17th Anniversary of the Apache HTTP Server with the release of version 2.4.

The Apache HTTP server is is the world's most popular Web Server, powering nearly 400 million Web sites across the globe.

I played around with version 2.4 over the weekend. It brings numerous enhancements, making Apache ideally suited for cloud environments, including:
  • lower resource utilization, better concurrency and async I/O support, bringing performance on par, or better, than pure event-driven Web servers like Nginx;
  • dynamic reverse proxy configuration;
  • more granular timeout and rate/resource limiting capability;
  • more finely-tuned caching support, tailored for high traffic servers and proxies.

More details on the Apache Software Foundation blog and a list of all the new features in the Apache HTTP server documentation.

Thursday, February 16, 2012

Tumblr Architecture - 15 Billion Page Views A Month

Interesting entry on the High Scalability blog describing the Tumblr architecture and how they're scaling to 15 billion pages a month.

A few points caught my eye:
  • Confirmation that MySQL scales just fine with sharding. More details on their sharding implementation here.
    With all the buzz around NoSQL I think people are underestimating good old SQL databases like MySQL or PostgreSQL for example.
  • Confirmation that Redis is just great.
  • Assigning users to Cells helps handle the combinatorial explosion of users x followers x posts.
    To draw an analogy with Ethernet networking, this reminds me of how you can segment a LAN using network switches to reduce bandwidth usage and congestion (as some of the traffic will stay within each cell / segment).

Monday, February 6, 2012

12 Things

Another gorgeous day in Squaw this weekend, running Giant Slalom gates on the upper mountain and training with the masters ski team!


It's a lot of fun! but requires serious mental concentration as I still need work to convert my 'old school' ski technique to the modern, and more efficient, carving ski racing technique.

Here are the 12 things I try to think about before each run: Wide, Long, Inside, Up, Forward, Pressure, Level, Angle, Early, Far, Line, Fear.
  • Keep a wide stance with the skis shoulder/hip wide.
  • Extend the outside leg as long as possible and stand on it to put the ski on edge.
  • Push the inside knee inside into the hill.
  • Keep hands up and wide, don't let the hands down.
  • Move shoulders forward in front of the hips, elbows in front of the shoulders.
  • Apply pressure on the shins and to the front of the boots all the time.
  • Keep the shoulders level, facing the fall line.
  • Angle the hip to throw the body into the next turn.
  • Apply pressure on the outside ski early to hook the edge and start carving at the top of the turn.
  • Don't look down at the skis or the next gate, look at the gates far ahead.
  • Don't try to get speed, just focus on carving a clean line around the gates, that's how you get speed.
  • Forget about fear, as it will make you make mistakes and fall. Just ignore it, and enjoy the ride and the adrenaline rush :)

I can't go next weekend as we have some dinner and party plans, so in the next few days I'm going to focus on some physical training. Hoping we get more snow in the meantime...

Tuesday, January 31, 2012

We Really Don't Know How To Compute!

One of my new year resolutions was to blog more. It's not working out yet, as I've been too busy the last few weeks. It's already Jan 31 and this is only my second blog entry this year.

I recently came across a fascinating presentation from Gerald Jay Sussman, co-author of the famous MIT computer science text book 'Structure and Interpretation of Computer Programs' and co-inventor of the Scheme programming language.

He claims that we really don't know how to compute, compares computer programs (constrained to rigid designs and difficult to adjust to a new situation) to living organisms (which can be reconfigured to implement new ways to solve a problem) and makes a convincing argument that we need drastically different programming models to approach that level of flexibility.

He then introduces the Propagator Programming Model (work supported in part by the MIT Mind Machine project). A propagator program is built as a network connecting cells and propagators. Cells collect and accumulate information. Propagators are autonomous machines which continuously examine some cells, perform computations on the information from these cells and add the results to other cells.

A propagator program is analogous to an electrical wiring diagram. To extend it and add a new way to approach a problem, you simply add and connect new propagators. Your cells now collect alternate results from different propagators, and you can then decide to merge redundant results, combine partial results, or even exclude contradictory results when some propagators do not work well in a new situation.

This is similar to how human beings resolve problems. We try several approaches, weigh and combine their results, then wire up our brain with the approaches that work well for the next time we face a similar situation.

I couldn't help but see some relation between that propagator model and my recent interests in computer programming models.

Massively Parallel programming
A propagator program is naturally parallel. Each propagator is continually watching its neighbor cells and computing new results as their values change, autonomously and in parallel with other parts of the program.

Functional programming
A propagator is like a pure function that computes results only from its inputs. A result can also be wrapped in a monad to provide information about its premises, relevance or correctness (useful to pick or combine partial results as they accumulate in a cell for example).

Web Component Assembly
The wiring diagram describing a propagator program seems to map really well to an SCA (Service Component Architecture) component assembly wiring diagram. A propagator could easily be realized as a stateless Web component providing a computation service. A cell could be realized as a Web resource accumulating and storing data.

The propagator model also seems like a great candidate to represent programming expressions as networks of connected components, a subject I researched a bit last year, but which would be too long to describe here... perhaps in another blog post.

Anyway, that got me thinking about a fun weekend project. If I find the time (no guarantee as I'm usually busy on weekends between my regular ski race training and family time), I'd like to do a little hacking and experiment with implementing a propagator program as an assembly of SCA components wired together.

How about defining two new cell and propagator SCA component types, perhaps with REST interfaces to allow propagator programs to live on the Web and play with data from some useful REST services out there?

Wouldn't that be fun?

Wednesday, January 4, 2012

Happy New Year 2012!

Happy New Year 2012 from the Delfino Family!


January 2nd, a great day in Squaw Valley: shopping for the girls, free skiing for my son, slalom gate training for me.

Just got back to work today after a long vacation. Still trying to figure out the year 2012 resolutions.

We wish you all a happy new year 2012!


The postings on this site are my own and don’t necessarily represent positions, strategies or opinions of my employer IBM.