Browse files

Heroku. Yeah.

  • Loading branch information...
1 parent 39744f9 commit e37f9010dae8ab8f367ac4f18d1e20bedc367613 @steveklabnik committed Sep 8, 2011
Showing with 23,441 additions and 1 deletion.
  1. +0 −1 .gitignore
  2. +288 −0 public/2009/12/02/about-crows.html
  3. +415 −0 public/2009/12/28/the-little-coder-s-predicament.html
  4. +332 −0 public/2009/12/31/the-hackety-mainfesto.html
  5. +397 −0 public/2010/03/01/reddit-drama-an-interesting-look-at-community-values.html
  6. +340 −0 public/2010/03/03/why-bother-creating.html
  7. +358 −0 public/2010/03/05/writing-a-su-feature-with-authlogic.html
  8. +439 −0 public/2010/03/08/create-a-more-compelling-experience-for-your-users-through-game-mechanics.html
  9. +345 −0 public/2010/03/10/book-review-rework.html
  10. +306 −0 public/2010/04/24/living-in-the-cloud.html
  11. +334 −0 public/2010/04/27/a-break-with-the-past.html
  12. +445 −0 ...d-of-your-own-children-since-they-are-natives-in-a-world-where-you-will-always-be-immigrants.html
  13. +301 −0 public/2010/06/08/productivity-waves.html
  14. +285 −0 public/2010/06/30/case-study-in-being-excellent-divvy.html
  15. +888 −0 public/2010/07/17/what-to-know-before-debating-type-systems.html
  16. +318 −0 public/2010/07/24/a-blip-in-time.html
  17. +300 −0 public/2010/08/19/a-word-about-why-whyday-and-hackety-hack.html
  18. +306 −0 public/2010/09/17/trouble-with-diaspora.html
  19. +303 −0 public/2010/09/21/80-of-success-is-showing-up.html
  20. +286 −0 public/2010/09/24/trolling-is-a-art.html
  21. +312 −0 public/2010/11/17/the-hardest-decision-i-ve-ever-made.html
  22. +267 −0 public/2010/12/25/hackety-hack-v1-0.html
  23. +312 −0 public/2011/01/02/goals-for-2011.html
  24. +401 −0 public/2011/01/22/a-few-notes-on-foucault.html
  25. +286 −0 public/2011/03/03/i-m-quitting-hacker-news.html
  26. +278 −0 public/2011/03/18/did-you-hear-i-m-ruby-mendicant-university-s-first-visiting-teacher.html
  27. +288 −0 public/2011/03/23/announcing-rstat-us.html
  28. +382 −0 public/2011/03/30/the-first-week-of-rstat-us-users-press-scaling-oh-my.html
  29. +358 −0 public/2011/05/10/contributing-to-ruby-s-documentation.html
  30. +287 −0 public/2011/05/12/the-next-iteration-of-my-blog.html
  31. +634 −0 public/2011/05/21/single-text-many-masters.html
  32. +554 −0 public/2011/07/03/nobody-understands-rest-or-http.html
  33. +343 −0 public/2011/07/24/twitter-is-to-important-to-be-owned-by-twitter.html
  34. +507 −0 public/2011/08/07/some-people-understand-rest-and-http.html
  35. +388 −0 public/2011/08/12/we-forget-that-open-source-is-made-of-people.html
  36. +299 −0 public/2011/08/19/matz-is-nice-so-we-are-nice.html
  37. +332 −0 public/2011/08/22/im-making-it-dead-simple-to-contribute-to-ruby-s-documentation.html
  38. +305 −0 public/2011/09/04/the-self-improvement-pomodoro.html
  39. +854 −0 public/2011/09/06/the-secret-to-rails-oo-design.html
  40. BIN public/assets/jwplayer/glow/controlbar/background.png
  41. BIN public/assets/jwplayer/glow/controlbar/blankButton.png
  42. BIN public/assets/jwplayer/glow/controlbar/divider.png
  43. BIN public/assets/jwplayer/glow/controlbar/fullscreenButton.png
  44. BIN public/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png
  45. BIN public/assets/jwplayer/glow/controlbar/muteButton.png
  46. BIN public/assets/jwplayer/glow/controlbar/muteButtonOver.png
  47. BIN public/assets/jwplayer/glow/controlbar/normalscreenButton.png
  48. BIN public/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png
  49. BIN public/assets/jwplayer/glow/controlbar/pauseButton.png
  50. BIN public/assets/jwplayer/glow/controlbar/pauseButtonOver.png
  51. BIN public/assets/jwplayer/glow/controlbar/playButton.png
  52. BIN public/assets/jwplayer/glow/controlbar/playButtonOver.png
  53. BIN public/assets/jwplayer/glow/controlbar/timeSliderBuffer.png
  54. BIN public/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png
  55. BIN public/assets/jwplayer/glow/controlbar/timeSliderCapRight.png
  56. BIN public/assets/jwplayer/glow/controlbar/timeSliderProgress.png
  57. BIN public/assets/jwplayer/glow/controlbar/timeSliderRail.png
  58. BIN public/assets/jwplayer/glow/controlbar/unmuteButton.png
  59. BIN public/assets/jwplayer/glow/controlbar/unmuteButtonOver.png
  60. BIN public/assets/jwplayer/glow/display/background.png
  61. BIN public/assets/jwplayer/glow/display/bufferIcon.png
  62. BIN public/assets/jwplayer/glow/display/muteIcon.png
  63. BIN public/assets/jwplayer/glow/display/playIcon.png
  64. BIN public/assets/jwplayer/glow/dock/button.png
  65. +115 −0 public/assets/jwplayer/glow/glow.xml
  66. BIN public/assets/jwplayer/glow/playlist/item.png
  67. BIN public/assets/jwplayer/glow/playlist/itemOver.png
  68. BIN public/assets/jwplayer/glow/playlist/sliderCapBottom.png
  69. BIN public/assets/jwplayer/glow/playlist/sliderCapTop.png
  70. BIN public/assets/jwplayer/glow/playlist/sliderRail.png
  71. BIN public/assets/jwplayer/glow/playlist/sliderThumb.png
  72. BIN public/assets/jwplayer/glow/sharing/embedIcon.png
  73. BIN public/assets/jwplayer/glow/sharing/embedScreen.png
  74. BIN public/assets/jwplayer/glow/sharing/shareIcon.png
  75. BIN public/assets/jwplayer/glow/sharing/shareScreen.png
  76. BIN public/assets/jwplayer/player.swf
  77. +2,648 −0 public/atom.xml
  78. +602 −0 public/blog/archives/index.html
  79. BIN public/favicon.png
  80. BIN public/images/bird_32_gray.png
  81. BIN public/images/bird_32_gray_fail.png
  82. BIN public/images/code_bg.png
  83. BIN public/images/dotted-border.png
  84. BIN public/images/email.png
  85. BIN public/images/line-tile.png
  86. BIN public/images/noise.png
  87. BIN public/images/rss.png
  88. BIN public/images/search.png
  89. +2,412 −0 public/index.html
  90. +2 −0 public/javascripts/ender.js
  91. +43 −0 public/javascripts/github.js
  92. +1,497 −0 public/javascripts/libs/ender.js
  93. +85 −0 public/javascripts/libs/jXHR.js
  94. +298 −0 public/javascripts/libs/swfobject-dynamic.js
  95. +5 −0 public/javascripts/modernizr-2.0.js
  96. +142 −0 public/javascripts/octopress.js
  97. +56 −0 public/javascripts/pinboard.js
  98. +82 −0 public/javascripts/twitter.js
  99. +1,081 −0 public/page/2/index.html
Sorry, we could not display the entire diff because it was too big.
View
1 .gitignore
@@ -4,7 +4,6 @@
_gist_cache
_code_cache
_deploy
-public
sass.old
source.old
source/_stash
View
288 public/2009/12/02/about-crows.html
@@ -0,0 +1,288 @@
+
+<!DOCTYPE html>
+<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
+<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
+<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
+<head>
+ <meta charset="utf-8">
+ <title>About Crows - Literate Programming</title>
+ <meta name="author" content="Steve Klabnik">
+
+
+ <!-- http://t.co/dKP3o1e -->
+ <meta name="HandheldFriendly" content="True">
+ <meta name="MobileOptimized" content="320">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+
+
+ <link rel="canonical" href="http://blog.steveklabnik.com/2009/12/02/about-crows.html"/>
+ <link href="/favicon.png" rel="shortcut icon" />
+ <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
+ <script src="/javascripts/modernizr-2.0.js"></script>
+ <script src="http://s3.amazonaws.com/ender-js/jeesh.min.js"></script>
+ <script src="/javascripts/octopress.js" type="text/javascript"></script>
+ <link href="http://feeds.feedburner.com/steveklabnik" rel="alternate" title="Literate Programming" type="application/atom+xml"/>
+ <!--Fonts from Google's Web font directory at http://google.com/webfonts -->
+<link href='http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+<link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+
+</head>
+
+<body >
+ <header><hgroup>
+ <h1><a href="/">Literate Programming</a></h1>
+
+ <h2>Code is data, data is code. s/data/language/g;</h2>
+
+</hgroup>
+
+</header>
+ <nav role=navigation><ul role=subscription data-subscription="rss">
+ <li><a href="http://feeds.feedburner.com/steveklabnik" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
+
+</ul>
+<form action="http://google.com/search" method="get">
+ <fieldset role="site-search">
+ <input type="hidden" name="q" value="site:blog.steveklabnik.com" />
+ <input class="search" type="text" name="q" results="0" placeholder="Search"/>
+ </fieldset>
+</form>
+<ul role=main-navigation>
+ <li><a href="/">Blog</a></li>
+ <li><a href="/blog/archives">Archives</a></li>
+</ul>
+
+</nav>
+ <div id="main">
+ <div id="content">
+ <div>
+<article class="hentry">
+
+ <header>
+
+ <h1 class="entry-title">About Crows</h1>
+
+
+ <p class="meta">
+
+
+
+
+
+
+
+
+
+<time datetime="2009-12-02T00:00:00-05:00" pubdate data-updated="true" >Dec 2<span>nd</span>, 2009</time></p>
+
+ </header>
+
+
+<div class="entry-content"><p>A short time ago, the G20 came right here to Pittsburgh. With an event of such
+worldwide importance happening in our backyards, several people decided to
+document it via social media. The Mattress Factory did a site called &#8220;MyG20&#8221;
+and it did pretty well. Some smaller groups did their own thing. But IndyMedia
+did one better: <a href="http://indypgh.org/g20/">http://indypgh.org/g20/</a></p>
+
+<p>The <a href="http://thecaucus.blogs.nytimes.com/2009/09/24/getting-out-the-anti-globalization-message/">New York Times</a> called it &#8220;One of the best all-purpose sites with
+updates from the streets.&#8221; It got quite a lot of attention and hits from all
+over. And it was put together by a good friend of mine, <a href="http://www.twitter.com/edfilo">@edfilo</a>. I helped
+a teeny tiny bit, but he (with the help of LibSyn) really did an awesome job.</p>
+
+<p>So why should this matter to you? The G20 is old news by now.</p>
+
+<p>He&#8217;s releasing the code for the site, making it available to anyone who wants
+to cover events. It&#8217;s called &#8220;Crows,&#8221; and it lives at <a href="http://crowsne.st/">http://crowsne.st/</a>
+. With Crows, you can quickly and easily build a site, pulling in content from
+Flickr, Twitter, and elsewhere, and posting it all on a geotagged Google Map.</p>
+
+<p>It&#8217;s still in its rough infancy, but after the awesome role that it played
+during the G20, several other organizations had contacted IndyMedia about
+getting access to the code, and so it&#8217;s already gaining traction in the space.
+It&#8217;s undergoing rapid development, with new features being added quite fast.
+Ed really wants to make this useful for people, and I&#8217;m going to be
+contributing to the project in what little spare time I can as well. If you&#8217;re
+a coder too, you can <a href="http://github.com/edfilo/crows">fork crows on GitHub</a> to contribute back to the
+project.</p>
+
+<p>Check it out, and you can follow <a href="http://twitter.com/crowsource">@crowsource</a> on Twitter for updates, too.</p>
+</div>
+
+
+ <footer>
+ <p class="meta">
+
+
+
+<span class="byline author vcard">Posted by <span class="fn">Steve Klabnik</span></span>
+
+
+
+
+
+
+
+
+
+
+
+<time datetime="2009-12-02T00:00:00-05:00" pubdate data-updated="true" >Dec 2<span>nd</span>, 2009</time>
+
+
+
+ </p>
+
+ <div class="sharing">
+
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.steveklabnik.com/2009/12/02/about-crows.html" data-via="steveklabnik" data-counturl="http://blog.steveklabnik.com/2009/12/02/about-crows.html" >Tweet</a>
+
+
+ <div class="g-plusone" data-size="medium"></div>
+
+</div>
+
+
+ </footer>
+</article>
+
+</div>
+
+<aside role=sidebar>
+
+ <aside>
+<img src='http://en.gravatar.com/userimage/5335489/ee56a7574df33ed8748160494c930b98.jpg?size=190' />
+<h4>Hi there, I'm Steve.</h4>
+<p>
+I write both code and prose. Here's some of my thoughts about software,
+literature, art and code, with some politics thrown in on occasion.
+You might also enjoy <a href="http://steveklabnik.com/">my website</a>.
+</p>
+</aside>
+
+<section>
+ <h1>Recent Posts</h1>
+ <ul id="recent_posts">
+
+ <li class="post">
+ <a href="/2011/09/06/the-secret-to-rails-oo-design.html">The Secret to Rails OO Design</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/09/04/the-self-improvement-pomodoro.html">The Self-Improvement Pomodoro</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/22/im-making-it-dead-simple-to-contribute-to-ruby-s-documentation.html">I'm Making It Dead Simple To Contribute To Ruby's Documentation</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/19/matz-is-nice-so-we-are-nice.html">Matz is Nice So We Are Nice</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/12/we-forget-that-open-source-is-made-of-people.html">We Forget That Open Source is Made of People</a>
+ </li>
+
+ </ul>
+</section>
+
+<section>
+ <h1>Github Repos</h1>
+ <ul id="gh_repos">
+ <li class="loading">Status updating...</li>
+ </ul>
+
+ <a href="https://github.com/steveklabnik">@steveklabnik</a> on Github
+
+ <script type="text/javascript">
+ $.domReady(function(){
+ if (!window.jXHR){
+ var jxhr = document.createElement('script');
+ jxhr.type = 'text/javascript';
+ jxhr.src = '/javascripts/libs/jXHR.js';
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(jxhr, s);
+ }
+
+ github.showRepos({
+ user: 'steveklabnik',
+ count: 0,
+ skip_forks: true,
+ target: '#gh_repos'
+ });
+ });
+ </script>
+ <script src="/javascripts/github.js" type="text/javascript"> </script>
+</section>
+
+
+<section>
+ <h1>Latest Tweets</h1>
+ <ul id="tweets">
+ <li class="loading">Status updating...</li>
+ </ul>
+ <script type="text/javascript">
+ $.domReady(function(){
+ getTwitterFeed("steveklabnik", 4, false);
+ });
+ </script>
+ <script src="/javascripts/twitter.js" type="text/javascript"> </script>
+
+ <a href="http://twitter.com/steveklabnik" class="twitter-follow-button" data-width="208px" data-show-count="false">Follow @steveklabnik</a>
+
+</section>
+
+
+
+
+
+</aside>
+
+
+ </div>
+ </div>
+ <footer><p>
+ Copyright &copy; 2011 - Steve Klabnik -
+ <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
+</p>
+
+</footer>
+
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-10289851-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+
+
+
+ <script type="text/javascript">
+ (function() {
+ var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
+ script.src = 'https://apis.google.com/js/plusone.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
+ })();
+ </script>
+
+
+
+ <script type="text/javascript">
+ (function(){
+ var twitterWidgets = document.createElement('script');
+ twitterWidgets.type = 'text/javascript';
+ twitterWidgets.async = true;
+ twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
+ document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
+ })();
+ </script>
+
+
+</body>
+</html>
View
415 public/2009/12/28/the-little-coder-s-predicament.html
@@ -0,0 +1,415 @@
+
+<!DOCTYPE html>
+<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
+<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
+<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
+<head>
+ <meta charset="utf-8">
+ <title>The Little Coder's Predicament - Literate Programming</title>
+ <meta name="author" content="Steve Klabnik">
+
+
+ <!-- http://t.co/dKP3o1e -->
+ <meta name="HandheldFriendly" content="True">
+ <meta name="MobileOptimized" content="320">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+
+
+ <link rel="canonical" href="http://blog.steveklabnik.com/2009/12/28/the-little-coder-s-predicament.html"/>
+ <link href="/favicon.png" rel="shortcut icon" />
+ <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
+ <script src="/javascripts/modernizr-2.0.js"></script>
+ <script src="http://s3.amazonaws.com/ender-js/jeesh.min.js"></script>
+ <script src="/javascripts/octopress.js" type="text/javascript"></script>
+ <link href="http://feeds.feedburner.com/steveklabnik" rel="alternate" title="Literate Programming" type="application/atom+xml"/>
+ <!--Fonts from Google's Web font directory at http://google.com/webfonts -->
+<link href='http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+<link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+
+</head>
+
+<body >
+ <header><hgroup>
+ <h1><a href="/">Literate Programming</a></h1>
+
+ <h2>Code is data, data is code. s/data/language/g;</h2>
+
+</hgroup>
+
+</header>
+ <nav role=navigation><ul role=subscription data-subscription="rss">
+ <li><a href="http://feeds.feedburner.com/steveklabnik" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
+
+</ul>
+<form action="http://google.com/search" method="get">
+ <fieldset role="site-search">
+ <input type="hidden" name="q" value="site:blog.steveklabnik.com" />
+ <input class="search" type="text" name="q" results="0" placeholder="Search"/>
+ </fieldset>
+</form>
+<ul role=main-navigation>
+ <li><a href="/">Blog</a></li>
+ <li><a href="/blog/archives">Archives</a></li>
+</ul>
+
+</nav>
+ <div id="main">
+ <div id="content">
+ <div>
+<article class="hentry">
+
+ <header>
+
+ <h1 class="entry-title">The Little Coder's Predicament</h1>
+
+
+ <p class="meta">
+
+
+
+
+
+
+
+
+
+<time datetime="2009-12-28T00:00:00-05:00" pubdate data-updated="true" >Dec 28<span>th</span>, 2009</time></p>
+
+ </header>
+
+
+<div class="entry-content"><p>For those of you that don&#8217;t know, I&#8217;ve taken over a project by someone named
+_why. He dropped off of the face of the Internet back in March, and the
+community has picked up his works. Because I&#8217;ll be writing about the project
+in the future, and because I feel these words are still relevant, I&#8217;m
+reprinting the two of his essays that led up to the creation of the project,
+Hackety Hack, here on my blog.</p>
+
+<p>Enjoy.</p>
+
+<h1>The Little Coder&#8217;s Predicament</h1>
+
+<p>Okay, then, children of the modern age (where we live in a world so tied
+together with wires that Pangaea ain&#8217;t goin&#8217; nowhere!), you tell me if this is
+a predicament or not.</p>
+
+<p>In the 1980s, you could look up from your <a href="http://www.lemon64.com/">Commodore 64</a>, hours after
+purchasing it, with a glossy feeling of empowerment, achieved by the pattern
+of notes spewing from the speaker grille in an endless loop. You were part of
+the movement to help machines sing! You were a programmer! The <a href="http://kl.net/atari/">Atari 800</a>
+people had BASIC. They know what I&#8217;m talking about. And the <a href="http://web.archive.org/web/20070612155724/www.guidry.org/ti994a/systempics/4asystem-2.jpg">TI-994A</a> guys
+don&#8217;t need to say a word, because the TI could <a href="http://www.obsoletecomputermuseum.org/ti99/ti99_syn.jpg">say it</a> for them!</p>
+
+<p>The old machines don&#8217;t compare to the desktops of today, or to the consoles of
+today. But, sadly, current versions of Windows have no immediately accessible
+programming languages. And what&#8217;s a kid going to do with Visual Basic? Build a
+modal dialog? Forget coding for XBox. Requires registration in the XBox
+Developer Program. Otherwise, you gotta crack the sucker open. GameCube?
+GameBoy? Playstation 2?</p>
+
+<h2>Coding Just Isn&#8217;t Accessible</h2>
+
+<p>Yes, there are burgeoning <a href="http://openxdk.sourceforge.net/">free</a> <a href="http://gbdk.sourceforge.net/">SDKs</a> for many of these platforms. But
+they are obscure and most children have no means of actually deploying or
+executing the code on their own hardware! This is obvious to us all and likely
+doesn&#8217;t seem such a big deal. But ask yourself what might have happened had
+you not had access to a programming language on an Atari 800 or a Commodore.
+You tell me if this is a predicament.</p>
+
+<p>It turns out, most of the kids in my neighborhood are exposed to coding
+through the <a href="http://www.ticalc.org/">TI calculator</a>. A handful of <a href="http://www.ticalc.org/programming/columns/">languages</a> are available on
+the TI and its processor is interesting enough to evoke some curiousity. But
+this hasn&#8217;t spread to its PDA big brothers, where young people could have more
+exposure to programming. And undoubtedly the utility of a language on the
+Palm, Pocket PC and others would be useful to many.</p>
+
+<p>So what&#8217;s the problem here? We have no shortage of new languages, but they
+become increasingly distanced from the populace. Are the companies behind
+these platforms weary of placing the power of a programming language in the
+hands of users? Is there not a demand any longer? It&#8217;s got to be some kind of
+greed, power, money thing, right?</p>
+
+<p>Perhaps this is just another reason to push Linux and BSD on consumer systems.
+Still, are scripting languages easily accessible to beginners on those
+systems? OSX has made several scripting languages available (including Ruby
+and Python), but most users are unaware of their presence.</p>
+
+<p>I should mention that Windows is equipped with its own scripting host for
+developing in JScript and VBScript. But the use of the scripting host is (I
+believe) under-documented and limited for beginners. Try doing something
+useful in a script without using Server.CreateObject. Let&#8217;s not let kids touch
+the COM objects, please!</p>
+
+<h2>The Christmas List</h2>
+
+<p>I&#8217;m thinking a toy language for consoles and desktops alike could be
+monumental. I&#8217;m ot saying it needs to be cross-platform. A language for
+GameCube that took advantage of platform-specific features could be more
+appealing to GameCube users than a language that used a reduced featureset,
+but could execute on a handheld. Really, we live in a world where both choices
+should be available.</p>
+
+<p>As for essential features:</p>
+
+<h3>1. Transportable code.</h3>
+
+<p>On my TI-994A, I could make a little, animated Optimus Prime from pixels.
+Insert cassette. Record. Pass around to friends. Receive high fives from
+friends. Put on wraparound shades. Thank you, TI! Thank you, Optimus Prime!</p>
+
+<p>A little language for the consoles could be wildly popular if combined with
+the good ature of sharing code. This could be done by trading memory cards,
+but would be more effective if code could be easily obtained and posted on the
+Web. Learning would accelerate and collaborative development could take place.</p>
+
+<p>A suitable language should give coders access to I/O devices, to allow
+experimentation with network devices and the ability to enhance one&#8217;s
+connectivity with others. For the consoles, games could provide hooks for user
+mods. This has long proven a successful staple of the desktop gaming world.</p>
+
+<h3>2. Simplicity.</h3>
+
+<p>You&#8217;ve got to be able to write a single line of code and see a result. We need
+some instant results to give absolute beginners confidence. Simple methods for
+sending an e-mail, reading a web page, playing music. Demonstrable in a one-
+liner.</p>
+
+<p>Admittedly, as our systems have grown complex, it is difficult to balance
+simplicity and capability. Most users will be unimpressed by code that emits
+beeps and bloops from a PlayStation 2. If Ruby were available on the PS2, then
+I would hope that I could hear rich symphonic sounds from a wee bit of code.</p>
+
+<p><code>Orchestra.play( "A:2", "C:4", "E:1", "G:1" )</code></p>
+
+<p>Access to the graphic engine might require more complex code. But simple
+drawing methods could be provided for beginners. Or images could be stored
+alongside code and accessed programmatically.</p>
+
+<p><code>ImageLibrary.load( "GolfingOldMan" ).drawAt( 12, 10 )</code></p>
+
+<p>The trick would be to uncover what small applications might entice novices and
+still provide the ability to write large applications that would drive
+developers to master the language and not limit their growth.</p>
+
+<h3>3. Sensible environment.</h3>
+
+<p>Considering that many won&#8217;t want to purchase a keyboard for their gaming unit,
+let&#8217;s make sure that a reasonable environment is provided for entry of text.
+Controllers could be worked like the <a href="http://www.handykey.com/">Twiddler</a>. Or code could be
+transferred via IR, TCP/IP. (Dare I say cassette? :D)</p>
+
+<h3>4. Give it away!</h3>
+
+<p>It used to be that programming was practically an inalienable right for users.
+Include a language with the system, situated in a friendly spot. Each of the
+game consoles I&#8217;ve mentioned has launchers. (With the exception of Game Boy
+and its successors.) Provide a development prompt from the launcher. From
+desktop software, provide shortcuts for both the command prompt and a
+development prompt.</p>
+
+<p>Remember, we&#8217;re looking for a language that requires no system hacks. No
+obscure links. No warranty violation. We&#8217;ve become so used to these techniques
+that it seems to be an essential part of getting our way.</p>
+
+<p>And in many ways it is essential. Tinkering with hardware is learning.
+Lobotomizing and renovating is meaningful, magical. On behalf of those who
+prefer to code, I make these wishes. Not to take away jobs from the Phillips
+screwdriver.</p>
+
+<h2>The Ultimatum</h2>
+
+<p>My challenge is to Sony, Nintendo, Microsoft, Apple, and to those who
+manufacture and develop our interactive technology. Let us interact with these
+machines more deeply. Provide us a channel for having a dialogue with the
+entertainment boxes we nurture and care for. I swear to you, the relationship
+between the public and your product will assuredly blossom. That box will
+become more of a chest for our personal works.</p>
+
+<p>In addition, if your developers start putting out crap, then you have a whole
+world of people to pick up the slack.</p>
+
+<p>My challenge is for you to bundle a useful programming language with your
+product. Ruby, Squeak, REBOL, Python. Take your pick. It will be inexpensive
+to add any of these languages to your systems. And people will seriously pray
+to you. You know how geeks get when they pledge allegiance to something. But,
+yes, Ruby is preferable.</p>
+</div>
+
+
+ <footer>
+ <p class="meta">
+
+
+
+<span class="byline author vcard">Posted by <span class="fn">Steve Klabnik</span></span>
+
+
+
+
+
+
+
+
+
+
+
+<time datetime="2009-12-28T00:00:00-05:00" pubdate data-updated="true" >Dec 28<span>th</span>, 2009</time>
+
+
+
+ </p>
+
+ <div class="sharing">
+
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.steveklabnik.com/2009/12/28/the-little-coder-s-predicament.html" data-via="steveklabnik" data-counturl="http://blog.steveklabnik.com/2009/12/28/the-little-coder-s-predicament.html" >Tweet</a>
+
+
+ <div class="g-plusone" data-size="medium"></div>
+
+</div>
+
+
+ </footer>
+</article>
+
+</div>
+
+<aside role=sidebar>
+
+ <aside>
+<img src='http://en.gravatar.com/userimage/5335489/ee56a7574df33ed8748160494c930b98.jpg?size=190' />
+<h4>Hi there, I'm Steve.</h4>
+<p>
+I write both code and prose. Here's some of my thoughts about software,
+literature, art and code, with some politics thrown in on occasion.
+You might also enjoy <a href="http://steveklabnik.com/">my website</a>.
+</p>
+</aside>
+
+<section>
+ <h1>Recent Posts</h1>
+ <ul id="recent_posts">
+
+ <li class="post">
+ <a href="/2011/09/06/the-secret-to-rails-oo-design.html">The Secret to Rails OO Design</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/09/04/the-self-improvement-pomodoro.html">The Self-Improvement Pomodoro</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/22/im-making-it-dead-simple-to-contribute-to-ruby-s-documentation.html">I'm Making It Dead Simple To Contribute To Ruby's Documentation</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/19/matz-is-nice-so-we-are-nice.html">Matz is Nice So We Are Nice</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/12/we-forget-that-open-source-is-made-of-people.html">We Forget That Open Source is Made of People</a>
+ </li>
+
+ </ul>
+</section>
+
+<section>
+ <h1>Github Repos</h1>
+ <ul id="gh_repos">
+ <li class="loading">Status updating...</li>
+ </ul>
+
+ <a href="https://github.com/steveklabnik">@steveklabnik</a> on Github
+
+ <script type="text/javascript">
+ $.domReady(function(){
+ if (!window.jXHR){
+ var jxhr = document.createElement('script');
+ jxhr.type = 'text/javascript';
+ jxhr.src = '/javascripts/libs/jXHR.js';
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(jxhr, s);
+ }
+
+ github.showRepos({
+ user: 'steveklabnik',
+ count: 0,
+ skip_forks: true,
+ target: '#gh_repos'
+ });
+ });
+ </script>
+ <script src="/javascripts/github.js" type="text/javascript"> </script>
+</section>
+
+
+<section>
+ <h1>Latest Tweets</h1>
+ <ul id="tweets">
+ <li class="loading">Status updating...</li>
+ </ul>
+ <script type="text/javascript">
+ $.domReady(function(){
+ getTwitterFeed("steveklabnik", 4, false);
+ });
+ </script>
+ <script src="/javascripts/twitter.js" type="text/javascript"> </script>
+
+ <a href="http://twitter.com/steveklabnik" class="twitter-follow-button" data-width="208px" data-show-count="false">Follow @steveklabnik</a>
+
+</section>
+
+
+
+
+
+</aside>
+
+
+ </div>
+ </div>
+ <footer><p>
+ Copyright &copy; 2011 - Steve Klabnik -
+ <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
+</p>
+
+</footer>
+
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-10289851-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+
+
+
+ <script type="text/javascript">
+ (function() {
+ var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
+ script.src = 'https://apis.google.com/js/plusone.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
+ })();
+ </script>
+
+
+
+ <script type="text/javascript">
+ (function(){
+ var twitterWidgets = document.createElement('script');
+ twitterWidgets.type = 'text/javascript';
+ twitterWidgets.async = true;
+ twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
+ document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
+ })();
+ </script>
+
+
+</body>
+</html>
View
332 public/2009/12/31/the-hackety-mainfesto.html
@@ -0,0 +1,332 @@
+
+<!DOCTYPE html>
+<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
+<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
+<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
+<head>
+ <meta charset="utf-8">
+ <title>The Hackety Mainfesto - Literate Programming</title>
+ <meta name="author" content="Steve Klabnik">
+
+
+ <!-- http://t.co/dKP3o1e -->
+ <meta name="HandheldFriendly" content="True">
+ <meta name="MobileOptimized" content="320">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+
+
+ <link rel="canonical" href="http://blog.steveklabnik.com/2009/12/31/the-hackety-mainfesto.html"/>
+ <link href="/favicon.png" rel="shortcut icon" />
+ <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
+ <script src="/javascripts/modernizr-2.0.js"></script>
+ <script src="http://s3.amazonaws.com/ender-js/jeesh.min.js"></script>
+ <script src="/javascripts/octopress.js" type="text/javascript"></script>
+ <link href="http://feeds.feedburner.com/steveklabnik" rel="alternate" title="Literate Programming" type="application/atom+xml"/>
+ <!--Fonts from Google's Web font directory at http://google.com/webfonts -->
+<link href='http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+<link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+
+</head>
+
+<body >
+ <header><hgroup>
+ <h1><a href="/">Literate Programming</a></h1>
+
+ <h2>Code is data, data is code. s/data/language/g;</h2>
+
+</hgroup>
+
+</header>
+ <nav role=navigation><ul role=subscription data-subscription="rss">
+ <li><a href="http://feeds.feedburner.com/steveklabnik" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
+
+</ul>
+<form action="http://google.com/search" method="get">
+ <fieldset role="site-search">
+ <input type="hidden" name="q" value="site:blog.steveklabnik.com" />
+ <input class="search" type="text" name="q" results="0" placeholder="Search"/>
+ </fieldset>
+</form>
+<ul role=main-navigation>
+ <li><a href="/">Blog</a></li>
+ <li><a href="/blog/archives">Archives</a></li>
+</ul>
+
+</nav>
+ <div id="main">
+ <div id="content">
+ <div>
+<article class="hentry">
+
+ <header>
+
+ <h1 class="entry-title">The Hackety Mainfesto</h1>
+
+
+ <p class="meta">
+
+
+
+
+
+
+
+
+
+<time datetime="2009-12-31T00:00:00-05:00" pubdate data-updated="true" >Dec 31<span>st</span>, 2009</time></p>
+
+ </header>
+
+
+<div class="entry-content"><p>For those of you that don&#8217;t know, I&#8217;ve taken over a project by someone named
+_why. He dropped off of the face of the Internet back in March, and the
+community has picked up his works. Because I&#8217;ll be writing about the project
+in the future, and because I feel these words are still relevant, I&#8217;m
+reprinting the two of his essays that led up to the creation of the project,
+Hackety Hack, here on my blog. Here&#8217;s the second one.</p>
+
+<p>Enjoy.</p>
+
+<h1>The Hackety Manifesto</h1>
+
+<p>Nearly four years ago, I wrote an essay called The Little Coder&#8217;s Predicament.
+It&#8217;s not too unusual. Lots of others like it have been written. The point is:
+programming just isn&#8217;t available to people like it was with the Commodore 64.
+I also outlined my requirements for a new cross-platform programming
+environment for beginners.</p>
+
+<p>The essay was widely linked on Slashdot, Reddit, Lambda, etc. I got lots of
+mail from people who both agreed and disagreed. Great. Nice. Good people all
+of them! And yet, nothing has changed. Not really!</p>
+
+<p>I&#8217;ve been told of the Xbox development kit and possible programming of Wii
+channels. The Playstation actually had a language. But none if it has met my
+criteria for a proper coding platform.</p>
+
+<h2>An Aside: We Care, But Not Enough</h2>
+
+<p>So, why has nothing been done about this? Maybe our interpreters and IDEs
+(ewww…) are good enough? Lots of people wrote in to say that HTML and
+JavaScript are the new BASIC. NO!!! You can&#8217;t be serious!!! So people have to
+write two languages now, which are intertwined in an almost inexplicable and
+unfathomable way? This doesn&#8217;t do it.</p>
+
+<p>Hello world should be one line.</p>
+
+<p>In fact, downloading an MP3 should be one line!!</p>
+
+<p>We just don&#8217;t care right now, do we? Programmers have a paid gig. So business
+is happily slurping them up. Look at our books. Look at the programming sites.
+Programming is tightly coupled to business. Often the first example is an
+e-commerce site! Our books are like FIFTY DOLLARS!! For crying out loud.</p>
+
+<p>This diatribe isn&#8217;t about business being bad. Of course you need to feed your
+family and drive an Audi.</p>
+
+<p>This diatribe is about adding some balance to the world of programming. Okay,
+so, let&#8217;s take things into our own hands and bring hacking to the young folks.</p>
+
+<h2>The Bylaws of Hackety</h2>
+
+<p>Here are the rules by which Hackety Hack was established:</p>
+
+<ul>
+<li>Beginners should be greeted to Hackety Hack by a cartoon character. (For the sake of argument, let&#8217;s call this character: Hacky Mouse.)</li>
+<li>Also, helpful sentences. Preferably short and with a period.</li>
+<li>Hackety Hack is fundamentally a browser and a programming language. For now, Gecko and Ruby.</li>
+<li>I&#8217;m only using Ruby because I know it. Hopefully, more languages can be added!</li>
+<li>Again, this isn&#8217;t about Ruby, it&#8217;s about simply offering a place for plainspeople to tinker with code.</li>
+<li>IDEs are a disaster. Newbs should see only one non-scary window free of tree controls and pinned windows and toolbars.</li>
+<li>As such, we want to stay away from project files and makefiles, the trappings of an IDE.</li>
+<li>Hackety Hack also adds simple libraries for common things.</li>
+<li>Common things are one-liners.</li>
+<li>Keep args and options to a minimum.</li>
+<li>In Ruby, blocks should be used to open up a method to more advanced possibilities.</li>
+<li>Help files are clean, short, simple. Lots of short examples. No frames.</li>
+<li>While all bug tickets are helpful and great, I just value tickets from beginners to a greater degree.</li>
+<li>Hackety Hack is free and will remain free henceforth.</li>
+</ul>
+
+
+<p>Beyond that… anything which makes life easy and fun for Hackety Hackers is
+definitely encouraged, even demanded.</p>
+</div>
+
+
+ <footer>
+ <p class="meta">
+
+
+
+<span class="byline author vcard">Posted by <span class="fn">Steve Klabnik</span></span>
+
+
+
+
+
+
+
+
+
+
+
+<time datetime="2009-12-31T00:00:00-05:00" pubdate data-updated="true" >Dec 31<span>st</span>, 2009</time>
+
+
+
+ </p>
+
+ <div class="sharing">
+
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.steveklabnik.com/2009/12/31/the-hackety-mainfesto.html" data-via="steveklabnik" data-counturl="http://blog.steveklabnik.com/2009/12/31/the-hackety-mainfesto.html" >Tweet</a>
+
+
+ <div class="g-plusone" data-size="medium"></div>
+
+</div>
+
+
+ </footer>
+</article>
+
+</div>
+
+<aside role=sidebar>
+
+ <aside>
+<img src='http://en.gravatar.com/userimage/5335489/ee56a7574df33ed8748160494c930b98.jpg?size=190' />
+<h4>Hi there, I'm Steve.</h4>
+<p>
+I write both code and prose. Here's some of my thoughts about software,
+literature, art and code, with some politics thrown in on occasion.
+You might also enjoy <a href="http://steveklabnik.com/">my website</a>.
+</p>
+</aside>
+
+<section>
+ <h1>Recent Posts</h1>
+ <ul id="recent_posts">
+
+ <li class="post">
+ <a href="/2011/09/06/the-secret-to-rails-oo-design.html">The Secret to Rails OO Design</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/09/04/the-self-improvement-pomodoro.html">The Self-Improvement Pomodoro</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/22/im-making-it-dead-simple-to-contribute-to-ruby-s-documentation.html">I'm Making It Dead Simple To Contribute To Ruby's Documentation</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/19/matz-is-nice-so-we-are-nice.html">Matz is Nice So We Are Nice</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/12/we-forget-that-open-source-is-made-of-people.html">We Forget That Open Source is Made of People</a>
+ </li>
+
+ </ul>
+</section>
+
+<section>
+ <h1>Github Repos</h1>
+ <ul id="gh_repos">
+ <li class="loading">Status updating...</li>
+ </ul>
+
+ <a href="https://github.com/steveklabnik">@steveklabnik</a> on Github
+
+ <script type="text/javascript">
+ $.domReady(function(){
+ if (!window.jXHR){
+ var jxhr = document.createElement('script');
+ jxhr.type = 'text/javascript';
+ jxhr.src = '/javascripts/libs/jXHR.js';
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(jxhr, s);
+ }
+
+ github.showRepos({
+ user: 'steveklabnik',
+ count: 0,
+ skip_forks: true,
+ target: '#gh_repos'
+ });
+ });
+ </script>
+ <script src="/javascripts/github.js" type="text/javascript"> </script>
+</section>
+
+
+<section>
+ <h1>Latest Tweets</h1>
+ <ul id="tweets">
+ <li class="loading">Status updating...</li>
+ </ul>
+ <script type="text/javascript">
+ $.domReady(function(){
+ getTwitterFeed("steveklabnik", 4, false);
+ });
+ </script>
+ <script src="/javascripts/twitter.js" type="text/javascript"> </script>
+
+ <a href="http://twitter.com/steveklabnik" class="twitter-follow-button" data-width="208px" data-show-count="false">Follow @steveklabnik</a>
+
+</section>
+
+
+
+
+
+</aside>
+
+
+ </div>
+ </div>
+ <footer><p>
+ Copyright &copy; 2011 - Steve Klabnik -
+ <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
+</p>
+
+</footer>
+
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-10289851-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+
+
+
+ <script type="text/javascript">
+ (function() {
+ var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
+ script.src = 'https://apis.google.com/js/plusone.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
+ })();
+ </script>
+
+
+
+ <script type="text/javascript">
+ (function(){
+ var twitterWidgets = document.createElement('script');
+ twitterWidgets.type = 'text/javascript';
+ twitterWidgets.async = true;
+ twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
+ document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
+ })();
+ </script>
+
+
+</body>
+</html>
View
397 public/2010/03/01/reddit-drama-an-interesting-look-at-community-values.html
@@ -0,0 +1,397 @@
+
+<!DOCTYPE html>
+<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
+<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
+<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
+<head>
+ <meta charset="utf-8">
+ <title>Reddit drama: an interesting look at community values - Literate Programming</title>
+ <meta name="author" content="Steve Klabnik">
+
+
+ <!-- http://t.co/dKP3o1e -->
+ <meta name="HandheldFriendly" content="True">
+ <meta name="MobileOptimized" content="320">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+
+
+ <link rel="canonical" href="http://blog.steveklabnik.com/2010/03/01/reddit-drama-an-interesting-look-at-community-values.html"/>
+ <link href="/favicon.png" rel="shortcut icon" />
+ <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
+ <script src="/javascripts/modernizr-2.0.js"></script>
+ <script src="http://s3.amazonaws.com/ender-js/jeesh.min.js"></script>
+ <script src="/javascripts/octopress.js" type="text/javascript"></script>
+ <link href="http://feeds.feedburner.com/steveklabnik" rel="alternate" title="Literate Programming" type="application/atom+xml"/>
+ <!--Fonts from Google's Web font directory at http://google.com/webfonts -->
+<link href='http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+<link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+
+</head>
+
+<body >
+ <header><hgroup>
+ <h1><a href="/">Literate Programming</a></h1>
+
+ <h2>Code is data, data is code. s/data/language/g;</h2>
+
+</hgroup>
+
+</header>
+ <nav role=navigation><ul role=subscription data-subscription="rss">
+ <li><a href="http://feeds.feedburner.com/steveklabnik" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
+
+</ul>
+<form action="http://google.com/search" method="get">
+ <fieldset role="site-search">
+ <input type="hidden" name="q" value="site:blog.steveklabnik.com" />
+ <input class="search" type="text" name="q" results="0" placeholder="Search"/>
+ </fieldset>
+</form>
+<ul role=main-navigation>
+ <li><a href="/">Blog</a></li>
+ <li><a href="/blog/archives">Archives</a></li>
+</ul>
+
+</nav>
+ <div id="main">
+ <div id="content">
+ <div>
+<article class="hentry">
+
+ <header>
+
+ <h1 class="entry-title">Reddit Drama: An Interesting Look at Community Values</h1>
+
+
+ <p class="meta">
+
+
+
+
+
+
+
+
+
+<time datetime="2010-03-01T00:00:00-05:00" pubdate data-updated="true" >Mar 1<span>st</span>, 2010</time></p>
+
+ </header>
+
+
+<div class="entry-content"><p>I bet social psychologists are having a field day with the Internet. I know
+nothing about the field, so I don&#8217;t know if there are thousands of papers
+about it already written or not, but there should be. I can&#8217;t image that we&#8217;ve
+ever had a period in history when more communities are being formed; they&#8217;re
+also being formed out in the open.</p>
+
+<p>I&#8217;ve been involved in many different online communities over the years. I&#8217;ve
+already written before about the seeming decline of Reddit&#8217;s content&#8230; but
+this past week, something really interesting has happened. Reddit has had two
+major events occur that have caused it to be increasingly self-reflexive on
+the values and norms that the community desires for itself. This is
+particularly interesting because normally, cultural norms have to be observed,
+not codified. But here, we&#8217;re seeing completely open discussion about &#8220;The
+community says this is not okay.&#8221; It&#8217;s really interesting stuff.</p>
+
+<h2>Speed Issues</h2>
+
+<p>I won&#8217;t comment on the technical details involved, but Reddit has gotten
+significantly slower over the past few months. This is normal, as the
+community is growing. But it&#8217;s caused quite a bit of a stir lately. Many users
+are seeing increased loading times, error messages, missing posts, and various
+other problems.</p>
+
+<p>What&#8217;s a user to do in this situation? Post about it. See the <a href="http://www.reddit.com/search?q=fix+search&amp;sort=hot&amp;t=month">posts about the
+search feature</a>, or posts about the slowdown.</p>
+
+<p>For example, as I look for the links to these posts, I get this:</p>
+
+<blockquote><p>Our search machines are under too much load to handle your request right
+now. :( Sorry for the inconvenience.</p></blockquote>
+
+<p>Amusing. But unfortunate. The interesting part, though, is the backlash
+against the complaints. See this thread, &#8221;<a href="http://www.reddit.com/r/reddit.com/comments/b7jnr/reddit_fix_your_fucking_users_they_are_unbearably/">Reddit, fix your fucking users.
+They are unbearably bitchy.</a>&#8221; (The cursing is emulating the posts made
+complaining about Reddit&#8217;s lack of speed.)</p>
+
+<p>There&#8217;s a huge discussion about what it means to be part of a free online
+community. There&#8217;s a contingent of people who say that people aren&#8217;t entitled
+to complain, because Reddit is free. Another points out that complaining is
+better than silently leaving the site, and that while people don&#8217;t pay for
+Reddit accounts, the eyeballs Reddit users provide enable the site to make
+money.</p>
+
+<p>Some choice comments:</p>
+
+<blockquote><p>Hey, my incredibly expensive Reddit subscription fees entitle me to 100%
+perfect service! LEAVE ME ALONE!</p>
+
+<p>Man, I&#8217;ve been loving this particular strawman for over a decade now. Thanks
+for breaking out the classics.</p>
+
+<p>The reality is that Reddit is a business. The owners get paid because the
+users keep coming back to the site. Having users bitch and moan is not a
+problem for the admins - this isn&#8217;t their personal blog, they&#8217;re not mopy
+teenagers who are gonna cut themselves when they see how mean people are being
+to them on the interwebs.</p>
+
+<p>The problem for the admins is when users stop visiting Reddit altogether
+because of constant technical problems, or fishy administrative decisions
+about deleting threads, or too many spammers, or etc. They would much rather
+have us bitch about these things on the front page, create giant threads about
+them that keep thousands of posters and tens of thousands of readers engaged
+and on the site, and provide catharsis and a public forum to address the
+issues.</p>
+
+<p>tl;dr: Reddit is a business, they&#8217;d rather have us complain than have us
+leave.</p>
+
+<p>Meta-bitching about bitching time</p>
+
+<p>The OP posted a well thought out comment simply suggesting that Reddit&#8217;s
+users should be polite and respectful when addressing each other and the
+people that make using this site possible, and 90% of the responses here just
+prove his point. It seems like people are more concerned with gaining comment
+karma by posting bad one-liners than actually participating in intelligent
+conversation.</p>
+
+<p>Is anyone else absolutely done with the reddit user base? I mean&#8230; I was
+told that reddit was this great intellectual news aggregator that through the
+use of &#8216;karma&#8217; was able to bad submissions off the front page.</p>
+
+<p>Over the past few months I&#8217;ve been here all that has been up on the front
+page has been Glen Beck, Conan O&#8217;Brian, Tiger Woods, weekly &#8220;Reddit is slow&#8221;
+posts and now this Saydrah BS.</p>
+
+<p>I&#8217;ll say what I said when Conan O&#8217;Brian was on the front page for a week
+longer then Haiti ever was: I DON&#8217;T CARE. The Reddit admins don&#8217;t think
+Saydrah has abused her power as a moderator. At the very least (I personally
+don&#8217;t think she is a spammer) go flame some of the other 1000000000000000
+spammers on reddit FFS. This is boring uneducated dribble.</p>
+
+<p>KEEP THIS TRASH OFF THE FRONT PAGE.</p></blockquote>
+
+<p>And more. Interesting stuff, overall. There&#8217;s still quite a few trash
+comments, though.</p>
+
+<h2>The Saydrah Situation</h2>
+
+<p>The other event involves a user named Saydrah. She&#8217;s been accused of promoting
+links on Reddit for money, and abusing her moderator powers in conjunction
+with those offenses. This has spawned a huge amount of discussion on if these
+actions were inappropriate or not. Here&#8217;s <a href="http://www.reddit.com/r/reddit.com/comments/b7e25/today_i_learned_that_one_of_reddits_most_active/">the first big thread</a>. Then <a href="http://www.reddit.com/r/IAmA/comments/b7hpb/re_the_alleged_conflict_of_interest_on_reddit/">an
+AMA with moderators about their opinions</a>. Lastly, <a href="http://www.reddit.com/r/IAmA/comments/b7tew/fine_here_saydrah_ama_it_couldnt_get_much_worse/">Saydrah does an AMA</a>
+herself and explains her side of the story.</p>
+
+<p>I won&#8217;t show you a bunch of comments, only one. And it echoes my opinion on
+the matter:</p>
+
+<blockquote><p>Two things: Frankly, I don&#8217;t care if people are paid to submit links&#8230;if
+they&#8217;re interesting, I upvote. If not, I ignore them.</p>
+
+<p>Second, I have lurked around AR and RA a fair amount, and consistently find
+myself thinking, &#8220;That&#8217;s a helpful and well-reasoned response! Oh, it&#8217;s
+Saydrah again!&#8221; Whatever else people may say, I feel that you at least do try
+to contribute positively to this site.</p>
+
+<p>&#8230;I guess I don&#8217;t have a question, so I&#8217;ll just leave my un-asked-for
+opinion here.</p></blockquote>
+
+<p>There&#8217;s a lot more, on both sides of the conflict. Regardless, people are
+hashing it out.</p>
+
+<h2>Growth Hurts</h2>
+
+<p>There&#8217;s a reason they&#8217;re called &#8220;growing pains.&#8221; Change is always a painful
+time in any organism&#8217;s life, and even though there&#8217;s a lot of drama, the
+current Reddit staff can take pride that they&#8217;ve created something that&#8217;s so
+important to people that they feel the need to scream about it for hours. It&#8217;s
+unfortunate that their baby is being embroiled in a flamewar, but these things
+happen.</p>
+
+<p>We&#8217;ll see what the community ends up deciding is acceptable. I&#8217;ve managed to
+not get involved in these particular conflicts, but it sure is interesting to
+watch!</p>
+
+<p>Edit: Jen added some interesting links on my facebook feed:
+<a href="http://j.mp/baRqdy">http://j.mp/baRqdy</a></p>
+</div>
+
+
+ <footer>
+ <p class="meta">
+
+
+
+<span class="byline author vcard">Posted by <span class="fn">Steve Klabnik</span></span>
+
+
+
+
+
+
+
+
+
+
+
+<time datetime="2010-03-01T00:00:00-05:00" pubdate data-updated="true" >Mar 1<span>st</span>, 2010</time>
+
+
+
+ </p>
+
+ <div class="sharing">
+
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.steveklabnik.com/2010/03/01/reddit-drama-an-interesting-look-at-community-values.html" data-via="steveklabnik" data-counturl="http://blog.steveklabnik.com/2010/03/01/reddit-drama-an-interesting-look-at-community-values.html" >Tweet</a>
+
+
+ <div class="g-plusone" data-size="medium"></div>
+
+</div>
+
+
+ </footer>
+</article>
+
+</div>
+
+<aside role=sidebar>
+
+ <aside>
+<img src='http://en.gravatar.com/userimage/5335489/ee56a7574df33ed8748160494c930b98.jpg?size=190' />
+<h4>Hi there, I'm Steve.</h4>
+<p>
+I write both code and prose. Here's some of my thoughts about software,
+literature, art and code, with some politics thrown in on occasion.
+You might also enjoy <a href="http://steveklabnik.com/">my website</a>.
+</p>
+</aside>
+
+<section>
+ <h1>Recent Posts</h1>
+ <ul id="recent_posts">
+
+ <li class="post">
+ <a href="/2011/09/06/the-secret-to-rails-oo-design.html">The Secret to Rails OO Design</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/09/04/the-self-improvement-pomodoro.html">The Self-Improvement Pomodoro</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/22/im-making-it-dead-simple-to-contribute-to-ruby-s-documentation.html">I'm Making It Dead Simple To Contribute To Ruby's Documentation</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/19/matz-is-nice-so-we-are-nice.html">Matz is Nice So We Are Nice</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/12/we-forget-that-open-source-is-made-of-people.html">We Forget That Open Source is Made of People</a>
+ </li>
+
+ </ul>
+</section>
+
+<section>
+ <h1>Github Repos</h1>
+ <ul id="gh_repos">
+ <li class="loading">Status updating...</li>
+ </ul>
+
+ <a href="https://github.com/steveklabnik">@steveklabnik</a> on Github
+
+ <script type="text/javascript">
+ $.domReady(function(){
+ if (!window.jXHR){
+ var jxhr = document.createElement('script');
+ jxhr.type = 'text/javascript';
+ jxhr.src = '/javascripts/libs/jXHR.js';
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(jxhr, s);
+ }
+
+ github.showRepos({
+ user: 'steveklabnik',
+ count: 0,
+ skip_forks: true,
+ target: '#gh_repos'
+ });
+ });
+ </script>
+ <script src="/javascripts/github.js" type="text/javascript"> </script>
+</section>
+
+
+<section>
+ <h1>Latest Tweets</h1>
+ <ul id="tweets">
+ <li class="loading">Status updating...</li>
+ </ul>
+ <script type="text/javascript">
+ $.domReady(function(){
+ getTwitterFeed("steveklabnik", 4, false);
+ });
+ </script>
+ <script src="/javascripts/twitter.js" type="text/javascript"> </script>
+
+ <a href="http://twitter.com/steveklabnik" class="twitter-follow-button" data-width="208px" data-show-count="false">Follow @steveklabnik</a>
+
+</section>
+
+
+
+
+
+</aside>
+
+
+ </div>
+ </div>
+ <footer><p>
+ Copyright &copy; 2011 - Steve Klabnik -
+ <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
+</p>
+
+</footer>
+
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-10289851-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+
+
+
+ <script type="text/javascript">
+ (function() {
+ var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
+ script.src = 'https://apis.google.com/js/plusone.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
+ })();
+ </script>
+
+
+
+ <script type="text/javascript">
+ (function(){
+ var twitterWidgets = document.createElement('script');
+ twitterWidgets.type = 'text/javascript';
+ twitterWidgets.async = true;
+ twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
+ document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
+ })();
+ </script>
+
+
+</body>
+</html>
View
340 public/2010/03/03/why-bother-creating.html
@@ -0,0 +1,340 @@
+
+<!DOCTYPE html>
+<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
+<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
+<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
+<head>
+ <meta charset="utf-8">
+ <title>Why bother creating? - Literate Programming</title>
+ <meta name="author" content="Steve Klabnik">
+
+
+ <!-- http://t.co/dKP3o1e -->
+ <meta name="HandheldFriendly" content="True">
+ <meta name="MobileOptimized" content="320">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+
+
+ <link rel="canonical" href="http://blog.steveklabnik.com/2010/03/03/why-bother-creating.html"/>
+ <link href="/favicon.png" rel="shortcut icon" />
+ <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
+ <script src="/javascripts/modernizr-2.0.js"></script>
+ <script src="http://s3.amazonaws.com/ender-js/jeesh.min.js"></script>
+ <script src="/javascripts/octopress.js" type="text/javascript"></script>
+ <link href="http://feeds.feedburner.com/steveklabnik" rel="alternate" title="Literate Programming" type="application/atom+xml"/>
+ <!--Fonts from Google's Web font directory at http://google.com/webfonts -->
+<link href='http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+<link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+
+</head>
+
+<body >
+ <header><hgroup>
+ <h1><a href="/">Literate Programming</a></h1>
+
+ <h2>Code is data, data is code. s/data/language/g;</h2>
+
+</hgroup>
+
+</header>
+ <nav role=navigation><ul role=subscription data-subscription="rss">
+ <li><a href="http://feeds.feedburner.com/steveklabnik" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
+
+</ul>
+<form action="http://google.com/search" method="get">
+ <fieldset role="site-search">
+ <input type="hidden" name="q" value="site:blog.steveklabnik.com" />
+ <input class="search" type="text" name="q" results="0" placeholder="Search"/>
+ </fieldset>
+</form>
+<ul role=main-navigation>
+ <li><a href="/">Blog</a></li>
+ <li><a href="/blog/archives">Archives</a></li>
+</ul>
+
+</nav>
+ <div id="main">
+ <div id="content">
+ <div>
+<article class="hentry">
+
+ <header>
+
+ <h1 class="entry-title">Why Bother Creating?</h1>
+
+
+ <p class="meta">
+
+
+
+
+
+
+
+
+
+<time datetime="2010-03-03T00:00:00-05:00" pubdate data-updated="true" >Mar 3<span>rd</span>, 2010</time></p>
+
+ </header>
+
+
+<div class="entry-content"><p>Kanye West posted something interesting about the nature of creativity today.
+I&#8217;m going to make a copy of it here, because I find the presentation also
+interesting. Here&#8217;s <a href="http://www.kanyewest.com/2010/03/02/creativity">his post</a>, for reference.</p>
+
+<p><img src="/images/kanye.jpg" alt="" /></p>
+
+<p>I&#8217;m not the biggest Kanye fan. I go back and forth. But I think that this is
+an interesting, personal look into the creative process of someone whose work
+is at least widely known and recognized.</p>
+
+<p>Goood quotes from unlikely sources</p>
+
+<p>I agree with charlesju on <a href="http://news.ycombinator.com/item?id=1163873">Hacker News</a>, I think this line is my favorite:</p>
+
+<blockquote><p>I never feel like I&#8217;m not the underdog. I never felt completely comfortable.
+I&#8217;m tormented by the need to create.</p></blockquote>
+
+<p>I&#8217;ve basically felt that same itch for large parts of my life. Sometimes, I
+haven&#8217;t paid it much attention, but that need has been the source of some of
+the more interesting things I&#8217;ve done. I talked a little bit about this in my
+post last week about <a href="http://blog.steveklabnik.com/appreciating-the-gift-of-creation">the gift of creation</a>. That post was more about
+recognizing the surface signs of the creative itch than examining the
+underlying motivations that drive the creative process.</p>
+
+<p>&#8220;Why&#8221; is the harder question, of course. It&#8217;s something I&#8217;ve been thinking a
+lot about lately. One of the fundamental tenets of capitalism is the
+incentivisation of behaviors. Some jobs are paid more simply because we want
+to encourage people to do them. Garbage collectors, for instance, get paid
+pretty well for the relative level of difficulty their duties entail. Even
+though it&#8217;s an unskilled job, nobody wants to do it, so they make well over
+minimum wage. Some of the socialist literature I&#8217;ve been examining lately
+basically posits that monetary incentives aren&#8217;t the only kind of incentives,
+and that even if the monetary incentives no longer existed, people would still
+do &#8220;undesirable&#8221; things. I&#8217;m not sure that I buy it on a wide scale, but when
+I look at myself, this is absolutely true. Even when I didn&#8217;t pay my rent via
+code, I still coded. I wasn&#8217;t as fulfilled as a person, but I managed to
+exist, and still create. That&#8217;s what caused that thought to tumble around in
+my brain for the last month or two&#8230; why bother creating?</p>
+
+<p>Haters gonna hate</p>
+
+<p>It&#8217;s really amazing that people still continue to create at all, when there&#8217;s
+so much criticism out there. <a href="http://al3x.net/2010/03/02/hiatus.html">Al3x</a>, a Twitter engineer, is shutting down
+his blog. For now. Part of his reason is related; he&#8217;s writing for himself,
+and he feels the responses of others take away more than they contribute:</p>
+
+<blockquote><p>Lately, I’ve found the cathartic returns from blog-format writing to be
+diminishing. The ideas I’m trying to express never really get put to rest in
+my head when I write, now. Instead, they spark whole conversations that I
+never intended to start in the first place, conversations that leech precious
+time and energy while contributing precious little back. Negative responses I
+can slough off, but the sense that I’m not really crystalizing my unset
+thoughts by writing here is what bothers me.</p></blockquote>
+
+<p>I sort of felt the same way when my blog got linked to by Reddit a few weeks
+back; there was a lot of bullshit. And it&#8217;s frustrating. My initial
+motivations are similar to Al3x&#8217;s; I find that writing helps me to fill out my
+thoughts. I&#8217;ve been trying to make writing a habit, and it&#8217;s been hard to find
+both the time and topics that are fleshed out enough for me to finish them off
+by writing about them. But pushing myself is part of the challenge, and I
+expect to get better at it as time goes on. Hopefully, this means that in the
+future, I&#8217;ll be able to synthesize more fully thought-through opinions at a
+faster rate than before. I&#8217;ll also have examined my own thoughts, opinions,
+and convictions more closely, and made sure that they&#8217;re in line with what I
+truly believe is right. What I&#8217;m trying to get at is this: creation is always
+incredibly personal. An author puts some of himself into every work that he
+makes. So criticism against a work is extremely easy to consider as an attack
+against the author itself. So it&#8217;s difficult to create and put stuff out
+there, only to get it criticized by everyone is frustrating.</p>
+
+<p>And the verdict is&#8230;</p>
+
+<p>&#8230; I&#8217;m still not sure. This is a topic I&#8217;ll continue to write about, as my
+feelings become more clear. There has to be something more fundamental
+involved here. I haven&#8217;t found it yet, I just know that I can&#8217;t sit around and
+watch TV. I can&#8217;t work a &#8216;normal&#8217; job and toil away on some reporting system
+that helps just a few people do their jobs a little bit better. I&#8217;ve gotta do
+something more important than that, change the world, keep pushing.</p>
+
+<p>And I&#8217;ll keep telling you about it. So that I can figure it out for myself.</p>
+</div>
+
+
+ <footer>
+ <p class="meta">
+
+
+
+<span class="byline author vcard">Posted by <span class="fn">Steve Klabnik</span></span>
+
+
+
+
+
+
+
+
+
+
+
+<time datetime="2010-03-03T00:00:00-05:00" pubdate data-updated="true" >Mar 3<span>rd</span>, 2010</time>
+
+
+
+ </p>
+
+ <div class="sharing">
+
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.steveklabnik.com/2010/03/03/why-bother-creating.html" data-via="steveklabnik" data-counturl="http://blog.steveklabnik.com/2010/03/03/why-bother-creating.html" >Tweet</a>
+
+
+ <div class="g-plusone" data-size="medium"></div>
+
+</div>
+
+
+ </footer>
+</article>
+
+</div>
+
+<aside role=sidebar>
+
+ <aside>
+<img src='http://en.gravatar.com/userimage/5335489/ee56a7574df33ed8748160494c930b98.jpg?size=190' />
+<h4>Hi there, I'm Steve.</h4>
+<p>
+I write both code and prose. Here's some of my thoughts about software,
+literature, art and code, with some politics thrown in on occasion.
+You might also enjoy <a href="http://steveklabnik.com/">my website</a>.
+</p>
+</aside>
+
+<section>
+ <h1>Recent Posts</h1>
+ <ul id="recent_posts">
+
+ <li class="post">
+ <a href="/2011/09/06/the-secret-to-rails-oo-design.html">The Secret to Rails OO Design</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/09/04/the-self-improvement-pomodoro.html">The Self-Improvement Pomodoro</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/22/im-making-it-dead-simple-to-contribute-to-ruby-s-documentation.html">I'm Making It Dead Simple To Contribute To Ruby's Documentation</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/19/matz-is-nice-so-we-are-nice.html">Matz is Nice So We Are Nice</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/12/we-forget-that-open-source-is-made-of-people.html">We Forget That Open Source is Made of People</a>
+ </li>
+
+ </ul>
+</section>
+
+<section>
+ <h1>Github Repos</h1>
+ <ul id="gh_repos">
+ <li class="loading">Status updating...</li>
+ </ul>
+
+ <a href="https://github.com/steveklabnik">@steveklabnik</a> on Github
+
+ <script type="text/javascript">
+ $.domReady(function(){
+ if (!window.jXHR){
+ var jxhr = document.createElement('script');
+ jxhr.type = 'text/javascript';
+ jxhr.src = '/javascripts/libs/jXHR.js';
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(jxhr, s);
+ }
+
+ github.showRepos({
+ user: 'steveklabnik',
+ count: 0,
+ skip_forks: true,
+ target: '#gh_repos'
+ });
+ });
+ </script>
+ <script src="/javascripts/github.js" type="text/javascript"> </script>
+</section>
+
+
+<section>
+ <h1>Latest Tweets</h1>
+ <ul id="tweets">
+ <li class="loading">Status updating...</li>
+ </ul>
+ <script type="text/javascript">
+ $.domReady(function(){
+ getTwitterFeed("steveklabnik", 4, false);
+ });
+ </script>
+ <script src="/javascripts/twitter.js" type="text/javascript"> </script>
+
+ <a href="http://twitter.com/steveklabnik" class="twitter-follow-button" data-width="208px" data-show-count="false">Follow @steveklabnik</a>
+
+</section>
+
+
+
+
+
+</aside>
+
+
+ </div>
+ </div>
+ <footer><p>
+ Copyright &copy; 2011 - Steve Klabnik -
+ <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
+</p>
+
+</footer>
+
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-10289851-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+
+
+
+ <script type="text/javascript">
+ (function() {
+ var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
+ script.src = 'https://apis.google.com/js/plusone.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
+ })();
+ </script>
+
+
+
+ <script type="text/javascript">
+ (function(){
+ var twitterWidgets = document.createElement('script');
+ twitterWidgets.type = 'text/javascript';
+ twitterWidgets.async = true;
+ twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
+ document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
+ })();
+ </script>
+
+
+</body>
+</html>
View
358 public/2010/03/05/writing-a-su-feature-with-authlogic.html
@@ -0,0 +1,358 @@
+
+<!DOCTYPE html>
+<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
+<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
+<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
+<head>
+ <meta charset="utf-8">
+ <title>Writing a "su" feature with Authlogic - Literate Programming</title>
+ <meta name="author" content="Steve Klabnik">
+
+
+ <!-- http://t.co/dKP3o1e -->
+ <meta name="HandheldFriendly" content="True">
+ <meta name="MobileOptimized" content="320">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+
+
+ <link rel="canonical" href="http://blog.steveklabnik.com/2010/03/05/writing-a-su-feature-with-authlogic.html"/>
+ <link href="/favicon.png" rel="shortcut icon" />
+ <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
+ <script src="/javascripts/modernizr-2.0.js"></script>
+ <script src="http://s3.amazonaws.com/ender-js/jeesh.min.js"></script>
+ <script src="/javascripts/octopress.js" type="text/javascript"></script>
+ <link href="http://feeds.feedburner.com/steveklabnik" rel="alternate" title="Literate Programming" type="application/atom+xml"/>
+ <!--Fonts from Google's Web font directory at http://google.com/webfonts -->
+<link href='http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+<link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
+
+</head>
+
+<body >
+ <header><hgroup>
+ <h1><a href="/">Literate Programming</a></h1>
+
+ <h2>Code is data, data is code. s/data/language/g;</h2>
+
+</hgroup>
+
+</header>
+ <nav role=navigation><ul role=subscription data-subscription="rss">
+ <li><a href="http://feeds.feedburner.com/steveklabnik" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
+
+</ul>
+<form action="http://google.com/search" method="get">
+ <fieldset role="site-search">
+ <input type="hidden" name="q" value="site:blog.steveklabnik.com" />
+ <input class="search" type="text" name="q" results="0" placeholder="Search"/>
+ </fieldset>
+</form>
+<ul role=main-navigation>
+ <li><a href="/">Blog</a></li>
+ <li><a href="/blog/archives">Archives</a></li>
+</ul>
+
+</nav>
+ <div id="main">
+ <div id="content">
+ <div>
+<article class="hentry">
+
+ <header>
+
+ <h1 class="entry-title">Writing a "Su" Feature With Authlogic</h1>
+
+
+ <p class="meta">
+
+
+
+
+
+
+
+
+
+<time datetime="2010-03-05T00:00:00-05:00" pubdate data-updated="true" >Mar 5<span>th</span>, 2010</time></p>
+
+ </header>
+
+
+<div class="entry-content"><p>Sometimes, when responding to a support request, it&#8217;s nice to see what your
+users see. At the same time, you don&#8217;t want to ask your users for their
+passwords, out of respect for their privacy. So what do you do?</p>
+
+<p>Well, *NIX systems have a program called su.  Here&#8217;s what man su has to say:</p>
+
+<blockquote><p>NAME
+       su - run a shell with substitute user and group IDs</p>
+
+<p>SYNOPSIS
+       su [OPTION]&#8230; [-] [USER [ARG]&#8230;]</p>
+
+<p>DESCRIPTION
+       Change the effective user id and group id to that of USER.</p></blockquote>
+
+<p>su can be thought of as &#8220;substitute user&#8221; or &#8220;switch user.&#8221; It&#8217;s a command
+system administrators use to assume the identity of one of their users, or a
+way for someone with the root password on the system to switch to the root
+account itself. So how can we incorporate this into a web application?</p>
+
+<p>Well, we want to first log ourselves out, and then log in as the user we&#8217;re
+su-ing to. That&#8217;s it. The tricky part, however, comes in when we&#8217;re logging
+in: as we said before, we don&#8217;t want to ask for their password. Luckily,
+Authlogic provides a way to create our UserSession object directly from a User
+object by just passing it to create.</p>
+
+<p>This lets us write a controller method to do this pretty easily:</p>
+
+<pre><code>def su
+ @user = User.find params[:id]
+ current_user_session.destroy
+ UserSession.create!(@user)
+ flash[:notice] = "You've been su-d to that user."
+ redirect_to dashboard_path
+end
+</code></pre>
+
+<p>Add in a route:</p>
+
+<pre><code>map.admin_su "/admin/su/:id", :controller =&gt; "admin", :action =&gt; "su"
+</code></pre>
+
+<p>And to a view somewhere in your administrative tools:</p>
+
+<pre><code>&lt;%= link_to "log in as this user", admin_su_path(@user) %&gt;
+</code></pre>
+
+<p>And we&#8217;re good to go!</p>
+
+<p>One last thing about this, though: You don&#8217;t want to let anyone who&#8217;s not an
+administrator do this, for obvious reasons. My administrative controllers
+always include a block like this:</p>
+
+<pre><code>access_control do
+  allow :admin
+end
+</code></pre>
+
+<p>acl9 makes this really easy, but it&#8217;s really important.</p>
+
+<p>So there you have it. Easy as pie.</p>
+
+<p>EDIT: This post made the Rails subreddit, and <a href="http://www.reddit.com/r/rails/comments/cb0da/writing_a_su_feature_with_authlogic/c0rf26w">brettbender posted his code</a>
+to get you back to admin. Here it is:</p>
+
+<blockquote><p>I used this article to help build a su feature for a rails app I&#8217;m working
+on. thought I would share the code to let you su / exit-su back to the
+original user you were logged in as. You just need to add a link somewhere
+persistent if your session contains an entry for :su_user that links to the
+unsu action.</p>
+
+<p>Inside your admin controller, make sure you limit access to these actions:</p>
+
+<pre><code>def su
+ @user = User.find params[:id]
+
+ # change these 3 lines to apply to your session representation
+ session[:su_user] = self.current_user.id
+ self.current_user = @user
+
+ flash[:notice] = "You've been logged in as #{@user.login}."
+ redirect_to "/"
+end
+
+def unsu
+ redirect_url = "/"
+ if(session.has_key?(:su_user))
+ self.current_user = User.find session[:su_user]
+ session.delete :su_user
+ flash[:notice] = "You have exited your switch user session. You are
+ redirect_url = "/admin/users/"
+ else
+ flash[:error] = "Sorry, we couldn't find your original user."
+ end
+
+ redirect_to redirect_url
+end
+</code></pre></blockquote>
+</div>
+
+
+ <footer>
+ <p class="meta">
+
+
+
+<span class="byline author vcard">Posted by <span class="fn">Steve Klabnik</span></span>
+
+
+
+
+
+
+
+
+
+
+
+<time datetime="2010-03-05T00:00:00-05:00" pubdate data-updated="true" >Mar 5<span>th</span>, 2010</time>
+
+
+
+ </p>
+
+ <div class="sharing">
+
+ <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.steveklabnik.com/2010/03/05/writing-a-su-feature-with-authlogic.html" data-via="steveklabnik" data-counturl="http://blog.steveklabnik.com/2010/03/05/writing-a-su-feature-with-authlogic.html" >Tweet</a>
+
+
+ <div class="g-plusone" data-size="medium"></div>
+
+</div>
+
+
+ </footer>
+</article>
+
+</div>
+
+<aside role=sidebar>
+
+ <aside>
+<img src='http://en.gravatar.com/userimage/5335489/ee56a7574df33ed8748160494c930b98.jpg?size=190' />
+<h4>Hi there, I'm Steve.</h4>
+<p>
+I write both code and prose. Here's some of my thoughts about software,
+literature, art and code, with some politics thrown in on occasion.
+You might also enjoy <a href="http://steveklabnik.com/">my website</a>.
+</p>
+</aside>
+
+<section>
+ <h1>Recent Posts</h1>
+ <ul id="recent_posts">
+
+ <li class="post">
+ <a href="/2011/09/06/the-secret-to-rails-oo-design.html">The Secret to Rails OO Design</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/09/04/the-self-improvement-pomodoro.html">The Self-Improvement Pomodoro</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/22/im-making-it-dead-simple-to-contribute-to-ruby-s-documentation.html">I'm Making It Dead Simple To Contribute To Ruby's Documentation</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/19/matz-is-nice-so-we-are-nice.html">Matz is Nice So We Are Nice</a>
+ </li>
+
+ <li class="post">
+ <a href="/2011/08/12/we-forget-that-open-source-is-made-of-people.html">We Forget That Open Source is Made of People</a>
+ </li>
+
+ </ul>
+</section>
+
+<section>
+ <h1>Github Repos</h1>
+ <ul id="gh_repos">
+ <li class="loading">Status updating...</li>
+ </ul>
+
+ <a href="https://github.com/steveklabnik">@steveklabnik</a> on Github
+
+ <script type="text/javascript">
+ $.domReady(function(){
+ if (!window.jXHR){
+ var jxhr = document.createElement('script');
+ jxhr.type = 'text/javascript';
+ jxhr.src = '/javascripts/libs/jXHR.js';
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(jxhr, s);
+ }
+
+ github.showRepos({
+ user: 'steveklabnik',
+ count: 0,
+ skip_forks: true,
+ target: '#gh_repos'
+ });
+ });
+ </script>
+ <script src="/javascripts/github.js" type="text/javascript"> </script>
+</section>
+
+
+<section>
+ <h1>Latest Tweets</h1>
+ <ul id="tweets">
+ <li class="loading">Status updating...</li>
+ </ul>
+ <script type="text/javascript">