The Boston Globe with a 30-40 good-res photos from the Iran election riots. It’s really poppin' off over there.
There’s a nice combination of old and new concepts in here.
mnot on how to evaluate different proxy cache options for your needs.
Another classic on latency vs. throughput. This one gets into the limitations of speed of light fairly quickly :)
Interesting reading if you found Nick’s handling of latency vs. throughput (in the gogaruca talk) intriguing.
Great talk from this year’s gogaruca conference. Anything that starts with a rail against the belief that tools can have mystical scaling powers is going to end up being a good talk :)
Amazing! I put Ben under the table that night. Tucked him into bed and gave him a kiss.
“If you have reached the age of 25, I have a bit of bad news for you, to wit: it is time, if you have not already done so, for you to emerge from your cocoon of post-adolescent dithering and self-absorption and join the rest of us in the world.”
Very well done.
We've been getting a decent amount of PR-ish type coverage since the commercial launch but I still say blog posts like these are infinitely more interesting:
Remember when microwaves first hit the scene and people couldn’t believe how fast they could ‘deploy’ a meal? Yah me either, but the microwave changed the game big time.
And, unlike the microwave, Heroku doesn’t make your apps taste like cardboard :)
Minimalist, keyboard controlled (modal vim-like bindings, or with modifier keys) browser based on Webkit. A lightweight vimperator, maybe?
Tim Bray evaluates the web’s basic design from the perspective of the Fallacies of Distributed Computing. Reminds me of TimBL’s Axioms of Web architecture a bit. This stuff is essential to understanding why the web succeeded where other systems failed and why the web seems quirky in some ways compared to other distributed computing systems.
Pretty. Y axis is a category of significance, X axis is the year. There’s at least one error: no mention of suck.com ;)
Nice. The xargs(1) switch -P N will run up to N separate processes in parallel. Combine with the -n M switch for a quick and dirty process pool.
Simon Willison is working on python web microframework based on Django. This will get interesting. Fast.
They shut the park down before Katrina and just left everything. There’s still prizes and stuff hanging on the walls. Spooky indeed. (Via @timbray)
Here’s the slides from my RailsConf 2009 presentation on HTTP caching. I doubt the general info will make much sense without me talking over it but the diagrams should be fairly useful.
Coda on why Rack has had so much success within the Ruby community and modeling projects after it in the future. I couldn’t agree more.
Christian Neukirchen’s RailsConf 2009 wrap up. I had a pretty amazing time at the conference but sharing a Hookah with Chris was definitely a highlight.
Really interesting analogy between web architecture and a car crash. This is the piece that’s missing from almost every conversation about whether any given web framework or component “scales”. (via @jperkins)
Kragen Javier Sitaker: “I have said that spreading false rumors in time of epidemic costs lives. People have asked me how…”
This is why I recommend everyone subscribe to kragen-tol.
Jamie Zawinski (1997): “In this document, I describe what is, in my humble but correct opinion, the best known algorithm for threading messages (that is, grouping messages together in parent/child relationships based on which messages are replies to which others.) This is the threading algorithm that was used in Netscape Mail and News 2.0 and 3.0, and in Grendel.”
“Almost all non-functional programmers are unaware that tail calls facilitate a programming paradigm that they have never seen. The ability to tail call to functions that are not statically known is the foundation that makes many combinators useful. This is a style of programming where functions are composed in order to create a pipeline for values to flow through. Without tail call elimination, every stage in the pipeline would leak stack space and the whole approach becomes unusably unreliable.”
James Carr’s classification system for unit test smells and anti-patterns. This is almost three years old but still extremely relevant judging by the test suites I'm working with today. I'm guilty of more than a few of these. Via @coda.
Nice. Probably more appropriate than tmm1-amqp in threaded/synchronous environments or when you don’t want to deal with EM. Then again, I believe tmm1-amqp has a synchronous interface. If not, it wouldn’t be hard to put one together with fibers.
I've been staring at this screen for two sleepless weeks now. Really glad to have it wrapped. James Lindenbaum (CEO/founder/bad-ass) did most of the conceptual design work. seaofclouds did the fucking amazing illustrations and took the design to completion. Pedro Belo did the HTML/JavaScript and server side stuff. Definitely one of the best teams I've worked on.
Protocols are hard. Nobody understands this.
I had a chance to hang out with Rabbit’s Tony Garnock-Jones last week. Awesome guy. Knows his shit. We use RabbitMQ prettyy all over the place at Heroku — big fans.
Matthias Georgi’s framework for building DAV servers in Ruby with Rack. Could make building apps that mount into a local filesystem quite simple.
Measure, Leading, Quotes, Rhythm, Widows, Emphasis, Scale, and Rags. Great piece.
Great ideas for tweaking Ruby’s GC after applying Stefan’s Kaes’s GC patch. By the way, that patch has been an option on the ruby port in FreeBSD for years. It works. Apply it.
This is why simple is better. Sinatra probably runs well on any compatible ruby with a Rack handler.
Mark Pilgrim: “Anyway, I now realize that there were some hidden assumptions behind my design decisions in 2000. Some of those assumptions turned out to be wrong, or at least not-completely-right. Sure, a lot of people downloaded dip, but it still pales in comparison to the number of visitors I got from search traffic. In 2000, I fretted about my ‘home page’ and my ‘navigation aids.’ Nobody cares about any of that anymore, and I have nine years of access logs to prove it.”
I don’t think most people realize how little site navigation matters anymore. Your site’s navigation is google, topic sites, blogs, and feeds. The “website” is dead. Long live the individual useful resource.
OMG! Real, actual, research on the AIG bonus situation (from their 2007 10-K filing): “In light of the unrealized market valuation loss related to the AIGFP super senior credit default swap portfolio, to retain and motivate the affected AIGFP employees, a special incentive plan relating to 2007 was established. Under this plan, certain AIGFP employees were granted cash awards vesting over two years and payable in 2013.”
Interesting. So the bonuses were lined up in 2007 because all of their top guys would have left for other, less fucked up securities.
Good writeup on the rise of document and columnar databases, including Amazon SimpleDB, Apache CouchDB, Google App Engine, and Persevere.
Well said. It appears PHP’s culture of stupidity isn’t limited to technology. What a bunch of assholes.
Aaron Swartz explains why he (and friends) put fixcnbc.com together. I've always been skeptical of petition sites but his logic is sound here.
Amazingly painful to look at these. I hope motown can figure something out but I think it’s more likely that we’ll see other city’s (like Cleveland) follow in its footsteps. Decline sucks.
For real. The best microwave is one that has a single timer dial that moves as time elapses. No one ever uses all those buttons. I use exactly one button on my current microwave: “Quick Minute” (hitting it as many times as needed) but I'd prefer a dial.
It’s important to understand how fork(2), pipe(2), and exec(2) work. I don’t want to hear anymore of this “fork is a hack” shit from any of you :)
XPath-like syntax for expressing selection queries against JSON data structures. Interesting concept. I've always wondered why the basic concepts behind XPath were never borrow and applied to other types of structured data — it’s so insanely useful. I suppose jQuery popularized using CSS selectors for querying HTML but why not take the same basic concept and apply it to problem domains outside of SGML-inspired markup languages and their data models.
Nice. This is very similar to the Sinatra::Test module but with a few additional features (i.e., the session/cookiejar thingy). If this gets traction (and it will), we’ll deprecate Sinatra::Test and recommend people use Rack::Test instead.
I worked on this a bit. Jazzed to see it announced. Actually, they pretty much had everything working when I got there. I wrote some docs and tightened things up a bit is all.
Now go deploy something – it’s free!
Things are starting to get interesting around here. James pulled together some (fucking sexy) high level architectural diagrams and annotated them just so. We can start talking about what we’re up to a bit more now that this is out. I'm jazzed.
Why browser UI for HTTP auth is so horrible has always baffled me. This could be improved significant without any changes to HTTP whatsoever.
John Adams posted a bunch of details of the Varnish configuration they use in front of search.twitter.com to the varnish ML. Great stuff and nice to see the Twitter devs continuing to share their experiences with the community.
Harry Vangberg put together a Twitter relay bot in #sinatra (nick: nancie) so a bunch of the cool cats there are keeping the @sinatra twitter feed lit up with a stream links, tips, and announcements.
“I was having sort of a crap day, and spending 10 minutes watching this guy get towed completely brightened my day up. I normally feel slightly guilty watching everyday people’s cars get towed – so it was nice not to have any conscience eating at me this time.”
I haven’t actually had a chance to watch this yet but I'm sure it’s great if it builds on the talk Gregg gave at acts_as_conference 2009. Also, I love this slide: “Reverse Proxy Caches – WTF?” :)
The RailsEnvy guys presented on a bunch of recent innovations in the Ruby/Rails community in their acts_as_conference 2009 talk. Go to 24:00 where Gregg gives a really tremendous overview of using Rack::Cache, the benefits of HTTP caching in general, and how to use all of this stuff in Rails 2.3.
Huge thanks to christian for getting this up. I've been meaning to get something on the Rack::Cache site for some time now.
This has been sitting in the back of my brain for months now. I finally got a chance to throw something together last night:
Shotgun is an automatic reloading version of the rackup command that’s shipped with Rack. It can be used as an alternative to the complex reloading logic provided by web frameworks or in environments that don’t support application reloading.
The shotgun command starts one of Rack’s supported servers (e.g., mongrel, thin, webrick) and listens for requests but does not load any part of the actual application. Each time a request is received, it forks, loads the application in the child process, processes the request, and exits the child process. The result is clean, application-wide reloading of all source files and templates on each request.
Another interesting use of Rack middleware.
Geoffrey Grosenbach interviewed me yesterday for the Ruby on Rails podcast. We had a nice chat about Python/WSGI, Rack, Sinatra, Rack::Cache, Heroku, and other random stuff.
Aman Gupta and Joe Damato have implemented Fibers for the 1.8.6 and 1.8.7 MRIs. They’re patches now but will hopefully go into a 1.8.8 release. I had a chance to see these guys give a quick talk on their work at a local Ruby meetup — it was a hit.
This is one the amazing benefits of having an insanely simple but well defined SPEC (Rack) around the edges of your library. It makes it trivial to hook things up in new and interesting ways.
If I was stranded on a desert island and could bring only one website …
“This module allows Ruby programs to access their OS’s native sendfile(2) system call from any IO object. Your kernel must export a recognized signature for the sendfile(2) system call to use this module. Currently, that includes Linux, Solaris and FreeBSD.”
Pat Nakajima’s script to measure the amount bloat you’re adding by requiring libraries. Generates a report on the number of methods added, along with a list of names. Interesting metric.
Ruby 1.9.1 is out. Here’s the final rev of the NEWS file. Nice, condensed list of everything that’s new or changed.
I've written this same exact blog post a dozen times. For some reason, each hop along what should be a pure HTTP pipeline wants to invent their own psuedo-protocol for transferring HTTP messages. Why?! Your reimplementation of HTTP is not going to be any less complex — by definition, it must be at least as complex; and your reimplementation is definitely not going to be less buggy than the real HTTP implementations that have been around for a decade or more.
This is why can’t have nice things …
We gave the Sinatra website a major face lift. Check it out. Don’t leave without subscribing to the feed.
“As I see it, we are all piles of slowly decaying meat, wrapped in the skins and hairs of other creatures, wearing colorful vestments made of skillfully woven plants, staring at what is essentially a pile of oil, metal, and sand all day. We spend most of our waking lives gathering piles of paper that we use to buy more dead animals, woven plants, and varying sized piles of wood, sand, oil, and metal. At night, we sleep in carefully crafted piles of these materials heated by barrels of decayed animals and plants and dream about having even larger stacks of paper with which we can use to impress other piles of sentient meat.”
Guyon Morée shows how JavaScript 1.7/1.8 have been moving more and more toward Python with a few side-by-side examples. List comprehensions and generators would definitely be extremely cool to have in browser land.
The Prag’s have published two screencasts in a new series on Sinatra.
Ruby based continuous integration server that rocks. Built on Sinatra and DataMapper. Painless setup, beautiful web UI, hooks up to GitHub. I wish I'd went and looked at this earlier.
Magnus Holm disects a couple of implementations for parsing nested form parameters (e.g., “person[name]=Joe&person[zip]=55555”) in Ruby. _why’s is the most interesting (as always). We just added this to Sinatra and I'm fairly confident we’ll see something like it land in Rack before 1.0.
Tanner Burson talks about one of the larger accomplishments of the Sinatra 0.9.0 release. We definitely need more docs on using Sinatra in this fashion.
Nice overview of caching from 1000 feet. Lays down some useful terminology, like “Cache Hit”, “Cache Miss”, “Storage Cost”, “Retrieval Cost”, “Invalidation”, “Replacement Policy”, etc.
Ian Bicking explains the connection between modern traffic planning and modern programming in dynamic languages.
You cannot find this special offer anywhere else. A Twitter client, a fart noise generator, and a flashlight, all in one app for the iPhone. Act now!
Aristotle Pagaltzis shows a pretty crazy technique for splitting a single git commit into multiple separate commits using an interactive rebase and successive checkouts on the same branch. Interesting approach. I usually pop the commit off into my working directory with git reset HEAD^ and then use multiple iterations of git add --patch + git commit until my working directory is clean again.
Matt Todd did a nice presentation on Rack to the Atlanta Ruby Group (ATLRUG) and they were nice enough to put video of the slides + audio of Matt’s narration online.
“If you’re still terrified by the idea of talking to strangers, challenge yourself to talk to one stranger a day, every day, for 30 days. If you’re walking past someone on the sidewalk, say ‘Hi’, and the person looks at you and keeps walking (done that many times), your job is done for the day. If you walk up to a girl in a club and say ‘Hey!’, and she responds, with a slightly grossed out look ‘I have a boyfriend.’, congratulations, you’re one step closer to improving your love life. The point of this exercise is to get you used to talking to people you don’t know and form the habit of being more social.”
Interesting looking prefpane for MacOS X that tweaks some sleep settings:
“Just ‘sleep’ means that the notebook will go to sleep fast, but you loose the ability to change the battery. Just ‘sleep and hibernate’ will wake the computer fast, but sleeping will take ages as the contents of the memory are saved to disk before entering the sleep. MacOS uses ‘sleep and hibernate’ all the time by default. SmartSleep lets your notebook just ‘sleep’ while the battery has a high level. If the battery level drops below a certain point ( default is less then 20% or 20 minutes ) it will switch to ‘sleep and hibernate’. So you have the best of both worlds.”
Via Ted Han (@knowtheory): “Hypertext allows information to be organized and connected in a variety of ways that provide the user with a flexible working environment. The following advantages highlight the benefits of working and learning in a hypertext environment…”
Adam Wiggins: “gemweight.rb is a script to calculate the memory use and load time of a given gem.”
I've run numbers (very adhoc) on various gems before and I'm always surprised at the results. Libraries you'd think would be small are sometimes big and libraries you'd think would be big are almost always big :)
I've annotated RFC 2616 Section 13 with details on where Rack::Cache is and isn’t compliant. Anything not highlighted should work as described in the RFC. I think I’ll be using SharedCopy more in the future.