This weekend I released my first ruby gem: greedy. Greedy provides a layer on top of the Google Reader API to facilitate the consumption of feed items syndicated by Google Reader for a given Google account. John Nunemaker's GoogleReader gem was the inspiration, but it used an authentication method that has been discontinued by Google. I switched to using the gdata gem.
Right now I can't figure out how to post information to the Google Reader API. Anybody who could help me figure out why my code isn't working is welcome to fork and submit pull requests - I know I'm missing something simple. When that feature works, you'll be able to use greedy to change the state of items to "shared", "read", "unread", etc. However, the code that merely consumes feed items is ready for action.
Greedy was extracted from another project that went up today, although not for the first time: leftlibertarian.org. Now that the Google Reader API stuff has been successfully extracted, the next step is to make the code that runs leftlibertarian.org into something anybody can use to publish their Google Reader stream as a website. Hopefully, that won't be too long in coming...
Like everybody else in their right mind, I'm interested in the new Top Secret America project from the Washington Post. There's definitely much about this ballooning, labyrinthine fourth branch of the government to discuss. The project promises to explore the lack of accountability arising from all the secrecy and compartmentalization, the confusion and duplication of effort resulting from the creation of so much analysis material, and the private contractors being used to soak up all that excess cash thrown at these agencies. In particular, the phenomenon of agencies going after the low-hanging intelligence fruit, instead of looking into new, unexplored threats seems to reinforce the truth that intelligence professionals are no different than any other government employee: doing the least work for the most pay.
As you read the Post's stories on this topic, remember that the organization has had a cozy relationship with the intelligence community for decades. While it's not unique among the press in that regard (look into Operation Mockingbird, the CIA's media infiltration program), the question must be asked: why publish this now? That's the real story in my opinion, because as far as I can tell the investigation by the Post isn't treading on any important ground others haven't covered already.
I'll leave you with this quote from a speech the Post's former owner, Katherine Graham, gave at the CIA in 1988.
Read more...
RailsConf Dispatch - Test Always?
How not thinking carefully about your test suite can hold you back
There were two conveniently sequential presentations today at RailsConf that reminded me of some thoughts I'd had regarding testing: Michael Feathers' talk on legacy code and Glenn Vanderberg's talk on real software engineering. It seems to me that both talks had a theme in common: what is the function of tests? Why do we want them, what role do they play from an engineering perspective in the larger process, and what precisely are they meant to indicate to us?
Michael at one point talked about the expense of 100% code coverage for tests, instead recommending we test the parts of the code that change the least and are most important. Ugly code in legacy projects has utility, he explained, and untested code is a rational response to churn. Afterwards, Glenn discussed software development in the context of engineering principles from older, more established disciplines like structural engineering, finding areas of similarity, analogy, and abject difference. However, his testing point compared experiments in code to experiments in more physical engineering fields, remarking on how relatively cheap tests are for us. I suppose the common thread I found concerned the emphasis on cost: that what it means for us to do our job well is to do it effectively, and not subordinate our conscience and creativity to a mechanical process.
For some background, I've been practicing behavior driven development for a year or two. I love the confidence that testing gives me, independent of the value to the client. Verifying that my code works is fine and all, but what lets me sleep at night is the assurance derived from approaching a problem in a rational, systemic manner. By moving in small chunks and expressing problems in terms I understand well enough to programmatically recreate, I ground myself in a real comprehension of the system I'm building at the most relevant level and stage. I avoid the confusion of jumping ahead, thinking too large scale or minutely, or making unwarranted assumptions that come back to bite.
Read more...
The first tutorial class at RailsConf on Rails Anti-Patterns has been phenomenal and incredibly validating given my experiences with consulting. Tammer Saleh gave a wonderful talk on how to handle troubled legacy codebases - what he calls "rescue missions". It's particularly relevant for me as much of my early freelance work centered on failing projects I was dumped into.
Because of the success of Rails, there's a lot of shitty code out there for you to fix. The harder issue is figuring out why shitty code was delivered, which can be trickier to figure out than you'd think. It can be really difficult to change the course of a project when much more than merely the code is dysfunctional.
Tammer suggested a ton of coping strategies, many of which end up being good practices for most situations. I'm sharing my cursory notes here in case others are interested. Feel free to strike up a conversation in the comments to explore these points. I'll link to the slides when they become available.
Read more...
Over the last week I've started a project with Rails 3 and I'm impressed. The increased configurability of the framework has not diminished its ease of use nor its core concepts in the slightest. You'll have to get used to a few new conventions, especially regarding routing, but there's lots of help out there.
Since this project is something I'm doing in my off time, I decided to experiment with MongoDB using the Mongoid framework. I had played with MongoMapper before, but always felt like I was using an ActiveRecord clone that didn't take advantage of the full capabilities of a document database and was forcing and ActiveRecord-style approach on me. With Mongoid you get has_many, has_one, and belongs_to relationships that map to MongoDB concepts like embedded documents. Mongoid is fully compatible with the ActiveModel interface for Rails3, and things like associations and nested attributes work out of the box.
I also had been hearing great things about CarrierWave from co-workers. It employs the concept of an "uploader" outside of the MVC ecosystem. The uploader handles resizing, storage, and all other details. In your model, you simply "mount" the uploader and you're golden. Of course, for this project the killer feature is the GridFS storage option, which is something I wanted to play with.
Read more...
Many people, including I, lost track of where the ALL logo svg files were when my blog software and domain changed. For the record, here they are:
You're free to use these images for the purposes of promoting the Alliance.
Saw these guys in Richmond last weekend, and was thrilled to see such a well produced video of an Austin show of theirs existed! Here it is:
Christopher Ketchum on corporate personhood:
...so, for example, I can't take a corporation out in the backyard and bury it alive. I can't smack a corporation flat across the face and break its nose. I can't take a corporation's head and split it with an axe, nor can I chop off all its fingers, nor stab out its eyes with a rusty screwdriver, nor burn off its flesh with a blowtorch, nor flay it with an electric sander, nor stomp its kneecaps with a sledgehammer, nor cut its head off and parade it around the room on a broomstick, nor use its entrails as a rappel rope, nor smash its testicles with a spiked bat, nor do any of the things that really should be done to corporations these days - if they were people - but which one would never do to a human being. If only corporate persons would finally show their fleshy faces.
Vicious? Yes. But nothing that Blackwater corporate person wouldn't do to you for the right price.
Well, it's been a year since Brady and I attended the original Richmond Tea Party. Setting aside some encounters at Audit the Fed demonstrations and what not, this was the first time in quite a while I interacted with the tea party movement that has garnered so much attention over the past year. Although I've seen a lot coverage of the tea parties in the media, I wanted to experience the movement without the mediation of reporters. They're not usually known for their nuance.
Besides, this was a movement that said a lot of things I agreed with. While genuine disagreement is perfectly understandable, a philosophy containing contradicting opinions - advocating less government spending while supporting the expanding military budget and the empire it finances - is a target of opportunity. While there seem to be few tea partiers who care their ideology might be intellectually unsound, some can provide a reasoned argument. Those people often become thought leaders; they are the ones I'm looking for.
Read more...
To me, development is all about communication. With clients and other developers, sure, but mostly with the computer itself. I'm trying to describe to the computer how to accomplish a task it does not have any capacity to understand or appreciate. On the other hand, the context of a given problem can be so natural to me that I have a hard time articulating it. Using autotest, I can engage in a sort of conversation with the computer, where it tells me in real time as I program whether it understands what I'm telling it or not.
A Growl notification informing me of test results is great, and I can even tell Growl to play a sound when the notification is ready. But that sound tells me to look for the notification, not whether the tests pass or fail. To make this conversation more fluid, it would be nice if I had not just visual but also audio feedback which told me immediately what the test results were, instead of having to constantly context switch to the test results.
There have been a few attempts to do this already, but they all seem so complex. I found a simple command line sound file player called afplay that makes all this trivial. In your ~/.autotest file, add the following:
Read more...
You know, when FOX reports that a majority of Americans oppose Obama's health care reform, liberals complain that the numbers are being manipulated. FOX is lying.
When FOX reports on the Tea Party protests, liberals complain that they are manufacturing a movement. FOX is lying.
But when FOX shows footage of these protesters as stupid, inarticulate, crude, violent, white trash rednecks, suddenly FOX news is totally credible.
Read more...
Which anti-American, anti-war magazine published an article that frames Obama's foreign policy decisions in the following "blame America" terms?
The sad truth is everything we are seeing we have already seen. Despite presidents who come and go, permanent war is a hallowed American institution. Start if you will with the War of 1812, the invasion of Mexico, and the carnage of a Civil War. Move to the mass murder of Native Americans and theft of their property, the killing, torture, and prison camps in the Philippines, then the blood-drenched 20th century. The 21st likewise dawns red. It never changes. Doves protest, hawks rule, ordinary people pay the penalty. All wars are "just."
Hint: it's also the same magazine Time called "the most anti-Bush magazine of the [past] decade."
Here's the answer. The biggest element missing from the anti-war movement is the anti-war part. Instead, you get a coalition of exotic interest groups around culture war and identity politics. Wake up - that's a language neocons speak easily (as long as the criticism can be focused beyond our borders; see the women's rights arguments for the Iraq invasion).
But as the article goes on to explain, there's a rich history of antiwar conservatism (see Bill Kauffman on this topic) rooted in American traditions and sensibilities. And it took a monumental upset in the conservative movement to override the prejudices and side projects of the modern, liberal, supposedly anti-war characters in this country. Shameful.
You can inspect the software that generates this blog on Github. I borrowed heavily from one developer to integrate Haml with pagination into Jekyll. It took a while (like all night) but it works. Tests are failing all over the place, though, so fork with caution.
Creative Destruction in Software Development
As design becomes more critical to software, programmers must find new challenges to realize user value
I've been thinking a lot lately about the relationship between front-end design and programming in software development, and this article hit me at just the right time (thanks for tweeting it, Wren!). Basically, Allen argues that as programmers become more productive, more resources get spent in the indeterminate and creative tasks of design than in the increasingly well-understood and less error-prone tasks of programming. I'm generally inclined towards his idea of a designer-driven industry, because I'd love nothing more than to spend my time exercising my artistic side. However, I think he gets a few things mistaken, because the state of our industry is not as cut and dry as he makes it out to be.
It would be impossible to positively address Allen's larger point without pointing out the elephants in the room. Yes, I laughed out loud at the mention of cookies as a data store. But the biggest pachyderm has to be the paltry sample size for such a sweeping conclusion. One project does not an industry trend make. This guy works with Microsoft frameworks; surely he's seen bigger, more involved projects than the one he describes as spending more time in design than in development. The more complex the functional requirements, the more time spent implementing that functionality. That takes time, and productivity can only shave so many man hours off an enterprise project.
Any well understood problem and solution will be faster to implement than one that takes a lot of planning. In the web world, we developers spend a lot of time developing the same basic applications over and over. While they don't all have the same function to the user, the relationships between the data entities on the backend are often pretty damn similar. How many of us build apps with account models? How many have entities that aggregate other entities? The reason ActiveRecord can model these joins and finds so well is because there aren't too many permutations of the data relationships in the database-backed web app industry.
Read more...
(This article was originally written for ALLiance: A Journal of Theory and Strategy.)
"If voting changed anything, they'd make it illegal," declared Emma Goldman in a ringing indictment of the feeble mechanism by which the state claims to be restrained and directed. Of course, in invoking this quote anarchists argue against counting upon elections to change the status quo. We aren't going to bring about the voluntary society by listening to politicians, casting votes for them, and pressuring them to abolish their own offices. The statist means and the anarchist ends are clearly opposed.
But there's another argument against voting: that by casting a ballot, one registers endorsement of the state and its violence. Advocates of this argument do not hold that you must have chosen the politician who wields power. They disregard personal intent, interests, and any issues at hand. The argument is quite simple: by participating in the election, one is bound to its results. Given the anarchist view of those results - violence, fraud, and lies - one can only conclude that voting makes one an accessory to the crime.
Read more...