<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><description>CEO of Divshot, Fellow at Intridea, purveyor of fine open source software for the web.</description><title>Michael Bleigh</title><generator>Tumblr (3.0; @mbleigh)</generator><link>http://www.mbleigh.com/</link><item><title>In the Battle of the Ecosystems, No One Wins</title><description>&lt;p&gt;While I was excited today at some of the announcements Google made at I/O, I was also troubled: there was an awful lot of Google Play, which is fine, but the Nexus Q announcement just left a bad taste in my mouth. It&amp;rsquo;s a product that has cool use, but the only demonstrated use of that product is in Google&amp;rsquo;s closed Play ecosystem, a tactic that smells entirely too much like Apple.&lt;/p&gt;

&lt;p&gt;The traditionally held dynamic is that in a competitive market, the consumer wins. Competitors force each other to innovate and also force prices low. The problem is when the competition is between large, closed ecosystems involving multimedia content, the consumer will always lose. Google may make more of an effort to make their content available cross-platform than Apple does, but at the end of the day Play is just another iTunes store. I want to see better from Google.&lt;/p&gt;

&lt;p&gt;Closed ecosystems gain enormous inertia as consumers begin to &amp;ldquo;buy in&amp;rdquo; to them. The more purchased media I have on (iTunes/Google Play) the less appealing and more cumbersome a switch to another ecosystem becomes. This inertia counterbalances normal competitive forces allowing for effective lock-in of customers without the need to continually court and re-convince customers to stick around. This is basically Apple&amp;rsquo;s whole business model, but it isn&amp;rsquo;t sustainable forever.&lt;/p&gt;

&lt;p&gt;Apple&amp;rsquo;s domination of the digital content space is going to come to an end, and it isn&amp;rsquo;t going to be ended by a competitor that, for all intents and purposes, is identical. It&amp;rsquo;s going to be ended by Spotify, Netflix, Hulu, and other subscription services that challenge the very nature of traditional content distribution. Simply put, I don&amp;rsquo;t ever want to buy another movie, song, or book. I want access to everything, all the time, legally and with enough flexibility to do so when and how I wish. We have the technology, we just lack the right set of licensing agreements.&lt;/p&gt;

&lt;p&gt;If Google wants to eat Apple&amp;rsquo;s lunch it shouldn&amp;rsquo;t be announcing the fact that you can now buy DRM'ed movies in Google&amp;rsquo;s store just like you can in Apple&amp;rsquo;s. It should announce a partnership with Netflix and Spotify that lets you subscribe to both services with a single bill. It should make its Nexus Q so seamlessly compatible with popular subscription services that Apple TV seems like a joke.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m sick of walled-off ecosystems. I will never, &lt;em&gt;ever&lt;/em&gt; &amp;ldquo;purchase&amp;rdquo; content that I can&amp;rsquo;t freely reformat and redistribute in whatever way I see fit. Subscriptions at least offer me a middle ground: in exchange for giving up complete freedom over my viewing experience, I pay a small amount for access to huge libraries of content. That&amp;rsquo;s the future, and that&amp;rsquo;s where I will be from now until everyone else agrees with me. In the battle of the ecosystems, the first one that draws a line in the sand and says &amp;ldquo;no&amp;rdquo; to traditional distributions will be the real winner.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/26034993128</link><guid>http://www.mbleigh.com/post/26034993128</guid><pubDate>Wed, 27 Jun 2012 20:13:00 -0400</pubDate><category>opinion</category><category>google</category><category>apple</category><category>content</category></item><item><title>The Why of Zero Tolerance</title><description>&lt;p&gt;In the past couple of days the developer sphere has been ablaze with fury over sexism. Two days ago, startup &lt;a href="http://www.readwriteweb.com/enterprise/2012/03/how-casual-sexism-put-sqoot-in.php"&gt;Sqoot made a carelessly sexist statement&lt;/a&gt; in an event description. As a result, a number of high-profile sponsors including Heroku immediately pulled out of the event and a minitornado of fury was directed at the fledgling company.&lt;/p&gt;

&lt;p&gt;Today, ire is building over the &lt;a href="http://storify.com/charlesarthur/oh-hai-sexism"&gt;actions of the founders of Geeklist&lt;/a&gt; after someone pointed out the sexist nature of a video that was posted with their branding. I&amp;rsquo;ve yet to see how this one is going to turn out, but I&amp;rsquo;ll tell you what I did personally: I &lt;a href="https://twitter.com/#!/mbleigh/status/182844877141323777"&gt;tweeted at them to disable my private beta account&lt;/a&gt; and let them know that it was because of the emerging story.&lt;/p&gt;

&lt;p&gt;It wasn&amp;rsquo;t until yesterday that I realized just how much of an opportunity the development community has. We have long suffered from a terrible lack of gender diversity. This lack of diversity is an incredibly complex subject and I can&amp;rsquo;t begin to understand all of the contributing factors; however, the casually sexist and man-culture attitude assumed by developers certainly isn&amp;rsquo;t helping things. This issue has been slowly heating up in the past months (even years) and I think it&amp;rsquo;s finally at a boiling-over point. The furor in the past few days paints a picture of a developer community with an emerging zero tolerance policy for sexism.&lt;/p&gt;

&lt;p&gt;But, you might say, aren&amp;rsquo;t we getting a bit extreme here? Sure Sqoot did something careless, but wasn&amp;rsquo;t the response a bit disproportional? &lt;strong&gt;Yes, and that&amp;rsquo;s exactly the point.&lt;/strong&gt; A zero tolerance policy is not about the specific cases, it&amp;rsquo;s about changing the behavior of a group as a whole. If we as a community make the punishment for even casual sexism swift and incredibly harsh, we will change behavior. A simple complaint is likely to make a specific person or company think twice about behavior (although it seems less clear that this is the case with Geeklist), but an internet firestorm that results in a measurable impact (lost sponsors, lost users)? That has the power to affect the whole community. People who see these acts even from the sidelines will think about how little they want to be in the shoes of Geeklist and Sqoot and, as they interact with the community, they will be a little more mindful not to make the same mistakes.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m not advocating political correctness, and I think that women are (chauvinistically) painted as being oversensitive and needing to be treated with kid gloves. I love that we can &lt;a href="http://zachholman.com/posts/swearing/"&gt;say fuck in our talks when we feel like it&lt;/a&gt; and I don&amp;rsquo;t want to see that change. Far more harmful is language that, without ever swearing, simply assumes that women aren&amp;rsquo;t a part of this community. Until we can purge that completely from our behavior we can&amp;rsquo;t honestly say that we are doing all that we can to encourage women to join us. I&amp;rsquo;m committed to that outcome, and I think that more and more we all are.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/19733523231</link><guid>http://www.mbleigh.com/post/19733523231</guid><pubDate>Thu, 22 Mar 2012 11:36:33 -0400</pubDate><category>opinion</category><category>sexism</category><category>diversity</category><category>community</category></item><item><title>LocalStorage? IndexedDB? What we need is Redis for the browser.</title><description>&lt;p&gt;After Mozilla&amp;rsquo;s hacks blog posted an article about &lt;a href="http://hacks.mozilla.org/2012/03/there-is-no-simple-solution-for-local-storage/"&gt;how localStorage is too slow&lt;/a&gt; and someone else said &lt;a href="http://www.nczonline.net/blog/2012/03/07/in-defense-of-localstorage/"&gt;localStorage is just fine&lt;/a&gt; it reminded me of how frustrated I&amp;rsquo;ve been at the various proposed &amp;ldquo;solutions&amp;rdquo; for an in-browser persistence engine. It is completely ridiculous to think it reasonable to have a schema-driven store in the browser. Schema-driven stores work on the server side because engineers can run data migrations and control the flow of data. Browsers are distributed and stateless, there&amp;rsquo;s no &amp;ldquo;migration&amp;rdquo; pattern except one that is roughly lashed on using ugly Javascript conditionals.&lt;/p&gt;

&lt;p&gt;At the same time, localStorage simply isn&amp;rsquo;t enough (though it&amp;rsquo;s better than schema stores). A pure key value store works for lots of cases but is going to slow down and cause problems with any kind of complex structuring. So what is the solution? I think a document store could make sense: it&amp;rsquo;s schemaless, simple, and you could write simple querying semantics for it. Maybe a subset of MongoDB&amp;rsquo;s functionality. But you know what would be perfect? Having Redis in the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://redis.io"&gt;Redis&lt;/a&gt; gives you a simple key value store with some simple but powerful data structures on top. The interface is dead simple, the values stored are just strings (like localStorage) but with sets, ordered sets, and lists you can implement powerful (and fast) complex logic for an application.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m not saying that Redis should &lt;strong&gt;literally&lt;/strong&gt; be ported to the browser as an engine, but I do think that the ideal in-browser store would look almost exactly like Redis. It would be able to set values on keys, have them expire, add values to lists and sets and generally be a &amp;ldquo;key value store and a little bit more.&amp;rdquo; Implementation-wise I would imagine that this would be an in-memory store that had the ability (but not the necessity) of flushing to the disk.&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s the reasons it would work:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Straightforward API:&lt;/strong&gt; No complex schema migrations, just a simple API that can be used to accomplish powerful things.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small Footprint:&lt;/strong&gt; Redis, for all its awesomeness, has a very small footprint in terms of complexity of implementation. I believe that something akin to Redis could be taken down the standards path because, unlike WebSQL, it is simple enough for each browser vendor to implement independently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Just Enough Power:&lt;/strong&gt; SQL is overkill for an in-browser storage layer. Similarly, a document store would be nice to have but would also be overkill for the 95% use case. Redis gives you a simple key value store that can do just enough to cover almost everyone almost all the time.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;So Mozilla, Google, Opera (heck, even Microsoft) if you&amp;rsquo;re looking for an example of a storage API that would match the web browser perfectly, look no further than Redis.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/19298541107</link><guid>http://www.mbleigh.com/post/19298541107</guid><pubDate>Wed, 14 Mar 2012 14:42:12 -0400</pubDate><category>browsers</category><category>redis</category><category>opinion</category></item><item><title>So Fantastic It's Double Fine</title><description>&lt;p&gt;Today is the day that I stand in awe of the internet and the wonderful things it can do. My particular amazement is directed at the fact that yesterday Tim Schafer (a famous adventure game designer and creator of amazing things like Psychonauts and Day of the Tentacle) created &lt;a href="http://www.kickstarter.com/projects/66710809/double-fine-adventure"&gt;a Kickstarter project&lt;/a&gt; to fund a new adventure game with an ambitious funding level of $400,000. Eight hours later, he met his goal. As of the time I&amp;rsquo;m writing this, the project is at $554,000.&lt;/p&gt;

&lt;p&gt;Think about that. In &lt;strong&gt;eight hours&lt;/strong&gt; the internet came together to contribute more than half a million dollars to create an original video game. Whether or not you believe that video games are a worthwhile expenditure of money the ramifications of what just happened are staggering. As a technologist fed up with the status quo of the content industry, this is a shining beacon of where things are going.&lt;/p&gt;

&lt;p&gt;In the future it won&amp;rsquo;t be record labels and media conglomerates deciding what is worth our time and money. It will be the creators themselves convincing us directly that they are worthwhile, that they deserve a shot. I&amp;rsquo;m a proud supporter of Tim Schafer&amp;rsquo;s game and I intend to do a lot more investing in Kickstarter projects moving forward. It&amp;rsquo;s the most honest and amazing way of raising capital that I can imagine.&lt;/p&gt;

&lt;p&gt;On the same note, everyone should &lt;a href="http://www.senate.gov/general/contact_information/senators_cfm.cfm"&gt;contact their Senators&lt;/a&gt; to support H.R. 2930, the crowdfunding bill that would allow ordinary people to invest money into startup businesses for real equity. It&amp;rsquo;s currently stalled in the Senate and getting bogged down with needless extra regulation, so some action is needed to get this thing into law!&lt;/p&gt;</description><link>http://www.mbleigh.com/post/17318356561</link><guid>http://www.mbleigh.com/post/17318356561</guid><pubDate>Thu, 09 Feb 2012 09:34:59 -0500</pubDate><category>crowdfunding</category><category>kickstarter</category><category>politics</category><category>gaming</category></item><item><title>The Innovator and the Inhibitor</title><description>&lt;p&gt;Two little girls, Holly and Ivy, start lemonade stands in their neighborhoods one summer. Each has about the same foot traffic and each begins by selling lemonade at 25 cents. They do this for several days and, to their surprise they&amp;rsquo;re making more than $20 a day with their lemonade enterprise. Wow!&lt;/p&gt;

&lt;p&gt;Other kids in the neighborhood hear about how much money Holly and Ivy have been making and decide to open their own lemonade stands&amp;hellip;and this is where things start to diverge. Holly and Ivy&amp;rsquo;s next door neighbors both open their own lemonade stands and sell lemonade for the same price as Holly and Ivy. With the new competition, that day Holly and Ivy each only make $10.&lt;/p&gt;

&lt;p&gt;Ivy spends the evening thinking about the new competition, and resolves that she will just have to make her lemonade stand the best one it can be. The next day she offers pink lemonade and real lemon wedges to her customers. This, along with the fact that her neighbors have been buying from her for days already and she makes $18 that day. As it turns out, she&amp;rsquo;s particularly adept at making pink lemonade (even better than classic) and it&amp;rsquo;s a huge hit. The next day she finds herself swamped with business because her neighbors all told each other how delicious the pink lemonade Ivy makes is. She makes $30 in one day, a new record!&lt;/p&gt;

&lt;p&gt;Holly spends the evening talking to her mother, who is very well connected in the neighborhood. She tells her mother that it&amp;rsquo;s not fair that Billy next door opened a lemonade stand because she had the idea first. Holly&amp;rsquo;s mom calls Billy&amp;rsquo;s mom and asks her to tell Billy not to sell lemonade anymore. Billy&amp;rsquo;s mom, a bit confused, agrees because she doesn&amp;rsquo;t really want to have to buy lemons anyway. The next day Holly is once again the only lemonade stand in the neighborhood and is back to making $20 a day. Life is good.&lt;/p&gt;

&lt;p&gt;Ivy is so successful with her pink lemonade that her neighbor copies her recipe and, in addition, three more people open lemonade stands in the same neighborhood. &amp;ldquo;Wow,&amp;rdquo; she thinks, &amp;ldquo;I&amp;rsquo;m going to have to &lt;em&gt;really&lt;/em&gt; do a good job to keep all of my customers with all this competition.&amp;rdquo; So she tries lots of ideas: she starts selling cookies along with the lemonade, she hand-draws little cards that give someone a free lemonade for buying five and uses her mom&amp;rsquo;s hole-punch to keep track. She&amp;rsquo;s a friendly little girl and while the other kids in the neighborhood are making a little bit of money selling lemonade (and copying her every move), Ivy&amp;rsquo;s house has become something of a neighborhood gathering point. People come just to stand and talk about the day, all the while buying cookies and lemonade. It gets so popular that Ivy has to enlist some of the other neighborhood children to help her make enough lemonade and cookies to satisfy demand. Ivy is now making more than $100 a day, and three other kids in the neighborhood are making $30 a day helping her.&lt;/p&gt;

&lt;p&gt;Other kids keep opening lemonade stands in Holly&amp;rsquo;s neighborhood too, but each time she tells her mother that it isn&amp;rsquo;t fair and her well-connected but a bit overprotective mother dutifully calls and asks the parents of the other children not to sell lemonade: that&amp;rsquo;s Holly&amp;rsquo;s thing. The other parents are starting to grumble a bit&amp;hellip;Holly&amp;rsquo;s mom has been a good friend but isn&amp;rsquo;t it a little ridiculous that their children can&amp;rsquo;t sell lemonade just because Holly is stamping her feet and throwing a tantrum? Holly&amp;rsquo;s sales begin to dip as the parents (who are also Holly&amp;rsquo;s customers) get fed up with this entitled little girl.&lt;/p&gt;

&lt;p&gt;As the weather cools from the hottest part of summer, the demand for lemonade starts dropping. Ivy has proven herself a consummate innovator and begins offering coffee and hot chocolate in addition to her cold beverages. Holly gets angrier and angrier that her profits are dipping and now her mother is calling in favors with neighbors to get them to come buy Holly&amp;rsquo;s lemonade. This can only go so far, and Holly&amp;rsquo;s sales dwindle down to almost nothing. Now she just asks her mother to pay her $20 a day directly to buy lemonade because it&amp;rsquo;s not fair that people don&amp;rsquo;t want to buy it anymore. Her mother, finally fed up, says &amp;ldquo;Holly it&amp;rsquo;s November, no one wants to buy lemonade. Go find another game to play.&amp;rdquo; Holly is shocked at the audacity of her mother&amp;rsquo;s statement and stamps off to her room, throwing herself on her bed and locking the door. Holly&amp;rsquo;s mother feels a fleeting moment of guilt for being hard on her daughter, but is more relieved just to have some peace and quiet around the house for once.&lt;/p&gt;

&lt;p&gt;Which little girl would you rather be friends with?&lt;/p&gt;</description><link>http://www.mbleigh.com/post/16866896484</link><guid>http://www.mbleigh.com/post/16866896484</guid><pubDate>Wed, 01 Feb 2012 11:11:28 -0500</pubDate><category>parable</category><category>hollywood</category><category>innovation</category><category>business</category></item><item><title>If Government Embraced Technology...</title><description>&lt;p&gt;As an entrepreneurial software developer, I don&amp;rsquo;t usually look to the government to solve problems for me. Instead I usually try to think of ways to solve the problem (or start a business to solve the problem) myself. Sometimes, though, I stop to think about what it would be like if the government truly embraced and understood technology the way I do. Here are three big changes that might come about from such a government.&lt;/p&gt;

&lt;h3&gt;Digital Currency&lt;/h3&gt;

&lt;p&gt;Physical currency&amp;rsquo;s days are numbered. It may be some time yet before we truly replace it, but the time has come to build the systems that will eventually supplant it. The government should create a system of digital currency that would include at least these features:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Peer-to-Peer Transfer:&lt;/strong&gt; Any digital currency must obviously be as transferrable as real currency is now, both between individuals and from an individual to a business.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not Device-Locked:&lt;/strong&gt; Digital currency should not be tied to some specific &amp;ldquo;card&amp;rdquo; or device except as a convenience of transfer (such as a gift). I should be able to lose my wallet without losing my digital cash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anonymous Transactions:&lt;/strong&gt; Digital currency should retain the same level of anonymity as physical currency. I should be able to buy something without it being tied to an account or the destination of my funds recorded. Any kind of &amp;ldquo;tracking&amp;rdquo; of specific digital currency must only happen after court order (if at all).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Online and Offline:&lt;/strong&gt; Digital currency should be simple to use both in person and online.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;The impact of digital currency would mean an immediate boost for peer-to-peer economies that are already developing online. If everything from Etsy to eBay could be paid for in cash instead of through an intermediary the growth of individual power in the marketplace would be greatly increased, something that I think is vital to our economic future. I&amp;rsquo;m guessing that many of the ideas surrounding Bitcoin could be used for &amp;ldquo;official&amp;rdquo; digital currency.&lt;/p&gt;

&lt;p&gt;This would also negatively affect a number of large companies. Visa, Mastercard, Paypal, and a number of players small and large would have to drastically alter their business models to cope with a convenient, universal digital currency. Since digital currency is (in my opinion) inevitable, this is not reason enough to abandon the concept but instead a warning that there will likely be lobbying interests trying to stop such a move.&lt;/p&gt;

&lt;h3&gt;Phase Out Physical Addresses&lt;/h3&gt;

&lt;p&gt;The Post Office is struggling, and plenty of people say it shouldn&amp;rsquo;t exist at all any more. I&amp;rsquo;ll avoid weighing in on that, but one thing that &lt;em&gt;should&lt;/em&gt; exist is a central registry that maps people and businesses to physical locations without the need for physical addresses. I would propose that the identifier should be an email and the system could work like so:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;The system should be entirely opt-in and completed via some kind of online form.&lt;/li&gt;
&lt;li&gt;I should be able to map multiple email addresses to my account and specify privacy options for each. This could include the ability to reject mail from unapproved senders or get emails to approve/deny the delivery of mail.&lt;/li&gt;
&lt;li&gt;When I mail something, all I have to do is write the email address and affix a stamp. I can just write my own email address for the return address, or I can buy verified stamps associated to my own email address. This way someone can know that the message is actually from me.&lt;/li&gt;
&lt;li&gt;There should be publicly available APIs to allow businesses to check if an email address is associated to a physical one and what the privacy policy is for that email. This way Amazon.com can check if my email is associated to an address and, if it&amp;rsquo;s not, have me do so.&lt;/li&gt;
&lt;li&gt;There should be special APIs that can be accessed only by delivery companies such as UPS and Fedex that actually allow dereferencing an email address to a physical address. Usage of these APIs should be tightly restricted and regulated to prevent abuse.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;The impact of this would be to drastically increase the ease and convenience of sending physical packages and mail. It would also encourage a whole new industry of startups based around the ease with which delivering physical mail would be handled. It would also ease the frustration of changing address, since people are now mailing things to you, not you at some specific address.&lt;/p&gt;

&lt;p&gt;Negative impacts mostly center around the privacy dangers of having identity-based physical mail, but these are mostly addressed by the opt-in nature of the system. I would absolutely love to see this work.&lt;/p&gt;

&lt;p&gt;The reason the government can do the above while it would be difficult for a business is because both of these problems have solutions that only work at massive scale. If there isn&amp;rsquo;t a single digital currency that everyone can depend on using it won&amp;rsquo;t take off. If there isn&amp;rsquo;t a single accepted repository for physical address mappings they won&amp;rsquo;t be used. What other infrastructure&lt;/p&gt;

&lt;h3&gt;Automatic Tax Preparation&lt;/h3&gt;

&lt;p&gt;It&amp;rsquo;s always seemed slightly insane to me that the calculation of taxes is a burden for the citizenry and not the government. It&amp;rsquo;s seems akin to hiring a plumber who hands you a complex rate sheet and a calculator instead of a bill when the work is done.&lt;/p&gt;

&lt;p&gt;For the millions of individuals with relatively simple taxes (the kind that are mostly just filling in numbers from W-2s and other documents into TurboTax), why can&amp;rsquo;t the government simple accept the documents themselves and send a bill or a refund? Why do we have to purchase software or hire a professional to do something that could obviously be automated if the right systems were in place?&lt;/p&gt;

&lt;p&gt;If implemented, this would greatly disrupt the accounting industry, of course, but given the productivity gains of millions of Americans not spending hours worrying about preparing taxes each year, the benefits would far outweigh.&lt;/p&gt;

&lt;h3&gt;Technology and Politics&lt;/h3&gt;

&lt;p&gt;I&amp;rsquo;m often only thinking about politics when they start mucking about in my own technological backyard (e.g. SOPA/PIPA), but the truth is that a government that truly embraced technology could do some pretty amazing things. What grand ideas do you have that could be a reality if the government had the same know-how as a startup?&lt;/p&gt;</description><link>http://www.mbleigh.com/post/16771246767</link><guid>http://www.mbleigh.com/post/16771246767</guid><pubDate>Mon, 30 Jan 2012 14:33:52 -0500</pubDate><category>politics</category><category>opinion</category></item><item><title>Forward: Let's Start a Political Party</title><description>&lt;p&gt;I&amp;rsquo;ve never really been very interested in politics. At least, I wasn&amp;rsquo;t until SOPA/PIPA came along. The issue demonstrated for me two very important facts:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Technologists are severely under-represented in our current political system.&lt;/li&gt;
&lt;li&gt;Technologists are capable of causing political change.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;The first I&amp;rsquo;d known for ages, the second came as a surprise. I honestly never expected that my outrage and participation in activism regarding SOPA/PIPA would actually succeed. So what now? Well, &lt;a href="http://wefunder.com/signatures"&gt;we can start with crowdfunding for startups&lt;/a&gt;, but why not aim a bit higher?&lt;/p&gt;

&lt;p&gt;I think it&amp;rsquo;s time for technologists to organize and get some real change happening. The &lt;a href="http://testpacpleaseignore.org/"&gt;Test PAC&lt;/a&gt; is a great start, and I think any action should recognize that we may (for now) have more success influencing current political stakeholders than becoming them, but I believe that to truly move things forward we need actual people in office. Oh yeah, and I propose we call the party &lt;strong&gt;Forward&lt;/strong&gt;. Simple, to the point, and not confusing for ordinary people like Sweden&amp;rsquo;s Pirate Party. I also have a few ideas for ways to make the party successful in ways other third parties aren&amp;rsquo;t:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Large Active Member Base.&lt;/strong&gt; It is simply amazing how many technologists joined together to fight SOPA/PIPA. I truly believe that we can have a larger base of active party members (people who actually contribute in a meaningful way) than many other third parties.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Online Organization.&lt;/strong&gt; We already know how to organize. We can use Reddit, Hacker News, Twitter, and networks we create to build consensus and tackle specific issues in a way no other group can.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Position of Power.&lt;/strong&gt; We are the people building and shaping the most important industry in the world, the one that continues to grow despite the global economic setback. We can use this power for demonstration like with SOPA/PIPA and we can use it for education, too.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;If we can get &lt;strong&gt;one person&lt;/strong&gt; into Congress it can be the same as if every member of the party was elected. Why can&amp;rsquo;t we have an elected representative who puts a piece of proposed legislation on GitHub, accepts pull requests, and then submits the collaborative bill to Congress? From there we can collectively gather support from our representatives using phone campaigns, emails, etc. It&amp;rsquo;s time to change politics, and we have the power. Who&amp;rsquo;s with me?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; I created a &lt;a href="http://www.reddit.com/r/forwardparty/"&gt;Forward Party Reddit&lt;/a&gt; and would love to see discussion, links, and more there to evolve this idea and really make a difference.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/16764186875</link><guid>http://www.mbleigh.com/post/16764186875</guid><pubDate>Mon, 30 Jan 2012 11:40:30 -0500</pubDate><category>politics</category><category>opinion</category><category>forward</category></item><item><title>This is How I Want Social to Work</title><description>&lt;p&gt;I think that solving the dual problems of privacy and noise in social networking applications are very difficult. Personally I don&amp;rsquo;t think any of the major players (Facebook, Twitter, Google+) have tackled these problems entirely successfully. I did a little thinking and if I built a social network today, here&amp;rsquo;s how I would tackle the graph.&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s say that I just signed up for the network. As part of the sign up process I would be asked to create &lt;strong&gt;Topics&lt;/strong&gt; that I might post about. By default there would be two topics pre-populated: &lt;em&gt;Personal&lt;/em&gt; and &lt;em&gt;Work&lt;/em&gt;. In addition, the app would suggest that I add other topics that I might be interested and give examples such as &lt;em&gt;Technology&lt;/em&gt; or &lt;em&gt;Fashion&lt;/em&gt;. It would also say &amp;ldquo;hey don&amp;rsquo;t worry, you can always create topics while you post&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;So far so good. Now, whenever I share something I&amp;rsquo;m encouraged to select topics from those I have already posted about. I can also create a new topic on the fly just by typing its name. &amp;ldquo;Golly gee, this sounds an awful lot like Google&amp;rsquo;s Circles&amp;rdquo; you might be thinking if you were a 1950s era television character. Wait for it, here comes the payoff.&lt;/p&gt;

&lt;p&gt;Now I want to connect to people on the network. When I click &amp;ldquo;Follow&amp;rdquo; I&amp;rsquo;m greeted with a dialog box that says &amp;ldquo;For which topics do you want to follow X?&amp;rdquo; and presents me with a list of all of the topics that X has posted about (or I can say &amp;ldquo;all&amp;rdquo;). For my close family members I follow all topics, for friends I follow their &amp;ldquo;Personal&amp;rdquo; topic, for coworkers I follow their &amp;ldquo;Work&amp;rdquo; topic and for everyone else I follow the topics that I think I&amp;rsquo;ll enjoy reading from them, maybe &amp;ldquo;Funny&amp;rdquo; or &amp;ldquo;Ruby&amp;rdquo; or any number of other things.&lt;/p&gt;

&lt;p&gt;This is the best solution I&amp;rsquo;ve thought of to the &amp;ldquo;noise&amp;rdquo; problem with social networks. Right now I pretty much use Twitter for work and, well, I don&amp;rsquo;t really use Facebook much but if I did it would be for personal stuff. I don&amp;rsquo;t want to bore my friends with programming observations and I don&amp;rsquo;t want to bore my coworkers with personal observations. This system makes me certain that anyone looking at my posts has pro-actively decided that they are interested in hearing from me about that.&lt;/p&gt;

&lt;p&gt;The final piece of this puzzle is privacy. I would also have the ability to create private topics that require my approval before someone can follow me on. When someone subscribes to &amp;ldquo;all&amp;rdquo; of my topics they can check a box to request permission for private topics as well, which I can approve or deny on an individual basis. Private topics are not explicitly listed out nor are they revealed when I post to them (in this way private topics are much like Circles).&lt;/p&gt;

&lt;p&gt;There it is, my best attempt to describe a system that maximizes privacy control, minimizes noise, and creates as small a burden as possible. The only time that this requires &amp;ldquo;work&amp;rdquo; is that I need to tag each post I make with topics, and when I follow someone I have to decide which topics I want to follow them about.&lt;/p&gt;

&lt;h3&gt;Pros/Cons&lt;/h3&gt;

&lt;p&gt;Here are some of the advantages that I see to a system like the one described above:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;I believe that this solves the noise problem better than any existing system. Being able to subscribe to a subset of a user&amp;rsquo;s posts allows for specialized content without alienating followers who are interested in something else.&lt;/li&gt;
&lt;li&gt;Brands would be able to leverage this to their advantage as well. I could follow my favorite brands, blogs, etc. but only on the types of stories that would interest me.&lt;/li&gt;
&lt;li&gt;Gets us a little closer to &amp;ldquo;one network to rule them all&amp;rdquo; instead of needing to create a dichotomy between our personal and public lives.&lt;/li&gt;
&lt;li&gt;Since I&amp;rsquo;m encouraged to tag every post I make, lots of semantic data can be gathered about posts and used to make content discovery and other serendipity work on the system.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Of course, there are drawbacks as well, some surmountable some less so:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;The biggest problem is that people have to tag their posts accurately or none of this matters. It requires more work when I share and friction there is definitely a problem.&lt;/li&gt;
&lt;li&gt;What happens when people create new topics? I would imagine something like the Twitter interactions pane that would say &amp;ldquo;X posted about new topic Y, do you want to follow it?&amp;rdquo;, but this would have to be tuned to be user friendly.&lt;/li&gt;
&lt;li&gt;Users may feel tempted to follow all topics just out of fear of &amp;ldquo;missing something.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I&amp;rsquo;m putting this out there because I&amp;rsquo;m both wondering if anything like it exists and if there are huge glaring problems with it that I&amp;rsquo;m not considering. If this isn&amp;rsquo;t the right model for social, what is?&lt;/p&gt;</description><link>http://www.mbleigh.com/post/15682528392</link><guid>http://www.mbleigh.com/post/15682528392</guid><pubDate>Wed, 11 Jan 2012 15:27:41 -0500</pubDate><category>social</category><category>opinion</category></item><item><title>Free-to-Play Could Crash the Gaming Industry</title><description>&lt;p&gt;&lt;em&gt;This post is part of my &lt;a href="http://mbleigh.com/tagged/wgag"&gt;Where Games Are Going&lt;/a&gt; series in which I talk about the future of one of my favorite industries: video gaming.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://68.media.tumblr.com/tumblr_lxji8ypzUn1qzscwd.jpg" alt="ET Didn't Help" title="ET Didn't Help" style="float: right; margin: 0 0 5px 20px;"/&gt;&lt;/p&gt;

&lt;p&gt;At the same time that digital distribution is poised to level the playing field more than ever before for independent developers, another trend has the potential to cause a crash the likes of which hasn&amp;rsquo;t been seen since 1983. And it&amp;rsquo;s all Zynga&amp;rsquo;s fault.&lt;/p&gt;

&lt;p&gt;These days you can&amp;rsquo;t throw a rock in the gaming community without hitting someone who is talking about the brave new world of Free To Play. Everyone is taking a look at the hand-over-fist cash generated by the addiction engines pumped out by Zynga (no, I won&amp;rsquo;t call them games) and wants their piece of the pie. From the expected ranks of big publishers like EA to some of gaming&amp;rsquo;s most respected brands like Blizzard and Valve, everyone is exploring &amp;ldquo;alternative monetization&amp;rdquo; for games.&lt;/p&gt;

&lt;p&gt;But, you might say, won&amp;rsquo;t these alternative monetization strategies just lead to more people playing games and more games being made? If games are cheaper (or even free) isn&amp;rsquo;t that better for everyone? The answer is no.&lt;/p&gt;

&lt;p&gt;Free-to-play and in-game purchase models break the incentives associated with game development. Sure, it &lt;em&gt;can&lt;/em&gt; be done in a tactful manner and, in some cases, may even lead to a bigger audience for a great game. I haven&amp;rsquo;t played it, but I hear that League of Legends handles free vs. paid players in a very fair way. The problem is that once your money comes not from an up-front or monthly fee but from in-game purchases, you are no longer incentivized as a developer to make the game as fun as possible. Instead, you are incentivized to make players make as many &lt;em&gt;in-game purchases&lt;/em&gt; as possible.&lt;/p&gt;

&lt;p&gt;We don&amp;rsquo;t have to make up a worst case scenario for how this could end up, it already exists. Games like FarmVille are, quite literally, addiction engines. They are fine-tuned to draw a player in and build an obligation to continue playing and then an obligation to continue &lt;em&gt;purchasing&lt;/em&gt;. The problem is that there isn&amp;rsquo;t really a game underneath all the addiction; it&amp;rsquo;s just a psychologically tuned profit machine.&lt;/p&gt;

&lt;p&gt;In-game purchases might actually be more profitable in the short term. If you can convince people that they aren&amp;rsquo;t spending as much when they actually end up spending more, you&amp;rsquo;re going to make money. The problem is that in the long term people will come to realize that they are &amp;ldquo;playing&amp;rdquo; these games but not actually having, you know, fun. If the industry focuses on this model as much as I fear it is gearing up to do, the realization that games aren&amp;rsquo;t fun anymore could have sweepingly negative impact on the industry as a whole.&lt;/p&gt;

&lt;p&gt;The video game crash of 1982 was precipitated by a glut of mediocre-to-bad titles and little information to know which ones were good and which were bad. The gaming crash of 2015 might happen after developers have stopped making games fun in the quest to make them microtransactionally profitable. Casual and hardcore gamers alike could end up feeling jaded and alienated by an industry that treats them like marks instead of players, and if that happens gaming as a whole will suffer greatly.&lt;/p&gt;

&lt;p&gt;Personally I loathe the idea of in-game purchases. I don&amp;rsquo;t want my experience playing a game to be marred by thinking about the price of my fun. &amp;ldquo;Gee, would I have $2.99 more fun if I bought this Vorpal Sword right now?&amp;rdquo; It&amp;rsquo;s not that I&amp;rsquo;m price-sensitive, it&amp;rsquo;s that I explicitly play games to &lt;em&gt;escape&lt;/em&gt; the pocket-conscious decision-making of the rest of my daily life and now I&amp;rsquo;m being slapped in the face with it every five minutes.&lt;/p&gt;

&lt;p&gt;I care deeply about the gaming industry. I believe that video games helped to shape my logical thinking and problem-solving, and I &lt;em&gt;know&lt;/em&gt; that my interest in them precipitated my interest in computers and technology as a whole which has become a passionate and fulfilling career for me. So when I talk about this problem, it&amp;rsquo;s not because I think that there is something seriously wrong with games &lt;em&gt;now&lt;/em&gt;. I just think that many in the industry are being fooled by this mirage of a free-to-play future, and I implore these people to think twice before signing up to willfully misalign their incentive to simply make a great game.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/15570380781</link><guid>http://www.mbleigh.com/post/15570380781</guid><pubDate>Mon, 09 Jan 2012 11:48:19 -0500</pubDate><category>gaming</category><category>predictions</category><category>free-to-play</category><category>wgag</category><category>opinion</category></item><item><title>Calling Infringement Theft is Dangerous</title><description>&lt;p&gt;&lt;em&gt;Note: I actually submitted this as an op-ed piece to the New York Times which is why it&amp;rsquo;s far less technically voiced than my normal work. Unfortunately looks like I&amp;rsquo;m not getting picked up there, so I&amp;rsquo;ll just have to stand on my own soap box.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One day, Terry walked into a popular record store, slid a CD into his back pocket, and left the store without paying. The same day, Ian visited his favorite file sharing website and downloaded an album (as it happens, the same one that Terry shoplifted) without purchasing it or obtaining permission from the artist. If you think that these two cases sound almost identical, then you have likely fallen prey to a spreading and dangerous misnomer that has become nearly pervasive: conflating theft and copyright infringement.&lt;/p&gt;

&lt;p&gt;In the story above, Terry has committed theft, a criminal offense under state laws. In legal terms, theft is taking the property of someone else without consent and with the intent to permanently deprive them of the property. Ian, however, is not guilty of theft but rather copyright infringement: he has created an unlicensed copy of a copyrighted work. By downloading an album from a file sharing service he has not taken it from anywhere but rather duplicated it. While each person is entitled to his or her own opinion as to the difference in morality or ethics between the two, one thing is clear: from a legal perspective these are very different illegal actions.&lt;/p&gt;

&lt;p&gt;Theft is a criminal offense and is punishable by a wide array of remedies including jail time. Copyright infringement, on the other hand, is a civil infraction and can incur a lawsuit but cannot be prosecuted as a criminal offense (some instances of copyright infringement do warrant criminal punishment, but not as theft). The difference between criminal and civil infractions in our legal system is great: criminal infractions must be tried with the famous burden of proof of &amp;ldquo;beyond a reasonable doubt&amp;rdquo; while civil infractions are tried in court with a burden of &amp;ldquo;a preponderance of the evidence&amp;rdquo; (that the party is more likely guilty than not). The difference in burden is attributable to the weight of punishment: one cannot be jailed for a civil infraction, only fined.&lt;/p&gt;

&lt;p&gt;Copyrighted works such as books, movies, songs, and even software are all protected by federal law for the purpose of encouraging their creation. &amp;ldquo;Intellectual Property&amp;rdquo; is the term given to these types of works and, in the United States, we have three means of protecting intellectual property: copyrights, trademarks, and patents. Intellectual property is something that cannot be stolen because it is, by definition, intangible. You might say that someone &amp;ldquo;stole your idea&amp;rdquo; but what you really mean is that someone copied your idea. How can someone have stolen your idea if it&amp;rsquo;s still in your head? I can understand how this confusion comes about, but while it may feel like a technicality it is actually a very important distinction.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m not surprised when representatives of copyright holders call infringement theft; it is to their direct benefit to create a direct equivalency between intellectual property rights and real property rights. What continues to shock me is seeing this confusion trickle its way into the vocabulary of everyone from &lt;a href="http://bostinno.com/2011/12/20/sopa-will-kill-the-internet/"&gt;Harvard law professors&lt;/a&gt; to members of Congress. It is frightening to think that this misnomer is being used by the very people who are currently debating laws regarding copyright infringement with sweeping ramifications.&lt;/p&gt;

&lt;p&gt;My plea is simply this: stop thinking that these two terms are interchangeable and using them as such. Sure, &amp;ldquo;stealing&amp;rdquo; and &amp;ldquo;theft&amp;rdquo; are shorter and sound a lot more sensationalistic and juicy when one is talking about the issue of copyright infringement. But please at least use a term like &amp;ldquo;piracy&amp;rdquo; if you want a one-word term for the behavior. It may not be any more accurate but it doesn&amp;rsquo;t share the same effect of confusing everyday people about our legal system. Until there is a law decreeing that copyright infringement is a criminal offense punishable in the same manner as theft, one thing is certain: theft and copyright infringement are NOT the same thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; I &lt;a href="http://infringement-is-not-theft.tumblr.com"&gt;started a Tumblr&lt;/a&gt; to record these misnomers, feel free to submit one if you see it.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/15399553658</link><guid>http://www.mbleigh.com/post/15399553658</guid><pubDate>Fri, 06 Jan 2012 10:08:05 -0500</pubDate></item><item><title>Should we eliminate gendered pronouns?</title><description>&lt;p&gt;Today I was typing up another blog post and had to use &lt;em&gt;him/her&lt;/em&gt; as a gender neutral pronoun reference. This is something that&amp;rsquo;s always bugged me as it&amp;rsquo;s awkward to write and awkward to read. &amp;ldquo;They&amp;rdquo; is not a suitable alternative because it&amp;rsquo;s plural and therefore grammatically incorrect in a singular context.&lt;/p&gt;

&lt;p&gt;That got me thinking: why do we have gendered pronouns at all? After reading the recent post &lt;a href="http://www.rethinkingschools.org/archive/26_01/26_01_tempel.shtml"&gt;&amp;ldquo;It&amp;rsquo;s OK to be Neither&amp;rdquo;&lt;/a&gt; I&amp;rsquo;m wondering if there could be a positive cultural impact from completely eliminating gendered pronouns from language. I&amp;rsquo;m not proposing what we should standardize on, but if the English language didn&amp;rsquo;t have gendered pronouns, it would:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Solve the annoying he/she him/her pronoun problem.&lt;/li&gt;
&lt;li&gt;Make the language non-deterministic for those who believe that gender is a spectrum.&lt;/li&gt;
&lt;li&gt;Remove a subtle but foundational part of our language that encourages gender as a vitally important differentiator.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;I&amp;rsquo;m not generally an alarmist when it comes to vocabulary. I think that words only have power when we allow them to. That being said, it would be interesting to see the landscape of our society if this change were implemented.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Would it make the issue of the marriage of same-sex couples seem less &amp;ldquo;different&amp;rdquo; from the norm?&lt;/li&gt;
&lt;li&gt;Would workplace and friend networks be more likely to cross gender lines?&lt;/li&gt;
&lt;li&gt;Would children raised without gendered pronouns be more likely not to discriminate based on gender?&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I don&amp;rsquo;t have answers to any of these questions, I just think it&amp;rsquo;s an interesting topic to ponder. All of this being said, gender differences are a part of our lives and in many ways can and should be celebrated. But referential tags can be troublesome and this is one that&amp;rsquo;s literally baked into the language. Maybe it shoudn&amp;rsquo;t be&amp;hellip;what do you think?&lt;/p&gt;</description><link>http://www.mbleigh.com/post/15360479996</link><guid>http://www.mbleigh.com/post/15360479996</guid><pubDate>Thu, 05 Jan 2012 16:22:38 -0500</pubDate></item><item><title>Where Games Are Going: Consoles as App Platforms</title><description>&lt;p&gt;I&amp;rsquo;ve been an avid gamer since, well, ever. Like many developers, an interest in video games (and creating them) is what first lured me to the world of programming. While I&amp;rsquo;m not a part of the game industry I follow it closely and have greatly enjoyed discovering such online video series as &lt;a href="http://www.youtube.com/show/allyourhistory"&gt;All Your History Are Belong To Us&lt;/a&gt; and &lt;a href="http://penny-arcade.com/patv/show/extra-credits"&gt;Extra Credits&lt;/a&gt; this year. &amp;ldquo;Where Games Are Going&amp;rdquo; posts simply represent my observations and predictions about gaming and its future. This time, we&amp;rsquo;re going to talk about the next generation of consoles.&lt;/p&gt;

&lt;p&gt;The current generation of consoles (Xbox 360, PS3, Wii) is going to be the last generation in which physical media (discs, carts, what-have-you) are the primary way in which new games are acquired. This is a large trend that can be seen especially in Microsoft&amp;rsquo;s full downloadable games which include AAA titles from this year, not just the older/smaller titles to which downloadable games have traditionally been relegated.&lt;/p&gt;

&lt;p&gt;The company that wins the next generation console war will be the one who most wholeheartedly adopts the App Store model, specifically meaning a simple distribution system open to any and all developers with a constant revenue share model. I believe that Microsoft is currently best positioned to make this happen: Xbox Live is still far and away the most comprehensive console gaming community, they&amp;rsquo;ve shown that they&amp;rsquo;re willing to pull in this model with Xbox Live Indie Games, and they have Windows Phone 7 and Windows App Stores either here or on the way. That&amp;rsquo;s not to say that there aren&amp;rsquo;t a few kinks left to figure out:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Big Publishers Will Resist.&lt;/strong&gt; The next generation of consoles is going to see content created by a single guy pitted directly against content created by a seasoned team of 100. Big established publishers will fight hard to keep themselves separate to avoid competition from smaller developers but, ultimately, they will lose. They&amp;rsquo;ve already had to accept this on iOS and Android devices, they will eventually accept it on consoles as well.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Price Will Be A Problem.&lt;/strong&gt; A recent post on Signal vs. Noise called the physical disc/digital content price gap the &lt;a href="http://37signals.com/svn/posts/3063-my-friend-calls-this-the-lazy-tax"&gt;Lazy Tax&lt;/a&gt;, but in reality the problem is monolithic price control. Microsoft and publishers alike are going to have to radically alter the game price structure to work in the new market. Games will either have to drastically lower in price at the outset or aggressively discount after the first few months. Otherwise, there will be a big swell of frustration from the gamers who are accustomed to the used and on-sale markets for getting their games. One way to get around this (but it isn&amp;rsquo;t pretty) would be to have unique unlock codes that can be purchased for games and sold by retailers. This would allow Amazon et al to discount games more like they do currently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-Games Will Be Huge.&lt;/strong&gt; The next generation of gaming consoles aren&amp;rsquo;t just going to be for games. This is already obvious with the huge push for video that Microsoft has done on the Xbox 360 but it will become even more so as the consoles from all major players will open their doors to non-game content. Even Nintendo, traditionally focused exclusively on gaming, &lt;a href="http://www.joystiq.com/2011/12/30/rumor-wii-u-to-host-more-non-game-apps/"&gt;is rumored to be jumping on the app train&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google and Apple Will Enter the Fray.&lt;/strong&gt; The interesting side effect of consoles becoming app platforms is that they will suddenly face competition from the existing app platforms of Apple and Google. Each platform will have to work hard to differentiate itself from the pack.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;I think the next generation of consoles will be very interesting and there&amp;rsquo;s a lot that remains to be seen. Perhaps even more interesting, I think the &lt;em&gt;next&lt;/em&gt; next gen will come from disruptive game streaming services like &lt;a href="http://onlive.com"&gt;OnLive&lt;/a&gt;. As actually fast connectivity gets cheaper and more available it will make a lot more sense to stream games from big gaming rigs in the sky than to outlay a pile of cash on a home console. Once this happens, game platforms will go ubiquitous, no longer tied to any one device. Expect to be able to play full Xbox 1080 games on your Windows Phone and (maybe) even your iOS or Android device.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/15251908631</link><guid>http://www.mbleigh.com/post/15251908631</guid><pubDate>Tue, 03 Jan 2012 15:01:07 -0500</pubDate><category>gaming</category><category>predictions</category><category>opinion</category><category>wgag</category></item><item><title>Why I Rarely Read Books</title><description>&lt;p&gt;I don&amp;rsquo;t really read books these days. I read plenty of blogs and web development related things via Google Reader, but I almost never just sit down and read something in my free time. Sometimes I&amp;rsquo;m filled with guilt about it: surely I should be reading more, enriching my life and whatnot. But then I realized that it&amp;rsquo;s not because I hate reading that I don&amp;rsquo;t do it often, it&amp;rsquo;s because &lt;strong&gt;reading is anti-social&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I spend a large portion of my life reading and writing text from and to a computer screen. When I&amp;rsquo;m ready to put down the computer I&amp;rsquo;m also ready to have some actual face-to-face interaction with people. Reading is just about the only form of common leisure activity that can&amp;rsquo;t be enjoyed simultaneously by more than one person (unless one is reading aloud or being read aloud to).&lt;/p&gt;

&lt;p&gt;Video games, board games, concerts, and even to a lesser extent movies and television are all social experiences. When I&amp;rsquo;m playing video games with my family and friends we also chat about this and that in gameplay lulls. Board games have always been social and my collection continues to grow. Movies and TV aren&amp;rsquo;t quite as social but during commercial breaks (Hulu, of course, not &lt;em&gt;actual&lt;/em&gt; television which I abandoned years ago) or afterwards there is a new shared experience to talk about. Most forms of entertainment are about creating that shared experience. Reading is not.&lt;/p&gt;

&lt;p&gt;Reading is an isolating experience: you have to concentrate on the story and separate yourself from the rest of the world. So I still read when I&amp;rsquo;m on a plane or alone on a business trip, when I find myself both without company and uninspired to be hacking on open source or another side project. Sometimes my wife and I even read aloud to each other when we&amp;rsquo;re both really interested in a book (or manga series). But I rarely read books these days, and I&amp;rsquo;m starting to feel ok about that.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/15040512892</link><guid>http://www.mbleigh.com/post/15040512892</guid><pubDate>Fri, 30 Dec 2011 15:11:41 -0500</pubDate><category>leisure</category><category>reading</category><category>opinion</category></item><item><title>Announcing OmniAuth BrowserID</title><description>&lt;p&gt;I&amp;rsquo;ve been following the progress of Mozilla&amp;rsquo;s &lt;a href="https://browserid.org"&gt;BrowserID&lt;/a&gt; for some time now, and I&amp;rsquo;m a big fan. Having dove much deeper than most into the quagmire of fragmented authentication I&amp;rsquo;ve reached the same conclusion that Mozilla has: ultimately, authentication is a function that should belong to the user agent.&lt;/p&gt;

&lt;h3&gt;What is BrowserID?&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;BrowserID&lt;/strong&gt; is a Single Sign-on service for the web, much like you can implement using OpenID or even Facebook or Twitter. However, BrowserID is fantastic for its simplicity: as an implementation of a simple &amp;ldquo;verified email&amp;rdquo; protocol, it is simply a way to be able to obtain the email of a user (and know that it&amp;rsquo;s verified).&lt;/p&gt;

&lt;p&gt;For now, this works via a Javascript authentication flow on a website that Mozilla is maintaining. However, the future of this technology is that you would verify your email directly within your browser and would then be able to sign in to supported websites using your browser itself.&lt;/p&gt;

&lt;p&gt;But, you ask, why do we want authentication in the browser? Browsers are called &lt;strong&gt;User Agents&lt;/strong&gt; for a reason: they are simply tools that help connect you to the content of the internet that interests you. And a lot of that content right now requires you to manage dozens of different passwords and store sensitive login information with a third party. BrowserID doesn&amp;rsquo;t entirely solve this problem in its nascent web-based form, but once it is integrated into the browser itself BrowserID becomes a single, secure way to access content on the internet.&lt;/p&gt;

&lt;h3&gt;BrowserID + OmniAuth&lt;/h3&gt;

&lt;p&gt;I want BrowserID to succeed, and it will only succeed if people start using it. To that end, I&amp;rsquo;ve created &lt;a href="https://github.com/intridea/omniauth-browserid"&gt;OmniAuth BrowserID&lt;/a&gt;, a simple OmniAuth strategy that works with the BrowserID protocol. You can use it in your application like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# in Gemfile
gem 'omniauth-browserid'

# in application
use OmniAuth::Builder do
  provider :browser_id
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&amp;rsquo;s it! Now send your users to &lt;code&gt;/auth/browser_id&lt;/code&gt; and they will be able to sign in using the BrowserID service. Of course you may prefer to implement your own Javascript flow. That&amp;rsquo;s fine, too, just take a look at the &lt;a href="https://github.com/intridea/omniauth-browserid"&gt;project README&lt;/a&gt; for more information about customizing the flow.&lt;/p&gt;

&lt;p&gt;BrowserID is an important idea and whether Mozilla&amp;rsquo;s implementation is ultimately the one that gets adopted it&amp;rsquo;s high time we started moving authentication to where it belongs: in the user agent.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/14688678047</link><guid>http://www.mbleigh.com/post/14688678047</guid><pubDate>Wed, 21 Dec 2011 00:00:00 -0500</pubDate></item><item><title>Implementing DRY Magic Methods in Ruby</title><description>&lt;p&gt;As a new developer to Ruby you might wonder how certain methods seem to
be magically available without being strictly defined. Rails&amp;rsquo;s dynamic
finders (e.g. &lt;code&gt;find_by_name&lt;/code&gt;) are one example of this kind of magic. It&amp;rsquo;s
very simple to implement magic such as this in Ruby, but it&amp;rsquo;s also easy
to implement things in a way that doesn&amp;rsquo;t entirely mesh with standard
Ruby object expectations.&lt;/p&gt;

&lt;h3&gt;Your Friend &lt;code&gt;method_missing&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;The way that many magic methods are implemented is by overriding
&lt;code&gt;method_missing&lt;/code&gt;. This special method in Ruby is automatically called by
the interpreter whenever a method is called that cannot be found. The
default behavior of &lt;code&gt;method_missing&lt;/code&gt; is to raise a &lt;code&gt;NoMethodError&lt;/code&gt;
letting the user know that the method that was called does not exist.
However, by overriding this behavior we can allow the user to call
methods that aren&amp;rsquo;t strictly defined but rather programatically
determined at runtime. Let&amp;rsquo;s look at a simple example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Nullifier
  def method_missing(*args)
    nil
  end
end

nullifier = Nullifier.new
nullifier.some_method     # =&amp;gt; nil
nullifier.foo(:bar, :baz) # =&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here we simply told &lt;code&gt;method_missing&lt;/code&gt; to immediately return nil, regardless
of the method name or arguments passed. This essentially means that, for
this class, &lt;strong&gt;any&lt;/strong&gt; method call that is not defined on &lt;code&gt;Object&lt;/code&gt; 
(the default superclass for new classes) will return nil.&lt;/p&gt;

&lt;p&gt;While this example is certainly interesting, it doesn&amp;rsquo;t necessarily give
us more use in the real world. Let&amp;rsquo;s take another example that actually
does something useful. Let&amp;rsquo;s make a hash that allows us to access its
keys by making method calls:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class SuperHash &amp;lt; Hash
  def method_missing(method_name, *args)
    if key?(method_name.to_s)
      self[method_name].to_s
    else
      super
    end
  end
end

h = SuperHash.new
h['abc'] = 'def'
h.abc            # =&amp;gt; 'def'
h.something_else # =&amp;gt; NoMethodError
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This behavior gives us something pretty simple yet powerful: we have
manipulated the foundation of the class to give us runtime methods.
There&amp;rsquo;s a problem, though: using &lt;code&gt;method_missing&lt;/code&gt; alone is only half the
story.&lt;/p&gt;

&lt;h2&gt;Quack Check With &lt;code&gt;respond_to?&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;In Ruby, you can call &lt;code&gt;respond_to?&lt;/code&gt; with a symbol method name on any
object and it should tell you whether or not that method exists on
the object in question. This is part of what makes Ruby&amp;rsquo;s duck-typing
work so well. So in our example, we also want to be able to know if a 
method is there using &lt;code&gt;respond_to?&lt;/code&gt;. So let&amp;rsquo;s add a new override for the
&lt;code&gt;respond_to?&lt;/code&gt; method of our example above:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class SuperHash &amp;lt; Hash
  def respond_to?(symbol, include_private=false)
    return true if key?(symbol.to_s)
    super
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Well, that was easy enough. Now our SuperHash will return hash keys
based on &lt;code&gt;method_missing&lt;/code&gt; and even tell you if the method is there with
&lt;code&gt;respond_to?&lt;/code&gt;. But there&amp;rsquo;s still one more thing we can do to clean
things up a bit: notice how we have repeated functionality in that we
check &lt;code&gt;key?&lt;/code&gt; in both methods? Now that we have a &lt;code&gt;respond_to?&lt;/code&gt; we can
use that as a guard for &lt;code&gt;method_missing&lt;/code&gt; to make it more confident:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class SuperHash &amp;lt; Hash
  def method_missing(method_name, *args)
    return super unless respond_to?(method_name)
    self[method_name].to_s
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wait, that can&amp;rsquo;t be right, can it? Can we just assume that we can
call the key like that? &lt;strong&gt;Of course!&lt;/strong&gt; We already know that no existing
method was called if &lt;code&gt;method_missing&lt;/code&gt; is activated. That means that if
&lt;code&gt;respond_to?&lt;/code&gt; is true but no existing method was called, there &lt;strong&gt;must&lt;/strong&gt;
be a key in our hash that caused &lt;code&gt;respond_to?&lt;/code&gt; to return true. Therefore
we can confidently assume that the key exists and simply return it,
removing the conditional and cleaning up the &lt;code&gt;method_missing&lt;/code&gt; substantially.&lt;/p&gt;

&lt;p&gt;Now that you know how &lt;code&gt;method_missing&lt;/code&gt; and &lt;code&gt;respond_to?&lt;/code&gt; can work
together to add functionality to an object at runtime, you have a
powerful new tool in your metaprogramming arsenal. Enjoy it!&lt;/p&gt;</description><link>http://www.mbleigh.com/post/14688677060</link><guid>http://www.mbleigh.com/post/14688677060</guid><pubDate>Wed, 16 Nov 2011 00:00:00 -0500</pubDate></item><item><title>OmniAuth 1.0: Auth for All</title><description>&lt;p&gt;Today I&amp;rsquo;m happy to announce that &lt;a href="https://github.com/intridea/omniauth"&gt;OmniAuth&lt;/a&gt; version 1.0.0 has been released into the wild. The result of more than a month of heavy development, the newest version of OmniAuth brings along with it a slate of new features, a whole new structure, and the tools to let OmniAuth be your &lt;strong&gt;only&lt;/strong&gt; authentication library. The one thing that hasn&amp;rsquo;t changed is OmniAuth&amp;rsquo;s mission: to assume nothing about how your app works and what you want to do with authentication.&lt;/p&gt;

&lt;h3&gt;Breaking up the Band&lt;/h3&gt;

&lt;p&gt;OmniAuth was first written to abstract the common parts of authentication to external service providers like Twitter and Facebook. It launched as a small collection of gems that each contained many strategies (for instance, the &lt;code&gt;oa-oauth&lt;/code&gt; gem contained Twitter and LinkedIn strategies). As OmniAuth&amp;rsquo;s popularity grew five strategies became fifty-five. Releases became fewer and further between because of the overhead of managing pull requests and issues for dozens of strategies.&lt;/p&gt;

&lt;p&gt;No more. Starting with OmniAuth 1.0, each and every OmniAuth strategy will live in its own gem. The downside of this for end users is that you will have a few more lines to declare in your Gemfiles. The upsides, however, are numerous:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;There is no longer a gatekeeper to releasing an OmniAuth strategy. Just build a gem, release it, and link it from the new &lt;a href="https://github.com/intridea/omniauth/wiki/List-of-Strategies"&gt;strategy list wiki page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Individual strategies are free to make releases as often as they&amp;rsquo;d like. Users don&amp;rsquo;t have to wait for a massive OmniAuth patch or minor release to pick up fixes for changing APIs or other improvements.&lt;/li&gt;
&lt;li&gt;With a lean, focused core OmniAuth itself will be able to release more frequently and adapt itself to the needs of strategy authors.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;As a final note about structural gem changes, OmniAuth 1.0 marks the beginning of strict semantic versioning for the project. For end users, this doesn&amp;rsquo;t mean much. For strategy authors, that means that you can safely declare your dependency on &lt;code&gt;~&amp;gt; 1.0&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Identity for OmniAuth&lt;/h3&gt;

&lt;p&gt;As I began using OmniAuth in my day-to-day coding, I began to crave the flexibility of OmniAuth in even traditional authentication scenarios. I wanted a way to leverage the same unassuming, simple authentication structure even when my users logged in via username and password. Today, I&amp;rsquo;m happy to announce the first official release of &lt;a href="https://github.com/intridea/omniauth-identity"&gt;omniauth-identity&lt;/a&gt;, an OmniAuth strategy that bridges the gap between traditional auth and OmniAuth.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;omniauth-identity&lt;/code&gt; you can quickly and easily set up internal identity management for your app that behaves &lt;strong&gt;exactly&lt;/strong&gt; like other OmniAuth strategies. The library is simple but its implications are powerful: you can now treat internal and external authentication exactly the same in your application.&lt;/p&gt;

&lt;p&gt;OmniAuth now ships with a Developer strategy that is essentially &amp;ldquo;fake authentication&amp;rdquo; you can use as a placeholder until you determine your app&amp;rsquo;s real authentication strategies. Combined with the potential of Identity, authentication no longer has to be that annoying &amp;ldquo;first thing&amp;rdquo; you have to do before you can get down to the real business of building your app. Just drop in OmniAuth, use the Developer strategy, and implement other strategies down the road when it works for the timeline of your app. This is how I&amp;rsquo;ll be building all my apps from now on, and since OmniAuth is just Rack middleware even Sinatra and other non-Rails apps can use the same techniques.&lt;/p&gt;

&lt;p&gt;For more information on how to use &lt;code&gt;omniauth-identity&lt;/code&gt;, see the &lt;a href="https://github.com/intridea/omniauth-identity"&gt;README on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Strategy Builders: Better Docs, Better Tools&lt;/h3&gt;

&lt;p&gt;For the 1.0 release in addition to all of the new features and structure I also tried to significantly improve the documentation for the project, especially for those who are interested in building a strategy. You can see the results of those efforts on &lt;a href="https://github.com/intridea/omniauth/wiki"&gt;the OmniAuth wiki&lt;/a&gt; which is the official repository of all documentation for OmniAuth.&lt;/p&gt;

&lt;p&gt;Along with better documentation for developers OmniAuth 1.0 also brings along a more declarative DSL for building strategies. The new strategy API gives developers clear ways to implement consistent functionality and makes everything cleaner across the board. For more information on the tools available for strategy developers, take a look at the &lt;a href="https://github.com/intridea/omniauth/wiki/Strategy-Contribution-Guide"&gt;Strategy Contribution Guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;App Developers: Consistency, Dynamic Strategies&lt;/h3&gt;

&lt;p&gt;While many of the improvements in OmniAuth are structural and made for strategy developers, there&amp;rsquo;s also some great stuff available for everyday users of OmniAuth! Here&amp;rsquo;s some highlights of new features that work across all strategies:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auth Hash.&lt;/strong&gt; Some small tweaks have been made to the &lt;code&gt;omniauth.auth&lt;/code&gt; hash that is returned after authentication completes. For one, you can now access keys using method accessors (e.g. &lt;code&gt;env['omniauth.auth'].info.name&lt;/code&gt;. The &lt;code&gt;user_info&lt;/code&gt; key has also been renamed simply to &lt;code&gt;info&lt;/code&gt;. The schema can be considered a stable part of the public API and any breaking changes will trigger a major version release (you can rely on OmniAuth 1.9 to support the same schema as 1.0).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Options Everywhere.&lt;/strong&gt; As of OmniAuth 1.0, strategy authors are encouraged to make all strategy configuration happen through the options hash that is passed in on initialization. You will still have strategies that have additional arguments (such as consumer keys and secrets) for convenience, but even those can be configured instead by passing in a single options hash. This means that every configurable aspect of the strategy is handled at runtime, which brings us to the next improvement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better Dynamic Strategies.&lt;/strong&gt; OmniAuth 1.0 makes it easy to dynamically alter strategies for each request using the new, universally available &lt;a href="https://github.com/intridea/omniauth/wiki/Setup-Phase"&gt;setup phase&lt;/a&gt;. Simply set the &lt;code&gt;:setup&lt;/code&gt; option to a Rack endpoint and you can modify the strategy or anything else about the environment before passing it along to OmniAuth for normal operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skip Info.&lt;/strong&gt; Some strategies will be able to determine the UID without making additional API calls. You can pass &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;, or a lambda that takes a UID and returns true or false as to whether additional info is required. This gives you the ability to make fewer API calls for cases where you already have a user in your system, for instance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom Forms.&lt;/strong&gt; If you are utilizing an OmniAuth strategy that displays the standard OmniAuth form, you can now pass in &lt;code&gt;:form =&amp;gt; (true || false || lambda)&lt;/code&gt; to the strategy to instead render a custom form that conforms better to your application. This replaces the previous poorly conceived method of requiring &lt;code&gt;/auth/:provider&lt;/code&gt; to return a 404 in order for OmniAuth to trigger.&lt;/p&gt;

&lt;h3&gt;Calling All Companies&lt;/h3&gt;

&lt;p&gt;Now that each strategy for OmniAuth is its own gem, I&amp;rsquo;m putting a public call out to any and all companies with APIs, but especially companies that are already on a Ruby stack. I would like to get companies on board for maintaining their own &amp;ldquo;official&amp;rdquo; OmniAuth strategies. This gives developers using your API the simplest possible means of authenticating to your service and will only help you get more developer traction and experimentation.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m also happy to announce that our first &amp;ldquo;official&amp;rdquo; strategy maintainers are none other than GitHub! You can say hello to the &lt;a href="https://github.com/intridea/omniauth-github"&gt;official GitHub OmniAuth strategy&lt;/a&gt; and be sure that any changes to the GitHub API will be safely transitioned into the gem immediately. My hope is that going forward many more companies will join the official strategy ranks. If you&amp;rsquo;re interested in maintaining an official strategy, you don&amp;rsquo;t need my permission but I&amp;rsquo;d love to hear about it so &lt;a href="https://github.com/inbox/new/mbleigh"&gt;shoot me a message on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Where&amp;rsquo;s That Strategy?&lt;/h3&gt;

&lt;p&gt;Because of the structural changes to OmniAuth not all existing strategies are available at launch. I fully expect that in the coming weeks the strategy count will regain lost ground and even surpass the count as of the last &lt;code&gt;0.x&lt;/code&gt; release, but if your favorite strategy is missing from the &lt;a href="https://github.com/intridea/omniauth/wiki/List-of-Strategies"&gt;official list&lt;/a&gt; here&amp;rsquo;s what you can do about it:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Find the source code for your strategy in the &lt;a href="https://github.com/intridea/omniauth/tree/0-3-stable"&gt;0-3-stable branch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/intridea/omniauth-contrib"&gt;omniauth-contrib&lt;/a&gt; and add the strategy there&lt;/li&gt;
&lt;li&gt;Follow the &lt;a href="https://github.com/intridea/omniauth/wiki/Adapting-strategies-for-1.0"&gt;strategy adaption guide&lt;/a&gt; to update the strategy for 1.0&lt;/li&gt;
&lt;li&gt;Submit a pull request!&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;The &lt;code&gt;omniauth-contrib&lt;/code&gt; repository is a temporary repository for strategies that have been written but aren&amp;rsquo;t robust and supported enough to have their own gem yet. This repository is &lt;strong&gt;not&lt;/strong&gt; going to be maintained as an actual RubyGem and the strategies contained inside are meant to eventually be adopted by developers to become their own gems.&lt;/p&gt;

&lt;h3&gt;One More Thing&lt;/h3&gt;

&lt;p&gt;One last thing that I wanted to do for 1.0 is create a kind of living example that the community could update to have a simple example of as many strategies as possible. You can now visit &lt;a href="http://www.omniauth.org"&gt;omniauth.org&lt;/a&gt; and try out a number of authentication strategies that OmniAuth has to offer. The code is all open so you can see how simple it is to add and use OmniAuth in your applications today!&lt;/p&gt;

&lt;h3&gt;Welcome to 1.0&lt;/h3&gt;

&lt;p&gt;OmniAuth 1.0 marks an important milestone for the project and I&amp;rsquo;m looking forward to a new, leaner trajectory that lets us make changes more nimbly (and keeps the outstanding issue count low to zero). While the changes for 1.0 were mostly written by me, OmniAuth has been an outstanding community effort and it couldn&amp;rsquo;t have gotten to where it is today without the efforts of &lt;a href="https://github.com/sferik"&gt;@sferik&lt;/a&gt; and countless other contributors. I hope you enjoy the new release and look forward to hearing your feedback!&lt;/p&gt;</description><link>http://www.mbleigh.com/post/14688675998</link><guid>http://www.mbleigh.com/post/14688675998</guid><pubDate>Wed, 02 Nov 2011 00:00:00 -0400</pubDate></item><item><title>Hire a Guard for Your Project</title><description>&lt;p&gt;Of all of the new tools that I&amp;rsquo;ve picked up using for development in the
past six months, there is one that has come to stand above the others
for its nearly universal utility. That tool is &lt;a href="https://github.com/guard/guard"&gt;Guard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Guard is a RubyGem but don&amp;rsquo;t let that fool you into thinking it&amp;rsquo;s only
useful for Ruby projects. Guard is essentially an &lt;code&gt;autotest&lt;/code&gt; for
&lt;em&gt;everything&lt;/em&gt;. It provides a general purpose set of tools for watching
when files are changed in your project and taking action based on it.
You can use it to do just about anything, but common uses will include:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Re-running automated tests after a file changes.&lt;/li&gt;
&lt;li&gt;Automatically compiling scripts or assets for a project (e.g.
minification).&lt;/li&gt;
&lt;li&gt;Installing new dependencies that may be added to the project.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;With a little creativity and a slight bit of Ruby coding, though, you can
make your entire project&amp;rsquo;s workflow run smoother and faster. It&amp;rsquo;s like
having a telepathic robot buddy who just goes around doing whatever you
were about to do next without having to be told (except the first time).&lt;/p&gt;

&lt;h2&gt;Getting Started With Guard&lt;/h2&gt;

&lt;p&gt;Guard requires a basic Ruby setup. Once you have Ruby and RubyGems
installed, simply run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem install guard
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will get you started. If you want to make it easier for others to
run your guards as well, you should also install Bundler to encapsulate
the different guard gems you&amp;rsquo;ll be using:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem install bundler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once you have these installed, in the root of your project run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;guard init
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will initialize a &lt;code&gt;Guardfile&lt;/code&gt; in the project root that will be
telling Guard what to do going forward. From here, you will want to
install some of the Guard extension gems that let you quickly create
automation for your project. Some of my favorites:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;strong&gt;guard-rspec:&lt;/strong&gt; Automatically run RSpec tests based on
easy-to-customize patterns. I use this on almost every Ruby project
these days.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;guard-coffeescript:&lt;/strong&gt; Compile &lt;a href="http://coffeescript.org"&gt;Coffeescript&lt;/a&gt;
into Javascript lickety-split. Even though Coffeescript has its own
automatic build command with the &lt;code&gt;-w&lt;/code&gt; option, I prefer Guard because
it lets you define the configuration once and, in addition, run a
single process for &lt;em&gt;all&lt;/em&gt; of your project&amp;rsquo;s automation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;guard-process:&lt;/strong&gt; This is the guard for anything they haven&amp;rsquo;t made a
guard for yet. Using this you can quickly and easily run shell
commands as soon as files change, giving you the ability to do almost
anything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;guard-sass:&lt;/strong&gt; Never write vanilla CSS again. Using Guard SASS you
can automatically compile &lt;a href="http://sass-lang.com"&gt;SASS&lt;/a&gt; giving you the
full power of mixins, variables, and more for all your styles.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;There&amp;rsquo;s a &lt;a href="https://github.com/guard/guard/wiki/List-of-available-Guards"&gt;full list of guards&lt;/a&gt;
that include all kinds of magic (there&amp;rsquo;s even &lt;a href="https://github.com/guard/guard-livereload"&gt;guard-livereload&lt;/a&gt;
that can automatically refresh your browser whenever you make a change
to a project), and it&amp;rsquo;s dead simple to create new Guard libraries if
what you want isn&amp;rsquo;t available (or you can just use &lt;strong&gt;guard-process&lt;/strong&gt;).&lt;/p&gt;

&lt;h2&gt;Standing Guard&lt;/h2&gt;

&lt;p&gt;For any of the Guard gems you install, you can add them to your
Guardfile by running:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;guard init guardname
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Where &lt;code&gt;guardname&lt;/code&gt; might be &lt;code&gt;rspec&lt;/code&gt; or &lt;code&gt;coffeescript&lt;/code&gt;, etc. That will
fill your Guardfile with a basic implementation of the given guard and
is usually enough for you to tweak the settings to your liking without
further documentation.&lt;/p&gt;

&lt;p&gt;There&amp;rsquo;s a great &lt;a href="https://github.com/guard/guard/wiki/Guardfile-examples"&gt;example&lt;/a&gt;
of using Guard for a big Rails project, but I&amp;rsquo;m not just using it for
Ruby. I&amp;rsquo;ve used Guard on jQuery plugins, Node.js projects, even static
websites that I&amp;rsquo;ve been building (more on that a little later).&lt;/p&gt;

&lt;p&gt;To make it easier for others to jump into your project with Guard, it
also helps to use Bundler to maintain a &lt;code&gt;Gemfile&lt;/code&gt; that points to the
various guards you&amp;rsquo;re using for the specific project. Just run &lt;code&gt;bundle
init&lt;/code&gt; to get Bundler up and running then edit the file to look something
like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;source 'http://rubygems.org'

gem 'guard'
gem 'guard-coffeescript'
gem 'guard-process'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then run &lt;code&gt;bundle install&lt;/code&gt;. Once your gems are installed and you&amp;rsquo;ve set
up your Guardfile, just run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bundle exec guard
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Guard will start up right away and your project now has some smooth
automation action. Guard will even reload &lt;em&gt;itself&lt;/em&gt; if you modify the
Guardfile, so feel free to tweak as you go!&lt;/p&gt;

&lt;h2&gt;Guard in the Real World&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;m going to post just a couple examples of Guardfiles I&amp;rsquo;ve been using
in my projects recently to give you an idea of its versatility.&lt;/p&gt;

&lt;h3&gt;Guarding a jQuery Plugin&lt;/h3&gt;

&lt;p&gt;Here&amp;rsquo;s the &lt;code&gt;Guardfile&lt;/code&gt; for &lt;a href="https://github.com/intridea/sketch.js"&gt;Sketch.js&lt;/a&gt;,
a jQuery plugin that I just released:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Automatically build the source Coffeescript into the lib directory
guard 'coffeescript', :input =&amp;gt; 'src', :output =&amp;gt; 'lib', :bare =&amp;gt; true
# Also automatically build the test Coffeescripts
guard 'coffeescript', :input =&amp;gt; 'test', :output =&amp;gt; 'test', :bare =&amp;gt; true

# Run Docco 
guard 'process', :name =&amp;gt; 'Docco', :command =&amp;gt; 'docco src/sketch.coffee' do
  watch %r{src/.+\.coffee}
end

# Copy the newly created lib file for minification.
guard 'process', :name =&amp;gt; 'Copy to min', :command =&amp;gt; 'cp lib/sketch.js lib/sketch.min.js' do
  watch %r{lib/sketch.js}
end

# Use uglify.js to minify the Javascript for maximum smallness
guard 'uglify', :destination_file =&amp;gt; "lib/sketch.min.js" do
  watch (%r{lib/sketch.min.js})
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This enabled my workflow to be instantaneous: I could immediately look
at my work whether it was in my examples, my tests, or my documentation.
Everything was immediately built and I never had to slow myself down
with run and refresh cycles.&lt;/p&gt;

&lt;h3&gt;Guarding a Node.js Project&lt;/h3&gt;

&lt;p&gt;I&amp;rsquo;ve probably only scratched the surface here, but a simple Node.js
project that I&amp;rsquo;m currently working on has this for a Guardfile:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;guard 'coffeescript', :input =&amp;gt; 'src', :output =&amp;gt; '.', :bare =&amp;gt; true

guard 'process', :name =&amp;gt; 'NPM', :command =&amp;gt; 'npm install' do
  watch %r{package.json}
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Notice that using &lt;strong&gt;guard-process&lt;/strong&gt; I&amp;rsquo;m automatically installing new
dependencies that may arise when the &lt;code&gt;package.json&lt;/code&gt; file is altered.&lt;/p&gt;

&lt;h3&gt;Guarding a Static Website&lt;/h3&gt;

&lt;p&gt;I&amp;rsquo;ve come to really appreciate both Coffeescript and SASS as worthwhile
abstractions, so even if I&amp;rsquo;m building something that&amp;rsquo;s vanilla HTML I
might have a Guardfile like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;guard 'sass', :input =&amp;gt; 'sass', :output =&amp;gt; 'css'
guard 'coffeescript', :input =&amp;gt; 'coffeescripts', :output =&amp;gt; 'javascripts'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These are all basic examples, but that (to me) is the point: Guard is so
simple to use and basic that you can drop it in &lt;strong&gt;every project you build&lt;/strong&gt;.
I&amp;rsquo;ve yet to run into something that I don&amp;rsquo;t want to use Guard on.&lt;/p&gt;

&lt;h2&gt;Tip of the Iceberg&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;ve been expanding my usage of Guard into, well, everything that I&amp;rsquo;m
working on. Thus far it&amp;rsquo;s included Ruby, Javascript, and static HTML
projects, but if I move on to other things Guard will be coming with me.
For instance, I&amp;rsquo;d love to build a Guard to automatically recompile and
run an Android application whenever the XML views change. The
possibilities are limitless.&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re not using Guard, give it a try on one of your current
projects. I think you&amp;rsquo;ll quickly find immense satisfaction in being able
to simply &lt;code&gt;cd&lt;/code&gt; into the project directory, run &lt;code&gt;guard&lt;/code&gt;, and know that
you are completely ready to roll. I&amp;rsquo;d like to see a Guardfile in every
open source project I fork, every client project I clone&amp;hellip;Guard is so
useful that I simply want to be using it all the time. And &lt;em&gt;that&lt;/em&gt; is the
mark of a great tool.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/14688675209</link><guid>http://www.mbleigh.com/post/14688675209</guid><pubDate>Thu, 25 Aug 2011 00:00:00 -0400</pubDate></item><item><title>Sketch.js: HTML5 Canvas Sketchpads for Whyday</title><description>&lt;p&gt;Last Friday I decided to celebrate &lt;a href="http://whyday.org"&gt;_whyday&lt;/a&gt; by
taking a departure from my normal open source path and writing some
Javascript (well, technically Coffeescript). So today we&amp;rsquo;re announcing
&lt;a href="http://intridea.github.com/sketch.js"&gt;Sketch.js&lt;/a&gt;, a simple jQuery
library to enable HTML5 Canvas &amp;ldquo;sketchpads&amp;rdquo; for any web application.&lt;/p&gt;

&lt;h2&gt;Quick and Easy Doodling&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sketch.js&lt;/strong&gt; allows you to initialize a &lt;code&gt;canvas&lt;/code&gt; element as a
sketchpad as well as draw with different colors, stroke sizes, and tools
(currently only a marker and an eraser). These tools can be accessed
programatically or using special links with &lt;code&gt;data&lt;/code&gt; attributes. Here&amp;rsquo;s a
basic example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;canvas id='mysketch' width='400' height='300'&amp;gt;&amp;lt;/canvas&amp;gt;

&amp;lt;script type='text/javascript'&amp;gt;
  $('#mysketch').sketch();
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&amp;rsquo;s all there is to it! The canvas will now be drawable by your users
and, thanks to a relatively straightforward API, you can customize it to
your heart&amp;rsquo;s content.&lt;/p&gt;

&lt;p&gt;The HTML5 Canvas element is extremely powerful but it can be a bit
daunting to get started. I took this as an opportuntiy both to learn it
some myself and to provide a drop-in tool for others. Hopefully you find
it useful!&lt;/p&gt;

&lt;h2&gt;Learning on Whyday&lt;/h2&gt;

&lt;p&gt;I set out on Whyday with the intent of learning a few new tricks. Here&amp;rsquo;s
some new things I tried out:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Sketch.js is coded in &lt;a href="http://coffeescript.org"&gt;Coffeescript&lt;/a&gt;. I had 
used Coffeescript before but never its class system or more advanced 
features. I like it!&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s documented using &lt;a href="http://jashkenas.github.com/docco/"&gt;Docco&lt;/a&gt;
which has been one of the most straightforward and pleasant
documentation experiences I&amp;rsquo;ve ever had. It also, as an annotated source
engine, encourages clean source code.&lt;/li&gt;
&lt;li&gt;I set up an awesome instant build environment that uses
&lt;a href="http://github.com/guard/guard"&gt;Guard&lt;/a&gt; to compile Coffeescript,
generate docs with Docco, and minify the JS into a build directory.
The workflow worked really well.&lt;/li&gt;
&lt;li&gt;I tried to do a very little bit of unit testing using 
&lt;a href="http://docs.jquery.com/Qunit"&gt;QUnit&lt;/a&gt;, which was my first major foray
into Javascript testing. Unfortunately, with how much I was learning
about Canvas at the same time, I didn&amp;rsquo;t keep at the testing as much
as I would have liked.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;All in all it was a great chance to sharpen my skills on something that
I hadn&amp;rsquo;t had a ton of experience with. You can see the docs (and live examples) on
&lt;a href="http://intridea.github.com/sketch.js"&gt;its GitHub pages&lt;/a&gt; or visit the code
&lt;a href="https://github.com/intridea/sketch.js"&gt;on GitHub&lt;/a&gt;. Enjoy!&lt;/p&gt;</description><link>http://www.mbleigh.com/post/14688674553</link><guid>http://www.mbleigh.com/post/14688674553</guid><pubDate>Mon, 22 Aug 2011 00:00:00 -0400</pubDate></item><item><title>What's Wrong With Patents? It's Obvious.</title><description>&lt;p&gt;Patents are in the news in the tech circle more and more these days. As
trolls lurk under bridges and the portfolio cold war gets hotter and
hotter, everyone is talking about the fact that something is wrong. What
exactly that something is, however, is up for debate. Should the patent
system be abolished? What about just software patents? Is the term too
long? I don&amp;rsquo;t know, maybe. But one of the primary issues, from my view
as a web startup developer, is that what&amp;rsquo;s obvious isn&amp;rsquo;t really so
obvious anymore.&lt;/p&gt;

&lt;p&gt;Patents were established as part of a way to codify the Constitution&amp;rsquo;s
Copyright Clause attempting to promote science and the &amp;ldquo;useful arts.&amp;rdquo;
They grant a limited term of exclusivity for inventors in exchange for
publishing the means to reproduce the invention. In theory, this is a
win-win: the inventor gets to make money off of their invention and the
public gets to know how it&amp;rsquo;s made. Other individuals or companies can
even license the right to reproduce the invention before the patent has
expired so it may reach even more people than it would otherwise.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m not going to get into arguments about whether or not the patent
system as a whole encourages innovation in modern times. However, one of
the requirements of getting a patent is that it not be obvious to &amp;ldquo;a
person having ordinary skill in the art.&amp;rdquo; I believe that this
requirement is no longer adequately strict for patent issuance due to
three fundamental differences between the establishment of the system
and today&amp;rsquo;s field of &amp;ldquo;inventors&amp;rdquo;: population, communication, and
specialization.&lt;/p&gt;

&lt;h2&gt;Matters of Population&lt;/h2&gt;

&lt;p&gt;There are more than 300 million people in America, more than 100 times
as many as when the country was founded. That means that for any given
&amp;ldquo;art&amp;rdquo; there&amp;rsquo;s a great number more people in any particular field than
there used to be. So how does this affect obviousness?&lt;/p&gt;

&lt;p&gt;If eight people out of ten couldn&amp;rsquo;t figure out how to do something, maybe 
it&amp;rsquo;s reasonable to let the one out of two that figured it out first get a
patent on it. That incentivizes the two that &lt;em&gt;can&lt;/em&gt; figure it out &lt;em&gt;to&lt;/em&gt;
figure it out because there&amp;rsquo;s a real chance that they&amp;rsquo;ll break ground
first and make some money off of it.&lt;/p&gt;

&lt;p&gt;So let&amp;rsquo;s increase the field&amp;rsquo;s population a bit. Now let&amp;rsquo;s apply the same
ratio to an invention but there&amp;rsquo;s 1,000 people in the field.  That means
that 800 out of 1000 would find it non-obvious, but 200 out of 1000
would. A person of &amp;ldquo;ordinary skill in the art&amp;rdquo; still would allow the
patent to be issued, but now we&amp;rsquo;re talking about 200 separate people who
&lt;em&gt;would&lt;/em&gt; find it obvious. This isn&amp;rsquo;t inherently a problem if all
inventions existed in a vacuum, but most often patented ideas
(especially in software) represent only part of a larger vision or
system. That means that because one out of 200 people happened to
register for a patent first, their larger system is in the clear while
199 others that could be solving totally different problems but using
the same invention &lt;em&gt;as a part of their larger vision&lt;/em&gt; are now in
jeopardy of owing licensing fees or being barred from pursuing matters
entirely.&lt;/p&gt;

&lt;p&gt;In modern America any given field will have tens of thousands of people
all working, collaborating, and inventing. To posit that the standard by
which &lt;em&gt;exclusive, multi-year rights&lt;/em&gt; to something should be given to
something that&amp;rsquo;s non-obvious to the average person doesn&amp;rsquo;t ring true. It
should be something unique and groundbreaking enough to be non-obvious
to the &lt;em&gt;vast majority&lt;/em&gt; of people in the field. To merit exclusivity, it
should be something so beneficial that the inventor would fight tooth
and nail to keep it secret were the advantages of patents unavailable.
Instead, hundreds of patents are issued for mundane, completely
foreseeable advancements in the art. Just because something is
non-obvious to most people doesn&amp;rsquo;t make it a breakthrough invention.&lt;/p&gt;

&lt;h2&gt;Proliferances of Communication&lt;/h2&gt;

&lt;p&gt;Can you even imagine how things must have worked back in the late 18th
century? What would it have been like to be a scientist, a researcher,
an inventor? Compared to the always-on global communications networks
that researchers, engineers and inventors have today it&amp;rsquo;s an entirely
different world. Lots has been written about how the world is
&amp;ldquo;shrinking&amp;rdquo; as both travel and communication between disparate places
becomes easier and easier, and the same goes for the inventive
communities who are churning out patents.&lt;/p&gt;

&lt;p&gt;This readily available communication has the effect of making all
participants in a field effectively smarter than they would be
otherwise: if I don&amp;rsquo;t know how to do something, I can just Google it and
now I do. This has implications again for the consideration of the
&amp;ldquo;obviousness&amp;rdquo; of patents. Are many of the things patented today non-obvious
to a person of average skill in the art &lt;strong&gt;with access to the internet?&lt;/strong&gt;
I&amp;rsquo;m not so sure.&lt;/p&gt;

&lt;h2&gt;Especially Specialized&lt;/h2&gt;

&lt;p&gt;&lt;img align="right" src="https://img.skitch.com/20110818-espsja4cdbqi4g6jqq4dgfetme.png" style="padding-left:10px; padding-bottom:5px; padding-top:10px"/&gt;&lt;/p&gt;

&lt;p&gt;Over the course of our society&amp;rsquo;s development we have gone from an
agrarian society to an industrial one and now to an informational one.
The level of specialization found in the modern creative force makes it
pretty difficult to tell exactly who should be considered a person with
&amp;ldquo;average skill in the art.&amp;rdquo; As a disclaimer, I&amp;rsquo;m not actually sure how
the courts currently make such decisions, but it surely is a more
complicated question than it used to be. Where do we draw lines of
separation for the &amp;ldquo;arts&amp;rdquo;?&lt;/p&gt;

&lt;p&gt;Is the peer group for a new mobile device patent other mobile device
engineers? Is it other device engineers? All electrical engineers? I&amp;rsquo;m
not honestly sure how you would draw that distinction and where you draw
the line will drastically effect the determination of average skill in
the art.&lt;/p&gt;

&lt;h2&gt;Abandoning IP&lt;/h2&gt;

&lt;p&gt;So what is to be done about the patent problem? Well, my guess is that
the growing tsunami of patent litigation is going to lead to &lt;em&gt;some&lt;/em&gt; kind
of change in the law. The current situation is pretty untenable, and I 
think it&amp;rsquo;s only going to become more so. Something big will break loose
in the next few years and I think the landscape is going to change
dramatically.&lt;/p&gt;

&lt;p&gt;There are multiple fronts on which the current patent system seems to be
at odds with proper innovation, and one of the biggest problems in my
eyes is that it is only larger, heavily established and heavily funded
companies that are even trying to get patents. You don&amp;rsquo;t see garage
startups wasting their time trying to eke out software patents: they&amp;rsquo;re
too busy building. It&amp;rsquo;s not until a company is big enough that it can
afford to split its focus and hire patent attorneys and do what is
necessary to start &amp;ldquo;protecting&amp;rdquo; its IP. That bothers me, because it&amp;rsquo;s
propping up a system of innovation where only the big established
players have a chance to exclusivity on their &amp;ldquo;inventions,&amp;rdquo; and in my
mind those are the people who need protection the least.&lt;/p&gt;

&lt;p&gt;Technology moves orders of magnitude faster than it did in &amp;ldquo;the old
days&amp;rdquo; and I&amp;rsquo;m not even sure where patents fit anymore. 18 years is
several lifetimes by current standards of advancement, and to lock up a
technology for that long is equivalent to locking it up for the entire
span of its usefulness.&lt;/p&gt;

&lt;p&gt;Coming from an open source software advocacy background, patents seem
like a greedy, antiquated version of what thousands do every day for
free: sharing their technology with the world for the benefit of
everyone (the creator included). In a world where everything can change
in a matter of months, I think it&amp;rsquo;s time to stop worrying about
protecting IP and time to focus solely on creating things of lasting
value. Don&amp;rsquo;t keep your competitors from using your innovations, just
make newer and better innovations that outpace them.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/14688673829</link><guid>http://www.mbleigh.com/post/14688673829</guid><pubDate>Thu, 18 Aug 2011 00:00:00 -0400</pubDate></item><item><title>Ruby Thankful</title><description>&lt;p&gt;A lot has been made in the talkosphere recently about the brewing
&amp;ldquo;multi-Ruby version manager&amp;rdquo; war, namely
&lt;a href="http://rvm.beginrescueend.com"&gt;RVM&lt;/a&gt; vs newcomer
&lt;a href="https://github.com/sstephenson/rbenv"&gt;rbenv&lt;/a&gt;. I&amp;rsquo;m not here to discuss
the relative merits of either software solution, mostly because I take
things pretty simple and straightforward in command-line world and I&amp;rsquo;ve
never run into problems with RVM. What I do think this little fracas
displays, though, is a common thread in the Ruby community of &lt;em&gt;having&lt;/em&gt;
big, blown-up controversies when new things come along. In some ways, I
think that such drama is one of the unique features of the Ruby
community that make it so vibrant. It&amp;rsquo;s also a feature of the community
that can lead to community casualties.&lt;/p&gt;

&lt;p&gt;RVM vs. rbenv, Test::Unit vs. RSpec, HAML vs. ERB, Rails vs. Merb, 
Coffeescript vs. Javascript, Mongrel vs. Thin vs. Passenger vs. 
Unicorn, Cucumber vs. Steak, and the list goes on. It seems like the
Ruby community has a habit of drawing battle lines every month or so.
Why do these &amp;ldquo;fights&amp;rdquo; come up so frequently in our community? More
importantly, what do they mean for the overall health of the community?&lt;/p&gt;

&lt;p&gt;Today we&amp;rsquo;re launching a little site called &lt;a href="http://rubythankful.com"&gt;RubyThankful&lt;/a&gt;.
It&amp;rsquo;s barebones at the moment and &lt;a href="https://github.com/intridea/rubythankful"&gt;open source&lt;/a&gt;,
but what it represents is hopefully a way to find some positivity in the
Ruby community.&lt;/p&gt;

&lt;h2&gt;Background: Passionate Programmers&lt;/h2&gt;

&lt;p&gt;I would argue that controversy breaks out on a regular basis in the Ruby
community because, more than any other community in which I&amp;rsquo;ve
participated, Rubyists are singularly driven to use not just good-enough
tools but ideal tools. Ruby is a community of chaotic reinvention, a
community that will jump off a cliff just to try out a new brand of
parachute. It&amp;rsquo;s that passion that draws me to the community, that makes
me feel like the things that I do matter. It&amp;rsquo;s also that passion that
can cut to the bone.&lt;/p&gt;

&lt;p&gt;People are inevitably going to form opinions about what they think is
the best in a field of competing libraries/tools/products. This
competition in the commercial marketplace is what drives high quality
and low prices, and in the open source world it&amp;rsquo;s what drives
reinvention and continual progress. If a library isn&amp;rsquo;t pushing its users
forward, those users can and will seek out a different library that
better meets their needs. This is natural and generally beneficial.&lt;/p&gt;

&lt;p&gt;What isn&amp;rsquo;t maybe so beneficial is the &amp;ldquo;what have you done for me lately&amp;rdquo;
attitude that can come with our pursuit of the perfect development process.
It&amp;rsquo;s altogether too easy to write about reasons why &amp;ldquo;Y is better than X&amp;rdquo;
while forgetting about the fact that before that, X was so much better
than nothing at all.&lt;/p&gt;

&lt;h2&gt;Casualties of Harsh Reality&lt;/h2&gt;

&lt;p&gt;As I began to write this post I saw Steve Klabnik&amp;rsquo;s &lt;a href="http://blog.steveklabnik.com/2011/08/12/we-forget-that-open-source-is-made-of-people.html"&gt;We Forget That Open
Source is Made of People&lt;/a&gt;.
It&amp;rsquo;ll be hard not to re-iterate many of his well-reasoned thoughts here,
so I want to give him credit for making a point that needs to be made.
I was also amazed to come against this controversy just one day after I
wrote a post that included the sentence &amp;ldquo;Harsh words can sometimes be 
enough to completely dissolve the creator&amp;rsquo;s interest in continuing the 
project.&amp;rdquo; We&amp;rsquo;ve lost amazing members of this community because rather
than respecting their contributions we tear them down when something
marginally better comes along. This is the dark side of passion.&lt;/p&gt;

&lt;p&gt;I like some tools better than others. I&amp;rsquo;ve even written blog posts
debating the merits of one approach over another and declaring one
superior for my purposes. I&amp;rsquo;ve been guilty of jumping onto new
technologies and giving nary a thought to the old way of doing things. I
don&amp;rsquo;t think it&amp;rsquo;s possible to stop this community from being obsessed
with the new and different, and I don&amp;rsquo;t think that&amp;rsquo;s what needs to
happen. What needs to happen is that our community needs to get better
at raising our voice in something other than protest. We need to temper
our enthusiasm for the new enough to at least be civil to the
hard-working people who created the tools we used until oh-so-recently.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m as guilty as anyone of this. Short of trying to say &amp;ldquo;thanks&amp;rdquo; in
person to the creators and maintainers of the tools I use every day when
I see them at conferences, I don&amp;rsquo;t take much time to thank people for
the amazing things they&amp;rsquo;ve done to make this community what it is. 
This all sounds sappy and somewhat inefficient, but I think it&amp;rsquo;s a vital
piece of maintaining a healthy community.&lt;/p&gt;

&lt;h2&gt;Ruby Thankful&lt;/h2&gt;

&lt;p&gt;I almost wrote this just as a blog post to say &amp;ldquo;hey, let&amp;rsquo;s be more
positive and thankful.&amp;rdquo; I was just about to post it when I realized I
could do at least a little bit more than that. So I built an
almost-nothing-to-it site that can serve as a public forum for the Ruby
community&amp;rsquo;s gratitude for those who work hard to make it what it is.
Just tweet something with the &lt;a href="http://rubythankful.com"&gt;#rubythankful&lt;/a&gt;
hashtag and it&amp;rsquo;ll get picked up. Maybe it&amp;rsquo;s someone you&amp;rsquo;re thanking for
a library, or their blog post or tutorial that helped you out, maybe
it&amp;rsquo;s something else. If you&amp;rsquo;re thankful for the Ruby community and the
members of it, let&amp;rsquo;s put some voice out there!&lt;/p&gt;

&lt;p&gt;This community has given me a lot in the last four years, and I&amp;rsquo;ve done
my best to give back. But I haven&amp;rsquo;t always been thankful enough to the
individuals who create the things that I use every day. Hopefully
&lt;a href="http://rubythankful.com"&gt;RubyThankful&lt;/a&gt; is a small way to encourage that
to change.&lt;/p&gt;</description><link>http://www.mbleigh.com/post/14688672943</link><guid>http://www.mbleigh.com/post/14688672943</guid><pubDate>Mon, 15 Aug 2011 00:00:00 -0400</pubDate></item></channel></rss>
