When Application and Library Cookbooks Fail

Apologies in advance if you’re not interested in a post about the guts of Opscode Chef.

I recently started to adopt Bryan Berry’s application & library cookbook model as outlined in his excellent and funny blog post, "How to Write Reusable Chef Cookbooks, Gangnam Style". But I quickly ran into a blocker, because people are trying to solve problems using the compile phase and not the execute phase of Chef. Perhaps this calls into question the entire viability of compile-phase providers like chef_gem. Continue reading

Retweets Aren’t Endorsements: Why Not?

not equalsAfter seeing yet another person whose Twitter profile says “retweets ≠ endorsements”, I feel compelled to say something. “RT ≠ endorsement” doesn’t distance you from something you’re retweeting. Rather, it’s the electronic equivalent of the annoying phrase just sayin’: a passive-aggressive way of making a statement while pretending not to have made a statement. Sorry, but I call shenanigans.

I understand that sometimes you want to comment on someone’s opinions by simply showing their own words. In that situation, why not add your voice to the conversation by prepending a couple words to the retweet, or condensing/summarizing the original tweet using a MT (Modified Tweet)? People follow you on Twitter because they want to know your perspective on things. You shouldn’t just be a mouthpiece for other people.

In short: If you don’t completely agree with or endorse an opinion on Twitter, don’t just blindly retweet it and think that “RT ≠ endorsement” will cover you. Add some color to the retweet to clarify where you stand. Not only will you show that you’re not afraid to have an opinion, but your followers will thank you for continuing the conversation. Isn’t that what Twitter is about, after all?

Image from holeymoon on Flickr. CC-licensed.

What Your CDN Won’t Tell You: Optimizing a News Website for Speed and Stability

I was recently in San Diego giving a talk at LISA ’12 entitled “What Your CDN Won’t Tell You: Optimizing a News Website for Speed and Stability“. The paper was based on work my colleague Blake Crosby and I did at the Canadian Broadcasting Corporation to rearchitect their website & integrate it successfully with Akamai‘s EdgeSuite content delivery network, enabling it to serve over a million unique visitors daily with high availability.

I’m pleased to announce that the slides from the presentation are now available, and the video (eek!) will be shortly.

Hope everyone’s having a great holiday and I promise there will be more blog posts in the New Year.

Automating Atlassian JIRA, Confluence, and Crowd Installation with Chef

As a user, I’ve always been impressed with Atlassian‘s products for software development, issue tracking and documentation. For companies who take these things seriously, JIRA, Greenhopper and Confluence are quickly becoming the go-to products, and with good reason: the products are easy to get started with but have the enterprise features that allow a company to customize workflows as their business changes. I hate to slam open-source products but just try doing what JIRA does with Bugzilla or Trac.

The products themselves, though, can be a nightmare to install, despite the fact that they are mostly just Java web applications living in a WAR file. The products have improved immensely from the days when setting them up involved hacking up a multitude of XML files in WEB-INF (though there still is some of that), and it’s still annoying that Atlassian doesn’t support running the applications as unexploded WARs within Tomcat or another servlet container, probably for the aforementioned reasons. All that aside, though, it’s satisfying when everything is working together and users can single-sign-onto the entire Atlassian suite because of the magic of Crowd, Atlassian’s SSO directory server.

Last week, I released a set of Chef cookbooks I wrote at SecondMarket to ease the installation of the Atlassian tools on a server. I’m still looking to automate more parts of this, including the ability to edit the aforementioned XML files in-place in an idempotent way, so pull requests against our GitHub repo would be welcome.

Special Note on Using Atlassian Products in the Amazon Cloud

I should also mention that my first attempt to set up Atlassian’s products using Amazon Relational Database Service (RDS) as a backing store was a failure. To spare you the pain of finding this out yourself, I’ll just mention the reason: Crowd, JIRA and Confluence expect MySQL to be configured with READ-COMMITTED transaction isolation level, which means you need to configure MySQL to have row-based binary-logging. Unfortunately, binlog_format is not a parameter you can configure in RDS’s DB Parameter Groups, for obvious reasons; it would affect all other clients on that MySQL instance. This has been confirmed with Amazon support, so JIRA/Crowd/Confluence with RDS is a no-go.

An Introduction to Shef, the Chef Shell

Earlier this week I gave a talk at the Chef-NYC meetup about Shef, the Chef Shell. Although it was more of an interactive demo rather than a traditional presentation, I’ve put the slides up nonetheless.

I’ve also been meaning to post some notes from the 2012 Surge Conference that I attended at the end of September. Haven’t had much of a chance to write those up into something coherent, but I will soon. Meanwhile, check out the videos, which have just been posted.

Finally, I will be at DevOpsDays in a couple weeks — though not speaking. If you’re going, I’m looking forward to meeting you!

Implementing Jetty Session Persistence in MongoDB

At SecondMarket, we’re moving towards a development model where not only are the deployments continuous but where deploys incur no downtime. Users should not notice if we take a portion of our servers out for maintenance, even if they’re logged into the site and have an active session. We decided to tackle this problem by persisting Java sessions to external storage. This allows another Jetty to take over serving of existing sessions if we decide to take down a Jetty for maintenance. Continue reading

Continuous Deployment with a $10 USB Button

IDream Cheeky USB pushbutton picture‘ve been very busy at my job in system operations over at SecondMarket, trying to get our infrastructure in shape for many changes coming down the pipe. On the business side, the JOBS Act passed by Congress back in April means that the ban on general solicitation of accredited investors is being lifted, and so we expect to be able to grow our client base as a result.

More clients means more features needed to cater to them. On the technology side we have been working hard to deliver small packages of features faster, rather than in one large biweekly release: in other words, continuous delivery. I’m looking forward to the day when we can finally hand over the keys to engineering & have developers deploy whenever they want, using our Jenkins continuous integration system. Operations people have no business being a roadblock to software developers who want to get features out the door as quickly as possible. As long as the code is of high quality and doesn’t crash the servers, I’m comfortable with whatever gets deployed into production. It also means that engineers are 100% responsible for both the success and failure of their code — a simultaneous carrot & stick towards increasing quality.

The whole discussion around push-button deploys has led us purchasing an actual USB pushbutton. Made by a company called Dream Cheeky, this button — admittedly a little more flimsy than it appears in the picture — ships with only a Windows driver. Fortunately, someone has written a RubyGem and a Mac driver to interface with it. We’re taking the next logical step and making it possible to deploy with literally a button push. Continue reading

HTML5: What kind of standard is this, anyway?

I haven’t written much HTML since 1996. Back in those wild west days before CSS existed, we used <font> tags and <table>-based layouts to control how websites were presented to end-users. Although these ugly hacks limited the sophistication of web sites and later proved to be a barrier to the development of rich Internet applications, they were at least part of a standard: HTML 2.0.

Today, however, I think the state of markup on the Internet is far worse, despite the existence of this beast we call HTML5. To my utter shock, I discovered that HTML5 isn’t even what one could call a standard. On the contrary, HTML5 represents standards committees (and there are two — I’ll get into this later) throwing in the towel because of internecine fighting, to the enormous detriment of web, application and browser developers everywhere. The most poignant illustration of the problem is that there is no DTD for HTML5: you merely write <!DOCTYPE html> and you’re on your way. Nothing says “anything goes” better than “don’t even bother mechanically validating this because who the hell knows what’s valid?” Continue reading

World IPv6 Launch Day: Where are the cloud providers?

WORLD IPV6 LAUNCH is 6 June 2012 – The Future is ForeverIPv6, the next version of the Internet’s addressing scheme, is back — and this time it’s here to stay.

Following up on last year’s World IPv6 Day, the Internet Society has organized World IPv6 Launch Day for June 6th. On this day, many major ISPs and corporations will permanently launch their IPv6 presence, in recognition of the fact that the world has now exhausted the IPv4 address space and must urgently migrate to IPv6. Participating companies include Google, FaceBook, Yahoo! and CDNs like Akamai and LimeLight Networks. My question is: where on the list are the cloud infrastructure providers? Continue reading