Steve Klabnik

  1. A tale of two Claudes

    It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything…

    Published

  2. Is Rust faster than C?

    Someone on Reddit recently asked: What would make a Rust implementation of something faster than a C implementation, all things being the same? I think this is a great and interesting question! It’s really tough because it ultimately relies on what exactly you mean by “all things being the same.” And…

    Published

  3. I am disappointed in the AI discourse

    Recently, something happened that made me kind of like, break a little bit. I’m still not entirely sure why this whole thing bothers me so much, but here’s a blog post about it. I happened to ask ChatGPT something for fun. I often do this just to see what it says, and if I feel like it’s right or wrong…

    Published

  4. Rust 1.0, ten years later

    It’s kind of hard to believe it’s been ten years since Rust 1.0 was released. I stopped working on Rust three years ago, and frankly, the last three years have been pretty rough. But 2025 is shaping up to be a really good year for me, with lots of positive changes. With that in mind, this post is going…

    Published

  5. Thoughts on Bluesky Verification

    Today, Bluesky rolled out blue checks. And, I was given one. Now, I’m not the biggest fan of this sort of feature, however, I also don’t really think this kind of feature is for me. I really like the idea of domain verification; I have been like “oh okay that’s coming from a .gov account” from time to…

    Published

  6. Thinking like a compiler: places and values in Rust

    A while back, someone on the internet asked about this syntax in Rust: *pointer_of_some_kind = blah; They wanted to know how the compiler understands this code, especially if the pointer wasn’t a reference, but a smart pointer. I wrote them a lengthy reply, but wanted to expand and adapt it into a blog…

    Published

  7. Does unsafe undermine Rust's guarantees?

    When people first hear about unsafe in Rust, they often have questions. A very normal thing to ask is, “wait a minute, doesn’t this defeat the purpose?” And while it’s a perfectly reasonable question, the answer is both straightforward and has a lot of nuance. So let’s talk about it. (The straightforward…

    Published

  8. Choosing Languages

    I tried to write this post yesterday, but I didn’t like my approach there. Last night, I had a conversation with one of my best friends about it, and he encouraged me to write this, but in a different way. I think this way is better, so thanks, dude. The other day, Microsoft announced that they are re…

    Published

  9. A Happy Day for Rust

    A while back, I wrote A sad day for Rust about the Actix-web unsafe controversy. The short of it was, Actix-web was using some unsound unsafe code. When this was discovered, people responded pretty harshly, and the maintainer quit. Others picked up the work, but it still wasn’t great: I’m not sure where…

    Published

  10. When should I use String vs &str?

    Rust has two main string types: String and &str. Sometimes, people argue that these two types make Rust code difficult to write, because you have to think about which one you should be using in a given situation. My experience of writing Rust is that I don’t really think about this very much, and this…

    Published

  11. Against Names

    There’s an old saying: There are only two hard things in Computer Science: cache invalidation and naming things. ― Phil Karlton I also appreciate the joke version that adds “and off by one errors.” Lately, I’ve been thinking about this saying, combined with another old joke: “The patient says, “Doctor…

    Published

  12. How Does BlueSky Work?

    One of the reasons I am enthusiastic about BlueSky is because of the way that it works. So in this post, I am going to lay out some of the design and the principles behind this design, as I understand them. I am not on the BlueSky team, so these are my takes only. Let’s begin. Why does BlueSky exist…

    Published

  13. Using the Oxide Console

    A very, very long time ago, I was introduced to Gerrit. To be honest, I hated it. However, lately I have become interested in divesting from git and GitHub, and so have decided to re-visit various “forges” to see what’s out there. The “why” for this will come later, and I’m not leaving them just yet…

    Published

  14. Memory Safety is a Red Herring

    TL;DR: I think that a focus on memory safe languages (MSLs) versus non memory-safe languages is a bit of a red herring. The actual distinction is slightly bigger than that: languages which have defined behavior by default, with a superset where undefined behavior is possible, vs languages which allow…

    Published

  15. Updating Buck

    Hey there! A shorter post today, but I wanted to continue my series on Buck by going over some things that have changed since this series started. A series This post is part of a series: Using buck to build Rust projects Using Crates.io with Buck Updating Buck (you are here) Updating Buck Lots of great…

    Published

  16. Using Crates.io with Buck

    In a previous post, I laid out the basics of building a Rust project with buck2. We compared and contrasted it with Cargo. But what about one of the biggest and best features that Cargo has to offer, the ability to use other Rust packages from crates.io? They don’t use buck, so how can we integrate them…

    Published

  17. Using buck to build Rust projects

    A few days ago, Facebook/Meta/idk announced that buck2 is now open source. Buck2 is an extensible and performant build system written in Rust and designed to make your build experience faster and more efficient. As it just so happens, I have taken an increasing interest in build systems lately. I have…

    Published

  18. Rust's Golden Rule

    I find myself thinking about a particular design principle of Rust today. I’m not sure I’ve ever seen it named specifically before, but it gets referred to from time to time, and I think it’s an under-rated but very important aspect of why Rust works so well. I was going to refer to it as “the signature…

    Published

  19. You're probably learning a technology in its seventh season, not its pilot

    I first heard this adage in the Rails space. I don’t know who to attribute this to, but I also never wrote it down. So, time to write it down, and if you know of the origin of this aphorism, let me know and I’d love to put it here! I think that the first formulation of this sentiment goes something like…

    Published

  20. Too many words about Rust's function syntax

    There’s a famous quote by Eleanor Roosevelt: great minds discuss semantics, average minds discuss syntax and small minds discuss syntax of comments (Apologies, Phil Wadler.) I’d like to preface this post that I do not consider this to be an actual proposal to change Rust, even a pre-RFC. I don’t think…

    Published

  21. Ten Years of Ru...ewriting my website

    December 21 is the anniversary of when I first heard about Rust way back in 2012. I used to write yearly posts about it; the last time I did was in 2018. That makes today ten years. I thought I’d have something big to say here, but… I just don’t. Part of that is because I haven’t written a blog post…

    Published

  22. Are out parameters idiomatic in Rust?

    There is a pretty straightforward design pattern called “out parameters” that you may have heard of before. In short, the question is, does your function wear pants… err, I mean, does your function modify data like this: fn foo() -> i32 { // body elided } let x = foo(); or like this: fn foo(out: &mut…

    Published

  23. The CXX Debate

    Let’s talk about safe and unsafe in Rust. To review, Rust has a concept of “unsafe code.” Unsafe Rust is a superset of safe Rust, letting you do some extra things that are dangerous. It’s your job as a programmer to verify that your code is playing by the rules, because the compiler cannot check them…

    Published

  24. Today is my first day at Oxide Computer Company

    Today is my first day at Oxide Computer Company, where I will be doing engineering work. When Oxide introduced themselves to the world, I saw a lot of folks who were pretty confused. At its core, what Oxide is doing is very straightforward: you give Oxide money, and Oxide gives you a computer. This company…

    Published

  25. The next iteration of my blogs

    I’ve had a few different blogs over the years. Every so often, I change things. One of the nice things about having your own site is that you can do whatever you want! So, I’m folding my old blogs’ content into my main website. I’m sick of adding new subdomains, and it all feels better in one place these…

    Published

  26. How often does Rust change?

    I’ve been thinking a lot lately about how often Rust changes. There are some people that assert that Rust stays fairly static these days, and there are some people who say Rust is still changing far too much. In this blog post, I want to make a data driven analysis of this question. First, I will present…

    Published

  27. "C is how the computer works" is a dangerous mindset for C programmers

    A long time ago, I wrote “Should you learn C to “learn how the computer works”?”. This was part 1 in a three part series. A year later, I got around to part 2, ““C is not how the computer works” can lead to inefficient code”. It’s been five more months. I don’t think I really want to write out the third…

    Published

  28. A sad day for Rust

    actix-web is dead. This situation is bad, from all sides. When Rust was a tiny, tiny community, I thought to myself, “wow, I wonder how long this will last? Probably 1.0 will kill it.” Sort of playing off of Eternal September, I assumed that over time, the community would grow, and we’d encounter problems…

    Published

  29. "C is not how the computer works" can lead to inefficient code

    A little over a year ago, I wrote “Should you learn C to ‘learn how the computer works’”. It was a bit controversial. I had promised two follow-up posts. It’s taken me a year, but here’s the first one. In that post, I argued that C doesn’t “work like the computer”, but rather, by a concept called the…

    Published

  30. Porting steveklabnik.com to Workers Sites and Zola

    One fun thing about having a personal domain is that you can keep the contents the same forever, but take a few days every so often to port it to some new stack you want to try out. A while back, I had my site on GitHub Pages using Jekyll. This has long been the sort of default, go-to stack for me. At…

    Published

  31. The culture war at the heart of open source

    There’s a war going on. When isn’t there a war going on? But I’m not talking about a physical war here: I’m talking about a war over meaning. This particular war is a fight over what “open source” means. Let’s take a few steps back. The Free Software Foundation People organize into groups for many reasons…

    Published

  32. I'm joining Cloudflare

    Yesterday, I signed an offer letter from Cloudflare. I’ll be the product manager of Storage, which is the part of the company that’s working on data storage products for the Cloudflare Workers platform. I’ll be starting at the end of the month. I think a lot of you will say “that makes perfect sense…

    Published

  33. What comes after open source

    In a previous post, I discussed the history of open source, and ended with this claim: Today’s developers have never learned about this history, or don’t care about it, or actively think it’s irrelevant. … For the same reasons that “open source” came up with a new name, I think the movement that will…

    Published

  34. Rust has finally outgrown me

    Today is a very interesting day. It’s giving me a lot of feels. Today is Rust Latam, a Rust conference in Montevideo. And I’m not there. This is significant because, as far as we know, I’m the only person who has been to every Rust conference in existence so far. I went to RustCamp, all three RustConfs…

    Published

  35. Learning Ada

    I decided to try and learn Ada. I love programming languages. This post documents my attempt, and explains what I learned. This is pretty stream of consciousness and basically is a bunch of random notes, so if you hate that, better close the tab. I typed my thoughts up pretty raw, so I may be incorrect…

    Published

  36. What's next for SemVer

    On December 18, 20091, the Semantic Versioning specification was announced. More commonly known as SemVer, it provided guidance for developers regarding software versions: I propose a simple set of rules and requirements that dictate how version numbers are assigned and incremented. For this system to…

    Published

  37. thank u, next

    I started working at 15, when I took a job as a pizza cook. Over the next seven years, I moved up the ranks, to a driver, shift manager, and then as part of the “new store opening team.” The franchise was growing, and we needed to help new franchisees open their new stores. I’d travel to where the new…

    Published

  38. Thoughts on Rust in 2019

    Each year, we ask the community to write blog posts about what they want to see on Rust’s roadmap for the next year. This is my post for Rust in 2019. Rust 2021: Maturity This year is also a bit special; in 2018, we introduced “editions” to Rust, on a roughly three-year schedule. So now is not just a…

    Published

  39. Six years with Rust

    Today is six years since I first heard of Rust. I wrote a post last year about it. This past year was… intense. Rust 1.31 was basically Rust 2.0, at least in the marketing sense. I burned myself out getting the first edition of the book together for Rust 1.0, and I burned myself out getting the edition…

    Published

  40. Why is Clojure so stable?

    There’s been some Programming Language Discourse lately, and I have some thoughts. It’s mostly centered around a comment on the orange website: I would put it simply: Clojure was designed by a thinker, who creates when he is away from the keyboard, not in front of it. When one releases and breaks the…

    Published

  41. Borrow checking, escape analysis, and the generational hypothesis

    There’s a fairly common argument that pops up on programming forums, and it’s about the nature of what “garbage collection” means. In the research world, this is what GC means: Garbage collection (GC), also known as automatic memory management, is the automatic recycling of dynamically allocated memory…

    Published

  42. Should you learn C to "learn how the computer works"?

    I’ve often seen people suggest that you should learn C in order to learn how computers work. Is this a good idea? Is this accurate? I’m going to start with my conclusion right upfront, just to be crystal clear about what I’m saying here: C is not “how the computer works.” I don’t think most people mean…

    Published

  43. You can't "turn off the borrow checker" in Rust

    Every once in a while, someone will talk about unsafe in Rust, and how it “turns off the borrow checker.” I think this framing leads to misconceptions about unsafe and how it interacts with safe code. Here’s some code that causes a borrow checker error: fn main() { let mut x = 5; let y = &x; let z =…

    Published

  44. Is WebAssembly the return of Java Applets & Flash?

    In my last post on WebAssembly, I made the following claim: Some have compared WebAssembly to Java applets; in some ways, they’re very right, but in some ways, they’re very wrong. Eventually I’ll write a post about the wrong, but for now, the right: in some sense, WebAssembly is a different way of accomplishing…

    Published

  45. WebAssembly is more than just the web

    While WebAssembly was given its name for good reason, I also think it’s quite the misnomer. When you hear about WebAssembly, don’t just think of the web: think bigger. Many programmers know that WebAssembly is a technology that lets you run non-JavaScript code in the browser. That is true, but there’s…

    Published

  46. "The Expressive C++17 Coding Challenge (in Rust)" revisited

    In October of last year, I wrote a post, “The Expressive C++17 Coding Challenge (in Rust)”. For various reasons, it got brought up again in the D world, and seb has written a new post. It’s good, you should check it out! However, it links to my gist, not my blog post. As I said back then: I held myself…

    Published

  47. 0b100000

    As someone who has significantly different beliefs than Peter Thiel, today is likely my second-to-last power of two years alive. Two years ago, I wrote a post about turning 30, and I pretty much feel the same way. Never enough time, tick tock, tick tock. I have today off (thanks Mozilla!), but am still…

    Published

  48. Looking back at Rust in 2018

    A careful reader will note the date of this post; it’s fundamentally in response to this call for blog posts, with a rhetorical device of looking backwards as if my personal plans for Rust came true. If you’re reading this in 2019 or beyond, this may be a work of fiction. It’s been an exciting year for…

    Published

  49. Five years with Rust

    Today is five years since I first heard of Rust. I wrote a post last year about it. This year, I have something slightly different in mind. Five years is a long time in tech. It’s also a long time for me to be focused on one specific thing; other than the pizza job I held in high school and college,…

    Published

  50. User-Agent: moz://a

    Every six months, Mozilla gets all of its employees from around the world together in one place, for a week. This morning was the plenary session, with Mozilla leadership talking about our successes this year, as well as plans for the future. I noticed a theme that, while not super overt, I find very…

    Published

  51. "The Expressive C++17 Coding Challenge" in Rust

    A few weeks ago, two C++ bloggers initiated a challenge (here and here): use the shiny new features of C++17 to write a small program that manipulates CSV files. The link is to the results; you can see the examples people came up with. I’ve written a follow-up post too! I decided to implement it in Rust…

    Published

  52. Want to join the Rust docs team?

    One of Rust’s major goals this year is to provide mentoring at all levels of the project. This is a goal I’m very on-board with. There’s lots of ways to get involved with Rust, but I’d like to talk about the bit I’m most involved in: documentation. There’s many ways to contribute to Rust’s docs. Some…

    Published

  53. An overview of macros in Rust

    Rust has had a lot of stuff going on with “macros”. There are a few, interconnected aspects of these features, many different names for the same thing, and a lot of development work going on. This post will give an overview of the past, present, and future of macros in Rust. Ultimately, macros allow…

    Published

  54. Announcing Rust Contributors

    When I was working with Ruby on Rails, someone once sent me this link: http://contributors.rubyonrails.org/ In some ways, this link changed my life. You see, I respond really strongly to integers going upwards. I am a sucker for points, hits, whatever. That web page, however, puts that integer towards…

    Published

  55. Fire Mario not fire flowers

    My post yesterday got a lot of great responses. Two of them are from people I greatly respect, Dave Herman and Graydon Hoare. You should go read those two posts; this one is in response to them. I’m going to respond to both at the same time by mixing them together. Graydon says: Safety in the systems…

    Published

  56. Rust is more than safety

    Rust is most well-known for its features around writing low-level code in a safer way than its predecessors. But it’s also a lot more than that. The Rust community is slowly evolving the way that we talk about Rust to people who haven’t yet given Rust a try, but it can take time. But how did we get here…

    Published

  57. Four years with Rust

    Today is four years since I first learned about the existence of Rust. I know this because Rust 0.5 was the first release I used. Rust has changed a lot in that time. For a brief overview of its history, watch this talk of mine. But for today, I thought it would be fun to check out the release announcement…

    Published

  58. What's new with "The Rust Programming Language"

    It’s been a while since I’ve mentioned my work on “The Rust Programming Language”, and I wanted to give you all an update. Before we get into the news, though, I’d like to take a moment to reflect on where the book has been, and then we’ll talk about it’s future. I previously wrote about my history with…

    Published

  59. Structure literals vs. constructors in Rust

    Learning the basics of a language and its syntax is easy. Learning how all those bits fit together is a bit harder. There’s a neat intersection between three of Rust’s features that I’ve seen people use, but never seen written down. I was explaining this technique to someone in #rust-beginners the other…

    Published

  60. A eulogy for my 20s

    Today is the last day of my 29th year of existence. I’ve been thinking about it a lot, which is extra strange because I don’t generally care about birthdays. I’m not much of one for holidays in general. So why do I care about this one? My 20s have been an extreme period of growth. At the start of it…

    Published

  61. Docember

    There are few things I appreciate more than using software projects that have good documentation. When I’m new to the project, documentation is invaluable for helping me get going. When I’m not new, good documentation helps me get the information I need to :shipit:. We say programming is hard, and we…

    Published

  62. Rescuing Resque (again)

    A long time ago, there was a big open source project, which was a huge part of the Rails world, but had almost no maintenance. This project was Resque, the go-to way to write background jobs for your Rails application. I attended a talk where the current maintainer was clearly getting burned out, and…

    Published

  63. "The Rust Programming Language" will be published by No Starch Press

    I’m happy to bring you some news: “The Rust Programming Language” is going to be published, in physical form, by No Starch Press. I am really excited to work with No Starch on this: they’ve published some of my favorite programming books, like “If Hemingway Wrote JavaScript”, “Ruby Under a Microscope…

    Published

  64. Community Versions for Rust

    Rust has been through a lot of changes in recent years. As such, tutorials get out of date. We’ve occasionally said that including rustc -v in your blog posts would be helpful, but today, I saw this tweet go by: Tired of guessing what versions of Ember work with a given blog post? Check out http://t.co…

    Published

  65. Ember Data: ‘DS’ is not defined

    I’m doing a little Ember app, and if there’s one thing I’ve learned from writing software, it’s to blog about error messages. Two-years-later me has ended up finding my own posts when searching for help! So today, when getting started with Ember Data 1.13, I was trying to use the new JSONAPIAdapter.…

    Published

  66. The language strangeness budget

    I’ve always loved programming languages. I’ve spent plenty of times with many of them, and am fortunate enough that language design is now part of my job. In discussions about building Rust, I’ve noticed myself making a particular kind of argument often in design discussions. I like to call it ‘the language…

    Published

  67. Ouroboros

    One of the things that I love about open source is its ability to send improvements across projects. Sometimes, an improvement in one project ends up improving its upstream. This kind of network effect really gets to the core of it for me: steady, constant improvement. I saw an example of this today…

    Published

  68. Hope

    “The people are unstoppable / Another world is possible” This has long been my favorite protest chant. For me, it gets to the heart of the matter: another world is possible. If I’m honest with myself, most days, I don’t really believe that the world will get better. We often present history as a kind…

    Published

  69. An introduction to economics under capitalism

    The dismal science a difficult one. Many people have strong opinions about economics, and it determines many of their other political beliefs. As someone who has significantly different thoughts on this topic than many of my peers, I’m writing this post out to give a basic explanation as I see it. That…

    Published

  70. A new introduction to Rust

    Lately, I’ve been giving a lot of thought to first impressions of Rust. On May 15, we’re going to have a lot of them. And you only get one chance at a first impression. So I’ve been wondering if our Intro and Basics are putting our best foot forward. At first I thought yes, but a few days ago, I had…

    Published

  71. Update GitHub Pages with Travis CI

    Ever wanted to have your project automatically update Pages when you have a successful build? I have a demo repository here: https://github.com/steveklabnik/automatically_update_github_pages_with_travis_example It, of course, uses Travis to update its own Github Pages, which is here: http://steveklabnik.github.io…

    Published

  72. I'm going writeonly on Twitter for a while

    This is something I’ve been joking about for a while, but I’ve decided for the near future, I’m just going to be posting things to Twitter, and not reading replies or anything. So, if you don’t get a fav or a reply or something, it’s nothing personal. There’s a lot going into this decision, but basically…

    Published

  73. Rust's documentation is about to drastically improve

    Historically, Rust has had a tough time with documentation. Such a young programming language changes a lot, which means that documentation can quickly be out of date. However, Rust is nearing a 1.0 release, and so that’s about to change. I’ve just signed a contract with Mozilla, and starting Monday…

    Published

  74. SF

    @steveklabnik including you? — Nick Quaranto (@qrush) March 5, 2014 I was always not quite sure about moving to San Francisco. I’ve heard about this place for my entire life: back in high school, during the first bubble, I would read Slashdot and wonder about life out west. But San Francisco is like…

    Published

  75. Hypermedia FizzBuzz

    I read a really great blog post last week: Solving FizzBuzz with Hypermedia. In it, Stephen Mizell builds a FizzBuzz service using Siren, and then shows how client code evolves. I wanted to explain exactly why I think this example is amazing, because I’m not sure it’s exactly obvious. FizzBuzz? Really…

    Published

  76. How to be an open source gardener

    I do a lot of work on open source, but my most valuable contributions haven’t been code. Writing a patch is the easiest part of open source. The truly hard stuff is all of the rest: bug trackers, mailing lists, documentation, and other management tasks. Here’s some things I’ve learned along the way.…

    Published

  77. Is npm worth 26MM?

    Yesterday, npm, Inc. announced that it had closed a $2.6MM round of funding. This was met with a bunch of derision on Twitter. I feel this is not only unwarranted, but backwards: I think this investment signals a nascent trend within the VC community, and a more honest view of how open source actually…

    Published

  78. Announcing Emoji 1.0

    A long time ago, I wanted an emoji gem. So I set out to make one. Turns out, emoji are damn complex. Emoji Licensing was one of the results. Who’d have guessed the hard part of making a gem was the legal part! Next up was that the ‘emoji’ gem was waaaay out of date: it was a library for converting between…

    Published

  79. A 30 minute introduction to Rust

    I recently gave a proposal for Rust’s documentation. An important component of my overall proposal is a short, simple introduction for people who may have heard of Rust, so that they can figure out if Rust is right for them. The other day, I saw this excellent presentation, and thought it might serve…

    Published

  80. 2013: year in review

    Every year I try to do a “year in Review” blog post, and every year I realize I didn’t keep good notes. Sigh. Overall, this was a pretty… meh year, to be honest. :/ Don’t get me wrong, a lot of really, really good things happened, but as far as my grand strategic life goals go, this year was pretty much…

    Published

  81. Rust is surprisingly expressive

    Do you remember the first time you saw Rails’ ActiveSupport library? I do: it totally blew my mind. The only dynamic language I had used up to that point was Perl, and it had a similarly mind-blowing effect on my young self. I thought that dynamic typing was mostly a requirement towards making this kind…

    Published

  82. How Dogecoin changed my perspective on cryptocurrency

    I have long been a Bitcoin hater, for many reasons. But then, a fortnight ago, something happened. Dogecoin came into existence, and for some reason, I just couldn’t get mad about it. After some thoughtful self-evaluation this week, I’ve realized that Dogecoin has actually reversed my position on cryptocurrency…

    Published

  83. git, history modification, and libuv

    There has been a recent kerfuffle over a pull request to libuv: it was rejected, applied, reverted, and re-applied. There was some question as to the authorship of that commit, and I wanted to show you why that was, because it illustrates how git handles history. At first, the pull request was closed…

    Published

  84. Why I'm partnering with Balanced

    My next venture will be joining up with Balanced, an API for marketplace payments, and I’m really excited about it. To the tax man, of course, the title of this post is “Why I’m going to be an employee of Balanced,” but I like to think about it as a partnership. Why I Balanced I first heard of Balanced…

    Published

  85. On leftist infighting

    There used to be a post here: https://web.archive.org/web/20131118145002/http://words.steveklabnik.com/on-leftist-infighting After having some conversations on Twitter, I was made aware of some context around ‘infighting’ that made it problematic. I decided that the post was unworkable, as I certainly…

    Published

  86. Abstract vs concrete

    When I talk to people about systemic inequalities, one of the hardest things for them to understand is the concrete nature of how these relations affect the day-to-day lives of others. For many, this topic is an abstract discussion. For many others, this is life, day to day. In the interest of helping…

    Published

  87. Pointers in Rust, a guide

    Rust’s pointers are one of its more unique and compelling features. Pointers are also one of the more confusing topics for newcomers to Rust. They can also be confusing for people coming from other languages that support pointers, such as C++. This tutorial will help you understand this important topic…

    Published

  88. New Beginnings

    TL;DR: WANTED: Proletarian/petite bourgeoisie looking for capitalist/industrialist/haute bourgeoisie. I’ve got the labor power, you’ve got the money commodity. Let’s exchange commodities at full market value in accordance with the Law of Value; I know you’ll extract some surplus and alienate my species…

    Published

  89. Keep Saturdays sacred

    There are obviously a lot of factors that have contributed to my career as a programmer, but I think the most important one can be summed up in this sentence: Keep Saturdays sacred. You see, in college, my friends and I were moderately obsessed with writing software. We sorta stumbled onto a tradition…

    Published

  90. Thankfulness

    I recently attended GoGaRuCo, which was a great conference. My favorite part, however, wasn’t directly attatched to the conf itself: it was a few moments of thankfulness. A lot of what I’ve been experiencing lately has been profoundly negative. That is what it is; there’s a lot of realy negative things…

    Published

  91. The CLOSURE companion

    Today is the fourth _why day. So I thought I’d say a few words about his final gift to the rest of us, CLOSURE. Be Skeptical First, a few words about the words I’m about to write. Software developers (though you don’t have to be one to read this) love meta, so surely you’ll indulge me for these next…

    Published

  92. Resque 1.25.0 has been released

    I’ve just released Resque 1.25.0! Resque is the most stable, widely-used job queue for Ruby. It uses Redis as its backing store. This release is thanks to adelcambre, who took the time to get it over the finish line! A total of 19 contributors helped out with this release, with 77 commits. Thank you…

    Published

  93. Just the regularly scheduled apocalypse

    Every once in a while, I unfollow EVERYONE on Twitter. I did it again last night. Feels good, like a fresh start. Part of the problem is that I feel like I should be following everyone who I know in real life. This causes Twitter to be absolutely unmanageable, as I’m following far too many. So then I…

    Published

  94. Emoji licensing

    I recently decided to make an emoji gem. Of course, as with any project, I first look into the relevant licensing issues. What I found made me :cry:. Here’s the low-down on emoji and intellectual property law. A history So what are emoji, anyway? The Japanese spelling is 絵文字: 絵 (e) means ‘picture’ and…

    Published

  95. redis-namespace 1.3.1 security release

    TL;DR: if you use redis-namespace and you use send, Kernel#exec may get called. Please upgrade to 1.0.4, 1.1.1, 1.2.2, or 1.3.1 immediately. Link to the fix: https://github.com/resque/redis-namespace/commit/6d839515e8a3fdc17b5fb391500fda3f919689d6 The Problem Redis has an EXEC command. We handle commands…

    Published

  96. Beware subclassing Ruby core classes

    TL;DR: Subclassing core classes in Ruby can lead to unexpected side effects. I suggest composition over inheritance in all these cases. Subclassing Review If you’re familiar with the concept of subclassing, skip down to “The Problem.” In Ruby, you can make your own classes: class List end You can also…

    Published

  97. Resque 1.25.0.pre has been released

    I’ve just released Resque 1.25.0.pre! Resque is the most stable, widely-used job queue for Ruby. It uses Redis as its backing store. This release is thanks to adelcambre, who took the time to get it over the finish line! A total of 19 contributors helped out with this release, with 77 commits. Thank…

    Published

  98. Removing Turbolinks from Rails 4

    If you don’t want to use Turbolinks with your Rails 4 application, it’s easy! Just do this: Remove the gem 'turbolinks' line from your Gemfile. Remove the //= require turbolinks from your app/assets/javascripts/application.js. Remove the two "data-turbolinks-track" => true hash key/value pairs from your…

    Published

  99. Twitter ghosts

    I’ve been thinking about death more than usual lately; my father died just before Father’s Day a year ago, and so I remembered, then was constantly reminded again on that day. But there’s another death that’s recently happened that really bothers me. The Internet is a really strange place. A few days…

    Published

  100. Returning to Free Software, a guide

    A month or two ago, I made a conscious decision that I would return to using as much Free Software as possible. The PRISM debacle of the last week confirmed my fears and reasoning, and so I made the decision to accelerate the schedule. Here’s what I did, and how you can, too. My GNU/Linux Background…

    Published

  101. Rust-y Scraps: iterating with a step

    This blog post works with Rust v 0.6, and may change in the future :). A common need in various algorithms is to iterate with some sort of step. A simple way to do this in Rust is with unit::range_step: let nums = [1,2,3,4,5,6,7]; for uint::range_step(0, bytes.len() - 1, 2) |i| { println(fmt!("%d & …

    Published

  102. Rails 4.0.0-beta1 to Rails 4.0.0-rc1

    I’m writing Rails 4 in Action along with Ryan Bigg and Yehuda Katz. In updating the book to Rails 4, I started early: the sample app (ticketee) was done with 4.0.0.beta1. Then 4.0.0.rc1 came out. I didn’t upgrade immediately, but last night, I took the plunge. There were only three errors, and the whole…

    Published

  103. Ditching Google Chat with XMPP

    Last week, I decided that it was time to migrate one of my services away from Google: XMPP for IM. The nice thing about XMPP is that you don’t have to totally drop support for your old identity: since Google still uses it (for now), you can get online with both. Here’s how: I set mine up with Digital…

    Published

  104. The profile link relation and you

    I was quite pleased when RFC 6906 was finalized. It’s a really useful pattern that people are using to enhance documentation of their APIs. Let’s start with an example. I tweet something like this: “Oh man, the example.com API is super awesome. You should check it out!” - @steveklabnik seconds ago from…

    Published

  105. Closure

    I spent six weeks of last December/January in my hometown. It was the first Christmas without my father, and it was cheap to stay, so I went back. It was my first time back in Pittsburgh since I’d moved away from the only place I’d ever lived. The trip was incredibly emotional for many reasons, but one…

    Published

  106. Upgrading from Rust 0.5 to 0.6

    Here are some error messages that I got when updating Rust for Rubyists from Rust 0.5 to the new 0.6, and how to fix those errors. Error: rust.rs:1:4: 1:16 error: unresolved name rust.rs:1 use task::spawn; ^~~~~~~~~~~~ rust.rs:1:4: 1:16 error: failed to resolve import: task::spawn rust.rs:1 use task…

    Published

  107. Deleuze for Developers: will smooth space/open source suffice to save us?

    Deleuze and Guattari employ the notion of ‘smooth space’ quite a bit in A Thousand Plateaus. I saw this quote about it the other day: never believe that a smooth space will suffice to save us I’ve recently been giving a lot of thought to ‘cultural hegemony’ and its applicability to the web, specifically…

    Published

  108. Travis build matrix for Rails

    Do you have a gem that needs to test against multiple versions of Rails? Doing it all can be complex, and while I have lots to say about this topic, but here’s one of the pieces: Travis build matrix. Here’s what you want: language: ruby rvm: - 1.8.7 - 1.9.2 - 1.9.3 - 2.0.0 - ruby-head env: - "RAILS_VERSION…

    Published

  109. Announcing security_release_practice

    Security is hard. One of the skills any OSS maintainer needs is how to do releases, and security releases are a special kind of release that needs special git-fu to make it work. I’ve created a repository so that you can practice this particular skill. It’s called ‘security_release_practice’. The problem…

    Published

  110. Going vimgan

    I’m going vim-gan. Basically, I don’t want to consume any source code which doesn’t come from vim, or products that contain non-vim source code. While I won’t, some people I’ve talked to will also consume code produced in Eclipse, since recent scientific studies show that Eclipse users can’t actually…

    Published

  111. Using puma on Heroku

    I’m a big fan of Puma these days. Today, I converted my blog over to use Puma, and I figured I’d share how I did it. This blog uses Sinatra. If you want to look ahead, here is the commit. Gemfile Installing Puma is really easy: just add gem 'puma' to your Gemfile. Done! This section is way too easy.…

    Published

  112. I'm writing "Rails 4 in Action"!

    Last night, I took a big step forward in my writing career: I’ll be building upon the work Ryan Bigg was doing to take “Rails 3 in Action” and move it to Rails 4. I signed the contract a few weeks ago, but last night I actually did the first bit of editing, and successfully got everything through the…

    Published

  113. The next iteration of "Designing Hypermedia APIs"

    I sent out an email today to everyone who’d previously purchased Designing Hypermedia APIs. Here’s the text: Hey there, First of all, I want to apologize for sending you an email. I try to keep these to a minimum. But this one is important. I haven't been uploading new content lately for a few reasons…

    Published

  114. Ruby on Rails maintenance policy

    Recently, the Rails team has committed to a specific policy related to release maintenance. Due to the rapid pace of recent releases, it’s good to understand how your apps relate to this policy. The policy was originally posted on Google Groups, here: https://groups.google.com/forum/?fromgroups=#!topic…

    Published

  115. Ember.js and accessibility

    Hey everyone! I made a video today about Ember.js and accessibility. I had always been repeating what I’d heard about screen readers: they can’t work with JavaScript. Turns out that’s not exactly true. The video is the best way to show you: VoiceOver, Ember.js, and WAI-ARIA from Steve Klabnik on Vimeo…

    Published

  116. How to not rely on rubygems.org for development

    Due to the recent situation with Rubygems.org, a lot of people noticed that they rely on Rubygems.org when deploying. A lot of people advocate “vendor everything”, and while that’s one approach, I actually don’t think it’s necessary. I think a lot of people think they rely on Rubygems.org more than they…

    Published

  117. Node

    Soooo there’s this thing: http://harthur.wordpress.com/2013/01/24/771/ First of all, unequivocally, I said it before, and I’ll say it again: I’m sorry, and feel terrible that I made someone feel terrible. @harthur, I felt bad yesterday, and I’m feeling bad again. Not that it helps you that I feel bad…

    Published

  118. _why is a role, not a person

    http://whytheluckystiff.net/ has re-ignited a discussion about _why, and while I have tons and tons and tons of things to say on the subject, this is all I can give you for now: _why is a role, not a person. For a long time, I was talking about a separation between _why and the person who played him…

    Published

  119. Draper 1.0.0 released

    Today, I released Draper 1.0.0! Draper is a gem that gives you decorators/view models for Rails. Rubygems: https://rubygems.org/gems/draper GitHub: https://github.com/drapergem/draper README: https://github.com/drapergem/draper/blob/master/README.md You can get it with Rubygems: $ gem install draper…

    Published

  120. Rails has two default stacks

    Rails’ greatest strength is “Convention over Configuration.” Basically, Rails makes a ton of default choices for you about how things should be named, where they should go, and other things. This is why working with Rails is so productive for an experienced developer: just follow the Golden Path and…

    Published

  121. 2012: year in review

    I always enjoy reading patio11’s year in review posts, and while I didn’t take enough notes for this year to do a GOOD one, I figure that I should at least leave some notes so that when I do one next year, I’ll have something to benchmark against. Ruby This has been a whirlwind year for my career. My…

    Published

  122. Most things I do are interconnected

    I work on a lot of different things. Sometimes I get asked how I find the time, but there’s another aspect not related to time management: most of my projects build off of each other. Draper and RequestStore This issue got filed in Draper. What Draper does isn’t important, but it did have this code in…

    Published

  123. I invented hypermedia APIs by accident

    Long long ago, I got an internship in college. Back then, I didn’t know anything about web development. My college professor said “GET and POST are the same thing, it’s just that GET requests show parameters in the URL bar.” But a friend of mine was working at this post-acquisition startup. They still…

    Published

  124. An early Christmas present for you

    Normally, I’m a bit of a grinch. I’ll admit it, I really hate Christmas. It reminds me of all of the worst parts of America: You know, how the baby Jesus commands us to literally shop until we kill each other… Anyway, today, I was teaching a bunch of brand new Rails devs, and I had to explain the mysterious…

    Published

  125. Announcing request_store

    Last night I had some insomnia, so I wrote a gem. Here it is: https://github.com/steveklabnik/request_store. TL;DR: If you’re using Thread.current in your Rails app to store global-ish data, don’t do it! If you use Thin or Puma or a threaded web server, it won’t get reset between requests, and you’ll…

    Published

  126. Getting started with chruby

    If you’re looking for crazy simplicity in your ‘switch between multiple Rubies’ life, you may want to check out chruby. Written by Postmodern, it’s basically the simplest possible thing that can work. As in, 76 lines of shell script. For that, you get: Features Updates $PATH. Also adds RubyGems bin/…

    Published

  127. Deleuze for developers: deterritorialization

    Let’s re-examine this diagram of the assemblage: What’s up with this line? Well, just because assemblages are amorphous doesn’t mean that there’s no way to demarcate what’s in the assemblage and what is not. This particular assemblage has a ‘territory,’ of sorts: everything that’s inside the line is…

    Published

  128. Deleuze for developers: assemblages

    The ancient Greeks thought that atoms were it. ἄτομος, Wikipedia will tell you, comes from ‘ἀ’- meaning “not” and ‘τέμνω’, meaning ‘I cut.’ Cells are the smallest thing that there is. You can’t cut them in half. Everything is composed of a bunch of atoms. Well, guess what? Modern science has found things…

    Published

  129. Draper 1.0.0.beta2 release

    I’ve relased the second beta for Draper 1.0.0! Many thanks to all of you who gave the first beta a shot. We’ve fixed some issues, and I’d apprecaite you giving this one a try. This solves all known issues with Draper, including every one we’ve found in 1.0.0.beta1. You can get it by installing it from…

    Published

  130. Draper 1.0.0.beta1 release

    I’m happy to announce the release of Draper 1.0.0.beta1 today. If you use Draper, I’d appreciate you checking out the beta release in your app, kicking the tires, and letting me know what’s up. You can get it by installing it from Rubygems: $ gem install draper --pre or by putting it in your Gemfile…

    Published

  131. Introducing the rails-api project

    Ruby on Rails is a great tool to build websites incredibly quickly and easily. But what about applications that aren’t websites? Rails is still a first-class choice for this use-case, but why settle for good when you could be the best? That’s why I’m happy to introduce Rails API: a set of tools to build…

    Published

  132. Narratives

    Occasionally in this big wide world, things happen. When things happen, we like to tell each other about it. When you take a bunch of connected events and tell someone about it, you’ve formed a narrative. Narratives are important, because they tell the story! The details of the account that one presents…

    Published

  133. How to squash commits in a GitHub pull request

    So you’ve contributed some code to an open source project, say, Rails. And they’d like you to squash all of the commits in your pull request. But you’re not a git wizard; how do you make this happen? Normally, you’d do something like this. I’m assuming upstream is a git remote that is pointing at the…

    Published

  134. Theory and practice

    purity There is always a tension between Theory and Practice. These two separate realms are connected through a process of abstraction and application. To explain this relationship by way of theory, Theory deterritorializes Practice, and Practice reterritorializes Theory: a Theory which is a becoming…

    Published

  135. I got hit by a car today

    “Humans are really squishy, messy, complicated, and contradictory. That’s what makes life interesting.” Veggie Grill is damn delicious, but it’s hard to talk and eat at the same time. I’m usually trying to shovel my Santa Fe Chickin’ sandwich into my face as hard as possible. Today, though, there was…

    Published

  136. Living with a terrible taste in music

    Music has always been very important to me. Throughout most of my life, I’ve listened to a lot of music, and it’s played a huge role in defining my personality at the time I listened to it. In many ways, the history of the music I’ve listened to is a history of me. Here’s a look at where I’ve been, and…

    Published

  137. Run Rails with custom patches

    I often see comments like this in the Rails bugtracker. Generally, someone is running an older version of Rails, and some bug they face has been fixed on edge. But they may be running a version that’s too old to receive fixes, or need a fix that has yet to be included in an actual release. What to do…

    Published

  138. How do you find the time?

    I’m often asked the question, “How do you find the time?” Mostly, it’s around open source, sometimes it’s about books, and occasionally, on other things. I’ve generally deflected the question with something like “I don’t know, man, I just do it.” But that answer isn’t very helpful. And I’ve been wondering…

    Published

  139. Seriously: numbers: use them!

    Turbolinks test from Steve Klabnik on Vimeo. If you don’t feel like watching… https://github.com/steveklabnik/turbolinks_test Results with 1000 pages: Blank Rails app: $ rspec user system total real no turbolinks 11.170000 0.980000 12.460000 (138.656728) yes turbolinks 10.800000 0.870000 11.670000 (…

    Published

  140. Resque: let's do this

    If you’ve ever done background job stuff with Rails, you’ve probably used Resque. Resque is “Yet Another GitHub Project They’ve Open Sourced and Then Abandoned.” But Resque is super awesome: it builds a job queue on top of Redis, which is a totally awesome piece of software. Anyway, Resque has been psuedo…

    Published

  141. Software and community

    “Are you sure you’re not vegan? You look like a vegan.” Chad Fowler made me laugh pretty hard that day. We were in Austin, at a Ruby conference, and getting some very non-vegan food at the excellent Iron Works BBQ. I had only talked to Chad a few times before, and while chowing down on some excellent…

    Published

  142. Random Ruby Tricks: Class.new

    If you didn’t know, classes are first-class objects in Ruby: 1.9.3p194 :001 > String.class => Class 1.9.3p194 :002 > Class.class => Class How is this useful, though? Inheritance You may create very simple classes at times. This often happens when subclassing an error of some sort: class MyException StandardError…

    Published

  143. Protocol and language

    This is the second part of my series on protocol. The first part contained a lot of background information, but now we’re ready to get into what Protocol actually is. I live in a pretty unique place, the Farmhouse. It’s a psuedo-public space in which we live, others work, and everybody has a good time…

    Published

  144. Random Ruby Tricks: Struct.new

    One of my favorite classes in Ruby is Struct, but I feel like many Rubyists don’t know when to take advantage of it. The standard library has a lot of junk in it, but Struct and OStruct are super awesome. Struct If you haven’t used Struct before, here’s the documentation of Struct from the Ruby standard…

    Published

  145. New blog: Words

    I’ve started a new blog: Words. You may have noticed that it’s a part of the Svbtle blogging network. I’m super excited about this, but you may be confused. Let me explain. My relationship with writing I’ve been involved in Internet communities for most of my life. One of the nice things about that is…

    Published

  146. Protological Control: an introduction

    “I finished by pointing out that, like scientists, people in the web development community had to be ethically and morally aware of what they were doing. I thought this might be construed as a bit out of line by the geek side, but the people present were the ones now creating the Web, and therefore were…

    Published

  147. DayZ

    I’ve recently come across one of the most addicting, interesting experiences I’ve ever had online: DayZ. I hesitate to call it a ‘video game,’ because while it is a mod for a first person shooter game, it basically ignores all common wisdom about what makes for a good game. I think that the broader implications…

    Published

  148. Sparrow

    I purchased Sparrow back when it was $9, and didn’t find it particularly amazing. I did like it, but ended up using the web interface more. I certainly got my $9 of value out of it, though, even though I used it for a short time. However. There’s been a lot of complaining about Sparrow’s acquisition…

    Published

  149. Why I don't like factory_girl

    Once upon a time, I was building my First Serious Rails App. I was drawn to Rails in the first place because of automated testing and ActiveRecord; I felt the pain of not using an ORM and spending about a week on every deploy making sure that things were still okay in production. So of course, I tried…

    Published

  150. How can I contribute to Ruby on Rails?

    After RailsConf this year, I joined the Rails Issue Team. This means that I help triage issues that people have filed, try to reproduce errors, and point core team members at ones that are most important. Since doing that, a few people have asked me how to get started, so I decided to draw up my thoughts…

    Published

  151. Introducing issue2pr

    Ever had an issue on GitHub, and then you fixed the bug? Opened a brand new pull request, which becomes a new issue, and then you have to remember to link the two via a comment, or manually go back and close the issue as well? Turns out that GitHub has the power to turn Issues into Pull Requests in the…

    Published

  152. Show solidarity to all who resist

    I found this on a flyer in my neighborhood. On may 19th, three people associated with the Occupy movement were arrested in Chicago, just before the anti-NATO protest. Two infiltrators had been working with them for months, trying to persuade them to escalate their tactics – just as in the recent Cleveland…

    Published

  153. Finale

    This morning, my mother woke up and found that my father had passed away in the night. Thanks for all the love and support you all have shown me over the last two months. It’s been hard, but you all have made it easier. Don’t be worried if you don’t see me around a lot for the next few days. Just trying…

    Published

  154. Shoes 4 work is starting: get involved!

    As you know, I’ve been doing a lot of work over the last few years to keep _why’s Shoes project going. A few other intrepid individuals have been doing a lot as well. We’re starting to work on Shoes 4, and we’d love your help. A little about Shoes If you didn’t know, Shoes is a GUI toolkit for Ruby.…

    Published

  155. Mixins: a refactoring anti-pattern

    I spend an unusually large amount of time thinking about interactions between what I call ‘past me’ and ‘future me.’ It seems that my life changes significantly every few years, and I like to ground myself by imagining how odd it would be if ‘current me’ could tell ‘past me’ things like ‘Someday, you’ll…

    Published

  156. On the eve of #m1gs

    Walking down the street, a woman cries for help. She’s blind, and the curb is large, and she’s unsure of herself. Knowing it’s not safe, she seeks the help of a stranger to guide her on her way. Three or four people pass by, but then someone stops, gives her their arm, and guides her safely to her destination…

    Published

  157. Cards for dad - follow-up

    Hey everyone! It’s been a few weeks, and I wanted to update you guys on the card situation. First of all, thank you so much. Every single one of you who sent cards, thank you! It was truly amazing to see so much support. I was even more surprised that I basically put my address on the internet and nothing…

    Published

  158. Building StoreEngine

    So I said I was gonna build antisocialne.ws. But I’m changing gears instead: I’d rather do this project, which has a better spec and needs a reference implementation. Building StoreEngine from Steve Klabnik on Vimeo.

    Published

  159. About antisocialne.ws

    About Antisocialne.ws from Steve Klabnik on Vimeo.

    Published

  160. Anti-capitalism 101

    People are often surprised to find out that I identify as an anti-capitalist. At least in America, many people see capitalism as inevitable, or even as the way things always were. Unfortunately, there’s so much rhetoric and confusion around this topic that it always takes a long time to break it down…

    Published

  161. Birthday cards for Dad

    Hey everyone. If you follow me on Twitter, you’ll know that I’ve been a bit absent lately. Basically, my dad has angiosarcoma. It’s a really rare cancer of the blood vessels. A city the size of Pittsburgh sees two cases every ten years, roughly. It’s certainly terminal, while he had some chemotherapy…

    Published

  162. Transmuting Philosophy into Machinery

    I’m so very close to releasing the beta of Get Some REST. However, I’m about to get on a plane to Poland, and that’s a bad time to launch things. ;) wroc_love.rb, here I come! Anyway, I figured I’d give you a preview of some of the content that I’ve been working on. This particular article is short,…

    Published

  163. Hypermedia API reading list

    Originally, this post was titled “A RESTful Reading List,” but please note that REST is over. Hypermedia API is the new nomenclature. I’ve been doing an intense amount of research on Hypermedia APIs over the last few months, and while I didn’t save every resource I found, I’ve made a list here of the…

    Published

  164. REST is over

    REST is Yep. Sorry to have to inform you. REST is totally over. The cool kids are moving on. We’re building “Hypermedia APIs” now. Such is life. A lesson from the anti-globalization movement Way back in the day, COINTELPRO was at the forefront of America’s fight against “subersive” organizations and…

    Published

  165. An API ontology

    NOTE: The alpha of my book on APIs is out! Check it out at http://designinghypermediaapis.com. As I’ve done research on APIs for Designing Hypermedia APIs, I’ve become increasingly interested in different styles of API. I currently see most real-world deployed APIs fit into a few different categories…

    Published

  166. Introducing metadown

    Because I don’t have enough gems made already, I made another one last night: metadown. What’s Metadown do? This blog originally used Jekyll. When I moved it to my own personal blog implementation, I noticed something: Markdown doesn’t actually have support for adding YAML at the top of your files, like…

    Published

  167. Moving from Sinatra to Rails

    I love both Sinatra and Rails, for different reasons. I’ve heard a few different heuristics for which framework would be better for your application, but I’m not sure the answer is all that simple, really. Regardless of which is correct for your application, I haven’t seen a lot of people discussing…

    Published

  168. Implementing HATEOS with presenters

    I’m a big fan of using the presenter pattern to help separate logic from presentation. There’s a great gem named Draper that can help facilitate this pattern in your Rails apps. When doing research for my book about REST, I realized that the presenter pattern is a great way to create responses that comply…

    Published

  169. ActiveRecord considered harmful

    It is practically impossible to teach OO design to students that have had a prior exposure to Rails: as potential programmers they are mentally mutilated beyond hope of regeneration.Edsger W. Dijkstra (paraphrased) I love ActiveRecord. It was the first ORM I’d ever interacted with. My first technical…

    Published

  170. Devise: ActionController::RoutingError (No Route Matches [GET] /users/sign_out)

    Just a quick note about Devise, and its RESTful implications. I ran across this error today, and thought I’d share. I was trying to log out, so I hit the normal route for such things with my browser. Here’s the error: Devise: ActionController::RoutingError (No Route Matches [GET] /users/sign_out) Uhhhhh…

    Published

  171. Redcarpet is awesome

    It’s true. If you haven’t used it yet, Redcarpet is the Markdown parser that GitHub uses to work all that magic on their site. So of course, it’s awesome. You can use it and abuse it What makes it really awesome is the custom renderers feature. Here’s the one from the documentation: # create a custom…

    Published

  172. Write better cukes with the rel attribute

    The other day, I was working on some Cucumber features for a project, and I discovered a neat technique that helps you to write better Cucumber steps. Nobody wants to be cuking it wrong, but what does that really mean? Here’s Jonas’ prescription: A step description should never contain regexen, CSS or…

    Published

  173. Marx, anarchism, and web standards

    An aside for software devs You might not care about anarchism, and I can almost guarantee that you don’t care about Marx, but please bear with me. I think my point is best made by putting the web stuff at the end, so please, just read it. ;) It’ll be good for you, I swear. I’ll explain better at the…

    Published

  174. Fast Rails tests with CanCan

    If you haven’t used it, CanCan is a great library for Rails that handles authorization for you. Its calling card is simplicity; just do this: class Ability include CanCan::Ability def initialize(user) user ||= User.new if user.is? :paying_customer can :show, Article else can :show, Article, :free =>…

    Published

  175. Book review: New Programmer's Survival Manual

    Disclaimer: I do have a small credit in this book. A long time ago, the author mentioned that he was looking for people to help out, so I stepped up. It was only participating in discussions like “What do you think about version control’s use in industry?”; I didn’t help with any actual writing, and…

    Published

  176. Burnout

    I have a confession to make: Other than one little stint at RubyC, I haven’t really written code in almost a month. And I haven’t really written a ‘real’ blog post in almost six weeks. It happens. I was hitting it really hard there for a while, and the combination of stresses from travel, speaking, writing…

    Published

  177. Your startup is not a platform

    No, seriously. This is a public service announcment to all MBAs who want to do startups: ‘platform’ does not mean ‘web site.’ I know that ‘platform’ is a hot thing right now. But seriously, the term has become basically useless. It’s almost to the point that I just pretend you don’t even say it. A platform…

    Published

  178. For science: I'm killing my cell phone

    Yep. Doin’ it. This morning I swung by the Sprint store and picked up a 4G hotspot. Gonna transfer my number to Google Voice this evening. lolwhut? Yep. I’m terribly addicted to my phone right now. This is fine, but I’m always interested in improving myself. I have a few friends who’ve done similar things…

    Published

  179. Matz is nice so we are nice

    Rubyists have a saying, or at least, we used to. “Matz is nice so we are nice.” This has sort of been lost over the years… some people who have been around Ruby for a long time still say this, but it’s something that’s gone in and out of popularity. Nice should be the default Most of being nice, in a…

    Published

  180. Rubinius is awesome

    You walk into work tomorrow morning, and your boss says this: Boss: Hey, we’re gonna need to go ahead and have you implement require_relative in rubinius. We have some new servers coming in, and we’ll be running it in production, but we use some 1.9.2 features of MRI that haven’t been implemented yet…

    Published

  181. GitHub is anarchy for programmers

    I finally got to see Zach Holman give his talk, How GitHub Uses GitHub to Build GitHub. It was awesome. Zach is a great speaker, and the slides don’t do it justice. I highly recommend catching it on video or in person sometime. Anyway, there’s something that I found really interesting about GitHub’s…

    Published

  182. Real, modern Ruby development

    I came across a blog post the other day titled Modern Ruby Development. While it’s a perfectly fine blog post (other than the digs at rvm…) it really should have been titled something more along the lines of “My default tooling to build a Rails application.” I thought of this yesterday, as I was invited…

    Published

  183. I'm deleting my Facebook tonight

    Well, it’s the end of the web as we know it. I’d already been thinking about this all weekend, and last night, I decided. I just can’t deal with Facebook’s crazy privacy stuff anymore. I mean, I already basically forked Twitter over their ToS, and Facebook has been a lot more evil for a lot longer. Frictionless…

    Published

  184. More rstat.us refactoring

    Hey everyone! I just wanted to share One More Thing with you about this rstat.us refactoring. The main thrust of the last article I posted was to show you a technique for extracting a class, getting it under some kind of test, and then refactoring it a bit. Refactoring is always an iterative process…

    Published

  185. Extracting domain models: a practical example

    Hey everyone! We’ve been doing a lot of refactoring on rstat.us lately, and I wanted to share with you a refactoring that I did. It’s a real-world example of doing the domain models concept that I’ve been talking about lately. Step one: check the tests I don’t know how much more emphasized step 1 of…

    Published

  186. We forget that open source is made of people

    Programmers like to think that software is the purest form of meritocracy. We like to consider ourselves scientists; what we do is entirely impersonal. I’m at Lone Star Ruby right now, and the first two talks are entirely about software as a science. But this is a fallacy. There’s a human element to…

    Published

  187. Better Ruby Presenters

    My last blog post caused a bit of a stir in some circles. I got a bunch of emails. Apparently, I need to expand on a few things. So here we go. Let’s rap about the Presenter pattern, shall we? No seriously, helpers suck In Ruby, everything is an object. Every bit of information and code can be given…

    Published

  188. The secret to Rails OO design

    UPDATE: I also have a follow-up here. I often tell people that I learned Ruby via Rails. This is pretty much the worst way to do it, but I’d learned so many programming languages by then that it didn’t hinder me too much. The one thing that it did do, however, was give me a slightly twisted sense of…

    Published

  189. The self improvement pomodoro

    By now, the pomodoro technique is pretty well-known amongst programmers. I forget where I heard of it first, but if you haven’t, here it is: Break your day up into 30 minute chunks. Work for 25 minutes, break for 5. Repeat. It’s easy to stay concentrated when you know a break is coming up soon, the fact…

    Published

  190. I'm making it dead simple to contribute to Ruby's documentation

    Okay! So, if you’d read my previous article on this, you’d know how easy it is to contribute to Ruby’s Documentaiton. But Steve, I’m still kinda scared. Okay, so here we go: I’m making it even easier on you. Send me what you want changed, and how, and I’ll make a patch and submit it on your behalf. No…

    Published

  191. Some people understand REST and HTTP

    This is a follow-up post to my post here. You probably want to read that first. UPDATE: Please note that ‘REST is over’. ’Hypermedia API’ is the proper term now. A few words on standards versus pragmatism When I wrote my first post on this topic, I tried to take a stance that would be somewhat soft,…

    Published

  192. Twitter is too important to be owned by Twitter

    When I spoke on a panel at RTLM NY ’11, I got a little rise out of the crowd when I said “Twitter is too important to be owned by Twitter.” This is still absolutely true, and yesterday was a great example of that: the #fuckyouwashington debacle. If you haven’t heard, Jeff Jarvis started something on…

    Published

  193. Nobody understands REST or HTTP

    HI HN, PLEASE READ THIS!!! Since I’ve posted this, I’ve refined a few of my positions on things. Everyone learns and grows, and while I still stand by most of what I said, I specifically don’t agree that versioning the media type is how to properly version APIs. Hypermedia APIs should not actually use…

    Published

  194. Single text, many masters

    Hey everyone. Here’s a draft of an essay I’ve been working on. I’d love to hear your feedback. The word ‘engineering’ has a deep connection to the word ‘trade-offs’ in my mind. Most engineering decisions come down to evaluating a few differing alternatives, and often multiple factors end up being negatively…

    Published

  195. Contributing to Ruby's documentation

    Update! I’m now making it even easier than this: Read my new post about how I’ll do this for you. That said, if you want to do it yourself, the following will tell you how. Original Article Ruby 1.9.3 is coming out soon! drbrain has challenged the Ruby community to improve its documentation, but some…

    Published

  196. The next iteration of my blog

    Well well well, some things never change. Long ago, I hosted my own blog, and here we are again. I’ve moved everything over to Jekyll, if that means anything to you. You can now look at my blog on GitHub. Big thanks to this article for lots of help and pointers with final deployment stuff, and this one…

    Published

  197. The first week of rstat.us: users, press, and scaling, oh my!

    Hey everyone. A lot of people have been asking me about rstat.us lately, so I figured I’d tell a little bit of the story as it’s gone down so far. Stats First, here’s some numbers: Users: 4553 Uniques: 25,000 Pageviews: 119,385 Pages/visit: 4.77 Statuses posted: 9387 Here’s some fun info: stats on statuses…

    Published

  198. Announcing rstat.us

    Whew. If you’ve been following me on Twitter at all lately, you’ll know that I’ve been working hard on a new project lately. Tonight, even though it’s late, I’m finally getting it out there. Please welcome http://rstat.us/ to the world! (as soon as the DNS updates. ;) ) rstat.us is a micro-blogging service…

    Published

  199. Did you hear? I'm Ruby Mendicant University's first visiting teacher

    I’ve heard Ruby Mendicant University (also known as RMU, not to confuse you Robert Morris alums!) described as “the best kept secret of the Ruby community.” High praise, indeed. If you haven’t heard about RMU before, check out this presentation by Andrew Cox: TL;DR: RMU is a free, online ‘unversity’…

    Published

  200. I'm quitting Hacker News

    I’ve been thinking about this post for a while. I freaking love Hacker News. It’s my favorite place on the Internet. It’s incredibly valuable. I have learned so much from my time there. With that said, I feel like it’s taken up too much of my time. I’m trying to accomplish things. I got accepted to grad…

    Published

  201. Living in the cloud

    I’ve been joking for a while that I’d like to “move to the Internet.” Generally I cite my familiarity and love with online culture as opposed to American culture. I don’t really care what’s going on in “the real world,” as I feel it’s kind of played out. The whole cycle of “fight wars, reduce freedoms…

    Published

  202. A few notes on Foucault

    I’ve almost always been in a habit of reading. When I was younger, I spent a lot of time in the library. I’d just grab an entire series of novels, and read them all, right in a row. Sometimes I’d end up reading non-fiction too. I ended up with a lot of books on software. Then my local library got Internet…

    Published

  203. Goals for 2011

    This year I’m happy to report that I have much more upbeat plans than last year’s kind of sad post. With that said, here’s my 2011 goals: I want to work for other people 2 days per week on average for the year. I want to write something every day I want to keep building on the initial success that Hackety…

    Published

  204. Hackety Hack v1.0

    It’s been a long journey. I have a lot to say about this, but it’ll have to wait until I’m not in the middle of nowhere spending some time with Maria’s family. I just wanted to tell you all Merry Christmas, and point you at the Hackety Hack v1.0 release announcement and the new Hackety Hack website.…

    Published

  205. The hardest decision I've ever made

    I’ll cut to the chase: I’ve stepped down as CTO of CloudFab. I don’t want to discuss details, but life is too short to not be doing what you want with it. And, after a period of careful thought and consideration, it’s no longer the right thing for me. It was an amicable parting, and my replacements are…

    Published

  206. Trolling is a art

    I find it incredibly hard not to be judgmental. I’m not sure what part of my personality makes this happen, but even when I try to curb tearing down other people, I end up doing it anyway. I’m not sure if it’s just me, but I think part of the problem is that these kinds of things are rewarded. One of…

    Published

  207. 80% of success is showing up

    It’s funny how true this quote is. There are three people that I really admire: _why, Zed Shaw, and Yehuda Katz. And to simplify my tenses a bit, I’ll speak of _why in the present tense. What do these three guys have in common? They all churn out badass software like nobody’s business. _why started so…

    Published

  208. Trouble with Diaspora

    So, Wednesday, Diaspora was released. If you’re not familiar, a few months ago everyone was up in arms about the latest Facebook privacy change. So four college kids started a Kickstarter project with a dream: let’s make a distributed, private Facebook. They asked for $10,000. They got about $200,000…

    Published

  209. A word about _why, Whyday, and Hackety Hack

    Today is Whyday. A programmer’s holiday. Today is the day that we don’t forget that programming isn’t all Agile and driven by behavior and Serious Business. Inside each cubicle, the hacker spirit is trying to burst free. Today, it will. Today, I’m also releasing a prerelease version of Hackety Hack 1.0…

    Published

  210. A blip in time

    Sometimes, insight comes from very unlikely places. I’m keenly interested in the music industry, and how it will evolve, or possibly die. I care deeply about music; it’s had a profound effect on my life over the years. Even though the entire industry has been screaming that they’re dying, I truly believe…

    Published

  211. A case study in being excellent: Divvy

    The images in this post have been lost to time. Oh well. Original post below, images removed. The other day I wrote a post about being excellent to each other. Today, I’ve got a great example of that for you: Divvy. What would you do if you received an email like this? Here’s what happened: Here’s a…

    Published

  212. Productivity Waves

    Right now, I’m having a bit of a ‘darkness before the dawn’ kind of moment. I feel like I might soon start to become productive again. It’s sort of strange, how these things travel in waves. Just a month or two ago, I was super-ultra-crazy productive. I was working on Hackety, coding Bindlr, writing…

    Published

  213. A Declaration of the Independence of Cyberspace

    I just saw this today. It kind of goes along with my “Move to the Internet” post from a few days ago. Enjoy. A declaration of the Independence of Cyberspace

    Published

  214. A break with the past

    Pretty soon, Twitter is going to turn off Basic Authentication and switch entirely to OAuth. People are upset. It’s natural. If apps aren’t updated, they’ll stop working, entirely. This could be bad. But in the long run, it won’t be. In any sort of long-term endeavor, things can go sour, due to accumulating…

    Published

  215. Book review: Rework

    I’ve been waiting for this book for a while. “Rework” is the new book by Jason Fried and David Heinemeier Hansson from 37signals. It hit stores on Tuesday. Here’s a (non-affiliate) link to Rework on Amazon. For those of you who don’t know, I’m down in Houston, Texas. I’m here for a few days before heading…

    Published

  216. Create a more compelling experience for your users through game mechanics

    Ever wonder why some websites are so addictive? Certain sites always keep you going back, time after time after time. Well, I can’t speak for all of them, but there’s a subtle reason that some sites draw your attention on such a repeated basis: They’re actually games. Wait, games? Try a little thought…

    Published

  217. Writing a su feature with Authlogic

    Sometimes, when responding to a support request, it’s nice to see what your users see. At the same time, you don’t want to ask your users for their passwords, out of respect for their privacy. So what do you do? Well, *NIX systems have a program called su. Here’s what man su has to say: NAME su - run…

    Published

  218. Reddit drama: an interesting look at community values

    I bet social psychologists are having a field day with the Internet. I know nothing about the field, so I don’t know if there are thousands of papers about it already written or not, but there should be. I can’t image that we’ve ever had a period in history when more communities are being formed; they’re…

    Published

  219. The Hackety Manifesto

    For those of you that don’t know, I’ve taken over a project by someone named _why. He dropped off of the face of the Internet back in March, and the community has picked up his works. Because I’ll be writing about the project in the future, and because I feel these words are still relevant, I’m reprinting…

    Published

  220. The Little Coder's Predicament

    For those of you that don’t know, I’ve taken over a project by someone named _why. He dropped off of the face of the Internet back in March, and the community has picked up his works. Because I’ll be writing about the project in the future, and because I feel these words are still relevant, I’m reprinting…

    Published

  221. About Crows

    A short time ago, the G20 came right here to Pittsburgh. With an event of such worldwide importance happening in our backyards, several people decided to document it via social media. The Mattress Factory did a site called “MyG20” and it did pretty well. Some smaller groups did their own thing. But IndyMedia…

    Published