Try not to become a man of success, but rather try to become a man of value.
Illusory joy is often worth more than genuine sorrow.
René Descartes, who 392 years ago had the dreams that inspired his Meditations on First Philosophy. Download the book here: http://goo.gl/iTd73

He was a French philosopher and writer who spent most of his adult life in the Dutch Republic. He has been dubbed the ‘Father of Modern Philosophy’, and much subsequent Western philosophy is a response to his writings, which are studied closely to this day. In particular, his Meditations on First Philosophy continues to be a standard text at most university philosophy departments. Descartes’ influence in mathematics is equally apparent; the Cartesian coordinate system — allowing algebraic equations to be expressed as geometric shapes, in a 2D coordinate system — was named after him. He is credited as the father of analytical geometry, the bridge between algebra and geometry, crucial to the discovery of infinitesimal calculus and analysis. Descartes was also one of the key figures in the Scientific Revolution… (more)
A fool thinks himself to be wise, but a wise man knows himself to be a fool.
William Shakespeare, whose plays Othello and The Tempest were performed for the first time on a November 1.

He was an English poet and playwright, widely regarded as the greatest writer in the English language and the world’s pre-eminent dramatist. He is often called England’s national poet and the “Bard of Avon”. His surviving works, including some collaborations, consist of about 38 plays, 154 sonnets, two long narrative poems, and several other poems. His plays have been translated into every major living language and are performed more often than those of any other playwright… (more)
Download the complete works of William Shakespeare: http://goo.gl/4iGVY.
Download “The Cambridge Introduction to Shakespeare”: http://goo.gl/QvvsT.
Download some Cambridge Companions to his work: http://goo.gl/bEno6.
Download Routledge’s “Wiliam Shakespeare: The Critical Heritage” (6 volumes): http://goo.gl/SQL6J.
(via thecultofgenius)
Do you wish to rise? Begin by descending. You plan a tower that will pierce the clouds? Lay first the foundation of humility.
I adore art… when I am alone with my notes, my heart pounds and the tears stream from my eyes, and my emotion and my joys are too much to bear.
Giuseppe Verdi, who would be 198 years old today.

was an Italian Romanticcomposer, mainly of opera. He was one of the most influential composers of the 19th century. His works are frequently performed in opera houses throughout the world and, transcending the boundaries of the genre, some of his themes have long since taken root in popular culture – such as “La donna è mobile” from Rigoletto, “Va, pensiero” (The Chorus of the Hebrew Slaves) from Nabucco, “Libiamo ne’ lieti calici” (The Drinking Song) from La traviata and the “Grand March” from Aida… (more)
He who has never failed somewhere, that man can not be great.
Herman Melville, who would be 192 years old today.

He was an American novelist, short story writer, essayist, and poet. He is best known for his novel Moby-Dick and the posthumous novella Billy Budd. His first three books gained much contemporary attention (the first, Typee, becoming a bestseller), but after a fast-blooming literary success in the late 1840s, his popularity declined precipitously in the mid-1850s and never recovered during his lifetime. When he died in 1891, he was almost completely forgotten. It was not until the “Melville Revival” in the early 20th century that his work won recognition, especially Moby-Dick, which was hailed as one of the literary masterpieces of both American and world literature. He was the first writer to have his works collected and published by the Library of America… (more)
I thank my God for graciously granting me the opportunity of learning that death is the key which unlocks the door to our true happiness.
Knowledge is of no value unless you put it into practice.
Anton Chekhov, who passed away 107 years ago.
He was a major Russian playwright and master of the modern short story. He was a literary artist of laconic precision who probed below the surface of life, laying bare the secret motives of his characters. Chekhov’s best plays and short stories lack complex plots and neat solutions. Concentrating on apparent trivialities, they create a special kind of atmosphere, sometimes termed haunting or lyrical. Chekhov described the Russian life of his time using a deceptively simple technique devoid of obtrusive literary devices, and he is regarded as the outstanding representative of the late 19th-century Russian realist school… (more)
The ordinary acts we practice every day at home are of more importance to the soul than their simplicity might suggest.
Thomas More, who was executed for treason against King Henry VIII of England 476 years ago.

He was an English humanist and statesman, chancellor of England (1529–32), who was beheaded for refusing to accept King Henry VIII as head of the Church of England. He is recognized as a saint by the Roman Catholic Church… (more)
People who know little are usually great talkers, while men who know much say little.
I have learned that to be with those I like is enough.
Walt Whitman, who would be 192 years old today.

He was an American poet, essayist and journalist. A humanist, he was a part of the transition between transcendentalism and realism, incorporating both views in his works. Whitman is among the most influential poets in the American canon, often called the father of free verse. His work was very controversial in its time, particularly his poetry collection Leaves of Grass, which was described as obscene for its overt sexuality… (more)
“Out of clutter, find simplicity. From discord, find harmony. In the middle of difficulty, lies opportunity.”
- Albert Einstein
I have enough money to last me the rest of my life, unless I buy something.
—Jackie Mason
There are many good reasons to be concerned about whether the internet industry is in another bubble. Once shaky, unproven businesses hit the NASDAQ, the chance that granny is going to lose her pension fund goes up big time. That’s the direct economic consequence that you’ve probably heard already.
What hasn’t been discussed as much are some of the secondary effects that a bubble has on the industry. Like how it gets harder to hire good people as a consequence. Sure, you may have heard of The War for Talent, but it’s much deeper than that. This is not simply about the latest tech darling not being able to find programmers in the Valley.
When bubbles inflate as fast as the most recent one, support infrastructure can’t cope. There just aren’t enough programmers, designers, operations people, and other warm bodies to man all the hot air balloons. So you have a predictable effect: Rapidly increasing demand for an only steadily increasing supply. Thus, inflation.
All this new demand is being fueled by the endless flows of cheap cash being pumped into the Valley (and everywhere else it can go). So the circle goes like this:
And every time we do a round, more talent gets trapped in the bubble, chasing things that can be flipped for the most money. Now in theory this is all good and well. Resources are allocated to the pursuits with the most economic value. So if Instapintora is worth $2 billion, of course they deserve to be able to hire 1,000 web builders, right?
That’s the same argument you’ll find for bridges to nowhere and other pursuits void of inherent economic and public value. Sure, people are being employeed, money is changing hands, but come Monday morning, the hangover is that we spent a bundle to build a lot of shit that’s not going anywhere.
As a result, we missed out on doing other worthwhile things. All those smart and talented heads, and all those benjamins, didn’t progress the economic base in a way we’re going to care about tomorrow. And that’s a damn shame.
I was bouncing around the Rails API documentation yesterday, and I noticed a few rails console tricks I haven’t seen before. There’s been plenty of posts about irb and Rails before, but I’m hoping you’ll learn something new here. The following console samples were taken with Basecamp Next on Rails version 3.2.3.
Running the app method in rails console gives you an integration session instance, so you can use it just like when you’re a normal integration test for Rails.
>> app.class => ActionDispatch::Integration::Session
Generating routes was always a hassle. What module did I need to include again? Did you remember to set the default_url_options? Stop googling and just use app:
>> app.project_path(Project.first) => "/projects/130349783-with-attachments"
It can make requests inside of your app as well:
>> app.get "/735644780/projects/605816632-bcx.atom" => 200 >> app.response.body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<feed xml:lang=\"en-US\" ...
Check out ActionDispatch::Integration::Session and ActionDispatch::Integration::RequestHelpers to see what else this object can help you with.
Getting a console session bootstrapped with Rails’ helpers is also a pain, which helper can fix for you! You could also use it to play with building HTML tags, or any existing Rails helper that ActionView knows about.
>> helper.truncate("Testing", length: 4)
=> "T..."
>> helper.link_to "Home", app.root_path
=> "<a href=\"/\">Home</a>"
One gotcha with helper is using instance variables inside of helper methods. Yes, I’m aware this is a Bad Idea™ with helpers in general, but I haven’t worked in a single Rails app without one. Here’s a small example of a method with one:
def title_tag(title = nil)
if @project.present? && title.nil?
content_tag :title, @project.name
elsif @project.present?
content_tag :title, "#{@project.name}: #{title}"
else
content_tag :title, title
end
end
We can use our old friend Object#instance_variable_set to violate a core principle of OOP and let us try this helper out in the console:
>> helper.title_tag "Testing!" => "<title>Testing!</title>" >> helper.instance_variable_set :@project, Project.first => #<Project id: 130349783, ... >> helper.title_tag => "<title>With attachments!</title>" >> helper.title_tag "Posts" => "<title>With attachments!: Posts</title>"
Dealing with a helper that uses params is also not straightforward. However, we can trick ActionView into listening to us with a tiny hack. This is the console, after all! Let’s say we have this helper method:
def javascript_debugging_options
if params[:javascript_debugging] == "enabled"
{ debug: true, digest: false }
else
{}
end
end
Usually ActionView needs an entire ActionDispatch::Request from the controller to figure out what parameters came in from the user. We can trick it with a little OpenStruct instead:
>> helper.controller = OpenStruct.new(params: {})
=> #<OpenStruct params={}>
>> helper.javascript_debugging_options
=> {}
>> helper.controller = OpenStruct.new(params: {javascript_debugging: "enabled"})
=> #<OpenStruct params={:javascript_debugging=>"enabled"}>
>> helper.javascript_debugging_options
=> {:debug=>true, :digest=>false}
Hunting down the exact location of a given method isn’t always easy. Luckily, Ruby can point you in the right direction with Method#source_location:
>> Project.instance_method(:trash).source_location => ["/Users/qrush/37s/apps/bcx/app/models/project.rb", 90]
Whoa! You’ll get back an array with the full path of where the method was defined along with that method’s line number in the file.
I’ve used this when looking for code buried inside of gems as well. Let’s try it on app:
>> app.method(:get).source_location => ["/Users/qrush/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/bundler/gems/rails-7d95b814583b/actionpack/lib/action_dispatch/testing/integration.rb", 32]
This tip has saved me from an immense amount of source diving. Try it out!
Looking for more tips? JEG2 gave a neat talk at RailsConf about some of the hidden parts of Rails you might not know about. If you have some of your own, please share!
We’re looking for another teammate. This time we’re looking for someone who is completely focused on improving conversion and retention. You love moving the needle, one small step at a time. This job is all about seeing untapped potential.
Conversion could be financial (get more people to start a trial or complete it – what we consider a “sale”), or outcome-based (inspire people to create more Basecamp projects by showing them creative ways to use Basecamp they never thought of before). Or something else.
Retention could be reducing cancellations, or reducing unsubscribes from our mailing list, or increasing the number of people who log into Basecamp every day. Or something else.
You should be great at figuring out which words or phrases hook people instead of letting them get away. We believe the right words at the right time can make all the difference.
You should look at a sign up form like… …and already know three ways to significantly improve conversion.
You should be great at understanding what motivates people. This requires deep insight into the decision making process. You should know why people buy, why people don’t buy, why people buy more of something they already have, and why people who bought decide not to buy any more.
You should look at a screen like… …and think to yourself – “if they rearranged this, highlighted that, or renamed this other thing, they’d increase sales by at least 25%.”
You should be great at knowing how to help people find value in something they already have. There are always more ways to use something than the ways you already use it.
You should look at a new project like… …and say “no, no, no… a better way to get someone started on a new project is like this…”
Or you should look at an email like… …and think “You’re missing a big opportunity to get more people to take action here. If we…”
This is not just a job for an idea person – it’s about ideas and execution. You’ll be expected to write the copy. You’ll be expected to implement the designs. You’ll be expected to shepherd ideas from start to finish – not just to toss them out there for other people to worry about.
You should love to propose, experiment, implement, execute, and measure. You may not be able to take everything on 100% yourself, but you try your best before you hit your limits and have to ask for help.
We’d like to double sales over the next 12 months without making deep material changes to our products. We don’t believe it’s possible. Change our minds. Convert us.
If this sounds like something you’re great at, we’d love to talk to you. This is a new position at 37signals, so you’ll be in charge of making it work.
You’ll be part of the best overall team in the business. From ops, to programming, to design, to support, to data, to video – we’re ready to work together to see your bright ideas through.
Send an email titled [Conversion] to jointheteam@37signals.com telling us why you’re the one. How you tell us is up to you.
Our office is based in Chicago, but our team is spread out all over the world. You can work from anywhere. We just require a few trips to Chicago a year when the whole company gets together.
We’ll be accepting applications until June 4.
This is a chance to do the best work of your career. We know you’re out there. Get in touch.
A common obstacle we face when releasing new features is making production schema changes in MySQL. Many new features require additional columns or indexes. Running an “ALTER TABLE” in MySQL to add the needed columns and indexes locks the table, hanging the application. We need a better solution.
Option 1: Schema Change in Downtime This is the simplest option. Put the application into downtime and perform the schema change. It requires us to have the application down for the duration of the “ALTER TABLE”. We’ve successfully used this option for smaller tables that can be altered in seconds or minutes. However, for large tables the alter can take hours making it less than desirable.
Option 2: Role Swap This is the option that we have used in the past to perform schema changes on large tables. There are quite a few steps which make this option error-prone. When the changes are made, a short downtime to swap the application between the master and replica is required.
Here’s a sample of the process we follow to change the roles of the current master “A”, and the current replica “B”.
Option 3: pt-online-schema-change We have recently started using pt-online-schema-change to perform our schema updates without needing to take downtime. It was developed by the folks at Percona. During the online schema change the original table is not locked and will continue to take reads and writes. In very basic terms here is what is happening when you run pt-online-schema-change.
Copying all rows of a table to the new table creates a lot of data that needs to be replicated to your slave. Fortunately pt-online-schema-change will monitor the status of your slave and will pause the data copy process if replication goes too far behind. We have also found that the data copy process can be disk intensive and will impact MySQL’s performance. Even with pt-online-schema-change we still choose to perform schema updates after hours to limit the impact on our applications. There are a number of settings in pt-online-schema-change which you can tune to maximize performance during the schema change. We also thoroughly test each schema change in staging prior to running production.
Next up: MySQL HA and Failover
We have customers around the world doing extraordinary things with our software, but Ben Saunders is taking it to a whole new level.
Ben and his team are using Basecamp to organize an expedition to the South Pole and back, unsupported and on foot. This is the same journey Captain Robert Scott died trying to achieve 100 years ago, and no one has attempted it since.
Ben has been a professional polar explorer for more than 10 years and is one of only three people to complete a solo journey to the North Pole. He will be joined by Alastair Humphreys, who has cycled 46,000 miles around the world, and renowned nature photographer Martin Hartley.
You can follow the expedition, which launches this October, at Scott2012.org and be sure to follow @polarben on Twitter.
Special thanks to Temujin Doran for letting us use his amazing arctic footage.
A year ago we put Sortfolio up for sale.
We entertained a variety of offers, met with a few potential suitors in person, and negotiated numbers. Ultimately nothing came together. Then we shelved the process so we could focus all of our efforts on designing and building the new Basecamp.
Sortfolio continued to run itself for another year, generating over $200,000 in profit for us during that time.
Our paying customer count continues to hover consistently in the 170s, each paying $99/month to be listed as a premium member.
We’ve put Sortfolio on the clock: We either sell it by July 1, or we close it down. And we’ll make it easier this time so there’s no guessing: The price is $480,000, cash. No special deals, no partial payments now the rest later, no equity in your company, etc. $480,000 cash and it’s yours. Considering how much hands-off free cash flow it generates, we think that’s a very fair price. We just want it to go to a good home.
We’ve put next to no effort into it over the last year… If you put some effort in you should see significantly higher sales. With over 10,000 free accounts, there’s tons of untapped opportunity here in the existing customer base. And of course plenty more on the outside or in entirely different industries.
You get the design, the branding, the code (it’s a Rails app), the customers, and the steady cash flow. Since Sortfolio is hooked up to our centralized billing system, you’ll need to write your own code to charge customers. Also, since Sortfolio is hosted on our server cluster, no hardware is included (but you can run it on a cheap server or two – the hardware requirements are next to nothing). We’ll also be happy to announce the sale here on SvN and on our very well subscribed email newsletter.
If you’re interested at $480,000, please email me direct at jason@37signals… Thanks.
This is going to be a big one. Now you can post messages, to-do lists, files, and text documents to the all new Basecamp just by sending an email.
In Basecamp Classic, you can post a new message by sending an email directly to Basecamp. This feature is especially useful if you’re on the road and want to post a message to the project from your phone. Just fire up your email app, address the email to Basecamp, and it’s immediately posted as a message to the project.
Initially, the all new Basecamp didn’t launch with this feature. Like everything else in the new Basecamp, we wanted to approach it fresh, take our time to think it through, explore a variety of ideas, and make it even better than before.
In Classic you could only post a message via email. You couldn’t make a to-do list, start a text document (called Writeboards in Classic), or upload a file via email.
But in the all new Basecamp, you can do all these things and more. Plus, it’s easier, clearer, and more powerful than before.
At the bottom right corner of every project you’ll see a link that says “Email content to this project”.
When you click that link, you’ll see a sheet pop up that looks like this:
You’ll see five icons at the top of the page. Each icon describes a different email-in feature. Starting discussions, making to-do lists, creating documents, uploading files, and forwarding emails. Clicking any one of those icons shows you the simple steps to follow for each feature.
Below the steps we show an example of an email and how that content will look when it’s posted to Basecamp.
When Basecamp receives your email and posts your content to the project, it immediately sends you an email receipt letting you know it worked.
For most content types, the email also includes a link to let you notify others on the project letting them know that you just added something to the project. If you click that link you’ll see:
Since we expect a lot of people to email in from their mobile phones, we made a mobile optimized version of the notifications screen too:
In addition to allowing you to start discussions, make to-do lists, create text documents, and upload files via email, we also allow you to forward in any existing email to Basecamp. This is especially useful if there was a conversation going on outside of Basecamp. Just forward that email thread into Basecamp and it’s stored along with everything else on the project. Easy peasy.
Forwarded emails get collected into a “Forwarded emails” section at the bottom of the project.
And if the email was an HTML email, we show the full HTML email, too:
There are so many interesting ways to use this new email-in feature in Basecamp.
One of the things I’ve loved about it so far is that I can sketch an idea on the whiteboard/chalkboard in a meeting room in our office, take a picture of it with my iPhone, and email it directly to a Basecamp project. It’s such a great way to get the physical results of a brainstorm, meeting, or sketch session right into Basecamp. And now that it’s in Basecamp, I can erase the whiteboard and not worry about ever losing that idea.
Email-in is also a great little “poor-man’s API”. You can have your apps send emails direct into Basecamp whenever you make a sale, get survey results from a customer, or who knows what. The opportunities are endless. We’re eager to see what sorts of things people come up with.
We’re thrilled with the feature and we think you’ll feel the same way. Thanks again for using Basecamp!
In college, I worked for a couple of years in a lab that tested the effectiveness of surgical treatments for ACL rupture using industrial robotics. Sometimes, the reconstructions didn’t hold. The surgeons involved were sometimes frustrated; it can be hard to look at data showing that something you did didn’t work. But for the scientists and engineers, all that mattered was that we’d followed our testing protocol and gathered some new data. I came to learn that this attitude is exactly what it takes to be a successful scientist over the long term and not merely a one-hit wonder.
Occasionally, when we’re running an A/B test someone will ask me what I call “success” for a given test. My answer is perhaps a bit surprising to some:
I only judge a test based on whether we designed and administered it properly.
As an industry, we don’t yet have a complete analytical model of how people make decisions, so we can’t know in advance what variations will work. This means that there’s no shame in running variations that don’t improve conversion. We also lack any real ability to understand why a variation may have succeeded, so I don’t care much whether or not we understood the results at a deeper level.
The only thing we can fully control is how we set up the experiment, and so I judge a test based on criteria like:
This might sound a lot like the way a chemist evaluates an experiment about a new drug, and that’s not by accident. The way I look at running an A/B test is much the same as I did when I was working in that lab: if you run well-designed, carefully implemented experiments, the rest will take care of itself eventually.
You might hit paydirt this time, or it might take 100 more tests, but all that matters is that you keep trying carefully. I evaluate the success of our overall A/B testing regimen based on whether it improves our overall performance, but not individual tests; individual tests are just one step along what we know will be a much longer road.
Today I saw a familiar pattern on a website for an analytics product. The home page pitched the product, and then above the signup form there was a headline: “Sign up in seconds.”
I see this all the time on signup forms and it makes me wonder: why did the designer put that there? My best guess is that they were trying to relieve some anxiety the customer might have. Like, “don’t worry, it’ll be over soon!”
I’ll bet that the time-to-signup isn’t an important anxiety factor. When’s the last time you shopped for a software product under intense time pressure, where every second counts?
When I evaluate web products I often feel uncertain about what will happen after the quick signup. Sure it takes seconds to create an account, but then what?
I had an idea to address this uncertainty. You could preview the workflow steps that come after the signup so it’s clear how much of a gap there is between signing up and getting value out of the product.
Check out this sketch. It shows “what happens” after you signup. Once you sign up, you get a Javascript code, paste it into your website, and then you can watch real live graphics of traffic come to your website. Sounds pretty easy right? Why not try it?
I haven’t tested this approach on any sites. Intuitively I like how it integrates the call to action with the sales pitch in a single flow. What do you think?
Over the past few months I’ve learned an immense amount from the all new Basecamp codebase. This year for RailsConf, I was able to show off some new (and old!) patterns in the codebase along with some neat libraries that we’ve put to serious use for our customers. The slides are over at SpeakerDeck if you’d like to see them all, and hopefully a video of the presentation will be up soon!
Here’s a few choice sections from the talk, and plenty of great links to check out in the meantime:
We’ve talked in bits and pieces about the infrastructure behind our apps, and I wanted to give a clearer picture of what Basecamp looks like both on our production machines and on each developer’s box.
For databases, we hook up to several:
There’s a mix of internal services as well, which are hooked up to through a series of gems and Rails engines:
Thankfully, we don’t need to set up each individual service on our own machine to get hacking on Basecamp. Two are required though, along with the main Rails app: Portfolio, and Launchpad. The app would look pretty silly without avatars, and even locally we need to sign in to get access.
Running these services side by side is usually a challenge, but Pow handles it like a champ. If you haven’t checked it out yet, it’s a wonderful Ruby web server that hooks into OSX internals to make serving apps locally painless.
We also have a convention across all of our apps to use a single bash script that makes getting started with development so much easier. This script lives at script/setup in each repo. Typically, getting an app working on your machine feels like blowing on an NES cartridge. Having one script to be a “reset button” for your app that sets up the database, bounces your local web server, and does whatever custom wrangling required to get cranking away can save an immense amount of time and frustration for your team.
ActiveSupport’s Concerns are used extensively in our models and controllers. Using them in your Rails app enables two big wins: it’s the simplest refactor out there, an Extract Method, and it allows you to group alike methods together instead of each class being a grab bag of unrelated functions. Here’s an example of our Ajax concern, used across several controllers:
# app/controllers/concerns/ajax.rb
module Ajax
extend ActiveSupport::Concern
included do
before_filter :set_ajax_cookies
end
private
def set_ajax_cookies
# set some cookies!
end
end
It’s a standard Ruby module, but the included block that allows class-level code to be be easily added in. Of course, even if you extract everything into concerns, your class can still be a ball of mud. Please don’t think this is an excuse to gloss over proper design for your code.
The Ruby to CoffeeScript ratio is around 1:1 as well. Since Rails 3.0, using HTML5 data-* attributes for decoupling behavior between the client and server side has been immensely helpful. We’ve taken that to the next level with our usage of data-behavior. Here’s an example of what hooking up the date picker for todos looks like:
<label>
<b>Set the due date:</b>
<div data-behavior="date_picker"></div>
</label>
$('[data-behavior~=date_picker]').live 'focus', ->
$(this).datepicker()
This technique keeps complicated JavaScript logic out of the views, stops tying behavior to CSS classes and/or DOM IDs, and it’s still pretty easy to query the elements. Check out the usage of ~= as well, which allows us to chain multiple behaviors on the same element. If you’d like to get a start on using these in your app, rails-behaviors has some great examples.
Anything we can do to make debugging customer problems easier and faster is worth it. Noah blogged earlier this week about how we use marginalia to log the controller and action that each SQL query came from.
We also tag each log line in production with a unique ID for each request and the account ID of the user. This has two big benefits: we can easily grep out one entire request with the unique ID, and we split logs based on the account ID to narrow down the search.
Accomplishing this in Rails 3.2 is easy, thanks to ActiveSupport::TaggedLogging. Here’s a simple example of getting it running, crack open config/application.rb:
YourApp::Application.configure do
config.log_tags = [ :uuid ]
end
After bouncing your server, you’ll start to see a unique ID for each request in the log:
[71ba53fd717c67a6677a058f4a5acdf4] Processing by ProjectsController#index as HTML
The config.log_tags array can also take a static string, or a proc/lambda to allow for more customization. I’ve pulled out some more examples to check out as well.
There’s a lot more to the WebKit console than console.log. I remember when Firebug utterly changed how I worked with JavaScript. After learning some tricks out of this codebase and some great blog posts lately, I’m starting to feel that way again.
Two examples are console.warn(), and console.group() / console.groupEnd(). Warn adds the yellow icon, and grouping allows you to collapse/expand similar log messages:
These are only enabled when in development mode, but it’s really simplified how we dealing with log messages and nailing down performance issues.
Another great example is console.profile() and console.profileEnd(). There’s an entire tab for performance tuning and timing on the WebKit console. How did I miss this!?
This tool has been really useful for simply visualizing what’s slow. It’s a bit obtuse at times, and the nesting of how functions are called/displayed is a little wacky, but definitely check it out.
Finally, Chrome has a little piece of code that can show you how many milliseconds it’s been since the page load:
chrome.csi().pageT
// 2933006.221
This feels like it should be standardized somehow! In the meantime there’s a small snippet you can toss in to get it working in any browser.
Hopefully you’ve picked up something new so far! There’s plenty more on the slides, along with some notes that conference-goers took. One huge take-away I’ve gotten from the Basecamp code base is that we’re still evolving and learning, and there’s no reason to stop!
We’re looking for one or two more folks to join our support team. Specifically, we’re after some great people in the UK time zone (or close to it) to cover business hours in that part of the world. Launching the all-new Basecamp got a lot of people excited and we want to expand our team to cover business hours in more time zones.
You’ll be responsible for providing tremendous customer service via email for Basecamp, Basecamp Classic, Highrise, Backpack, and Campfire. You’ll also help us answer questions via Twitter, create and edit help documentation, and maybe run some online classes.
You’ll be expected to answer about 75 emails per day once you’re fully up to speed (2-3 months on-ramp). This is a significant volume, so be sure that you’re ready and able to deal with that kind of daily load.
We’re looking for some great writers who love helping our customers, so you should enjoy making complicated situations simple and painless and have a passion for our products.
If you live in the UK (or thereabouts) and want to join Ann, Chase, Emily, Kristin, Merissa, Michael and me in making our customers happy, please apply!
Please submit a cover letter explaining:
Also, attach the following writing samples:
We offer heaps of lovely benefits, plus a progressive work environment. Starting salary is $45k USD, depending on experience.
Email everything to jointheteam@37signals.com. Include “Customer Support” in the subject line. If you’re attaching a resume, please send it as a PDF. Note: We look favorably on people who get creative with their applications.
We look forward to hearing from you!
We just launched a brand new feature in the all new Basecamp that is handy in a bunch of different ways. Now you can move to-do lists, discussions, text documents, files, and calendar items between projects or into a brand new project.
Moving items between projects is especially useful in a few specific cases (and probably many we’ve never thought of). For one, people put things in the wrong place from time to time. Now it’s no big deal – just move it to where it should be.
And then there are other times when you want to break a bigger project into a couple smaller projects. Now you can take a list or a message or anything from one project and start an entirely new project from that item. It’s great.
Here’s a video showing you how it works. We think you’re going to love it.
Thanks for using Basecamp! Wait, you aren’t using Basecamp? What are you waiting for?.
One of the things we’ve added to our applications in the last few months is a little gem that (among other things) adds a comment to each MySQL query that is generated by one of our applications.
Now, when we look at our Rails or slow query logs, our MySQL queries include the application, controller, and action that generated them:
Account Load (0.3ms) SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`queenbee_id` = 1234567890 LIMIT 1 /*application:BCX,controller:project_imports,action:show*/
When we’re trying to improve a slow query, or identify a customer problem, we never have to go digging to understand where the query came from—it’s just right there. This comes in handy in development, support, and operations – we used it during a pre-launch review of unindexed queries in the brand new Basecamp which launched a couple months ago. If you combine this with something like pt-query-digest, you end up with a powerful understanding of how each Rails action interacts with MySQL.
It’s easy to add these comments to your Rails application in a relatively unintrusive way. We’ve released our approach that works in both Rails 2.3.x and Rails 3.x.x apps as a gem, marginalia.
marginalia (mar-gi-na-lia, pl. noun) — marginal notes or embellishments
Merriam-Webster
We’ve been using this in production on all of our apps now since December, ranging from Rails 2.3.5 to Rails master and Ruby 1.8.7 to 1.9.3. You should be able to have it running in your application in a matter of minutes.
It’s worth acknowledging that anytime you modify the internals of something outside your direct control there are risks, and that every function call adds some overhead. In our testing, these have both been well worth the tradeoff, but I absolutely encourage you to consider the tradeoff you’re making for yourself every time you instrument or log something. You may certainly have a different set of tradeoffs, and you should absolutely test on your own application.
Have a suggested improvement to our sample code or another way to do this? We’d love to hear it.
Thanks to Taylor for the original idea, and to Nick for helping to extract it into its own gem.
“Oh, that’s not my job,” is the sound of doom. Maybe not imminent doom, but doom indeed. It’s the magic inflection point when a company becomes too big (even if only psychologically) for any single employee to give a rat’s ass about job numero uno: Making shit work.
No profession is immune. You can have designers who oh-thats-not-my-job to get the JavaScript they wrote to work, programmers who cry for operations to make their slow code run on time, operations people who refuse to answer customer complaints from their network outage, and on and on. Once the mentality cements, everything is eventually someone else’s job, and they’re being a toad for inconveniencing you with it.
And besides, it’s easy to put it on somebody else, right? Everybody else’s job is easy!
Departmental hedges grow fast and tall if not trimmed with vigor. It’s the natural path unless you take steps to fight it.
That’s why, at 37signals, we all chip in when lots of customers have questions after a new product launch and customer support is overwhelmed. It’s why programmers will wake up in the middle of the night if a sql query tipped over and needs an urgent rewrite until faster servers can arrive.
Don’t let your company culture become one where certain people are too good to do the jobs that need doing. Making shit work is everyone’s job.
My dad is a firefighter and fire captain in Niagara Falls, NY. When I told him I had on-call duty for my new job, he was beyond excited. After relaying stories of waking in the middle of the night to head into the hall and getting overtime from his buddies that didn’t want to wake up for work were sick, I had to explain that it’s a different type of action for me. I face issues of a less life-threatening variety, but there’s still plenty of virtual fires to extinguish. Here’s a primer for what being an on-call programmer means at 37signals.
On-call programmers are rotated around every 2 weeks, and all 8 programmers currently get their fair share of customer support and interaction. Usually we have 2 to 3 programmers on-call on a given week. Support issues from email and Twitter are routed through Assistly, and handled by our awesome support team.
If there’s an issue they can’t figure out, we get a ping in our On Call room in Campfire to check out a certain issue:
These issues range in severity, and they might look like:
The next step is to FIX IT! If possible, get the customer’s problem figured out in the short term, and hopefully push out a bug fix to stomp it out permanently. Luckily, we’ve got a few tools to help us out debugging. We use a GitHub wiki to share code snippets that make some common issues go faster:
This screenshot shows off a newer piece of our weapon rack as on-call programmers: 37. 37 is our internal tool for doing pretty much anything with our production servers and data. Some of what it covers:
37 has helped immensely by just the virtue of being a shared tool that we can use Ruby (and Bash!) to automate our daily work. It started as a small set of scripts tossed around on various machines, but it really became a vital part of our workflow once we made it into a repo and documented each command and script.
Once the issue has been debugged/solved/deployed, we’ll log the issue as fixed on Assistly. The support crew handles telling the customer it’s fixed, but sometimes I’ll jump in if it’s a developer/API related issue.
There’s a few other channels we pay attention to throughout the day as well. In Campfire we get alerts from Nagios about things that might be going wrong.
Here’s one such example: a contact export from Highrise that was stuck in the queue for too long.
Another incoming channel is the API support google group. Although this is more of a support forum for existing API consumers, we’ll try to jump in and help debug issues if there’s time left over from handling direct customer issues.
Our on-call emergencies come in many different flavors. An all-out, 5 alarm fire is rare, but does happen. Typically it’s a slow burning fire: something is smoldering, and we need to put it out before it gets worse.
We’ll learn of these problems in a few ways:
Once we have a handle that it’s not a false alarm, we’ll update the status site and notify customers via @37signals. The number one priority from there is putting out the fire, and it usually involves discussing our attack plan and deploying the fix.
If the fire is really getting out of control and tickets are piling up, sometimes we’ll help answer them to let them know we’re on it. The status site also knows everyone’s phone numbers, so if it’s off-hours we can text and/or call in backup to help solve the problem.
Here’s a few tips I’ve learned from our fires so far:
Be honest
Given I’m relatively new to our apps and their infrastructure, I don’t know my way around 100% yet. Being honest about what you do and don’t know given the information at hand is extremely important. Be vocal about what you’re attempting, any commands you might be running, and what your thought process is. Jumping on Skype or voice iChat with others attempting to debug the problem might also be useful, but if someone is actively trying to hunt down the problem, be aware that might break their flow.
Cool your head
Each problem we get is different, and it’s most likely pretty hairy to solve. Becoming frustrated at it isn’t going to help! Stepping away might not be the best way to de-stress if the fire is burning, but staying calm and focused on the problem goes a long way. Frustration is immediately visible in communication, even via Campfire, and venting isn’t going to solve the problem any faster.
Write up what happened
Post-mortems are an awesome way to understand into how the fires were put out, and what we can do better the next time one happens. Our writeups get pretty in-depth, and knowing the approach used can definitely help out the next time. Especially since we’re remote and spread across many different timezones, reviewing a full report and reflection on the problem is extremely helpful, no matter how small the fire was.
Issues that crop up repeatedly always have a larger fix in mind. Losing work due to browser crashes and closed windows was a large support issue, until autosave came to the rescue. When not putting out fires, on-call programmers are working on “slack” issues like these, or fixing other long-standing bugs.
Experimentation with how on-call works is definitely encouraged to help our customers faster, and I’m sure our process will continue to evolve. It’s not perfect (what process is?), but I can definitely say it’s been improving. Putting out our virtual fires is still a lot of fun despite all of the stress!
It’s always satisfying to announce the release of one of the top Basecamp feature requests. Today is one of those days. We’re glad to announce that to-dos with due dates now show up on the all new Basecamp calendar.
Prior to this update, only events that were directly added to the calendar showed up on the calendar. But as of today, any to-dos with due dates also show up on the calendar. And just like events, you can drag and drop to reschedule a to-do. Very handy.
Now you have a much better view of everything that’s due in a project. To-dos, events, meetings, project phases, etc. – now you can see them all at the same time on a single calendar.
We’re really happy with how it turned out. We hope you love it.
Here’s a quick video showing you how it works.
The signs are all here: There’s now an incubator on every corner, even your uncle is donning angel wings, and IPO expectations for Facebook are exceeding the hype for a new Twilight movie. But that’s all circumstantial evidence. What we needed was some public testimony to really put everyone in the right frame of mind.
Enter our trusted troubadour of bullshit, TechCrunch:
My best guess is that it is about to get crazy. And, only fools sit on the sidelines. Many strong and older entrepreneurs that I know are wealthy today because they made intelligent decisions during the dot-com bubble of the late ’90s. Success was not easy then, and it will not be easy now, either. But, the likelihood of a great outcome is much higher in a boom.There are a lot of newly minted entrepreneurs that pursue their dream company in a halfhearted way. You may tinker with your idea while toiling at a day job. You may refuse to put in the work required to recruit the best talent. You might be afraid of launching an imperfect product. Or, you may put a mediocre effort into fundraising.
Let me translate: Dude, you’re going to miss riding this bull onto the bubble if you do not get on it RIGHT. FUCKING. NOW! Didn’t you see that someone just made A BILLION DOLLARS? Why wasn’t that you, lazy schmuck? Don’t answer that—there’s no time to look at the past, just quit your job, and come out here to the Valley post-haste. Sand Hill road just scored a fresh load of loot.
Now I get the basic psychology. Someone just won the billion dollar startup powerball and now everyone wants to make sure they bought a ticket for the next drawing. And why not? While the past season of tech IPOs has been full of duds, we still have the big baller Facebook coming up for a shot. And if red 32 hasn’t hit for the last few IPOs, it’s bound to do for this round. COME ON LUCKY 32!!!
But let’s calm down. Sooner or later, the market is going to sort these things out, and all will be right as rain. That’s evident with the Groupon fiasco. They’ve restated their accounting numbers endlessly and the stock has finally tanked. At the end of the day, the rules of accounting will blow through all the smoke and the mirror will show a face with no make-up.
Are you calm? Good. Now get ready to rage right back up. The new JOBS Act that was just passed with the help of a thousand VCs stomping it down the throat of Congress undoes all that. Matt Taibbi from Rolling Stones reports:
Ostensibly, the law makes it easier for startup companies (particularly tech companies, whose lobbyists were a driving force behind passage of this law) attract capital by, among other things, exempting them from independent accounting requirements for up to five years after they first begin selling shares in the stock market.The law also rolls back rules designed to prevent bank analysts from talking up a stock just to win business, a practice that was so pervasive in the tech-boom years as to be almost industry standard.
Now isn’t that swell. Enable people with an extreme financial incentive to spin the truth, or outright lie about the numbers, a 5-year get-out-of-jail cover, and what are you going to get? JOBS, silly! Duh!
Buckle your seat belt, Dorothy, ‘cause Kansas is going bye bye.
When developers first discover the wonders of test-driven development, it’s like gaining entrance to a new and better world with less stress and insecurity. It truly is a wonderful experience well worth celebrating. But internalizing the benefits of testing is only the first step to enlightenment. Knowing what not to test is the harder part of the lesson.
While as a beginner you shouldn’t worry much about what not to test on day one, you better start picking it up by day two. Humans are creatures of habit, and if you start forming bad habits of over-testing early on, it will be hard to shake later. And shake them you must.
“But what’s the harm in over-testing, Phil, don’t you want your code to be safe? If we catch just one bug from entering production, isn’t it worth it?”. Fuck no it ain’t, and don’t call me Phil. This line of argument is how we got the TSA, and how they squandered billions fondling balls and confiscating nail clippers.
Tests aren’t free (they cost a buck o’five)
Every line of code you write has a cost. It takes time to write it, it takes time to update it, and it takes time to read and understand it. Thus it follows that the benefit derived must be greater than the cost to make it. In the case of over-testing, that’s by definition not the case.
Think of it like this: What’s the cost to prevent a bug? If it takes you 1,000 lines of validation testing to catch the one time Bob accidentally removed the validates_presence_of :name declaration, was it worth it? Of course not (yes, yes, if you were working on an airport control system for launching rockets to Mars and the rockets would hit the White House if they weren’t scheduled with a name, you can test it—but you aren’t, so forget it).
The problem with calling out over-testing is that it’s hard to boil down to a catchy phrase. There’s nothing succinct like test-first, red-green, or other sexy terms that helped propel test-driven development to its rightful place on the center stage. Testing just what’s useful takes nuance, experience, and dozens of fine-grained heuristics.
Seven don’ts of testing
But while all that nuance might have a place in a two-hour dinner conversation with enlightened participants, not so much in a blog post. So let me firebomb the debate with the following list of nuance-less opinions about testing your typical Rails application:
Given all the hundreds of books we’ve seen on how to get started on test-driven development, I wish there’d be just one or two that’d focus on how to tame the beast. There’s a lot of subtlety in figuring out what’s worth testing that’s lost when everyone is focusing on the same bowling or bacon examples of how to test.
But first things first. We must collectively decide that the TSA-style of testing, the coverage theater of quality, is discredited before we can move forward. Very few applications operate at a level of criticality that warrant testing everything.
In the wise words of Kent Beck, the man who deserves the most credit for popularizing test-driven development:
I get paid for code that works, not for tests, so my philosophy is to test as little as possible to reach a given level of confidence (I suspect this level of confidence is high compared to industry standards, but that could just be hubris). If I don’t typically make a kind of mistake (like setting the wrong variables in a constructor), I don’t test for it.
In February I got a chance to chat with Paul Budnitz, founder of Budnitz Bicycles.
“I design and create beautiful things and then create businesses to sell them,” Paul says. He’s been a professional photographer, shot films, owned a company modifying vintage clothing, turned making handmade microphones out of a garage into a multi-million dollar business — the list goes on.
“I started out in eighth grade selling fireworks to all my friends in school and we actually programmed all our orders on the mainframe computers at the University of California, which at that time they were teletype computers. And we didn’t really know that those computers were controlled by the Department of Defense. So I eventually got arrested and suspended. That was my first business.”
In 2002 Paul founded Kidrobot, which makes limited-edition art toys. “I like to make immaculate products,” Paul says, “and if I run the business myself I get to do it my way.” Kidrobot uses Basecamp to communicate with suppliers and distributers over four continents with hundreds of active projects.
Budnitz Bicycles, Paul’s latest endeavor, uses the new Basecamp to work with manufacturers and suppliers around the globe. The bikes are gorgeous! Paul let me take one for a spin and it was honestly the most comfortable ride I’ve ever had.
You can find out more about Budnitz Bicycles at budnitzbicycles.com and be sure to follow @budnitzbicycles on Twitter.
Also, if you missed the profile we did on Happy Cog you can find it over here.
I’m starting to believe nothing should be designed in a day. Working a full-night’s sleep into your design process is as important as anything else you do. Morning tells the truth.
Designer Aaron Draplin lays down 50 points in 50 minutes the only way he knows how – bullshit free. Lots of great advice in here wrapped in great fun. Definitely worth your time.
Fantastic insight from Neil deGrasse Tyson about how important it is to be sensitive to someone’s current state of mind when you are trying to teach or persuade. You don’t teach with facts alone. You have to understand how those facts/thoughts are received by the person on the other end. And to do that, you have to understand what’s already in their head and how those ideas got there. Teaching is about bringing facts and external sensitivity together to have impact. This is powerful stuff and a great lesson for everyone.
When we were building the new Basecamp, we wanted the foundation to be built on clean, modern underpinnings to take advantage of all the new wonderful features of HTML5. That meant we have to drop support for older browsers, like IE8, that have little or poor support for the HTML5 technology we are using to make Basecamp awesome for everyone.
But, have no fear! We realize that a lot of people are stuck with IE8 (sometimes even IE7 or, yikes, 6), so we made sure that Chrome Frame works with Basecamp. Chrome Frame is available for IE 6-9 on Windows machines and can usually be installed without admin access.
If you’re stuck with an older version of Explorer, check out Chrome Frame and get yourself a Basecamp account.
One of the super-cool benefits of working at 37signals is a membership in a CSA (Community Supported Agriculture). We get fresh fruits and veggies at the farmer’s market or delivered to our doors, which encourages us and our families to cook and eat healthier — and the brain food helps us stay at the top of our mental game too!
It also feels great to support local farmers. We’re spread out all over the place, so the contents of our CSA boxes reflect what’s local and in season where we live.
Clockwise from top left: A recent delivery from Greenling in Austin, Texas; Javan’s Romanesco broccoli from Sunseed Farm in Ann Arbor, Michigan; Eron’s winter veggies from Coon Rock Farm in Hillsborough, North Carolina; and Ann’s fan dance with lettuce from Irv & Shelly’s Fresh Picks in Chicago.
My favorite part of belonging to a CSA is the surprise that comes with opening a new box and seeing what’s new — it’s turned me into a more adventurous cook.
A few of my CSA-based creations: grapefruit-avocado salad, sesame broccoli with peanut sauce, Swiss chard frittata and an avocado-orange smoothie.
Soup is perfect for using up a bunch of perishables all at once!
Shaun’s vegetarian chili, and Will’s wife’s veggie-and-ham soup
Kristin made a pie with apples from her CSA last fall, and I made a sweet potato meringue pie with mine.
Hey, it doesn’t have to be 100% healthy all the time, right?
Michael, 37signals’ resident foodie and showoff, whips up amazing creations with his CSA goodies from Irv & Shelly — I’m considering moving to Chicago so he’ll feed me more often.
Michael’s masterpieces, clockwise from top left: red quinoa with roasted cauliflower, dried cranberries, and toasted pine nuts; spinach tomato scramble with Sunday bacon; parsnip and potato latkes; mushroom ginger soup with hato mugi; squash and chickpea Moroccan stew with hand-rolled couscous; and poached eggs with sautéed spinach, toasted pecans, and parmesan.
If you’re interested in CSAs in your area, check out localharvest.org. Bon appetit!
Watch live video from The Topspin Weekly Webcast on Justin.tv
The above player is this week’s webcast, live from Laurel Canyon covering a lot of Topspin ground. Lots to learn about us in this episode so please press play. You’ll see some excellent campaigns in action, as well.
Watch live video from The Topspin Weekly Webcast on Justin.tv
Garrison Starr stopped by to perform songs from her new release “Amateur” before her CD release party tonight at The Hotel Cafe in Hollywood. It was a very heartfelt performance from Garrison in our office and we thank her for being with us today! Great spirit!
Greetings! We’re back today with both the Weekly Webcast at 11AM PST on our Justin.TV channel *and* our frequent Free Music Friday posts. Our webcast, which typically includes Topspin news, feature updates and website reviews, will also include a live performance from Mississippi’s Garrison Starr at 12:30PM. If you are around your computer, be sure to tune in!
There is such great art in this week’s post below, so PLEASE jump on a few mailing lists to keep up to date with these rockstars while earning their free tracks.
And Happy Friday!
Welcome to Topspin, Amanda Palmer! Eyes and Ears customized a GREAT email acquisition page in conjunction with the handy Download Anywhere feature built by Topspin Labs. After you get your “Confirm and Download” email, you land right on top of Amanda’s record-setting Kickstarter campaign which has garnered over $743k in 18 days! Badass.
Beachwood Sparks bring their very chill California vibe back to us with their first album in 11 years. ‘The Tarnished Gold’ comes out on Sub Pop June 26 and you can get a taste with a free download of ‘Forget the Song’ now. The song is simply beautiful and I cannot wait for the album to be released into the world.
Fitz and The Tantrums are giving away more of their fun, vibrant music, including live tracks and a remix of their groovy “Breakin’ The Chains of Love”. I discovered the giveaway when they posted the link from their Facebook page. It served as a great reminder: if you are giving away tracks, throw the link into your Facebook status, encourage ‘Shares’ and grow your list! It works!
This smooth pre-order page for the Danko Jones offer by Bad Taste Records is very well-done and worth checking out. Get the free music while you’re at it!
This beautiful Curtis & Reinhard offer page is produced by 27 Sound. It features thoughtful offers which include a nice way to select t-shirt designs through the purchase flow to avoid using multiple buy buttons. Go look: http://curtisreinhard.com
After ignoring Electronic Dance Music (EDM) since its inception, the music “business” is finally waking up to the fact that throngs of people *love* it and want to pay money to experience it. The pinnacle of proof is the annual Electric Daisy Carnival (EDC) which has organically grown to be the biggest EDM event of the year. This year the creators of EDC have added a conference addressing the *business* of EDM to the lineup, happening earlier in the week prior to EDC in Vegas. It’s shaping up to be a must-attend for anyone interested in the business of Electronic Dance Music.
See you there!
ian
EDMbiz Conference
June 5-7
The Cosmopolitan of Las Vegas
Register HERE
Music Startup Academy – LA
June 7
1:00 – 5:00
Grammy Museum
800 W. Olympic Blvd.
Los Angeles, California
(corner of Olympic Boulevard and Figueroa Street), in the L.A. LIVE district
The Music Startup Academy is designed to reduce barriers to entry into the music business for entrepreneurs, by providing a clear roadmap to success through actionable insights into the core structure, legal framework, content deals, business models, and the “nuts n’ bolts” of getting things done to build a legal, streamlined, and competitive music property. These sessions have been held in NYC, San Francisco, at the SXSW Accelerator, and most recently a 100+ standing-room-only session in Nashville. Upcoming sessions include this L.A. session, Washington D.C., and another to be announced shortly in London, at the UK GeneralAssemb.ly space.
The GRAMMY Museum is an exciting and interactive celebration of the power of music occupying a vibrant new space in downtown Los Angeles, minutes away from the Staples Center and the Convention Center.
A full agenda and registration can be found via Eventbrite.
It’s time we pulled back the curtain on the newly launched Eurovision download store produced by Jessie Scoullar of Wicksteed Works. The Eurovision Song Contest has been held annually since 1955 when it was created by the European Broadcasting Union in a bid to bring countries together with a light entertainment program. Check out the 2012 entries to the Contest, complete with custom preview players, lyrics to sing along with your favorites, and the back catalogue from 2007 through to 2011. All tracks are available for individual purchase or as whole albums, in full-figured high quality 320kbps MP3. This is one of Wicksteed Works’ most ambitious projects to date, in partnership with a world-leading brand: over 270 pages and 400 buy buttons! Eurovision has a broadcast audience reach in the hundreds of millions and there is a fantastic team at Universal Denmark. We’re looking forward to seeing who wins the Song Contest on May 26!
About Wicksteed Works: Jessie’s company emerged from the simmering crucible of the experience and know-how distilled from two years on Topspin’s Creative Services team, compounded with broad music industry experience in artist management, live event production, touring and merchandising, on top of a background in licensing, commercial law, student radio and journalism. To inquire about their services, send a message to: hello@wicksteedworks.com or follow them on Twitter.
Topspin features: Custom HTML Store; WordPress Plugin; Linkbuilder
Produced by: Wicksteed Works
Get Topspin: http://topspinmedia.com/signup
Very rough day on the news of Adam’s death. I may try to collect some memories in a blog post at some point. No idea what to say at the moment.
Please hit play on Bad Brains’ ROIR cassette this weekend. Adam would appreciate that, I’m certain.
Official statement up on BeastieBoys.com.
Wednesday, May 9
8:30 – 10:45AM: Breakfast & Opening Session
At NARM and digitalmusic.org’s Music Biz 2012 Opening Session, which will be held Wednesday, May 9 at the Hyatt Regency Century Plaza Hotel in Los Angeles, Robb McDaniels will be interviewed by Topspin’s Ian Rogers in a live episode of the “This Week in Music” web series. It will be McDaniels’ first public speaking engagement since INgrooves’ March 2012 acquisition of Fontana Distribution, a leading distribution company for independent record labels, to create the merged company INgrooves Fontana. McDaniels, Founder and CEO of Isolation Network (IN) and its pioneering digital music distributor INgrooves, is now CEO of the newly minted INgrooves Fontana.
“Robb’s long history in the digital space and recent entrance into the physical distribution market make him an extremely interesting interview subject with many important lessons to share,” said Rogers. “I’m looking forward to exploring his take on the current distribution landscape and excited for the opportunity to present ‘This Week in Music’ live from MusicBiz 2012.”
2:00 – 3:30PM: The Internet and Independent Labels
Ian will be in this Breakout Session with fellow panelists Bill Armstrong (Side One Dummy/The New Record Service), Adam Farrell (Beggars Group USA), Brian McNelis (Lakeshore Entertainment), and Molly Neuman (eMusic/Simple Social Graces Discos). The panel will discuss how Internet access has opened up countless opportunities for independents, but at the same time has also opened up opportunities for unlicensed/unpaid access. The conversation will explore best practices being enacted like the “Copyright Alerts” program, which the major ISPs have embraced here in the U.S. and the finger-printing and content ID blocking measures that many digital partners are starting to include as standard for their platforms.
Thursday, May 11
9:15AM: Product Packaging/Bundling In The Digital Age
Bob Moczydlowsky will be moderating the “Product Packaging/Bundling In The Digital Age” panel. Confirmed speakers are David Dorn (Rhino), Christina Dunkley (3D Management), Jason Fisher (Epitaph), Jeff Nicholas (The Uprising Creative), and Mark Reynolds (Cinderblock). The session will address the productization of digital content with a focus on what the fan wants, and how the industry must meet these demands through standardized metadata, condensed licensing strategies, and interoperable databases and backend systems.
Bringing Together The Developer Community And The Legacy Music Business
digitalmusic.org was created to reduce the friction between the entrepreneurs/developers and the legacy music business, and this year’s Music Biz 2012 focuses on bringing together these two communities to discuss best practices to reduce the friction in how they do business and tools to better help them navigate the complicated landscape of rights, standards and relationships. Music Biz 2012 is offering a Special App Developer Registration Offer, a steeply discounted registration fee of $199. If you are a developer, use code ’199-app’ at this registration link for the discounted registration fee.
Please say hello when you see us kicking around the various events next week!
Quick announcement from Topspin-land. We are excited to announce we’ve just hooked up with our pals at TuneCore to create a real technical integration that will save artists both time and money. Coming in late summer of this year, you will be able to have your music auto-delivered from Topspin to TuneCore or from TuneCore to Topspin without having to re-upload. You’ll also be able to send your Topspin direct-to-fan sales proceeds and information into the TuneCore artist dashboard, so it can be displayed along with all of your other sales data from iTunes, Spotify, Amazon, simfy, iHeartRadio and a whole bunch of other services around the world.
In fact, in the interest of celebrating, we’re making the discount available immediately. Click “Get Started” below and TuneCore is ready to give you up to 30 percent off right now.
Already Have a Tunecore Account?
Hopefully this simple but powerful integration will keep you from going crazy uploading albums and videos all over the place, and it will save you some money, too. Partnerships with MTV and TuneCore? Giving artists the ability to put their work on the URLs where fans discover and consume music? Hmmm… seems we’re up to something, doesn’t it?
Stay tuned. We have at least two, and maybe more, important announcements coming soon.
With over a million subscribers on his YouTube channel, DeStorm is another DIY artist winning in the game of music. His first release ever, the “Be Careful” mixtape, is available today via Topspin’s out-of-the-box Spinshop. DeStorm promotes his Spinshop link right inside his YouTube video descriptions to sell his offers: http://destorm.spinshop.com. And because he is a YouTube partner, DeStorm has his Topspin offers available in a Store right inside his YouTube channel. Learn more about YouTube’s Partner Program HERE.
DeStorm’s “Be Careful” mixtape, is for sale on a really cool KEY USB Drive which has all 14 songs + a bonus song for $15.00. The physical SIGNED CD is $9.99, and a digital version is just $4.99.
Thanks for all the Topspin shout-outs in your new video on YouTube, DeStorm! Keep up the great work!
Topspin features: Topspin Spinshop
Installed by: DIY – Artist
Get Topspin: http://topspinmedia.com/signup
Gundega Strautmane, a Latvian textile artist and designer, visualizes social and physical networks in a show called Relational Ornaments. The networks are created using various sized pins to depict nodes and threads connecting them to show relationships. Bringing visualization into the tactile world lends it a weight not able to be achieved on a computer screen. It allows the viewer to pause, spend time with the information, feel it, sense it in a more holistic way. The placement of pins and threads is imprecise because they are placed by hand giving the work a very natural, organic feel rather than the rigidity of the exact calculations of programming.
[via The Network Thinkers]
This Wall Street Journal graphic shows who's selling (or sold) a percentage of their Facebook stocks and who's holding steady.
This graphic is the perfect example of why I'm a proponent of the pie chart. First, they stuck to two values per pie chart. That makes it easy to read. Next, they used the size of the pie to denote the number of shares. Finally, they used small multiples to easily compare both the shares owned by each entity as well as change in percentage of shares being sold.
I'm sure bar charts would be fine too, but WSJ really used all aspects of the pie chart very effectively.
[via Barry Ritholtz]
Washington Post's Ezra Klein busts on the filibuster. Gone are the days of Mr. Smith when invoking the filibuster was seen to serve a greater purpose. The filibuster has its roots in Ancient Rome, and apparently even then it had its critics.
This chart is a great example of providing a lot of information in a concise area. All of these data points are relevant to the topic and helps us inform our opinion about the matter.
[via @hfairfield]
The New York Times does it again with this succinct look at tech IPOs. It begins with looking at everything through the lens of when Google's IPO in 2004, which, at the time, was considered huge. The next screen adds Facebook to the mix which dwarfs everything prior. It continues on to show the first day of trading pop and where things landed long term (3 years post-IPO).
It's a very interesting view of IPOs and could actually be a good financial analysis tool with a few more features.
Help is a drug company that offers you less. Less active ingredients, less waste, less confusion, less greed. Its tongue-in-cheek website has a map of its latest sales data called "What's wrong U.S.?" A bar chart for each state shows how many people are buying products for particular maladies.
So why are the inner northwest states having problems sleeping? My guess they're up late worrying about gay marriage.
Garbage in, garbage out the old adage goes. Nigel Hawkes, Director of Straight Statistics, describes a sort of statistical whistleblowing letter to the British Medical Journal.
A team from Imperial College found that in 2009-10, nearly 20,000 adults were coded as having attended paediatric outpatient services, and 3,000 patients under 19 were apparently treated in geriatric clinics. Even more striking, between 15,000 and 20,000 men have been admitted to obstetric wards each year since 2003, and almost 10,000 to gynaecology wards.
It's hard to put your faith in analysis, visualization, policy, and anything else that comes out of data with reports like these. With human error being a known issue, we have to find better ways of inputting and double-checking data. Unfortunate mistakes at the outset only lead to bigger problems down the line.
The unassuming little Descriptive Camera made me rethink data. This project by Matt Richardson was on display at the ITP Spring Show. The basic premise is that you take a photo and the camera spits out a textual description of what it sees. The results are remarkably accurate, detailed, and humorous.
Here's what my photo said:
A woman wearing a seriously awesome jacket that is printed with yellow, blue, and grey circles looks at her ipad rather than making eye contact with Matt Richardson.
I mean, my jacket *IS* seriously awesome! So it not only described what it saw, but it also has great fashion sense. What a clever programmer you may be thinking.
Ah, but it's all a ruse. Albeit, a very novel and sly ruse. Matt described being underwhelmed by the EXIF data provided by digital cameras which provides you with things like date, time, camera model, and sometimes geo-spatial info. He wanted to see a world where cameras actually told you about the contents of the photo. Undeterred by the fact that this type of technology isn't feasible or practical right now, Matt decided to take a more human approach. He uses Amazon's Mechanical Turk and alternatively, instant messages to his friends, to subvert the computational task of providing a textual description of the photo.
So back to how this made me rethink data. It struck me that sometimes it's not what's immediately in front of you. Sometimes it's the shadow of the thing that's important; sometimes it's what envelopes it, or connects it to its surroundings, or maybe even a subjective description of what it is. Sometimes it's not a jacket... it's a seriously awesome jacket.
What is Missing? by Maya Lin seeks to raise awareness about the mass extinction of species. It has a beautiful interface. The world map is black on a sea of black. Your mouse acts as a sort of flashlight layered between land and water, showing you glimpses of familiar coastlines and allowing you to select dots that tell the stories of extinction.
We are experiencing the sixth mass extinction in the planet's history, and the only one to be caused not by a catastrophic event, but by the actions of a single species - mankind. On average, every 20 minutes a distinct living species of plant or animal disappears. At this rate, by some estimates, as much as 30 percent of the world's animals and plants could be on a path to extinction in 100 years.
The site states that the dots on the world map each represent a species, place, or natural phenomenon that has disappeared or significantly diminished. Unfortunately, this is a very vague concept. I chose a dot titled "Earth" that described the abundance of life in a cup of soil. Another dot named "Migration" discussed how the natural phenomenon of migration was disappearing around the world. It seemed so loosely related to extinction that I felt the mission of the piece fell short. You can also view the dots by year, however, I felt it only added to my confusion because it doesn't seem to chronicle actual extinctions.
I typically love Maya Lin's work, so this site was surprisingly disappointing and certainly not her best piece of data visualization (see Vietnam Veterans Memorial).
There are a lot of ways to show distributions, but for the purposes of this tutorial, I'm only going to cover the more traditional plot types like histograms and box plots. Otherwise, we could be here all night. Plus the basic distribution plots aren't exactly well-used as it is.
Before you get into plotting in R though, you should know what I mean by distribution. It's basically the spread of a dataset. For example, the median of a dataset is the half-way point. Half of the values are less than the median, and the other half are greater than. That's only part of the picture.
What happens in between the maximum value and median? Do the values cluster towards the median and quickly increase? Are there are lot of values clustered towards the maximums and minimums with nothing in between? Sometimes the variation in a dataset is a lot more interesting than just mean or median. Distribution plots help you see what's going on.
Want more? Google and Wikipedia are your friend.Anyways, that's enough talking. Let's make some charts.
If you don't have R installed yet, do that now.
This old standby was created by statistician John Tukey in the age of graphing with pencil and paper. I wrote a short guide on how to read them a while back, but you basically have the median in the middle, upper and lower quartiles, and upper and lower fences. If there are outliers more or less than 1.5 times the upper or lower quartiles, respectively, they are shown with dots.
The method might be old, but they still work for showing basic distribution. Obviously, because only a handful of values are shown to represent a dataset, you do lose the variation in between the points.
To get started, load the data in R. You'll use state-level crime data from the Chernoff faces tutorial.
# Load crime data
crime <- read.csv("http://datasets.flowingdata.com/crimeRatesByState-formatted.csv")
Remove the District of Columbia from the loaded data. Its city-like makeup tends to throw everything off.
# Remove Washington, D.C. crime.new <- crime[crime$state != "District of Columbia",]
Oh, and you don't need the national averages for this tutorial either.
# Remove national averages crime.new <- crime.new[crime.new$state != "United States ",]
Now all you have to do to make a box plot for say, robbery rates, is plug the data into boxplot().
# Box plot boxplot(crime.new$robbery, horizontal=TRUE, main="Robbery Rates in US")
Want to make box plots for every column, excluding the first (since it's non-numeric state names)? That's easy, too. Same function, different argument.
# Box plots for all crime rates boxplot(crime.new[,-1], horizontal=TRUE, main="Crime Rates in US")
Multiple box plot for comparision.
Like I said though, the box plot hides variation in between the values that it does show. A histogram can provide more details. Histograms look like bar charts, but they are not the same. The horizontal axis on a histogram is continuous, whereas bar charts can have space in between categories.
Just like boxplot(), you can plug the data right into the hist() function. The breaks argument indicates how many breaks on the horizontal to use.
# Histogram hist(crime.new$robbery, breaks=10)
Look, ma! It's not a a bar chart.
Using the hist() function, you have to do a tiny bit more if you want to make multiple histograms in one view. Iterate through each column of the dataframe with a for loop. Call hist() on each iteration.
# Multiple histograms
par(mfrow=c(3, 3))
colnames <- dimnames(crime.new)[[2]]
for (i in 2:8) {
hist(crime[,i], xlim=c(0, 3500), breaks=seq(0, 3500, 100), main=colnames[i], probability=TRUE, col="gray", border="white")
}
Using the same scale for each makes it easy to compare distributions.
For smoother distributions, you can use the density plot. You should have a healthy amount of data to use these or you could end up with a lot of unwanted noise.
To use them in R, it's basically the same as using the hist() function. Iterate through each column, but instead of a histogram, calculate density, create a blank plot, and then draw the shape.
# Density plot
par(mfrow=c(3, 3))
colnames <- dimnames(crime.new)[[2]]
for (i in 2:8) {
d <- density(crime[,i])
plot(d, type="n", main=colnames[i])
polygon(d, col="red", border="gray")
}
Multiple filled density plots.
You can also use histograms and density lines together. Instead of plot(), use hist(), and instead of drawing a filled polygon(), just draw a line.
# Histograms and density lines
par(mfrow=c(3, 3))
colnames <- dimnames(crime.new)[[2]]
for (i in 2:8) {
hist(crime[,i], xlim=c(0, 3500), breaks=seq(0, 3500, 100), main=colnames[i], probability=TRUE, col="gray", border="white")
d <- density(crime[,i])
lines(d, col="red")
}
Histogram and density, reunited, and it feels so good.
The rug, which simply draws ticks for each value, is another way to show distributions. It usually accompanies another plot though, rather than serve as a standalone. Simply make a plot like you usually would, and then use rug() to draw said rug.
# Density and rug d <- density(crime$robbery) plot(d, type="n", main="robbery") polygon(d, col="lightgray", border="gray") rug(crime$robbery, col="red")
Using a rug under a density plot.
The violin plot is like the lovechild between a density plot and a box-and-whisker plot. There's a box-and-whisker in the center, and it's surrounded by a centered density, which lets you see some of the variation.
# Violin plot library(vioplot) vioplot(crime.new$robbery, horizontal=TRUE, col="gray")
I bet this violin sounds horrible.
The bean plot takes it a bit further than the violin plot. It's something of a combination of a box plot, density plot, and a rug in the middle. I've never actually used this one, and I probably never will, but there you go.
# Bean plot library(beanplot) beanplot(crime.new[,-1])
A little too busy for me, but here you go.
If you take away anything from this, it should be that variance within a dataset is worth investigating. Picking out single datapoints or only using medians is the easy thing to do, but it's usually not the most interesting.
Yesterday I visited the ever popular NYU ITP bi-annual show which is a showcase of the students' experimental and ingenious interactive work.
I stopped to talk to data visualization student and self-tracker, Doug Kanter, about his work. His first and smaller piece was about the war in Iraq. The image above depicts the number of wounded US soldiers by state (and territory) using the red stripes. The stars show the number of soldiers killed. I'm sure we could quibble about labels and where the bar chart starts, but to me, the tattered appearance of the flag created by data about war is very arresting.
Doug's more developed work dealt with his self-tracked health data. He's a type-1 diabetic and monitors his blood glucose, insulin dosage, and diet among other things. His visualization showed three months worth of data by which he says he was able to see how a low-carb diet helped keep his blood sugar in check. Doug's blog post detailing his process and visualization is worth a read.
The ITP Spring Show runs through this evening at 721 Broadway in NYC. Over 100 projects are on display making this a must see of interactive innovation.
A new biography of "Washington Post" editor Ben Bradlee has caused a sensation. Lee Siegel on the perilous relationship between biographer and subject.
Jason Biggs in a controversial pose, Mariah Carey on an adrenaline rush and Britney Spears with her new X Factor co-workers. Plus, more of the week’s celebrity Twitter pictures.
From Paris to Singapore and Morocco, Chadner Navarro rounds up seven worthy cooking lessons.
The attorney is arguing that the charges against George Zimmerman should be dropped. But Mansfield Frazier says a trial is the only way we'll know that justice was served.
Photographer Rania Matar captures teen girls in their most sacred space—their bedroom. By Lizzie Crocker.
“Why are women… so much more interesting to men than men are to women?”
- Virginia Woolf
Manuscript of Virginia Woolf’s Mrs. Dalloway.
Virginia Woolf’s novel Mrs. Dalloway was published 87 years ago. Download the book here: http://goo.gl/Zq0uz.
167 years ago, Felix Mendelssohn’s Violin Concerto was performed for the first time in Leipzig.
The Concerto is is his last large orchestral work. It forms an important part of the violin repertoire and is one of the most popular and most frequently performed violin concertos of all time. A typical performance lasts just under half an hour. Mendelssohn originally proposed the idea of the violin concerto to Ferdinand David, a close friend and then concertmaster of the Leipzig Gewandhaus Orchestra. Although… (more)
Listen to the composer’s Violin Concerto in E minor performed by Janine Jansen:
“The worst form of inequality is to try to make unequal things equal.”
- Aristotle
Bruno Walter, Arturo Toscanini, Otto Klemperer, Erich Kleiber and Wilhelm Furtwängler, 1929.
Claudio Abbado conducts Rossini’s “Il barbieri di Siviglia: Overture”.
Gioachino Rossini would be 220 years old today.
He was an italian composer who wrote 39 operas as well as sacred music, chamber music, songs, and some instrumental and piano pieces. His best-known operas include the Italian comedies Il barbiere di Siviglia (The Barber of Seville) and La Cenerentola and the French-language epics Moïse et Pharaon and Guillaume Tell (William Tell). A tendency for inspired, song-like melodies is evident throughout his scores, which led to the nickname “The Italian Mozart”. Until his retirement in 1829, Rossini had been the most popular opera composer in history… (more)
Martin Heidegger and José Ortega y Gasset, 1951.
“We can be knowledgable with other men’s knowledge but we cannot be wise with other men’s wisdom.”
- Michel de Montaigne
Watch the complete series “Philosophy - A Guide to Happiness” here:
Episodes:
1. Socrates on Self-Confidence.
2. Epicurus on Happiness.
3. Seneca on Anger.
4. Montaigne on Self-Esteem.
5. Schopenhauer on Love.
6. Nietzsche on Hardship.
Michel de Montaigne would be 479 years old today!
He was one of the most influential writers of the french renaissance, known for popularizing the essay as a literary genre and is popularly thought of as the father of modern skepticism. He became famous for his effortless ability to merge serious intellectual speculation with casual anecdotes and autobiography—and his massive volume Essais (translated literally as “Attempts”) contains, to this day, some of the most widely influential essays ever written. Montaigne had a direct influence on writers the world over, including René Descartes, Blaise Pascal, Jean-Jacques Rousseau, Ralph Waldo Emerson, Friedrich Nietzsche, Stefan Zweig, Eric Hoffer, Isaac Asimov, and perhaps William Shakespeare… (more)
Paul Ricœur on death and eternity. Excerpt from a 1969 interview.
“Man is this plural and collective unity in which the unity of destination and the differences of destinies are to be understood through each other.”
- Paul Ricœur
The french philosopher Paul Ricœur would be 99 years old today.
He is best known for combining phenomenological description with hermeneutic interpretation. As such his thought is situated within the same tradition as other major hermeneutic phenomenologists, Martin Heidegger and Hans-Georg Gadamer… (more)
The Bach Choir sings Händel’s “Joshua, HWV 64: See the Conquering Hero Comes!”.
“Handel is the greatest composer that ever lived… I would uncover my head and kneel down on his tomb.”
- Ludwig van Beethoven