<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Changelog &#187; Ruby</title>
	<atom:link href="http://thechangelog.com/tagged/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://thechangelog.com</link>
	<description>Open source moves fast. Keep up.</description>
	<lastBuildDate>Sat, 18 May 2013 07:32:37 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Earn a Sidekiq blackbelt by breaking a few boards</title>
		<link>http://thechangelog.com/earn-a-sidekiq-blackbelt/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=earn-a-sidekiq-blackbelt</link>
		<comments>http://thechangelog.com/earn-a-sidekiq-blackbelt/#comments</comments>
		<pubDate>Fri, 17 May 2013 15:02:27 +0000</pubDate>
		<dc:creator>Kelly Martin</dc:creator>
				<category><![CDATA[Opinions]]></category>
		<category><![CDATA[queues]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[resque]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[sidekiq]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4887</guid>
		<description><![CDATA[<p>Wynn posted about Sidekiq last February, briefly introducing a new way of handling background workers. For those of us who took on the challenge of switching from Resque to Sidekiq, you can probably agree with me that it brought a new set of challenges to tackle. The upside of that, though, is that tackling those [...]</p><p>The post <a href="http://thechangelog.com/earn-a-sidekiq-blackbelt/">Earn a Sidekiq blackbelt by breaking a few boards</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Wynn posted about Sidekiq <a href="/sidekiq-more-efficient-resque-compatible-message-process/">last February</a>, briefly introducing a new way of handling background workers.  For those of us who took on the challenge of switching from Resque to <a href="https://github.com/mperham/sidekiq">Sidekiq</a>, you can probably agree with me that it brought a new set of challenges to tackle.  The upside of that, though, is that tackling those quirks is well worth the payoff.</p>

<p>To save some trouble for those of you who want to switch but haven&#8217;t yet, here&#8217;s what to look out for on the conversion.</p>

<h2>#1: Sidekiq is too darn fast</h2>

<p>It sounds ridiculous, but Sidekiq is so fast that it can run your worker before your model even finishes saving.  There&#8217;s one easy solution for this: don&#8217;t use <code>after_create</code> or <code>after_save</code>, but instead use <code>after_commit</code> to make sure that model is done with the database.</p>

<pre><code class="ruby">after_commit :run_expensive_hello_world, :on => :create</code></pre>

<p>This will solve 99% of your use-cases, but if you use something like <a href="https://github.com/pluginaweek/state_machine">state_machine</a>, you won&#8217;t be able to use any of state_machine&#8217;s transitions to push out a worker.  Instead, we solved it by creating an instance variable that the <code>after_commit</code> callback uses.</p>

<pre><code>attr_accessor :just_moved

after_commit :tell_neighbors_hi, :if =&gt; :just_moved

state_machine :status, :initial =&gt; :sitting do
  # ...
  after_transition any =&gt; :moved do |i|
    i.just_moved = true
  end
end
</code></pre>

<h2>#2: You can&#8217;t see failed jobs. Well, sort of.</h2>

<p>Sidekiq is different from Resque in that it doesn&#8217;t keep a permanent record of your failed jobs, so you won&#8217;t always be able to go back later and run it again after it&#8217;s fixed.</p>

<p>The reasoning behind this design decision is that Sidekiq, unlike Resque, will retry your job at increasing intervals automatically up until about 20 days, along with giving you the ability to manually retry it &#8212; plenty of time to see the error, assign the bug and fix it. After that, you can say sayonara to that record. Sidekiq has some nice docs of <a href="https://github.com/mperham/sidekiq/wiki/Error-Handling">how to handle errors</a>, though, including saying one last goodbye to the error, so it&#8217;s not too hard to set up some safeguards against losing data.</p>

<p>If you don&#8217;t want to take the time to set all that up, there&#8217;s always <a href="https://github.com/mhfs/sidekiq-failures">sidekiq-failures</a>.</p>

<h2>#3: Sidekiq&#8217;s <code>perform</code> is not Resque&#8217;s <code>self.perform</code></h2>

<p>Mike Perham has done a good job of making the terminology fairly similar when switching from Resque to Sidekiq.  However, make note that Sidekiq&#8217;s <code>perform</code> method is an instance-level method, whereas Resque&#8217;s is class-level.</p>

<p>The main takeaway from this is that in Resque, it&#8217;s not uncommon to throw the <code>perform</code> method on whatever object you want to use for the worker.  In Sidekiq, you&#8217;ve got to watch out for initializing that new object. You might be able to get away with it if your <code>initialize</code> method has no arguments, but you&#8217;re better off creating a new class just for the worker.</p>

<p>After getting accustomed to some of the differences between Resque and Sidekiq, it&#8217;s pretty easy to see that Sidekiq can shave time and money off your server and is definitely worth the switch.</p>
<p>The post <a href="http://thechangelog.com/earn-a-sidekiq-blackbelt/">Earn a Sidekiq blackbelt by breaking a few boards</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/earn-a-sidekiq-blackbelt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stringer: a self-hosted, anti-social RSS reader</title>
		<link>http://thechangelog.com/stringer-a-self-hosted-anti-social-rss-reader/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stringer-a-self-hosted-anti-social-rss-reader</link>
		<comments>http://thechangelog.com/stringer-a-self-hosted-anti-social-rss-reader/#comments</comments>
		<pubDate>Mon, 06 May 2013 13:40:32 +0000</pubDate>
		<dc:creator>Jerod Santo</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4719</guid>
		<description><![CDATA[<p>With July 1st&#8217;s closing of Google Reader looming ever closer, the open source community has risen to the challenge of providing viable alternatives to the popular feed reading service. Stringer is Matt Swanson&#8217;s entry into the RSS ecosystem. Matt describes Stringer like so: Stringer has no external dependencies, no social recommendations/sharing, and no fancy machine [...]</p><p>The post <a href="http://thechangelog.com/stringer-a-self-hosted-anti-social-rss-reader/">Stringer: a self-hosted, anti-social RSS reader</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>With July 1st&#8217;s <a href="http://googlereader.blogspot.com/2013/03/powering-down-google-reader.html">closing of Google Reader</a> looming ever closer, the open source community has risen to the challenge of providing viable alternatives to the popular feed reading service.</p>

<p><a href="https://github.com/swanson/stringer">Stringer</a> is <a href="http://twitter.com/_swanson">Matt Swanson&#8217;s</a> entry into the RSS ecosystem. Matt describes Stringer like so:</p>

<blockquote>
  <p>Stringer has no external dependencies, no social recommendations/sharing, and no fancy machine learning algorithms. But it does have keyboard shortcuts and was made with love! When BIG_FREE_READER shuts down, your instance of Stringer will still be kicking.</p>
</blockquote>

<p>Here&#8217;s a screenshot of it in action. (Bonus points for featuring a Changelog post!)</p>

<p><a href="https://github.com/swanson/stringer"><img src="http://thechangelog.com/wp-content/uploads/stringer-stories.png" alt="" /></a></p>

<p>Stringer is written in Ruby and built on Sinatra with a PostgreSQL datastore. It deploys easily to <a href="http://heroku.com">Heroku</a> and is a self-professed <em>work-in-progress</em>. One thing the web app currently <a href="https://github.com/swanson/stringer/issues/7">lacks</a> is a solid mobile offering, so please get involved if you have mobile ideas and/or chops!</p>

<p>The project is <a href="https://github.com/swanson/stringer/blob/master/LICENSE">MIT licensed</a> and hosted <a href="https://github.com/swanson/stringer">on GitHub</a>.</p>
<p>The post <a href="http://thechangelog.com/stringer-a-self-hosted-anti-social-rss-reader/">Stringer: a self-hosted, anti-social RSS reader</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/stringer-a-self-hosted-anti-social-rss-reader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Run Ruby in the browser with Decaf, a fork of WebKit.</title>
		<link>http://thechangelog.com/run-ruby-in-the-browser-with-decaf-a-fork-of-webkit/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=run-ruby-in-the-browser-with-decaf-a-fork-of-webkit</link>
		<comments>http://thechangelog.com/run-ruby-in-the-browser-with-decaf-a-fork-of-webkit/#comments</comments>
		<pubDate>Sun, 05 May 2013 19:37:53 +0000</pubDate>
		<dc:creator>Andrew Thorp</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4714</guid>
		<description><![CDATA[<p>Decaf, from Tim Mahoney is a fork of WebKit that allows you to run Ruby in the browser. A simple example from the README: &#60;script type='text/ruby'&#62; window.onload do introduction = document.create_element('p') introduction.inner_text = 'Hello, world!' document.body.append_child(introduction) end &#60;/script&#62; It only works on the Mac right now, and there are a few other gotcha&#8217;s to keep [...]</p><p>The post <a href="http://thechangelog.com/run-ruby-in-the-browser-with-decaf-a-fork-of-webkit/">Run Ruby in the browser with Decaf, a fork of WebKit.</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Decaf, from <a href="https://twitter.com/timimahoney">Tim Mahoney</a> is a fork of <a href="https://github.com/WebKit/webkit">WebKit</a> that allows you to run Ruby in the browser. A simple example from the <a href="https://github.com/timahoney/decaf/blob/decaf/README.md#decaf">README</a>:</p>

<pre><code>&lt;script type='text/ruby'&gt;
  window.onload do
    introduction = document.create_element('p')
    introduction.inner_text = 'Hello, world!'
    document.body.append_child(introduction)
  end
&lt;/script&gt;
</code></pre>

<p>It only works on the Mac right now, and there are a <a href="https://github.com/timahoney/decaf/blob/decaf/README.md#differences-from-javascript">few other gotcha&#8217;s</a> to keep in mind:</p>

<ul>
<li>In Ruby, methods and attributes are specified in <code>underscore_case</code> instead of <code>camelCase</code>.</li>
<li>The <code>window</code> variable is accessible from only the top-most scope. Elsewhere you can use the global <code>$window</code>.</li>
<li>Ruby accepts <code>Procs</code> and <code>blocks</code> as callbacks and listeners. <a href="https://github.com/timahoney/decaf/blob/decaf/README.md#differences-from-javascript">View an example</a>.</li>
</ul>

<p>You can go to the <a href="http://trydecaf.org">project homepage</a>, get the <a href="http://trydecaf.org/latest">latest release</a> or <a href="https://github.com/timahoney/decaf">view the source</a> on GitHub.</p>
<p>The post <a href="http://thechangelog.com/run-ruby-in-the-browser-with-decaf-a-fork-of-webkit/">Run Ruby in the browser with Decaf, a fork of WebKit.</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/run-ruby-in-the-browser-with-decaf-a-fork-of-webkit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xray-rails reveals which files are being rendered in your view</title>
		<link>http://thechangelog.com/xray-rails-reveals-which-files-are-being-rendered-in-your-view/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=xray-rails-reveals-which-files-are-being-rendered-in-your-view</link>
		<comments>http://thechangelog.com/xray-rails-reveals-which-files-are-being-rendered-in-your-view/#comments</comments>
		<pubDate>Fri, 03 May 2013 21:51:11 +0000</pubDate>
		<dc:creator>Beverly Nelson</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyGems]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4693</guid>
		<description><![CDATA[<p>When I pair with Railsbridge attendees or new developers, I often wish I had a visual way to let them see the connection between the files in the codebase and what&#8217;s rendered in the browser. Today Ruby 5 featured Xray and a number of friends contacted me about checking it out. In no time I [...]</p><p>The post <a href="http://thechangelog.com/xray-rails-reveals-which-files-are-being-rendered-in-your-view/">Xray-rails reveals which files are being rendered in your view</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>When I pair with <a href="http://workshops.railsbridge.org/">Railsbridge</a> attendees or new developers, I often wish I had a visual way to let them see the connection between the files in the codebase and what&#8217;s rendered in the browser.  Today <a href="http://ruby5.envylabs.com/episodes/370-episode-366-may-3rd-2013">Ruby 5</a> featured <a href="https://github.com/brentd/xray-rails">Xray</a> and a number of friends contacted me about checking it out.  In no time I knew I&#8217;d found the solution.</p>

<p>I gave it a test drive on one of the student apps and it took 5 minutes, at most, to get up and running.</p>

<p>Just drop this in your <code>Gemfile</code>:</p>

<pre><code>group :development do
  gem 'xray-rails'
end
</code></pre>

<p>Bundle and delete the cached assets:</p>

<pre><code class="no-highlight">$ bundle &#038;&#038; rm -rf tmp/cache/assets</code></pre>

<p>Restart your app, visit it in your browser, and press <code>cmd+shift+x</code></p>

<p><img src="http://thechangelog.com/wp-content/uploads/xray-rails-example.png" alt="xray-rails" title="Xray overlay" /></p>

<p>By far the best feature in Xray is the fact that it allows you to actually click on the overlay and go straight to the file or partial being rendered.  It defaults to <a href="http://www.sublimetext.com/">Sublime</a>, which is easy for new users, but is simple enough to customize to another tool for seasoned pros.</p>

<p><a href="https://github.com/brentd/xray-rails">Xray</a> is great for:</p>

<ul>
<li>Helping new Rails developers while pairing to get clearer understanding of views</li>
<li>Gaining quick insight into complex views</li>
<li>Debugging templates, partials, and backbone views</li>
</ul>

<p><a href="http://f.cl.ly/items/1A0o3y1y3Q13103V3F1l/xray-rails-large.gif">See Xray in action</a></p>

<p>Right now Xray is a tool for the Rails framework but there are plans to expand and make it available for any framework. You can check it out on <a href="https://github.com/brentd/xray-rails">Github</a>.</p>
<p>The post <a href="http://thechangelog.com/xray-rails-reveals-which-files-are-being-rendered-in-your-view/">Xray-rails reveals which files are being rendered in your view</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/xray-rails-reveals-which-files-are-being-rendered-in-your-view/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Episode 0.8.6 &#8211; Discourse, Ruby and more with Jeff Atwood (aka Coding Horror)</title>
		<link>http://thechangelog.com/086/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=086</link>
		<comments>http://thechangelog.com/086/#comments</comments>
		<pubDate>Fri, 03 May 2013 15:10:16 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Discourse]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[vagrant]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4683</guid>
		<description><![CDATA[<p>Adam Stacoviak, Andrew Thorp and Kenneth Reitz talk with Jeff Atwood about Discourse and more. Tune in LIVE every Tuesday at 3pm PT / 6pm ET. We&#8217;re live every Tuesday! thechangelog.com/live Hack in style with your very own Changelog tee! We are now member supported! We&#8217;re joined by Jeff Atwood, from codinghorror.com and stackexchange.com Stack [...]</p><p>The post <a href="http://thechangelog.com/086/">Episode 0.8.6 &#8211; Discourse, Ruby and more with Jeff Atwood (aka Coding Horror)</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Adam Stacoviak, Andrew Thorp and Kenneth Reitz talk with Jeff Atwood about Discourse and more.</p>

<p><em><a href="/live/">Tune in LIVE every Tuesday at 3pm PT / 6pm ET</a>.</em></p>

<audio src="http://changelogshow.com/105/90496-episode-0-8-6-discourse-ruby-and-more-with-jeff-atwood-aka-coding-horror.mp3" controls="controls" preload="none"></audio>

<ul>
<li>We&#8217;re live every Tuesday! <a href="http://thechangelog.com/live">thechangelog.com/live</a></li>
<li><a href="https://thechangelog.com/store">Hack in style with your very own Changelog tee!</a></li>
<li>We are now <a href="https://thechangelog.com/membership">member supported!</a></li>
<li>We&#8217;re joined by Jeff Atwood, from <a href="http://codinghorror.com">codinghorror.com</a> and <a href="http://stackexchange.com">stackexchange.com</a></li>
<li><a href="http://stackoverflow.com">Stack Overflow</a> is a community Q&amp;A platform.</li>
<li><a href="http://discourse.org">Discourse</a> is an open source discussion platform.</li>
<li><a href="http://wordpress.org">WordPress</a> is an open source CMS in PHP.</li>
<li><a href="http://gitorious.org/shapado">Shapado</a> is a Q&amp;A platform in ruby.</li>
<li><a href="http://www.osqa.net/">OSQA</a> is an open source Q&amp;A system.</li>
<li><a href="http://reddit.com">Reddit</a> is an online community where users vote on content.</li>
<li><a href="https://sites.google.com/site/steveyegge2/tour-de-babel">Steve Yegge&#8217;s tour de babel</a> is a language roundup from 2006.</li>
<li><a href="http://www.codinghorror.com/blog/2013/03/why-ruby.html">Why Ruby?</a> is a blog post by Jeff about why he did Discourse in ruby.</li>
<li><a href="http://www.mono-project.com/Main_Page">mono</a> is an open source .NET development framework.</li>
<li><a href="http://blog.discourse.org/2013/04/discourse-as-your-first-rails-app/">Discourse as Your First Rails App</a> is a blog post about setting up the Discourse development environment.</li>
<li><a href="http://emberjs.com/">ember</a> is a JavaScript framework for ambitious web applications.</li>
</ul>
<p>The post <a href="http://thechangelog.com/086/">Episode 0.8.6 &#8211; Discourse, Ruby and more with Jeff Atwood (aka Coding Horror)</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/086/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://changelogshow.com/105/90496-episode-0-8-6-discourse-ruby-and-more-with-jeff-atwood-aka-coding-horror.mp3" length="37496960" type="audio/mpeg" />
		</item>
		<item>
		<title>Bring your server side debug logging into the browser with Chrome Logger</title>
		<link>http://thechangelog.com/bring-your-server-side-debug-logging-into-the-browser-with-chrome-logger/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bring-your-server-side-debug-logging-into-the-browser-with-chrome-logger</link>
		<comments>http://thechangelog.com/bring-your-server-side-debug-logging-into-the-browser-with-chrome-logger/#comments</comments>
		<pubDate>Thu, 11 Apr 2013 21:45:37 +0000</pubDate>
		<dc:creator>Jerod Santo</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[express]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4371</guid>
		<description><![CDATA[<p>If you find yourself jumping back and forth between Chrome&#8217;s Dev Tools and a terminal displaying your server side request logs, Craig Campbell&#8217;s Chrome Logger might be just the thing you need! It&#8217;s a Chrome extension which lets you see your server side logs right in the browser. There are currently libraries for: Python Ruby [...]</p><p>The post <a href="http://thechangelog.com/bring-your-server-side-debug-logging-into-the-browser-with-chrome-logger/">Bring your server side debug logging into the browser with Chrome Logger</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>If you find yourself jumping back and forth between Chrome&#8217;s <a href="https://developers.google.com/chrome-developer-tools/">Dev Tools</a> and a terminal displaying your server side request logs, <a href="http://craig.is/">Craig Campbell&#8217;s</a> <a href="http://craig.is/writing/chrome-logger/">Chrome Logger</a> might be just the thing you need!</p>

<p>It&#8217;s a <a href="https://chrome.google.com/webstore/detail/chromephp/noaneddfkdjfnfdakjjmocngnfkfehhd">Chrome extension</a> which lets you see your server side logs right in the browser. There are currently libraries for:</p>

<ul>
<li><a href="http://github.com/ccampbell/chromelogger-python">Python</a></li>
<li><a href="http://github.com/cookrn/chrome_logger">Ruby</a></li>
<li><a href="http://github.com/ccampbell/chromephp">PHP</a></li>
<li><a href="http://github.com/olahol/express-chrome-logger">Express</a></li>
</ul>

<p>Is your server side language/environment of choice not on that list? Don&#8217;t worry, Chrome Logger uses an <a href="http://craig.is/writing/chrome-logger/techspecs">open and published</a> protocol so you can easily write client libraries of your own!</p>

<p>See the project&#8217;s <a href="http://craig.is/writing/chrome-logger/">home page</a> for more info or <a href="https://github.com/ccampbell/chromelogger">check under the hood</a> if you&#8217;re curious about how it all works.</p>
<p>The post <a href="http://thechangelog.com/bring-your-server-side-debug-logging-into-the-browser-with-chrome-logger/">Bring your server side debug logging into the browser with Chrome Logger</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/bring-your-server-side-debug-logging-into-the-browser-with-chrome-logger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hyperresource: a hypermedia API client for Ruby</title>
		<link>http://thechangelog.com/hyperresource-a-hypermedia-api-client-for-ruby/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=hyperresource-a-hypermedia-api-client-for-ruby</link>
		<comments>http://thechangelog.com/hyperresource-a-hypermedia-api-client-for-ruby/#comments</comments>
		<pubDate>Thu, 11 Apr 2013 18:15:40 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[HAL]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4363</guid>
		<description><![CDATA[<p>Any of you who know me aren&#8217;t surprised about me posting this story: it&#8217;s right up my alley! Basically, hyperresource is intended to be a general hypermedia client. What&#8217;s that mean? It can work with any API that happens to use one of the media types it supports. Right now, that&#8217;s just HAL+JSON, but more [...]</p><p>The post <a href="http://thechangelog.com/hyperresource-a-hypermedia-api-client-for-ruby/">Hyperresource: a hypermedia API client for Ruby</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Any of you who know me aren&#8217;t surprised about me posting this story: it&#8217;s right up my alley!</p>

<p>Basically, <a href="https://github.com/gamache/hyperresource">hyperresource</a> is intended to be a general hypermedia client. What&#8217;s that mean? It can work with any API that happens to use one of the media types it supports. Right now, that&#8217;s just HAL+JSON, but more will be added in the future.</p>

<p>What&#8217;s that mean in terms of code? Well, here&#8217;s an example <a href="https://github.com/gamache/hyperresource#hyperresource">from the README</a>:</p>

<pre><code>api = HyperResource.new(root: 'https://api.example.com')
# =&gt; #&lt;HyperResource:0xABCD1234 @root="https://api.example.com" @href="" @namespace=nil ... &gt;
root = api.get
# =&gt; #&lt;HyperResource:0xABCD1234 @root="https://api.example.com" @href="" @namespace=nil ... &gt;
root.response_body
# =&gt; { 'message' =&gt; 'Welcome to the Example.com API',
#      'version' =&gt; 1,
#      '_links' =&gt; {
#        'self' =&gt; {'href' =&gt; '/'},
#        'users' =&gt; {'href' =&gt; '/users{?email,last_name}', 'templated' =&gt; true},
#        'forums' =&gt; {'href' =&gt; '/forums{?title}', 'templated' =&gt; true}
#      }
#    }
jdoe_user = api.users.where(email: "jdoe@example.com").first
# =&gt; #&lt;HyperResource:0x12312312 ...&gt;
</code></pre>

<p>How does it know how to look up those users? Well, there&#8217;s a <code>users</code> link relation on in the response, and it has a templated URI as its <code>href</code> attribute. This lets the client reflect and know how to look up users by their email or last name.</p>

<p>The power of this generic tooling is that we no longer have to think about how to parse HAL, how to interpret the response&#8230; we have this one library which works with any HAL-powered API.</p>

<p>The biggest drawback of hyperresource is that it&#8217;s read-only at the moment, nothing but GET. But it shows a lot of promise, and I&#8217;m excited to see this kind of stuff pop up in the wild. Everything I see points to 2013 as the year of example code for hypermedia services.</p>

<p><a href="https://github.com/gamache/hyperresource">Check it out on GitHub.</a></p>
<p>The post <a href="http://thechangelog.com/hyperresource-a-hypermedia-api-client-for-ruby/">Hyperresource: a hypermedia API client for Ruby</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/hyperresource-a-hypermedia-api-client-for-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>csscss parses your CSS and shows your duplicated declarations</title>
		<link>http://thechangelog.com/csscss-find-duplicated-css-rules/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=csscss-find-duplicated-css-rules</link>
		<comments>http://thechangelog.com/csscss-find-duplicated-css-rules/#comments</comments>
		<pubDate>Mon, 08 Apr 2013 17:57:34 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sass]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4318</guid>
		<description><![CDATA[<p>Yesterday, a neat little gem called csscss celebrated a 1.0 release! csscss will parse any CSS or Sass file you give it and let you know which rulesets have duplicated declarations. It&#8217;s super easy to use: $ gem install csscss $ csscss path/to/styles.css path/to/other-styles.css {.contact .content .primary} and {article, #comments} share 5 rules {.profile-picture}, {.screenshot [...]</p><p>The post <a href="http://thechangelog.com/csscss-find-duplicated-css-rules/">csscss parses your CSS and shows your duplicated declarations</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><em>Yesterday, a neat little gem called <a href="http://zmoazeni.github.io/csscss/">csscss</a> <a href="http://zmoazeni.github.io/csscss/">celebrated a 1.0 release!</a></em></p>

<p>csscss will parse any CSS or Sass file you give it and let you know which rulesets have duplicated declarations.</p>

<p>It&#8217;s super easy to use:</p>

<pre><code>$ gem install csscss
$ csscss path/to/styles.css path/to/other-styles.css

{.contact .content .primary} and {article, #comments} share 5 rules
{.profile-picture}, {.screenshot img} and {a.blurb img} share 4 rules
{.work h2:first-child, .archive h2:first-child, .missing h2:first-child, .about h2, .contact h2} and {body.home h2} share 4 rules
{article.blurb:hover} and {article:hover} share 3 rules
</code></pre>

<p>Cool! This really helps when you&#8217;re trying to get a handle on refactoring. Maybe it&#8217;s just me, but I find remembering all of my CSS rules very complicated. There&#8217;s a reason I&#8217;m more of a back-end developer&#8230;</p>

<p>For those who write their CSS in Sass, csscss can also parse Sass files, as well. Just point it at one and it&#8217;ll go to town!</p>

<p>Check out <a href="http://zmoazeni.github.io/csscss/">the homepage</a> or <a href="https://github.com/zmoazeni/csscss">the source</a> on GitHub for more details.</p>

<hr />

<p><em>There&#8217;s one other neat part about this gem</em>, but it&#8217;s not for users of the gem &#8212; it&#8217;s for developers. csscss contains, as you&#8217;d expect, <a href="https://github.com/zmoazeni/csscss/tree/master/lib/csscss/parser">a full CSS parser </a> written in <a href="https://github.com/kschiess/parslet">parselet</a>. I&#8217;m sure that others could do need static analysis stuff with CSS if they had a parser that was pre-built for them, as well.</p>
<p>The post <a href="http://thechangelog.com/csscss-find-duplicated-css-rules/">csscss parses your CSS and shows your duplicated declarations</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/csscss-find-duplicated-css-rules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Write Ruby API&#8217;s with Stripe&#8217;s Poncho (a DSL for REST interfaces)</title>
		<link>http://thechangelog.com/write-ruby-apis-with-poncho/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=write-ruby-apis-with-poncho</link>
		<comments>http://thechangelog.com/write-ruby-apis-with-poncho/#comments</comments>
		<pubDate>Thu, 04 Apr 2013 03:48:38 +0000</pubDate>
		<dc:creator>Andrew Thorp</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyGems]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4234</guid>
		<description><![CDATA[<p>As we said in a previous post: WE LOVE STRIPE! The team at Stripe has open sourced a RubyGem that makes REST API&#8217;s easy to create, Poncho. It&#8217;s compatible with any rack-based framework &#8212; like Rails or Sinatra. Best of all, it has a slew of (simple to use) features: Standard Params: integer, array, boolean, [...]</p><p>The post <a href="http://thechangelog.com/write-ruby-apis-with-poncho/">Write Ruby API&#8217;s with Stripe&#8217;s Poncho (a DSL for REST interfaces)</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>As we said in a <a href="http://thechangelog.com/stripe-push-is-money-in-the-bank/">previous post</a>: <strong><em>WE LOVE STRIPE!</em></strong></p>

<p><a href="http://twitter.com/stripe">The team at Stripe</a> has open sourced a RubyGem that makes REST API&#8217;s easy to create, <a href="https://github.com/stripe/poncho">Poncho</a>. It&#8217;s compatible with any rack-based framework &mdash; like Rails or Sinatra. Best of all, it has a slew of (simple to use) features:</p>

<ul>
<li><a href="https://github.com/stripe/poncho#params">Standard Params: integer, array, boolean, etc</a></li>
<li><a href="https://github.com/stripe/poncho#custom-params">Custom Params</a></li>
<li><a href="https://github.com/stripe/poncho#validation">Standard Validators: presence, format, length, etc</a></li>
<li><a href="https://github.com/stripe/poncho#custom-validation">Custom Validators</a></li>
<li><a href="https://github.com/stripe/poncho#method-filters">Method Filters</a></li>
<li>And more&#8230;</li>
</ul>

<p>Installation is simple, just install the <code>poncho</code> gem (or add <code>gem poncho</code> to your Gemfile). After installation, you can setup your API:</p>

<pre><code>class ChargeResource &lt; Poncho::Resource
  param :amount, :type =&gt; :integer
end

class ChargeCreateMethod &lt; Poncho::JSONMethod
  param :amount, :type =&gt; :integer, :required =&gt; true

  def invoke
    charge = Charge.new
    charge.amount = param(:amount)
    charge.save

    ChargeResource.new(charge)
  end
end

post '/charges', &amp;ChargeCreateMethod
</code></pre>

<p>The above code, which was <a href="https://github.com/stripe/poncho#tldr-usage">pulled from the documentation</a> is using Sinatra, but you could easily swap Rails out:</p>

<pre><code>match '/charges' =&gt; ChargeCreateMethod, :via =&gt; :post
</code></pre>

<p><a href="https://github.com/stripe/poncho/blob/master/README.md">The documentation</a> is thorough, and does a great job at explaining how to use Poncho. You can also <a href="https://github.com/stripe/poncho">view the source</a> or <a href="https://news.ycombinator.com/item?id=5490867">discuss this on HackerNews.</a></p>
<p>The post <a href="http://thechangelog.com/write-ruby-apis-with-poncho/">Write Ruby API&#8217;s with Stripe&#8217;s Poncho (a DSL for REST interfaces)</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/write-ruby-apis-with-poncho/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Helios: a server side for your iOS app</title>
		<link>http://thechangelog.com/helios-a-server-side-for-your-ios-app/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=helios-a-server-side-for-your-ios-app</link>
		<comments>http://thechangelog.com/helios-a-server-side-for-your-ios-app/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 19:53:45 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4156</guid>
		<description><![CDATA[<p>Today, the always-impressive Mattt released a new project: Helios. Helios is an open-source framework that provides essential backend services for iOS apps, from data synchronization and user accounts to push notifications, in-app purchases, and passbook integration. It allows developers to get a client-server app up-and-running in just a few minutes, and seamlessly incorporate functionality as [...]</p><p>The post <a href="http://thechangelog.com/helios-a-server-side-for-your-ios-app/">Helios: a server side for your iOS app</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Today, the always-impressive <a href="https://github.com/mattt">Mattt</a> released a new project: <a href="http://helios.io/">Helios</a>.</p>

<blockquote>
  <p>Helios is an open-source framework that provides essential backend services for iOS apps, from data synchronization and user accounts to push notifications, in-app purchases, and passbook integration. It allows developers to get a client-server app up-and-running in just a few minutes, and seamlessly incorporate functionality as necessary.</p>
</blockquote>

<p>Getting started is easy:</p>

<pre><code>$ gem install helios
$ helios new myapp
$ cd myapp; helios server
$ open http://localhost:5000/admin
</code></pre>

<p>Helios is broken down into useful components, too. If you <a href="https://github.com/helios-framework/helios/blob/master/helios.gemspec#L19-L22">check out the .gemspec</a>, you&#8217;ll notice a few other gems that would be useful for anyone trying to build a backend service.</p>

<p>There&#8217;s a lot of startups that do &#8220;Backend as a Service,&#8221; such as <a href="https://www.parse.com/">Parse</a>, so it&#8217;s nice to see an OSS competitor pop up.</p>
<p>The post <a href="http://thechangelog.com/helios-a-server-side-for-your-ios-app/">Helios: a server side for your iOS app</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/helios-a-server-side-for-your-ios-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fast_blank: String#blank? in C</title>
		<link>http://thechangelog.com/fast_blank-stringblank-in-c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=fast_blank-stringblank-in-c</link>
		<comments>http://thechangelog.com/fast_blank-stringblank-in-c/#comments</comments>
		<pubDate>Fri, 29 Mar 2013 23:57:42 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4012</guid>
		<description><![CDATA[<p>Sam Saffron is part of the team doing Discourse, an open-source Rails-based discussion platform. He&#8217;s been kicking all kinds of ass all over Ruby-land lately, but I wanted to share a specific bit of that with you. It&#8217;s a new gem, fast_blank. Basically, due to these awesome-looking flame graphs that Sam added to his MiniProfiler [...]</p><p>The post <a href="http://thechangelog.com/fast_blank-stringblank-in-c/">fast_blank: String#blank? in C</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a href="https://github.com/SamSaffron">Sam Saffron</a> is part of the team doing <a href="http://www.discourse.org/">Discourse</a>, an open-source Rails-based discussion platform. He&#8217;s been kicking all kinds of ass all over Ruby-land lately, but I wanted to share a specific bit of that with you. It&#8217;s a new gem, <a href="https://github.com/SamSaffron/fast_blank">fast_blank</a>.</p>

<p>Basically, due to these awesome-looking <a href="http://samsaffron.com/archive/2013/03/19/flame-graphs-in-ruby-miniprofiler">flame graphs</a> that Sam <a href="https://github.com/SamSaffron/MiniProfiler/commit/1a4f58182aa9750b2ec98903ba6573d8c37fa990">added to his MiniProfiler</a> gem. Here&#8217;s what it does: it samples stack traces while your app runs, and then lays them all next to each other so you can see where they&#8217;re especially deep. He has a demo <a href="http://samsaffron.com/flamegraph.htm">here</a>, which you can click around and check out what was going on on Discourse&#8217;s home page before Sam started working on making it faster.</p>

<p>Anyway, so what&#8217;s this has to do with <code>fast_blank</code>? Well, Sam noticed that a ton of time in Discourse&#8217;s code was being spent in <code>String#blank?</code>, a method which <a href="https://github.com/rails/rails/commit/4ef7bfb0166cb45428861ce9e001838ab9a2796f">was added to Rails by _why the lucky stiff</a> way back in the day. Sam <a href="https://github.com/rails/rails/pull/9958">attempted to fix it</a>, but making it 100% compatible, yet fast, was difficult.</p>

<p>This lead him to notice that <a href="https://github.com/rails/rails/issues/9992">Ruby and Rails have different implementations of <code>#blank?</code></a>, he decided to fix the issue in Discourse by <a href="https://github.com/SamSaffron/fast_blank">writing a <code>#blank?</code> in C so that it was super fast</a>.</p>

<p>To use <code>fast_blank</code>, just add it to your Gemfile:</p>

<pre><code>gem 'fast_blank'
</code></pre>

<p>That&#8217;s it! Your <code>String#blank?</code> will be faster.</p>

<p>Actually, that&#8217;s not quite it. Over on GitHub, <a href="https://github.com/SamSaffron/fast_blank/pull/1#issuecomment-15666491">Sam told me that it&#8217;s not up on Rubygems yet</a>, but will be in a few days. For now, you need to clone it down and use Bundler&#8217;s <code>:github</code> option:</p>

<pre><code>gem 'fast_blank', github: "SamSaffron/fast_blank"
</code></pre>

<p>That&#8217;s it.</p>

<p>Now, you may be wondering why I&#8217;m making such a big deal out of all of this. Well, this is pretty much an absolutely model open source interaction between a bunch of different projects.</p>

<ol>
<li>A performance issue was found. Rather than wonder or speculate, measurements were taken.</li>
<li>A new tool was developed to help make sense of the measurements.</li>
<li>Attempting to fix performance in the main project itself, with a pull request.</li>
<li>Recognizing that there was a lot going on here, so fixing it from himself via a patch.</li>
<li>Sharing the fix with everyone until the details in the main projects could be sorted out.</li>
</ol>

<p>Obviously, this isn&#8217;t the end of this story. What will happen next? Will Rails and MRI end up with the same implementation? Can we make it work in Ruby as fast as the C version? Will <code>fast_blank</code> just replace the implementation of <code>#blank?</code> in MRI?</p>

<p>I guess you&#8217;ll have to stay tuned to find out. ;)</p>
<p>The post <a href="http://thechangelog.com/fast_blank-stringblank-in-c/">fast_blank: String#blank? in C</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/fast_blank-stringblank-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sinatra-asset-pipeline: Sprockets for Sinatra</title>
		<link>http://thechangelog.com/sinatra-asset-pipeline-sprockets-for-sinatra/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sinatra-asset-pipeline-sprockets-for-sinatra</link>
		<comments>http://thechangelog.com/sinatra-asset-pipeline-sprockets-for-sinatra/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 16:41:15 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Asset Pipeline]]></category>
		<category><![CDATA[assets]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3979</guid>
		<description><![CDATA[<p>I remember being really excited for Rails 3.1, and that&#8217;s because it was going to have &#8216;the asset pipeline,&#8217; helping us manage the assets our application needed. I also remember being so excited by it, I fooled around with sprockets 2.0.0.beta6 to get it running on my Sinatra apps, as well. It took me a [...]</p><p>The post <a href="http://thechangelog.com/sinatra-asset-pipeline-sprockets-for-sinatra/">sinatra-asset-pipeline: Sprockets for Sinatra</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I remember being really excited for Rails <code>3.1</code>, and that&#8217;s because it was going to have &#8216;the asset pipeline,&#8217; helping us manage the assets our application needed. I also remember being so excited by it, I fooled around with sprockets <code>2.0.0.beta6</code> to get it running on my Sinatra apps, as well. It took me a while, and when <code>beta7</code> came out, it didn&#8217;t work any more&#8230;</p>

<p>But this isn&#8217;t a story about me. It&#8217;s a story about <a href="https://twitter.com/kalasjocke">Joakim Ekberg</a>. He did better than I ever did: when he put Sprockets on Sinatra, he made a gem out of it. He calls it <code>sinatra-asset-pipeline</code>.</p>

<p>It&#8217;s pretty easy to use: just</p>

<pre><code>gem 'sinatra-asset-pipeline'
</code></pre>

<p>in your Gemfile. After bundling, add this to your Rakefile:</p>

<pre><code>require 'sinatra/asset_pipeline/task.rb'
Sinatra::AssetPipeline::Task.define! MyApp
</code></pre>

<p>and add it to your application, too:</p>

<pre><code>require 'sinatra/asset_pipeline'

class MyApp &lt; Sinatra::Base
  register Sinatra::AssetPipeline
end
</code></pre>

<p>Then, <code>sinatra-asset-pipeline</code> gives you the rake tasks you&#8217;d expect:</p>

<pre><code>$ rake assets:precompile
$ rake assets:clean
</code></pre>

<p><a href="https://github.com/kalasjocke/sinatra-asset-pipeline">Sinatra-asset-pipeline</a> is still pretty young, and currently only supports the stock Haml, Sass, and CoffeeScript options that the Rails asset pipeline uses. Hopefully, future releases will integrate Tilt so that you can use arbitrary endings, but there&#8217;s a reason why these are default in Rails: they&#8217;re the most popular alternate options from the defaults.</p>

<p><a href="https://news.ycombinator.com/item?id=5456236">Vote this up on Hacker News</a>.</p>
<p>The post <a href="http://thechangelog.com/sinatra-asset-pipeline-sprockets-for-sinatra/">sinatra-asset-pipeline: Sprockets for Sinatra</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/sinatra-asset-pipeline-sprockets-for-sinatra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jeff Atwood on &#8216;Why Ruby?&#8217;</title>
		<link>http://thechangelog.com/why-ruby/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=why-ruby</link>
		<comments>http://thechangelog.com/why-ruby/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 06:05:46 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3962</guid>
		<description><![CDATA[<p>Jeff Atwood shares his thoughts on why he chose Ruby over .NET when building Discourse (a 100% open source project). Like any pragmatic programmer, I pick the appropriate tool for the job at hand. And as much as I may love .NET, it would be an extraordinarily poor choice for an 100% open source project [...]</p><p>The post <a href="http://thechangelog.com/why-ruby/">Jeff Atwood on &#8216;Why Ruby?&#8217;</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a href="https://twitter.com/codinghorror">Jeff Atwood</a> shares his thoughts on <em>why he chose Ruby over .NET</em> when building <a href="http://www.discourse.org/">Discourse</a> (a 100% open source project).</p>

<blockquote>
  <p>Like any pragmatic programmer, I pick the appropriate tool for the job at hand. And as much as I may love .NET, it would be an extraordinarily poor choice for an 100% open source project like Discourse. Why? Three reasons, mainly &#8230;</p>
</blockquote>

<p><a href="http://www.codinghorror.com/blog/2013/03/why-ruby.html">Read the post for yourself</a>.</p>

<p>And if you haven&#8217;t yet <a href="https://github.com/discourse/discourse">check out Discourse on GitHub</a> and <a href="https://news.ycombinator.com/item?id=5421908">this thread on Hacker News</a>.</p>
<p>The post <a href="http://thechangelog.com/why-ruby/">Jeff Atwood on &#8216;Why Ruby?&#8217;</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/why-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring: pre-load your Rails apps</title>
		<link>http://thechangelog.com/spring-pre-load-your-rails-apps/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spring-pre-load-your-rails-apps</link>
		<comments>http://thechangelog.com/spring-pre-load-your-rails-apps/#comments</comments>
		<pubDate>Wed, 27 Mar 2013 18:34:37 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3955</guid>
		<description><![CDATA[<p>When you&#8217;re working on a big app, Rails&#8217; startup time can be slow. It&#8217;s a hard problem, and there&#8217;s been a lot of work done in Ruby and Rails to help solve this pain. Rails Core member Jon Leighton has a new gem that helps solve this problem: it&#8217;s called spring. Basically, Spring is in [...]</p><p>The post <a href="http://thechangelog.com/spring-pre-load-your-rails-apps/">Spring: pre-load your Rails apps</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>When you&#8217;re working on a big app, Rails&#8217; startup time can be slow. It&#8217;s a hard problem, and there&#8217;s been a lot of work done in Ruby and Rails to help solve this pain.</p>

<p>Rails Core member Jon Leighton has a new gem that helps solve this problem: it&#8217;s called <a href="https://github.com/jonleighton/spring">spring</a>. Basically, Spring is in the same &#8216;genre&#8217; of gems as Spork and Zeus: it loads your app up and keeps it running in the background, so the next time you run your tests, things are fast.</p>

<p>Using spring is easy:</p>

<pre><code>$  cat &gt;&gt; Gemfile
gem "spring"
^D
$ bundle
$ spring testunit
</code></pre>

<p>This boots up your app, runs the tests, and keeps the app running in the background. You can see that your app is running with <code>spring status</code>:</p>

<pre><code>$ spring status
Spring is running:

26150 spring server | rails-3-2 | started 3 secs ago
26155 spring app    | rails-3-2 | started 3 secs ago | test mode 
</code></pre>

<p>Now, adding <code>spring</code> before every command is a lot of effort, so similar to <code>bundle</code>, <code>spring</code> can generate binstubs that take care of this for you:</p>

<pre><code>$ spring binstub testunit
$ bin/testunit
</code></pre>

<p>Easy!</p>

<p>If you haven&#8217;t used Spring before, check out <a href="https://github.com/jonleighton/spring#spring">the README</a>. If you were using earlier versions of Spring, Jon just released 0.8, so check out <a href="https://github.com/jonleighton/spring/blob/master/CHANGELOG.md">the CHANGELOG</a> for details on what&#8217;s new.</p>
<p>The post <a href="http://thechangelog.com/spring-pre-load-your-rails-apps/">Spring: pre-load your Rails apps</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/spring-pre-load-your-rails-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scorched: a new Ruby web framework</title>
		<link>http://thechangelog.com/scorched-a-new-ruby-web-framework/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scorched-a-new-ruby-web-framework</link>
		<comments>http://thechangelog.com/scorched-a-new-ruby-web-framework/#comments</comments>
		<pubDate>Fri, 22 Mar 2013 20:14:59 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3812</guid>
		<description><![CDATA[<p>Disclaimer: this is a story about Ruby web frameworks, and I have commit bit to Rails Ruby has a long tail of web frameworks. There&#8217;s the big dogs, Rails and Sinatra, there&#8217;s some smaller frameworks with a devoted following like Padrino or Camping, and then there&#8217;s a ton of other frameworks like Ramaze, Merb, Cuba, [...]</p><p>The post <a href="http://thechangelog.com/scorched-a-new-ruby-web-framework/">Scorched: a new Ruby web framework</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Disclaimer: this is a story about Ruby web frameworks, and I have commit bit to Rails</p>

<hr />

<p>Ruby has a long tail of web frameworks. There&#8217;s the big dogs, Rails and Sinatra, there&#8217;s some smaller frameworks with a devoted following like Padrino or Camping, and then there&#8217;s a ton of other frameworks like Ramaze, Merb, Cuba, or Renee.</p>

<p>Now, we have another: <a href="http://scorchedrb.com/">Scorched</a>. Here&#8217;s what it has to say about itself:</p>

<blockquote>
  <p>Scorched is a true evolutionary enhancement of Sinatra, with more power, focus, and less clutter.</p>
</blockquote>

<p>This looks to be true. Here&#8217;s a Hello World in Scorched:</p>

<pre><code>require 'scorched'
class App &lt; Scorched::Controller
  get '/' do
    'hello world'
  end
end
run App
</code></pre>

<p>Here it is in Sinatra:</p>

<pre><code>require 'sinatra/base'
class App &lt; Sinatra::Base
  get '/' do
    'Hello world!'
  end
end
run App
</code></pre>

<p>Sooooo yeah. What&#8217;s different about it then? It takes on a very anti-&#8221;full stack&#8221; philosophy:</p>

<blockquote>
  <p>unlike other lightweight web frameworks that attempt to hide Rack in the background, Scorched makes no such attempts, very rarely providing functionality that overlaps with what&#8217;s already provided by Rack. In fact, familiarity with Rack is somewhat of a pre-requisite to mastering Scorched.</p>
</blockquote>

<p>You can do this kind of thing with Scorched, which somehow makes it feel even more low-level than Sinatra, yet higher-level than Rack:</p>

<pre><code>map pattern: '/', priority: -99, conditions: {methods: ['POST', 'PUT', 'DELETE']}, target: proc { |env|
  [200, {}, 'Bugger off']
}
</code></pre>

<p>The <a href="http://scorchedrb.com/docs/fundamentals/request_and_session_data">documentation</a> is pretty, and seems very full.</p>

<p>Scorched is also sponsored by <a href="http://www.phusion.nl/">Phusion</a>, who make the popular <a href="https://www.phusionpassenger.com/">Passenger</a> app server.</p>

<p>You can get <a href="https://github.com/wardrop/Scorched">the code on GitHub</a>, of course!</p>

<p>One more note: it was <a href="https://twitter.com/brixen/status/315197961208471552">pointed out to me on Twitter</a> that Scorched requires Ruby 2.0 only, and that&#8217;s true:</p>

<blockquote>
  <p>Scorched requires Ruby 2.0 as it makes use of a couple of new features. By the time Scorched hits v1.0, there should be little reason not to be running Ruby 2.0.</p>
</blockquote>
<p>The post <a href="http://thechangelog.com/scorched-a-new-ruby-web-framework/">Scorched: a new Ruby web framework</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/scorched-a-new-ruby-web-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Padrino Lives! After almost a year, 0.11.0 is *finally* released.</title>
		<link>http://thechangelog.com/padrino-lives/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=padrino-lives</link>
		<comments>http://thechangelog.com/padrino-lives/#comments</comments>
		<pubDate>Fri, 22 Mar 2013 18:04:56 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[padrino]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3791</guid>
		<description><![CDATA[<p>Over the years, we&#8217;ve been fans of Padrino. We&#8217;re happy to say congrats on releasing 0.11.0 fellas! Love the new logo too. From the announcement post: Since our 0.10.7 release (June 20th 2012), development on Padrino has been moving forward very actively and as such this is probably our biggest release in terms of code [...]</p><p>The post <a href="http://thechangelog.com/padrino-lives/">Padrino Lives! After almost a year, 0.11.0 is *finally* released.</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Over the years, <a href="http://thechangelog.com/tagged/padrino/">we&#8217;ve been fans of Padrino</a>. We&#8217;re happy to say congrats on releasing 0.11.0 fellas! Love the new logo too.</p>

<p>From <a href="http://www.padrinorb.com/blog/padrino-0-11-0-released-padrino-lives">the announcement post</a>:</p>

<blockquote>
  <p>Since our 0.10.7 release (June 20th 2012), development on Padrino has been moving forward very actively and as such <em>this is probably our biggest release</em> in terms of code modified and issues resolved that we have had in years.</p>
</blockquote>

<p>Check out <a href="http://www.padrinorb.com/blog/padrino-0-11-0-released-padrino-lives">the announcement post</a> to learn what&#8217;s new in 0.11.0 or fork <a href="https://github.com/padrino/padrino-framework">the source</a> on GitHub.</p>
<p>The post <a href="http://thechangelog.com/padrino-lives/">Padrino Lives! After almost a year, 0.11.0 is *finally* released.</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/padrino-lives/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cache ActiveRecord models in Memcached with IdentityCache by Shopify</title>
		<link>http://thechangelog.com/identity-cache/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=identity-cache</link>
		<comments>http://thechangelog.com/identity-cache/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 22:37:36 +0000</pubDate>
		<dc:creator>Andrew Thorp</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyGems]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3483</guid>
		<description><![CDATA[<p>Today Shopify open sourced a core piece of our infrastructure: identity cachegithub.com/Shopify/identi…&#8212; Tobias Lütke (@tobi) March 7, 2013 As the quote says, Shopify took a step to open source their solution for caching ActiveRecord model objects in Memcached. An elegant solution backed by a powerful data store, IdentityCache has already been used in production. It&#8217;s [...]</p><p>The post <a href="http://thechangelog.com/identity-cache/">Cache ActiveRecord models in Memcached with IdentityCache by Shopify</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<blockquote class="twitter-tweet" data-cards="hidden"><p>Today Shopify open sourced a core piece of our infrastructure: identity cache<a href="https://t.co/NXfDwkCkTB" title="https://github.com/Shopify/identity_cache">github.com/Shopify/identi…</a></p>&mdash; Tobias Lütke (@tobi) <a href="https://twitter.com/tobi/status/309660510666780672">March 7, 2013</a></blockquote>

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>As the quote says, Shopify took a step to open source their solution for caching ActiveRecord model objects in Memcached. An elegant solution backed by a powerful data store, IdentityCache has already been used in production. It&#8217;s fairly simple to install, straight from the <a href="https://github.com/Shopify/identity_cache#installation">README</a>:</p>

<p>Add this to your Gemfile:</p>

<pre><code>gem 'identity_cache', :git =&gt; 'git://github.com/Shopify/identity_cache.git'
</code></pre>

<p>Then <code>bundle,</code> and tell IdentityCache where Memcached is at:</p>

<pre><code>config.identity_cache_store = :mem_cache_store, Memcached::Rails.new(:servers =&gt; ["mem1.server.com"])
</code></pre>

<p>Usage is even easier, again from the <a href="https://github.com/Shopify/identity_cache#basic-usage">README</a>!</p>

<pre><code>class Product &lt; ActiveRecord::Base
  include IdentityCache
  has_many :images
  cache_has_many :images, :embed =&gt; true
end

# Fetch the product by it's id, the primary index.
@product = Product.fetch(id)

# Fetch the images for the Product. 
# Images are embedded so the product fetch would have 
# already loaded them.
@images = @product.fetch_images
</code></pre>

<p>IdentityCache also has support for: <strong>Secondary Indexes,</strong> <strong>Caching Associations</strong> and more. Head on over to GitHub to View the <a href="https://github.com/Shopify/identity_cache/blob/master/README.md">README</a> or the <a href="https://github.com/Shopify/identity_cache">Source Code.</a></p>
<p>The post <a href="http://thechangelog.com/identity-cache/">Cache ActiveRecord models in Memcached with IdentityCache by Shopify</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/identity-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby 2.0 is here!</title>
		<link>http://thechangelog.com/ruby-20/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ruby-20</link>
		<comments>http://thechangelog.com/ruby-20/#comments</comments>
		<pubDate>Sun, 24 Feb 2013 23:24:52 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=3191</guid>
		<description><![CDATA[<p>The time has come. Ruby 2.0 is here! From the announcement post on ruby-lang.org: We are pleased to announce the release of Ruby 2.0.0-p0. Ruby 2.0.0 is the first stable release of the Ruby 2.0 series, with many new features and improvements in response to the increasingly diverse and expanding demands for Ruby. Enjoy programming [...]</p><p>The post <a href="http://thechangelog.com/ruby-20/">Ruby 2.0 is here!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>The time has come. <em>Ruby 2.0 is here!</em></p>

<p>From <a href="http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released/">the announcement post</a> on ruby-lang.org:</p>

<blockquote>
  <p>We are pleased to announce the release of Ruby 2.0.0-p0.</p>
  
  <p>Ruby 2.0.0 is the first stable release of the Ruby 2.0 series, with many new features and improvements in response to the increasingly diverse and expanding demands for Ruby.</p>
  
  <p>Enjoy programming with Ruby 2.0.0!</p>
</blockquote>

<p><a href="http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released/#label-2">New features</a> include: Keyword arguments, utf-8 default encoding, a new regexp engine (Onigmo) and an asynchronous exception handling API (among others).</p>

<p>If you&#8217;re concerned about compatibility, <a href="http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released/">the announcement</a> has this to say about migrating from 1.9 to 2.0.</p>

<blockquote>
  <p>We have also taken care with the 2.0.0 design to make it compatible with 1.9. It will be easier to migrate from 1.9 to 2.0 than it was from 1.8 to 1.9.</p>
</blockquote>

<p><em>If you&#8217;ve played a part in contributioning to Ruby 2.0, we thank you!</em></p>
<p>The post <a href="http://thechangelog.com/ruby-20/">Ruby 2.0 is here!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/ruby-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Better Ruby specs with betterspecs.org</title>
		<link>http://thechangelog.com/better-specs-with-betterspecs-org/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=better-specs-with-betterspecs-org</link>
		<comments>http://thechangelog.com/better-specs-with-betterspecs-org/#comments</comments>
		<pubDate>Thu, 14 Feb 2013 18:53:25 +0000</pubDate>
		<dc:creator>Andrew Thorp</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[spec]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2840</guid>
		<description><![CDATA[<p>Rubyists love testing, and RSpec is a very popular tool to help you write your tests in Ruby. The Ruby community has started to accept certain guidelines on what writing good specs means, and Andrea Reginato is documenting those accepted rspec guidelines to help the rest of us keep up! Checkout the examples at betterspecs.org. [...]</p><p>The post <a href="http://thechangelog.com/better-specs-with-betterspecs-org/">Better Ruby specs with betterspecs.org</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Rubyists love testing, and <a href="/tagged/rspec">RSpec</a> is a very popular tool to help you write your tests in Ruby.</p>

<p>The Ruby community has started to accept certain guidelines on what <em>writing good specs</em> means, and <a href="https://twitter.com/andreareginato">Andrea Reginato</a> is documenting those accepted rspec guidelines to help the rest of us keep up!</p>

<p>Checkout the examples at <a href="http://betterspecs.org">betterspecs.org</a>. You can learn, share, and even debate the validity of the practices used. You can also <a href="https://github.com/andreareginato/betterspecs/">view the source</a> at GitHub.</p>
<p>The post <a href="http://thechangelog.com/better-specs-with-betterspecs-org/">Better Ruby specs with betterspecs.org</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/better-specs-with-betterspecs-org/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>s3_multipart: Multi-part file uploads straight to S3 for Rails</title>
		<link>http://thechangelog.com/s3_multipart-multi-part-file-uploads-straight-to-s3-for-rails/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=s3_multipart-multi-part-file-uploads-straight-to-s3-for-rails</link>
		<comments>http://thechangelog.com/s3_multipart-multi-part-file-uploads-straight-to-s3-for-rails/#comments</comments>
		<pubDate>Thu, 14 Feb 2013 18:05:18 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[S3]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2977</guid>
		<description><![CDATA[<p>There&#8217;s some things that every web application needs, and some they don&#8217;t need very often. File uploads are closer to the first category than the second; thinking back, most of my apps needed to upload files. If you need to upload big files, it&#8217;s kind of a problem: if you&#8217;re building a twelve-factor style app [...]</p><p>The post <a href="http://thechangelog.com/s3_multipart-multi-part-file-uploads-straight-to-s3-for-rails/">s3_multipart: Multi-part file uploads straight to S3 for Rails</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>There&#8217;s some things that every web application needs, and some they don&#8217;t need very often. File uploads are closer to the first category than the second; thinking back, most of my apps needed to upload files. If you need to upload big files, it&#8217;s kind of a problem: if you&#8217;re building a <a href="http://12factor.net/">twelve-factor style app</a> on something like Heroku, your web workers should have pretty short timeouts, since most of your requests are served quickly. But your file uploads take a long time. What to do?</p>

<p>Enter <code>s3_multipart</code>. From the README:</p>

<blockquote>
  <p>The S3 Multipart gem brings direct multipart uploading to S3 to Rails. <em>Data is piped from the client straight to Amazon S3</em> and a server-side callback is run when the upload is complete.</p>
  
  <p>Multipart uploading <em>allows files to be split into many chunks and uploaded in parallel</em> or succession (or both). This can result in dramatically increased upload speeds for the client and allows for the pausing and resuming of uploads.</p>
</blockquote>

<p>Neat, eh? The <a href="https://github.com/maxgillett/s3_multipart/blob/master/README.md">README</a> has more details of how to use the gem. It&#8217;s a bit complex: you need to set up <a href="http://en.wikipedia.org/wiki/Cross-origin_resource_sharing">CORS</a> on your S3 bucket, run some generators, write some JavaScript.</p>

<p>The gem is still young, and looking for contributions. This is a tough problem, and having an easy way to solve it is great!</p>
<p>The post <a href="http://thechangelog.com/s3_multipart-multi-part-file-uploads-straight-to-s3-for-rails/">s3_multipart: Multi-part file uploads straight to S3 for Rails</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/s3_multipart-multi-part-file-uploads-straight-to-s3-for-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ghost means never having to touch ssh/config again (either)</title>
		<link>http://thechangelog.com/ghost-means-never-having-to-touch-sshconfig-again/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ghost-means-never-having-to-touch-sshconfig-again</link>
		<comments>http://thechangelog.com/ghost-means-never-having-to-touch-sshconfig-again/#comments</comments>
		<pubDate>Tue, 12 Feb 2013 05:17:53 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyGems]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2941</guid>
		<description><![CDATA[<p>As a throwback to our original coverage of Ghost back in 2010, I wanted to share a hidden feature I just discovered in Ghost. Two years ago Felipe Coury submitted a pull request to add ghost-ssh to manipulate ~/.ssh/config files. If it weren&#8217;t for Google pointing me to this pull request, I would have never [...]</p><p>The post <a href="http://thechangelog.com/ghost-means-never-having-to-touch-sshconfig-again/">Ghost means never having to touch ssh/config again (either)</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>As a throwback to <a href="http://thechangelog.com/ghost-means-never-having-to-touch-etc-hosts-again/">our original coverage of Ghost back in 2010</a>, I wanted to share a hidden feature I just discovered in <a href="https://github.com/bjeanes/ghost">Ghost</a>.</p>

<p>Two years ago <a href="https://github.com/fcoury">Felipe Coury</a> submitted <a href="https://github.com/bjeanes/ghost/pull/10">a pull request</a> to add <code>ghost-ssh</code> to manipulate <code>~/.ssh/config</code> files. If it weren&#8217;t for Google pointing me to this pull request, I would have never known <code>ghost-ssh</code> existed. <em><a href="https://github.com/bjeanes/ghost/blob/master/README.md">The readme</a> says nothing about it!</em></p>

<p>This is what Felipe had to say when he submitted <a href="https://github.com/bjeanes/ghost/pull/10">his patch</a>:</p>

<blockquote>
  <p>I had a need to manipulate ~/.ssh/config file the same way I can manipulate my hosts entries, so I made this change.</p>
  
  <p>Not sure if it will be useful for the upstream project, but be welcome to merge if you like.</p>
</blockquote>

<h2>An intro to ghost-ssh</h2>

<p>Just like with <code>ghost</code> on the command line, <code>ghost-ssh</code> has basic <code>list</code>, <code>add</code>, and <code>delete</code> options, as well as an <code>import</code> operation to import files.</p>

<p>To save you some time, here&#8217;s the contents of <code>ghost-ssh --help</code>:</p>

<pre><code>$ ghost-ssh --help
USAGE: ghost-ssh add &lt;host&gt; &lt;hostname&gt; [--user=&lt;user&gt;] [--port=&lt;port&gt;]
       ghost-ssh modify &lt;host&gt; &lt;hostname&gt; [--user=&lt;user&gt;] [--port=&lt;port&gt;]
       ghost-ssh delete &lt;host&gt;
       ghost-ssh list
       ghost-ssh empty
       ghost-ssh export
       ghost-ssh import &lt;file&gt;
</code></pre>

<p>An example of adding a new entry to your <code>ssh/config</code> might look something like this:</p>

<pre><code>$ ghost-ssh add tclprod xxxxxx.gridserver.com --user=tcladmin
  [Adding] tclprod -&gt; xxxxxx.gridserver.com
</code></pre>

<p>You can confirm the entry was added to <code>ssh/config</code> by running the <code>ghost-ssh list</code> command:</p>

<pre><code>$ghost-ssh list                                             
Listing 1 configs(s):
  tclprod -&gt; tcladmin@xxxxxx.gridserver.com:22
</code></pre>

<p>Now that I have this new entry in place, I can easily ssh into the server by running <code>ssh tclprod</code> and <em>boom goes the dynamite!</em></p>

<p>Checkout <a href="https://github.com/bjeanes/ghost">the source for Ghost</a> on GitHub for install and usage details.</p>

<p><a href="http://news.ycombinator.com/item?id=5205321">Discuss on Hacker News</a> if you&#8217;d like.</p>
<p>The post <a href="http://thechangelog.com/ghost-means-never-having-to-touch-sshconfig-again/">Ghost means never having to touch ssh/config again (either)</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/ghost-means-never-having-to-touch-sshconfig-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New security releases for Rails: Rails 3.2.12, 3.1.11, and 2.3.17</title>
		<link>http://thechangelog.com/new-security-releases-for-rails-rails-3-2-12-3-1-11-and-2-3-17/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=new-security-releases-for-rails-rails-3-2-12-3-1-11-and-2-3-17</link>
		<comments>http://thechangelog.com/new-security-releases-for-rails-rails-3-2-12-3-1-11-and-2-3-17/#comments</comments>
		<pubDate>Tue, 12 Feb 2013 00:55:04 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2921</guid>
		<description><![CDATA[<p>This year has been a rocky start for Rails, with a bunch of security upgrades that have been important to perform. The end result is a more secure Rails for us all, however, so while it&#8217;s annoying, it&#8217;s worth it. How do I upgrade? You need to do two things: Upgrade your Rails. Make sure [...]</p><p>The post <a href="http://thechangelog.com/new-security-releases-for-rails-rails-3-2-12-3-1-11-and-2-3-17/">New security releases for Rails: Rails 3.2.12, 3.1.11, and 2.3.17</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>This year has been a rocky start for Rails, with a bunch of security upgrades that have been important to perform. The end result is a more secure Rails for us all, however, so while it&#8217;s annoying, <em>it&#8217;s worth it</em>.</p>

<span id="more-2921"></span>

<h2>How do I upgrade?</h2>

<p>You need to do two things:</p>

<ol>
<li>Upgrade your Rails. Make sure to get 3.2.12, 3.1.11, or 2.3.17.</li>
<li>Upgrade your JSON gem. Make sure you get 1.7.7, 1.6.8, 1.5.5.</li>
</ol>

<p>Most of this can be done by changing your Gemfile to look like this:</p>

<p><code>gem "rails", "3.2.12"</code></p>

<p>And then running <code>bundle update rails</code>. This will <em>probably</em> update your JSON gem as well, but to be sure, check your <code>Gemfile.lock</code>.</p>

<p>Run <code>cat Gemfile.lock | grep "rails"</code> and <code>cat Gemfile.lock | grep "json"</code>, if you see lines that look like <code>rails (= 3.1.12)</code> and <code>json (1.7.7)</code>, then you&#8217;re good to go.</p>

<h2>What are the vulnerabilities?</h2>

<p>First, there is one fix in the 3.x series: <a href="https://groups.google.com/forum/?fromgroups=#!topic/rubyonrails-security/AFBKNY7VSH8">CVE-2013-0276</a>.</p>

<p>If you&#8217;re using <code>attr_protected</code> to blacklist items for mass assignment, a poor regex could allow someone to assign those attributes anyway. If you&#8217;re using <code>attr_accessible</code> to whitelist items, you&#8217;re fine.</p>

<p>This is also a good time to plug <a href="https://github.com/rails/strong_parameters">strong_parameters</a>. Released as a gem for Rails 3.x, it will replace <code>attr_accessible</code> as the default security solution for Rails 4. If you&#8217;re starting a new Rails 3.x app today, you should default to using it, as it&#8217;s a much better solution.</p>

<p>If you&#8217;re on Rails 2.3 or 3.0, you have <a href="https://groups.google.com/forum/?fromgroups=#!topic/rubyonrails-security/KtmwSbEpzrU">CVE-2013-0277</a>.</p>

<p>If you serialize attributes into the database, they can be deserialized via YAML, with the same implications as the previous YAML vulnerabilities.</p>

<p>Finally, the JSON gem has <a href="https://groups.google.com/forum/?fromgroups=#!topic/rubyonrails-security/4_YvCpLzL58">CVE-2013-0269</a>.</p>

<p>The JSON gem can be made to symbolize user input, which can cause a denial of service attack, since symbols are not garbage collected.</p>

<h2>For More</h2>

<p>You might also want to see <a href="http://weblog.rubyonrails.org/2013/2/11/SEC-ANN-Rails-3-2-12-3-1-11-and-2-3-17-have-been-released/">the official release announcement</a>, which includes hashes of the gemfiles.</p>

<p><a href="http://news.ycombinator.com/item?id=5205161">Discuss at Hacker News</a> if you have questions or thoughts to share.</p>
<p>The post <a href="http://thechangelog.com/new-security-releases-for-rails-rails-3-2-12-3-1-11-and-2-3-17/">New security releases for Rails: Rails 3.2.12, 3.1.11, and 2.3.17</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/new-security-releases-for-rails-rails-3-2-12-3-1-11-and-2-3-17/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Topaz, a new Ruby written in Python on top of RPython</title>
		<link>http://thechangelog.com/topaz-a-new-ruby-written-in-python-on-top-of-rpython/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=topaz-a-new-ruby-written-in-python-on-top-of-rpython</link>
		<comments>http://thechangelog.com/topaz-a-new-ruby-written-in-python-on-top-of-rpython/#comments</comments>
		<pubDate>Wed, 06 Feb 2013 17:55:12 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[PyPy]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2827</guid>
		<description><![CDATA[<p>From the announcement blog post: Topaz is written in Python on top of the RPython translation toolchain (the same one that powers PyPy). Its primary goals are simplicity and performance. Because Topaz builds on RPython, and thus much of the fantastic work of the PyPy developers, it comes out of the box with a high [...]</p><p>The post <a href="http://thechangelog.com/topaz-a-new-ruby-written-in-python-on-top-of-rpython/">Topaz, a new Ruby written in Python on top of RPython</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>From <a href="http://docs.topazruby.com/en/latest/blog/announcing-topaz/">the announcement blog post</a>:</p>

<blockquote>
  <p><em>Topaz is written in Python</em> on top of the RPython translation toolchain (the same one that powers PyPy). Its primary goals are simplicity and performance.</p>
  
  <p>Because Topaz builds on RPython, and thus much of the fantastic work of the PyPy developers, it comes out of the box with a high performance garbage collector, and a state of the art JIT (just-in-time) compiler. What does this mean? <em>Out of the box Topaz is extremely fast.</em></p>
  
  <p>Topaz is far from complete and is missing many builtin methods and classes. However, it does have nearly every element of Ruby, including classes, blocks, many builtin types, all sorts of method calls, and much much more. <em>We don&#8217;t yet consider it stable</em>, but it&#8217;s getting closer every day.</p>
</blockquote>

<p>Check out <a href="https://github.com/topazproject/topaz">the source</a> and <a href="https://github.com/topazproject/topaz#readme">readme</a> on GitHub to get started.</p>

<p>Give a shout out to <a href="https://twitter.com/alex_gaynor">Alex Gaynor</a> for his hard work on this.</p>
<p>The post <a href="http://thechangelog.com/topaz-a-new-ruby-written-in-python-on-top-of-rpython/">Topaz, a new Ruby written in Python on top of RPython</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/topaz-a-new-ruby-written-in-python-on-top-of-rpython/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vagrant, by HashiCorp</title>
		<link>http://thechangelog.com/vagrant-by-hashicorp/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=vagrant-by-hashicorp</link>
		<comments>http://thechangelog.com/vagrant-by-hashicorp/#comments</comments>
		<pubDate>Wed, 06 Feb 2013 14:11:24 +0000</pubDate>
		<dc:creator>Andrew Thorp</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[vagrant]]></category>
		<category><![CDATA[virtualization]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2821</guid>
		<description><![CDATA[<p>Vagrant, the tool for building and distributing work environments, which we covered in one of our podcasts, has been growing and changing a lot in the last few months. Most notably, Mitchell Hashimoto, the creator and maintainer of the project, has launched HashiCorp &#8211; a company to help drive the development forward. He wrote a [...]</p><p>The post <a href="http://thechangelog.com/vagrant-by-hashicorp/">Vagrant, by HashiCorp</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Vagrant, <em>the tool for building and distributing work environments</em>, which we covered in one of our <a href="http://http://thechangelog.com/episode-0-7-2-vagrant-with-mitchell-hashimoto/" title="Vagrant Podcast" target="_blank">podcasts</a>, has been growing and changing a lot in the last few months. Most notably, <a href="https://twitter.com/mitchellh" title="Mitchell's Twitter" target="_blank">Mitchell Hashimoto</a>, the creator and maintainer of the project, has launched <a href="http://www.hashicorp.com" target="_blank">HashiCorp</a> &#8211; a company to help drive the development forward.</p>

<p>He wrote <a href="http://www.hashicorp.com/blog/announcing-hashicorp.html" target="_blank">a great article</a> on why he decided to launch HashiCorp now, and I encourage you to read it. The best way to summarize the change comes from the article itself:</p>

<blockquote>
  <p>I must stress that Vagrant will always remain open source and liberally licensed. The difference moving forward is that I will be working on it full-time.</p>
</blockquote>

<p>As always, you can <a href="http://www.vagrantup.com/" title="Vagrant Up" target="_blank">visit Vagrant&#8217;s website</a> or <a href="https://github.com/mitchellh/vagrant" target="_blank">view the source on GitHub</a>.</p>
<p>The post <a href="http://thechangelog.com/vagrant-by-hashicorp/">Vagrant, by HashiCorp</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/vagrant-by-hashicorp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linotype is atebits&#8217; Letterpress game engine in Ruby</title>
		<link>http://thechangelog.com/linotype-is-atebits-letterpress-game-engine-in-ruby/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linotype-is-atebits-letterpress-game-engine-in-ruby</link>
		<comments>http://thechangelog.com/linotype-is-atebits-letterpress-game-engine-in-ruby/#comments</comments>
		<pubDate>Mon, 04 Feb 2013 23:16:01 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[game engine]]></category>
		<category><![CDATA[gaming]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2731</guid>
		<description><![CDATA[<p>If you code in Ruby and you&#8217;re a fan of Letterpress from atebits, Linotype should get you excited. The project was inspired by this tweet by Andy Baio and started by Sean Devine. From the readme: Linotype is a simple ruby implementation of the Letterpress for iOS game mechanic. Letterpress was created by Loren Brichter [...]</p><p>The post <a href="http://thechangelog.com/linotype-is-atebits-letterpress-game-engine-in-ruby/">Linotype is atebits&#8217; Letterpress game engine in Ruby</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>If you code in Ruby and you&#8217;re a fan of <a href="http://www.atebits.com/letterpress/">Letterpress from atebits</a>, Linotype should get you excited. The project was inspired by <a href="https://twitter.com/waxpancake/statuses/261966416507465728">this tweet</a> by <a href="https://twitter.com/waxpancake">Andy Baio</a> and started by <a href="https://twitter.com/barelyknown">Sean Devine</a>.</p>

<p>From <a href="https://github.com/barelyknown/linotype#readme">the readme</a>:</p>

<blockquote>
  <p>Linotype is a simple ruby implementation of the Letterpress for iOS game mechanic. Letterpress was created by Loren Brichter and is sold on iTunes. Linotype is meant to be used to write other programs such as simple player command line games, cheating/simulation programs, web-based versions, or whatever else you can think of. My goal is that the community will submit pull requests to this project so that programs can share a common engine.</p>
</blockquote>

<p>Sean&#8217;s goal with this project is to have the community submit pull requests so the other programs can share a common game engine. Also <a href="https://github.com/barelyknown/linotype#readme">the readme</a> has a few <a href="https://github.com/barelyknown/linotype#feature-ideas">feature ideas</a> mentioned.</p>

<p>Check out <a href="https://github.com/barelyknown/linotype">the source</a> on GitHub to get started, or <a href="http://news.ycombinator.com/item?id=5167963">discuss at Hacker News</a>.</p>
<p>The post <a href="http://thechangelog.com/linotype-is-atebits-letterpress-game-engine-in-ruby/">Linotype is atebits&#8217; Letterpress game engine in Ruby</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/linotype-is-atebits-letterpress-game-engine-in-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jim Weirich&#8217;s Rake goes from 0.9.6 to 10.0.0</title>
		<link>http://thechangelog.com/jim-weirichs-rake-goes-from-0-9-6-to-10-0-0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=jim-weirichs-rake-goes-from-0-9-6-to-10-0-0</link>
		<comments>http://thechangelog.com/jim-weirichs-rake-goes-from-0-9-6-to-10-0-0/#comments</comments>
		<pubDate>Mon, 04 Feb 2013 17:03:38 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[semantic versioning]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2705</guid>
		<description><![CDATA[<p>Somewhat old news, but worth a mention &#8230; ~84 days ago, we favorited this Tweet knowing that when we relaunched we&#8217;d post about Rake&#8217;s jump from version 0.9.6 to 10.0.0. Rake 10 is out (and its backwards compatibility release 0.9.3) is out as well. github.com/jimweirich/rak…&#8212; Jim Weirich (@jimweirich) November 12, 2012 Also, below is a [...]</p><p>The post <a href="http://thechangelog.com/jim-weirichs-rake-goes-from-0-9-6-to-10-0-0/">Jim Weirich&#8217;s Rake goes from 0.9.6 to 10.0.0</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Somewhat old news, but worth a mention &#8230; ~84 days ago, we favorited <a href="https://twitter.com/jimweirich/status/268043906019622912">this Tweet</a> knowing that <a href="http://thechangelog.com/relaunched-member-supported/">when we relaunched</a> we&#8217;d post about Rake&#8217;s jump from version 0.9.6 to 10.0.0.</p>

<blockquote class="twitter-tweet"><p>Rake 10 is out (and its backwards compatibility release 0.9.3) is out as well. <a href="https://t.co/NSzMTUWP" title="https://github.com/jimweirich/rake/blob/rake-10.0.0/doc/release_notes/rake-10.0.0.rdoc">github.com/jimweirich/rak…</a></p>&mdash; Jim Weirich (@jimweirich) <a href="https://twitter.com/jimweirich/status/268043906019622912">November 12, 2012</a></blockquote>

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Also, below is a screenshot of <a href="https://rubygems.org/gems/rake/versions">Rake&#8217;s version history</a> shown at <a href="https://rubygems.org/">RubyGems.org</a>. Notice the jump from 0.9.6 to 10.0.0.beta.1. What&#8217;s up with that?</p>

<p><img src="http://thechangelog.com/wp-content/uploads/rake-versions.png" alt="Rake versions" /></p>

<p>If you&#8217;ve had a chance to hear Jim talk at conferences or <a href="https://twitter.com/jimweirich/status/268043906019622912">over twitter</a> about Rake&#8217;s version history, he often gets asked, &#8220;Jim, when will Rake reach version 1.0?&#8221;</p>

<p>Well, <a href="https://github.com/jimweirich/rake/blob/next-major-release/doc/release_notes/rake-10.0.0.rdoc">from the readme for 10.0.0</a>, he has this to say in response to that question:</p>

<blockquote>
  <p>Over the past several years I’ve been asked that question at conferences, panels and over twitter. Due to historical reasons (or maybe just plain laziness) Rake has (incorrectly) been treating the second digit of the version as the major release number. So in my head Rake was already at version 9.</p>
  
  <p>Well, it’s time to fix things. This next version of Rake drops old, crufty, backwards compatibility hacks such as top level constants, DSL methods defined in Object and numerous other features that are just no longer desired. It’s also time to drop the leading zero from the version number as well and call this new version of rake what it really is: Version 10.</p>
  
  <p>So, welcome to Rake 10.0!</p>
</blockquote>

<p>At The Changelog, we love <a href="http://semver.org/">semantic versioning</a>, and this is a case where the change was the right move to make!</p>
<p>The post <a href="http://thechangelog.com/jim-weirichs-rake-goes-from-0-9-6-to-10-0-0/">Jim Weirich&#8217;s Rake goes from 0.9.6 to 10.0.0</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/jim-weirichs-rake-goes-from-0-9-6-to-10-0-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using ImageOptim with guard-shell</title>
		<link>http://thechangelog.com/using-imageoptim-with-guard-shell/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-imageoptim-with-guard-shell</link>
		<comments>http://thechangelog.com/using-imageoptim-with-guard-shell/#comments</comments>
		<pubDate>Fri, 01 Feb 2013 16:00:11 +0000</pubDate>
		<dc:creator>Adam Jahnke</dc:creator>
				<category><![CDATA[Opinions]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2537</guid>
		<description><![CDATA[<p>For the uninitiated, ImageOptim is a great Mac app that uses several well-known image optimization tools to compress images and help keep file sizes down and Guard is &#8220;a command line tool to easily handle events on file system modifications.&#8221; If you&#8217;ve never tried Guard, I&#8217;d encourage you to take some time and check it [...]</p><p>The post <a href="http://thechangelog.com/using-imageoptim-with-guard-shell/">Using ImageOptim with guard-shell</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>For the uninitiated, <a href="http://imageoptim.com">ImageOptim</a> is a great Mac app that uses several well-known image optimization tools to compress images and help keep file sizes down and <a href="https://github.com/guard/guard">Guard</a> is &#8220;a command line tool to easily handle events on file system modifications.&#8221; If you&#8217;ve never tried Guard, I&#8217;d encourage you to take some time and check it out. With over <a href="https://rubygems.org/search?query=guard-">150 plugins</a> now available, there&#8217;s surely some way that you can use it to optimize your workflow.</p>

<p>I like to pair the <a href="https://github.com/guard/guard-shell">guard-shell</a> gem with ImageOptim to help me keep my project&#8217;s image assets compressed and ready for production. Make sure you have both guard and guard-shell in your Gemfile and set up a watcher in your Guardfile for new or edited images:</p>

<pre><code># Gemfile
gem 'guard'
gem 'guard-shell'
</code></pre>

<pre><code># Guardfile
guard 'shell' do
  watch %r{^public/images/.} do |file|
    n file[0], "#{file[0]} changed"
    `open #{file[0]} -a ImageOptim`
  end
end
</code></pre>

<p>An interesting side effect to note is that guard will catch the file change when ImageOptim is done compressing and re-open it in ImageOptim and continue this loop untill there&#8217;s nothing else ImageOptim can compress out of the image.</p>
<p>The post <a href="http://thechangelog.com/using-imageoptim-with-guard-shell/">Using ImageOptim with guard-shell</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/using-imageoptim-with-guard-shell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenHack your city</title>
		<link>http://thechangelog.com/openhack-your-city/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=openhack-your-city</link>
		<comments>http://thechangelog.com/openhack-your-city/#comments</comments>
		<pubDate>Thu, 31 Jan 2013 04:02:11 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Jekyll]]></category>
		<category><![CDATA[meetups]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2628</guid>
		<description><![CDATA[<p>OpenHack is a meetup with a simple purpose: Code together, on anything. We&#8217;d love to start OpenHack in as many cities as possible. This site is meant to facilitate starting new OpenHack groups, but isn&#8217;t meant to actually &#8220;run&#8221; or &#8220;RSVP&#8221; for groups. If you want to start an OpenHack in your city, just fork [...]</p><p>The post <a href="http://thechangelog.com/openhack-your-city/">OpenHack your city</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a href="http://openhack.github.com/">OpenHack</a> is a meetup with a simple purpose: <em>Code together, on anything.</em></p>

<blockquote>
  <p>We&#8217;d love to start OpenHack in as many cities as possible. This site is meant to facilitate starting new OpenHack groups, but isn&#8217;t meant to actually &#8220;run&#8221; or &#8220;RSVP&#8221; for groups.</p>
</blockquote>

<p>If you want to start an OpenHack in your city, just fork the <a href="https://github.com/openhack/openhack.github.com">openhack.github.com</a> repo and follow the instructions at <a href="http://openhack.github.com/yours/">openhack.github.com/yours</a>. If you have feedback or issues with the process, open an <a href="https://github.com/openhack/openhack.github.com/issues">issue</a> and ask for help.</p>

<p>BTW, I love how issues are used with this project, not to mention, the OpenHack site(s) are hosted on GitHub for free.</p>

<h2>OpenHack basics</h2>

<p>Copy and pasted from <a href="http://openhack.github.com/">the homepage</a>:</p>

<ul>
<li>You can hack on anything! Any language, framework, public/open-source, personal, etc.</li>
<li>You don&#8217;t have to have an idea to hack on! You&#8217;re more than welcome to come just to pair with someone.</li>
<li>Start off with a quick round of introductions <strong>(every night!)</strong>, to say who you are, what you&#8217;re working on, and if you&#8217;d like help with your idea.</li>
<li>Provide food and some coffee/drinks for attendees. Sponsors will help immensely with funding this.</li>
<li>Someone has to host the meetup. That person is in charge of ordering food and starting off the intro.</li>
<li>Don&#8217;t go too late. 9-10pm is good. Focus usually wanes by this point, for obvious reasons! Maybe if there&#8217;s interest head to a bar for more discussion.</li>
</ul>

<p>What are you waiting for? <em><a href="http://openhack.github.com/yours/">OpenHack your city</a>.</em></p>
<p>The post <a href="http://thechangelog.com/openhack-your-city/">OpenHack your city</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/openhack-your-city/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Better Rails development with better_errors!</title>
		<link>http://thechangelog.com/better-rails-development-with-better-errors/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=better-rails-development-with-better-errors</link>
		<comments>http://thechangelog.com/better-rails-development-with-better-errors/#comments</comments>
		<pubDate>Wed, 30 Jan 2013 14:16:06 +0000</pubDate>
		<dc:creator>Andrew Thorp</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyGems]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2574</guid>
		<description><![CDATA[<p>If you are anything like me (a Rails developer that enjoys good design), you will be glad to know that there is a project out there to make the default error pages for Rails development much cleaner! The standard features are simple, and pretty much just a polished version of what Rails offers out of [...]</p><p>The post <a href="http://thechangelog.com/better-rails-development-with-better-errors/">Better Rails development with better_errors!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>If you are anything like me (a Rails developer that enjoys good design), you will be glad to know that there is a project out there to make the default error pages for Rails development much cleaner! The standard features are simple, and pretty much just a polished version of what Rails offers out of the box:</p>

<ul>
<li>Full stack trace.</li>
<li>Source code inspection, with highlighting.</li>
</ul>

<p>As a bonus, if you install the extra dependency, you get access to the following features:</p>

<ul>
<li>REPL</li>
<li>Local/instance variable inspection.</li>
</ul>

<p>Installing it couldn&#8217;t be easier. While the project is usable outside of Rails, let&#8217;s assume you are using Rails/Bundler:</p>

<pre><code>group :development do
  gem "better_errors"
  gem "binding_of_caller" # Optional, only for the advanced features
end
</code></pre>

<p>That&#8217;s it! <a href="https://github.com/charliesome/better_errors" title="Project Repo">Checkout the project on GitHub</a> or <a href="https://github.com/charliesome/better_errors#better-errors" title="README">view the README.</a></p>
<p>The post <a href="http://thechangelog.com/better-rails-development-with-better-errors/">Better Rails development with better_errors!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/better-rails-development-with-better-errors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Work with 1.8 million IRS-recognized Nonprofits in Ruby with the GuideStar API</title>
		<link>http://thechangelog.com/ruby-guidestar-api/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ruby-guidestar-api</link>
		<comments>http://thechangelog.com/ruby-guidestar-api/#comments</comments>
		<pubDate>Wed, 16 Jan 2013 03:21:24 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Nonprofit]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[wrappers]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/?p=2129</guid>
		<description><![CDATA[<p>For those out there working on fighting social injustices and changing the world like we are at Pure Charity, I wanted to mention this Ruby wrapper for the Guidestar API from Mauricio Gomes of Gemini SBS. We&#8217;re making use of it :) For example, we can&#8230; Search by organization name: Guidestar::Client.search(:name =&#62; "Help One Now") [...]</p><p>The post <a href="http://thechangelog.com/ruby-guidestar-api/">Work with 1.8 million IRS-recognized Nonprofits in Ruby with the GuideStar API</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>For those out there working on fighting social injustices and changing the world like we are at <a href="http://purecharity.com/">Pure Charity</a>, I wanted to mention this Ruby wrapper for the <a href="http://www.guidestar.org/">Guidestar</a> API from <a href="https://github.com/mgomes">Mauricio Gomes</a> of <a href="https://github.com/geminisbs">Gemini SBS</a>.</p>

<p>We&#8217;re making use of it :)</p>

<p>For example, we can&#8230;</p>

<p><strong>Search by organization name</strong>:</p>

<pre><code>Guidestar::Client.search(:name =&gt; "Help One Now")
</code></pre>

<p><strong>Search by EIN</strong>:</p>

<pre><code>Guidestar::Client.search(:ein =&gt; "26-3618295")
</code></pre>

<p><a href="https://github.com/geminisbs/guidestar#usage">and more</a> &#8230;</p>

<p>From the <a href="http://www.guidestar.org/rxg/about-us/index.aspx">about page</a>:</p>

<blockquote>
  <p>If you care about nonprofits and the work they do, then you&#8217;re affected by what GuideStar does. We gather and publicize information about nonprofit organizations. Our reach is far and wide. Our database is broad and deep. We encourage nonprofits to share information about their organizations openly and completely.</p>
</blockquote>

<p>If you&#8217;re new to GuideStar, you can search and find the nonprofit information you need (or integrate with their API) &#8211; <del datetime="2013-02-04T18:37:16+00:00">and it&#8217;s free</del>.</p>

<p>Check out <a href="https://github.com/geminisbs/guidestar">the source</a> on GitHub or <a href="https://www.guidestar.org/Login.aspx?ReturnUrl=http://www.guidestar.org/rxg/about-us/index.aspx">create your account</a> to get started.</p>

<p><em>UPDATE</em>: It turns out that access to the web search is free, but API access is not free. Bummer. Personally, I think a free limited API would be a smart choice for GuideStar.</p>
<p>The post <a href="http://thechangelog.com/ruby-guidestar-api/">Work with 1.8 million IRS-recognized Nonprofits in Ruby with the GuideStar API</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/ruby-guidestar-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Roll your own crowdfunding with Selfstarter</title>
		<link>http://thechangelog.com/roll-your-own-crowdfunding-with-selfstarter/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=roll-your-own-crowdfunding-with-selfstarter</link>
		<comments>http://thechangelog.com/roll-your-own-crowdfunding-with-selfstarter/#comments</comments>
		<pubDate>Wed, 24 Oct 2012 07:31:29 +0000</pubDate>
		<dc:creator>Adam Stacoviak</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Crowd Funding]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/roll-your-own-crowdfunding-with-selfstarter/</guid>
		<description><![CDATA[<p>For those of you that follow The Industry Radio Show, you&#8217;ll know that we&#8217;ve talked quite a bit about Kickstarter and the self-propelled crowdfunding movement they&#8217;ve helped foster. In the same vein, there&#8217;s this neat open source project built on Ruby on Rails (at the time of this post v3.2.8), nicely titled Selfstarter. Selfstarter is [...]</p><p>The post <a href="http://thechangelog.com/roll-your-own-crowdfunding-with-selfstarter/">Roll your own crowdfunding with Selfstarter</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>For those of you that follow <a href="http://theindustry.cc/category/podcast/">The Industry Radio Show</a>, you&#8217;ll know that we&#8217;ve talked quite a bit about Kickstarter and the self-propelled crowdfunding movement they&#8217;ve helped foster. In the same vein, there&#8217;s this neat open source project built on Ruby on Rails (at the time of this post v3.2.8), nicely titled <a href="http://selfstarter.us/">Selfstarter</a>.</p>
<p>Selfstarter is an open source starting point for building out your own ad-hoc crowdfunding site. <a href="http://techcrunch.com/2012/10/07/the-story-of-lockitron-crowdfunding-without-kickstarter/">After getting rejected by Kickstarter</a>, the fine folks at Lockitron decided to follow in the footsteps of <a href="https://join.app.net/">App.net</a> and make their own crowdfunding site for <a href="https://lockitron.com/preorder">Lockitron</a>.</p>
<p>Selfstarter is a starting point, so you&#8217;re going to have to make some additions to tailor it for your project.</p>
<p>The post <a href="http://thechangelog.com/roll-your-own-crowdfunding-with-selfstarter/">Roll your own crowdfunding with Selfstarter</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/roll-your-own-crowdfunding-with-selfstarter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cane &#8211; Ruby code quality thresholds</title>
		<link>http://thechangelog.com/cane-ruby-code-quality-thresholds/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cane-ruby-code-quality-thresholds</link>
		<comments>http://thechangelog.com/cane-ruby-code-quality-thresholds/#comments</comments>
		<pubDate>Mon, 13 Aug 2012 13:33:00 +0000</pubDate>
		<dc:creator>Andrew Thorp</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Code Quality]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/cane-ruby-code-quality-thresholds/</guid>
		<description><![CDATA[<p>Xavier Shay, an engineer at Square, has released Cane, a tool that gives you &#8220;code quality threshold checking as part of your build&#8221;. Cane checks things like Style Metrics (Line length), ABC Metrics, Documentation, etc. It shines against some of the other code quality tools out there for a number of reasons: 1.9 based Low [...]</p><p>The post <a href="http://thechangelog.com/cane-ruby-code-quality-thresholds/">Cane &#8211; Ruby code quality thresholds</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a href="http://twitter.com/xshay">Xavier Shay</a>, an engineer at <a href="http://www.squareup.com/">Square</a>, has released Cane, a tool that gives you &#8220;code quality threshold checking as part of your build&#8221;. Cane checks things like Style Metrics (Line length), ABC Metrics, Documentation, etc. It shines against some of the other code quality tools out there for a number of reasons:</p>

<ul><li>1.9 based</li>
<li>Low false positives</li>
<li>Very fast (even on large code bases)</li>
<li>Zero external dependencies</li>
</ul>

<p>Using it is simple:</p>

<pre><code>gem install cane
cane --abc-glob '{lib,spec}/**/*.rb' --abc-max 15
</code></pre>

<p>I spoke with Xavier, and two things he would love to see from the community are a flag for machine readable output, with an easy way to hook it into Jenkins, and a &#8220;sane way to wire in new checks.&#8221; Currently, extending cane requires you edit far too many files, visit <a href="https://github.com/square/cane/pull/15">this pull request</a> for some background.</p>

<p>This is an extremely small, fast, and easy-to-use project that gives you some very cool features with a very small learning curve. <a href="https://github.com/square/cane">View the Source</a> at GitHub.</p>
<p>The post <a href="http://thechangelog.com/cane-ruby-code-quality-thresholds/">Cane &#8211; Ruby code quality thresholds</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/cane-ruby-code-quality-thresholds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rack::CoreData &#8211; Automatically generate REST APIs for Core Data models</title>
		<link>http://thechangelog.com/rack-coredata-automatically-generate-rest-apis-for-core/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rack-coredata-automatically-generate-rest-apis-for-core</link>
		<comments>http://thechangelog.com/rack-coredata-automatically-generate-rest-apis-for-core/#comments</comments>
		<pubDate>Tue, 24 Jul 2012 18:18:01 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Core Data]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Rack]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/rack-coredata-automatically-generate-rest-apis-for-core/</guid>
		<description><![CDATA[<p>An interesting project from Mattt to scaffold RESTful web services based on CoreData models using Rack. require 'bundler' Bundler.require # Rack::CoreData requires a Sequel connection to a database DB = Sequel.connect(ENV['DATABASE_URL'] &#124;&#124; "postgres://localhost:5432/coredata") run Rack::CoreData('./Example.xcdatamodeld') In summary:• AFIncrementalStore: *poof* no client code.• Rack::CoreData: *poof* no server code.&#8212; Mattt Thompson (@mattt) July 24, 2012 View the [...]</p><p>The post <a href="http://thechangelog.com/rack-coredata-automatically-generate-rest-apis-for-core/">Rack::CoreData &#8211; Automatically generate REST APIs for Core Data models</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>An interesting project from <a href="http://twitter.com/mattt">Mattt</a> to scaffold RESTful web services based on CoreData models using Rack.</p>

<pre><code>require 'bundler'
Bundler.require

# Rack::CoreData requires a Sequel connection to a database  
DB = Sequel.connect(ENV['DATABASE_URL'] || "postgres://localhost:5432/coredata")

run Rack::CoreData('./Example.xcdatamodeld')
</code></pre>

<blockquote class="twitter-tweet"><p>In summary:• AFIncrementalStore: *poof* no client code.• Rack::CoreData: *poof* no server code.</p>&mdash; Mattt Thompson (@mattt) <a href="https://twitter.com/mattt/status/227825223905447937" data-datetime="2012-07-24T17:59:00+00:00">July 24, 2012</a></blockquote>

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>View <a href="https://github.com/mattt/rack-core-data">the Source</a> for this project on GitHub.</p>
<p>The post <a href="http://thechangelog.com/rack-coredata-automatically-generate-rest-apis-for-core/">Rack::CoreData &#8211; Automatically generate REST APIs for Core Data models</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/rack-coredata-automatically-generate-rest-apis-for-core/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cupertino &#8211; Mechanize the Apple Dev Center</title>
		<link>http://thechangelog.com/cupertino-mechanize-the-apple-dev-center/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cupertino-mechanize-the-apple-dev-center</link>
		<comments>http://thechangelog.com/cupertino-mechanize-the-apple-dev-center/#comments</comments>
		<pubDate>Thu, 05 Jul 2012 21:17:16 +0000</pubDate>
		<dc:creator>Sam Soffes</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/cupertino-mechanize-the-apple-dev-center/</guid>
		<description><![CDATA[<p>Cupertino is a great new tool by the amazing Mattt Thompson: Automate administrative tasks that you would normally have to do through the Apple Dev Center websites. Life&#8217;s too short to manage device identifiers by hand! You can easily list devices like this: $ ios devices:list Easily add one like this: $ ios devices:add "Sam's [...]</p><p>The post <a href="http://thechangelog.com/cupertino-mechanize-the-apple-dev-center/">Cupertino &#8211; Mechanize the Apple Dev Center</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Cupertino is a great new tool by the amazing <a href="https://github.com/mattt">Mattt Thompson</a>:</p>

<blockquote>
  <p>Automate administrative tasks that you would normally have to do through the Apple Dev Center websites. Life&#8217;s too short to manage device identifiers by hand!</p>
</blockquote>

<p>You can easily list devices like this:</p>

<pre><code>$ ios devices:list
</code></pre>

<p>Easily add one like this:</p>

<pre><code>$ ios devices:add "Sam's iPhone":abcdefg...
</code></pre>

<p>There&#8217;s support for the following commands:</p>

<ul><li>devices:add</li>
<li>devices:remove</li>
<li>certificates:list [-e development|distribution]</li>
<li>certificates:add [-e development|distribution]</li>
<li>certificates:download CERTIFICATE_NAME</li>
<li>certificates:revoke CERTIFICATE_NAME</li>
<li>app_ids:list</li>
<li>app_ids:new</li>
</ul>

<p>Definitely worth checking out if you spend any amount of time in the iOS Provisioning Portal. Thanks Mattt!</p>
<p>The post <a href="http://thechangelog.com/cupertino-mechanize-the-apple-dev-center/">Cupertino &#8211; Mechanize the Apple Dev Center</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/cupertino-mechanize-the-apple-dev-center/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BubbleWrap &#8211; Cocoa wrappers and helpers for RubyMotion (Ruby for iOS) &#8211; Making Cocoa APIs more Ruby like, one API at a time.</title>
		<link>http://thechangelog.com/bubblewrap-cocoa-wrappers-and-helpers-for-rubymotion-rub/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bubblewrap-cocoa-wrappers-and-helpers-for-rubymotion-rub</link>
		<comments>http://thechangelog.com/bubblewrap-cocoa-wrappers-and-helpers-for-rubymotion-rub/#comments</comments>
		<pubDate>Thu, 05 Jul 2012 21:12:51 +0000</pubDate>
		<dc:creator>Sam Soffes</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Event Machine]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyMotion]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/bubblewrap-cocoa-wrappers-and-helpers-for-rubymotion-rub/</guid>
		<description><![CDATA[<p>BubbleWrap is &#8220;a collection of (tested) helpers and wrappers used to wrap CocoaTouch code and provide more Ruby like APIs&#8221; for RubyMotion. There is a ton of great stuff in BubbleWrap. One of the most interesting things I&#8217;ve seen in awhile is EventMachine implemented using GCD. If you&#8217;re doing any RubyMotion work, I think you [...]</p><p>The post <a href="http://thechangelog.com/bubblewrap-cocoa-wrappers-and-helpers-for-rubymotion-rub/">BubbleWrap &#8211; Cocoa wrappers and helpers for RubyMotion (Ruby for iOS) &#8211; Making Cocoa APIs more Ruby like, one API at a time.</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>BubbleWrap is &#8220;a collection of (tested) helpers and wrappers used to wrap CocoaTouch code and provide more Ruby like APIs&#8221; for RubyMotion. There is a ton of great stuff in BubbleWrap.</p>

<p>One of the most interesting things I&#8217;ve seen in awhile is <a href="https://github.com/rubymotion/BubbleWrap/blob/master/motion/reactor.rb">EventMachine implemented using GCD</a>.</p>

<p>If you&#8217;re doing any RubyMotion work, I think you should definitely checkout BubbleWrap!</p>
<p>The post <a href="http://thechangelog.com/bubblewrap-cocoa-wrappers-and-helpers-for-rubymotion-rub/">BubbleWrap &#8211; Cocoa wrappers and helpers for RubyMotion (Ruby for iOS) &#8211; Making Cocoa APIs more Ruby like, one API at a time.</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/bubblewrap-cocoa-wrappers-and-helpers-for-rubymotion-rub/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Barkeep &#8211; the Friendly Code Review System</title>
		<link>http://thechangelog.com/barkeep-the-friendly-code-review-system/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=barkeep-the-friendly-code-review-system</link>
		<comments>http://thechangelog.com/barkeep-the-friendly-code-review-system/#comments</comments>
		<pubDate>Thu, 05 Jul 2012 15:52:00 +0000</pubDate>
		<dc:creator>Andrew Thorp</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/barkeep-the-friendly-code-review-system/</guid>
		<description><![CDATA[<p>Some of the engineers from Ooyala have released a new project that &#8220;makes code reviews fun.&#8221; It is a standalone piece of software that you host on your own (they recommend using Vagrant/VirtualBox). With barkeep you get syntax-highlighted colored diffs, the ability to easily add your own features, a simple CLI, a REST API and [...]</p><p>The post <a href="http://thechangelog.com/barkeep-the-friendly-code-review-system/">Barkeep &#8211; the Friendly Code Review System</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><img src="http://f.cl.ly/items/0U1L1w1C1u2w272l0p1e/barkeep.png" alt="Barkeep" /></p>

<p>Some of the engineers from <a href="http://www.ooyala.com/">Ooyala</a> have released a new project that &#8220;makes code reviews fun.&#8221; It is a standalone piece of software that you host on your own (they recommend using Vagrant/VirtualBox).</p>

<p>With barkeep you get syntax-highlighted colored diffs, the ability to easily add your own features, a simple CLI, a REST API and plaintext (threadable) emails. Out of the box, barkeep offers many more features that will keep code reviews quick and entertaining. You can use barkeep with any git repo that has a reachable URL.</p>

<p>The team at Ooyala plans on growing barkeep as the community sees fit. Open issues as you play around with it – better yet, fork it and add new features yourself! Their style guidelines are simple: &#8220;mimic the style around you.&#8221;</p>

<p>You can view a <a href="http://demo.getbarkeep.org/commits">live example</a>, get <a href="http://getbarkeep.org">some more information</a> or <a href="https://github.com/ooyala/barkeep">browse the source</a> at GitHub.</p>
<p>The post <a href="http://thechangelog.com/barkeep-the-friendly-code-review-system/">Barkeep &#8211; the Friendly Code Review System</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/barkeep-the-friendly-code-review-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>kinectable_pipe &#8211; Microsoft Kinect data in the command line</title>
		<link>http://thechangelog.com/kinectable-pipe-microsoft-kinect-data-in-the-command-lin/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kinectable-pipe-microsoft-kinect-data-in-the-command-lin</link>
		<comments>http://thechangelog.com/kinectable-pipe-microsoft-kinect-data-in-the-command-lin/#comments</comments>
		<pubDate>Wed, 27 Jun 2012 16:03:57 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Homebrew]]></category>
		<category><![CDATA[kinect]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/kinectable-pipe-microsoft-kinect-data-in-the-command-lin/</guid>
		<description><![CDATA[<p>A neat little script from Marshall Yount that takes Microsoft Kinect input and pipes it to STDOUT, or wherever else you need it. From the readme: kinectable_pipe is a command-line utility that dumps user skeleton data from a Microsoft Kinect device to a standard Unix pipe. Check out the project page or the source on [...]</p><p>The post <a href="http://thechangelog.com/kinectable-pipe-microsoft-kinect-data-in-the-command-lin/">kinectable_pipe &#8211; Microsoft Kinect data in the command line</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>A <a href="https://github.com/marshally/kinectable_pipe">neat little script</a> from <a href="http://twitter.com/marshallyount">Marshall Yount</a> that takes Microsoft Kinect input and pipes it to STDOUT, or wherever else you need it.</p>

<p>From the <a href="https://github.com/marshally/kinectable_pipe#readme">readme</a>:</p>

<blockquote>
  <p>kinectable_pipe is a command-line utility that dumps user skeleton data from a Microsoft Kinect device to a standard Unix pipe.</p>
</blockquote>

<p>Check out the <a href="http://marshally.github.com/kinectable_pipe/">project page</a> or <a href="https://github.com/marshally/kinectable_pipe">the source</a> on GitHub</a> for installation, background, and usage.</p>
<p>The post <a href="http://thechangelog.com/kinectable-pipe-microsoft-kinect-data-in-the-command-lin/">kinectable_pipe &#8211; Microsoft Kinect data in the command line</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/kinectable-pipe-microsoft-kinect-data-in-the-command-lin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Episode 0.8.2 &#8211; Ruby Motion, MacRuby and more with Laurent Sansonetti</title>
		<link>http://thechangelog.com/episode-0-8-2-ruby-motion-macruby-and-more-with-laurent/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=episode-0-8-2-ruby-motion-macruby-and-more-with-laurent</link>
		<comments>http://thechangelog.com/episode-0-8-2-ruby-motion-macruby-and-more-with-laurent/#comments</comments>
		<pubDate>Tue, 26 Jun 2012 15:27:43 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Podcast]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[MacRuby]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyMotion]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/episode-0-8-2-ruby-motion-macruby-and-more-with-laurent/</guid>
		<description><![CDATA[<p>Wynn and Sam caught up with Laurent Sansonetti to talk about MacRuby, RubyMotion, and more. Items mentioned in the show: Bully is Sam’s Pusher client for Objective-C. Get some Cheddar, Sam’s TODO app (soon in the App Store). Laurent Sansonetti, creator of RubyMotion (and MacRuby) MacRuby is an implementation of Ruby 1.9 on top of [...]</p><p>The post <a href="http://thechangelog.com/episode-0-8-2-ruby-motion-macruby-and-more-with-laurent/">Episode 0.8.2 &#8211; Ruby Motion, MacRuby and more with Laurent Sansonetti</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Wynn and Sam caught up with Laurent Sansonetti to talk about MacRuby, RubyMotion, and more.</p>

<audio src="http://changelogshow.com/105/52539-episode-0-8-2-ruby-motion-macruby-and-more-with-laurent-sansonetti.mp3" controls="controls" preload="none"></audio>

<p>Items mentioned in the show:</p>

<ul><li><a href="https://github.com/samsoffes/bully">Bully</a> is Sam’s <a href="http://pusher.com">Pusher</a> client for Objective-C.</li>
<li>Get some <a href="https://cheddarapp.com/">Cheddar</a>, Sam’s TODO app (soon in the App Store).</li>
<li><a href="http://twitter.com/#!/lrz">Laurent Sansonetti</a>, creator of RubyMotion (and MacRuby)</li>
<li><a href="http://macruby.org/">MacRuby</a> is an implementation of Ruby 1.9 on top of Mac OS X core technologies</li>
<li><a href="http://www.rubymotion.com/">RubyMotion</a> is a port of MacRuby for iOS</li>
<li>RubyMotion comes with a built-in <a href="http://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop">REPL</a>.</li>
<li>RubyMotion allows you to run your application using <a href="https://github.com/jimweirich/rake">rake</a> at the command line.</li>
<li><a href="http://www.appcelerator.com/platform/titanium-sdk">Titanium</a> lets you create iOS apps using JavaScript</li>
<li><a href="http://xamarin.com/monotouch">MonoTouch</a> allows you to create iOS apps with C# and .NET</li>
<li>RubyMotion is not entirely open source, but the <a href="https://github.com/HipByte/RubyMotion">command line toolchain</a> is.</li>
<li><a href="http://redcareditor.com/">Redcar</a> is an open source editor that Laurent likes.</li>
<li>RubyMotion allows you to work entirely in the command line.</li>
<li><a href="http://cocoapods.org/">CocoaPods</a> was on a <a href="http://thechangelog.com/post/20527720570/episode-0-7-8-cocoapods-macruby-and-more-with-eloy-dur-n">previous episode</a>.</li>
<li>The creator of CocoaPods, <a href="http://twitter.com/#!/alloy">Eloy Durán</a> is Laurent’s personal hero.</li>
<li><a href="https://twitter.com/#!/samsoffes">Sam Soffes</a>, an Objective-C developer and a Rubyist sees a great fit for RubyMotion.</li>
<li>RubyMotion will have a debugger in the future that can run in the simulator and on the device.</li>
<li>The REPL will not be ported back to MacRuby.</li>
<li>RubyMotion memory management is very similar to ARC, but it happens at runtime.</li>
<li>A new version of memory management will be released in a few months.</li>
<li>Laurent uses <a href="http://code.google.com/p/macvim/">macvim</a> and <a href="http://sources.redhat.com/gdb/">gdb</a>.</li>
<li>Laurent wants to backport the memory model of RubyMotion to MacRuby.</li>
<li>RubyMotion ships with a flavor of <a href="https://github.com/alloy/MacBacon">bacon</a> for testing. Bacon is a small <a href="https://github.com/rspec/rspec">RSpec</a> clone.</li>
<li>Laurent mentioned <a href="https://github.com/mdks/rm-redgreen">rm-redgreen</a> to colorize your rake specs.</li>
<li>Wynn mentioned <a href="https://github.com/cucumber/cucumber">cucumber</a>.</li>
<li>Sam mentioned <a href="https://github.com/jnicklas/capybara">capybara</a>.</li>
</ul>
<p>The post <a href="http://thechangelog.com/episode-0-8-2-ruby-motion-macruby-and-more-with-laurent/">Episode 0.8.2 &#8211; Ruby Motion, MacRuby and more with Laurent Sansonetti</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/episode-0-8-2-ruby-motion-macruby-and-more-with-laurent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://changelogshow.com/105/52539-episode-0-8-2-ruby-motion-macruby-and-more-with-laurent-sansonetti.mp3" length="20746368" type="audio/mpeg" />
		</item>
		<item>
		<title>Descriptive statistics &#8211; extend Ruby Enumerable for common stats methods</title>
		<link>http://thechangelog.com/descriptive-statistics-extend-ruby-enumerable-for-common/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=descriptive-statistics-extend-ruby-enumerable-for-common</link>
		<comments>http://thechangelog.com/descriptive-statistics-extend-ruby-enumerable-for-common/#comments</comments>
		<pubDate>Sat, 16 Jun 2012 17:48:00 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Enumerable]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Stats]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/descriptive-statistics-extend-ruby-enumerable-for-common/</guid>
		<description><![CDATA[<p>Descriptive Statistics is a small gem from Derrick Parkhurst that provides a few common statistics methods to Ruby&#8217;s Enumerable: &#62; require 'descriptive_statistics' =&#62; true &#62; data = [2,6,9,3,5,1,8,3,6,9,2] =&#62; [2, 6, 9, 3, 5, 1, 8, 3, 6, 9, 2] &#62; data.number =&#62; 11.0 &#62; data.sum =&#62; 54 &#62; data.mean =&#62; 4.909090909090909 &#62; data.median =&#62; [...]</p><p>The post <a href="http://thechangelog.com/descriptive-statistics-extend-ruby-enumerable-for-common/">Descriptive statistics &#8211; extend Ruby Enumerable for common stats methods</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a href="https://github.com/thirtysixthspan/descriptive_statistics">Descriptive Statistics</a> is a small gem from <a href="http://twitter.com/thirtysixthspan">Derrick Parkhurst</a> that provides a <a href="https://github.com/thirtysixthspan/descriptive_statistics/tree/master/lib/descriptive_statistics">few common statistics methods</a> to Ruby&#8217;s <a href="http://ruby-doc.org/core-1.9.3/Enumerable.html">Enumerable</a>:</p>

<pre><code>&gt; require 'descriptive_statistics'
 =&gt; true 
&gt; data = [2,6,9,3,5,1,8,3,6,9,2]
 =&gt; [2, 6, 9, 3, 5, 1, 8, 3, 6, 9, 2] 
&gt; data.number
 =&gt; 11.0 
&gt; data.sum
 =&gt; 54 
&gt; data.mean
 =&gt; 4.909090909090909 
&gt; data.median
 =&gt; 5.0 
&gt; data.variance
 =&gt; 7.7190082644628095 
&gt; data.standard_deviation
 =&gt; 2.778310325442932 
&gt; data.percentile(70)
 =&gt; 6.0
</code></pre>

<p>Browse <a href="https://github.com/thirtysixthspan/descriptive_statistics/tree/master/lib/descriptive_statistics">the source</a> or fork on GitHub.</p>

<p><em>Update</em>: <a href="http://fgribreau.com/">Francois-Guillaume Ribreau</a> has <a href="https://github.com/FGRibreau/descriptive_statistics">ported the project to JavaScript</a> as a NPM package.</p>

<p><em>Update 2</em>: <a href="https://twitter.com/gleicon">Gleicon Moraes</a> has created a <a href="https://github.com/gleicon/py_descriptive_statistics">Python port</a>.</p>
<p>The post <a href="http://thechangelog.com/descriptive-statistics-extend-ruby-enumerable-for-common/">Descriptive statistics &#8211; extend Ruby Enumerable for common stats methods</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/descriptive-statistics-extend-ruby-enumerable-for-common/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby Mass &#8211; introspection for the heap</title>
		<link>http://thechangelog.com/ruby-mass-introspection-for-the-heap/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ruby-mass-introspection-for-the-heap</link>
		<comments>http://thechangelog.com/ruby-mass-introspection-for-the-heap/#comments</comments>
		<pubDate>Tue, 12 Jun 2012 12:31:00 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Introspection]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/ruby-mass-introspection-for-the-heap/</guid>
		<description><![CDATA[<p>Paul Engel, whose CSONV we covered previously, has created Ruby Mass, a gem that helps you introspect the Ruby heap. Ruby Mass indexes, counts, and locates object references. $ Mass.index Foo #=&#62; {} $ f = Foo.new $ b1 = Foo::Bar.new $ b2 = Foo::Bar.new $ t = Thing.new $ f.object_id #=&#62; 2154166500 $ b1.object_id [...]</p><p>The post <a href="http://thechangelog.com/ruby-mass-introspection-for-the-heap/">Ruby Mass &#8211; introspection for the heap</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a href="http://twitter.com/archan937">Paul Engel</a>, whose <a href="http://thechangelog.com/post/6865323098/csonv-js-a-tiny-library-to-fetch-relational-csv-data-at">CSONV</a> we covered previously, has created <a href="https://github.com/archan937/ruby-mass">Ruby Mass</a>, a gem that helps you introspect the Ruby heap. Ruby Mass <a href="https://github.com/archan937/ruby-mass#indexing-objects">indexes</a>, counts, and locates object references.</p>

<pre><code>$ Mass.index Foo #=&gt; {}

$ f = Foo.new
$ b1 = Foo::Bar.new
$ b2 = Foo::Bar.new
$ t = Thing.new

$ f.object_id #=&gt; 2154166500
$ b1.object_id #=&gt; 2154037400
$ b2.object_id #=&gt; 2154126780
$ t.object_id #=&gt; 2154372180

$ Mass.index Foo #=&gt; {"Foo"=&gt;[2154166500], "Foo::Bar"=&gt;[2154037400, 2154126780]}
$ Mass.index Foo::Bar #=&gt; {"Foo::Bar"=&gt;[2154037400, 2154126780]}
$ Mass.index Thing #=&gt; {"Thing"=&gt;[2154372180]}
$ Mass.index #=&gt; {"String"=&gt;[2151797000, 2151797080, 2151797120, 2151797140, ... a lot of more classes and object_ids}
$ Mass.index OneMoreThing #=&gt; {}
</code></pre>

<p>As always, check the <a href="https://github.com/archan937/ruby-mass#readme">README</a> for usage. The <a href="https://github.com/archan937/ruby-mass">source is on GitHub</a>.</p>
<p>The post <a href="http://thechangelog.com/ruby-mass-introspection-for-the-heap/">Ruby Mass &#8211; introspection for the heap</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/ruby-mass-introspection-for-the-heap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Virtus &#8211; give your Ruby objects DataMapper-like attributes</title>
		<link>http://thechangelog.com/virtus-give-your-ruby-objects-datamapper-like-attributes/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=virtus-give-your-ruby-objects-datamapper-like-attributes</link>
		<comments>http://thechangelog.com/virtus-give-your-ruby-objects-datamapper-like-attributes/#comments</comments>
		<pubDate>Mon, 11 Jun 2012 16:19:35 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[DataMapper]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyGems]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/virtus-give-your-ruby-objects-datamapper-like-attributes/</guid>
		<description><![CDATA[<p>I&#8217;ve written a few wrappers for various JSON APIs, and each time I&#8217;ve had to make a decision about how to represent API data in Ruby. Ruby hashes and arrays work well but bracket['notation'], can be hard on the eyes and fingers. My go-to library for these types of objects is often Hashie, the hash [...]</p><p>The post <a href="http://thechangelog.com/virtus-give-your-ruby-objects-datamapper-like-attributes/">Virtus &#8211; give your Ruby objects DataMapper-like attributes</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve written <a href="https://github.com/pengwynn">a few wrappers</a> for various JSON APIs, and each time I&#8217;ve had to make a decision about how to represent API data in Ruby. Ruby hashes and arrays work well but <code>bracket['notation']</code>, can be hard on the eyes and fingers. My go-to library for these types of objects is often <a href="https://github.com/intridea/hashie">Hashie</a>, the hash toolkit from Intridea. Its Mash, Dash, Clash, and Trash, objects provide some syntactic sugar on top of Ruby&#8217;s Hash.</p>

<p>Thanks to <a href="http://afreshcup.com/home/2012/6/11/double-shot-895.html">Mike&#8217;s linkblog</a>, another project has caught my eye. <a href="https://github.com/solnic/virtus">Virtus</a> from <a href="http://solnic.eu/">Piotr Solnica</a> extracts DataMapper&#8217;s <a href="http://rubydoc.info/github/datamapper/dm-core/master/DataMapper/Property">Property API</a>, for the times when you need to implement attributes on your objects yet maintain a bit more encapsulation. I love the <a href="https://github.com/solnic/virtus#using-virtus-with-modules">module approach for defining properties</a>:</p>

<pre><code>module Name
  include Virtus

  attribute :name, String
end

module Age
  include Virtus

  attribute :age, Integer
end

class User
  include Name, Age
end

user = User.new(:name =&gt; 'John', :age =&gt; '30')
</code></pre>

<p>Check the <a href="https://github.com/solnic/virtus#readme">excellent README</a> or <a href="https://github.com/solnic/virtus">source on GitHub</a> for more.</p>
<p>The post <a href="http://thechangelog.com/virtus-give-your-ruby-objects-datamapper-like-attributes/">Virtus &#8211; give your Ruby objects DataMapper-like attributes</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/virtus-give-your-ruby-objects-datamapper-like-attributes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TweetStream &#8211; Easily access the Twitter Streaming API</title>
		<link>http://thechangelog.com/tweetstream-easily-access-the-twitter-streaming-api/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tweetstream-easily-access-the-twitter-streaming-api</link>
		<comments>http://thechangelog.com/tweetstream-easily-access-the-twitter-streaming-api/#comments</comments>
		<pubDate>Sat, 02 Jun 2012 19:41:07 +0000</pubDate>
		<dc:creator>Andrew Thorp</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Event Machine]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/tweetstream-easily-access-the-twitter-streaming-api/</guid>
		<description><![CDATA[<p>Steve Agalloco, Erik Michaels-Ober, and Jeremy Haile have delivered a major update to Intridea&#8217;s TweetStream (2.0.0) gem, which gives you access to the Twitter Streaming API. One of the biggest updates in this version is the switch to OAuth as the default authentication method. This was necessary because Userstreams and Site Streams exclusively work on [...]</p><p>The post <a href="http://thechangelog.com/tweetstream-easily-access-the-twitter-streaming-api/">TweetStream &#8211; Easily access the Twitter Streaming API</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a href="http://twitter.com/anno">Steve Agalloco</a>, <a href="http://twitter.com/sferik">Erik Michaels-Ober</a>, and <a href="http://twitter.com/jhaile">Jeremy Haile</a> have delivered a major update to <a href="http://www.intridea.com/">Intridea</a>&#8217;s TweetStream (2.0.0) gem, which gives you access to the Twitter Streaming API.</p>

<p>One of the biggest updates in this version is the switch to OAuth as the default authentication method. This was necessary because Userstreams and Site Streams exclusively work on OAuth. You can still use basic authentication, but both Twitter and TweetStream strongly encourage you to switch, so you can enjoy the new features. Don&#8217;t worry, it&#8217;s <a href="https://dev.twitter.com/docs/auth/oauth/faq">simple</a>.</p>

<p>The gem itself is built on top of <a href="https://github.com/spagalloco/em-twitter">em-twitter</a>, which is an <a href="https://github.com/eventmachine/eventmachine">EventMachine</a> client for the Twitter Streaming API.</p>

<p>Getting up and running couldn&#8217;t be easier:</p>

<pre><code>require 'tweetstream'

TweetStream.configure do |config|
  config.consumer_key  = "123456789"
  config.consumer_secret = "abcdefghijklmnopqrstuvwxyz"
  config.oauth_token = "123456789"
  config.oauth_token_secret = "abcdefghijklmnopqrstuvwxyz"
  config.auth_method = :oauth
end

TweetStream::Client.new.userstream do |status|
  puts "#{status.user.screen_name}: #{status.text}"
end
</code></pre>

<p>t, a command line interface for twitter (covered in a <a href="http://thechangelog.com/post/22147765842/t-powerful-command-line-interface-for-twitter">previous article</a>), is also built on top of the TweetStream gem.</p>

<p><a href="https://github.com/intridea/tweetstream">Head on over to GitHub</a> to view the source code and browse the documentation.</p>
<p>The post <a href="http://thechangelog.com/tweetstream-easily-access-the-twitter-streaming-api/">TweetStream &#8211; Easily access the Twitter Streaming API</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/tweetstream-easily-access-the-twitter-streaming-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyMotion toolchain now open source</title>
		<link>http://thechangelog.com/rubymotion-toolchain-now-open-source/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rubymotion-toolchain-now-open-source</link>
		<comments>http://thechangelog.com/rubymotion-toolchain-now-open-source/#comments</comments>
		<pubDate>Fri, 01 Jun 2012 17:34:33 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyMotion]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/rubymotion-toolchain-now-open-source/</guid>
		<description><![CDATA[<p>Laurent has just announced the release of Ruby Motion&#8217;s lib folder which powers the command line tool chain. The source is on GitHub. Stay tuned, Laurent will be our guest on the next episode.</p><p>The post <a href="http://thechangelog.com/rubymotion-toolchain-now-open-source/">RubyMotion toolchain now open source</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a href="http://twitter.com/lrz">Laurent</a> has <a href="http://blog.rubymotion.com/post/24197887535/community-open-source-updates">just announced</a> the release of Ruby Motion&#8217;s <code>lib</code> folder which powers the command line tool chain. The <a href="https://github.com/HipByte/RubyMotion">source is on GitHub</a>.</p>

<p>Stay tuned, Laurent will be our guest on the next episode.</p>
<p>The post <a href="http://thechangelog.com/rubymotion-toolchain-now-open-source/">RubyMotion toolchain now open source</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/rubymotion-toolchain-now-open-source/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backstop &#8211; Simple HTTP service for submitting metrics to Graphite</title>
		<link>http://thechangelog.com/backstop-simple-http-service-for-submitting-metrics-to-g/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=backstop-simple-http-service-for-submitting-metrics-to-g</link>
		<comments>http://thechangelog.com/backstop-simple-http-service-for-submitting-metrics-to-g/#comments</comments>
		<pubDate>Thu, 31 May 2012 20:55:52 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Graphite]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Stats]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/backstop-simple-http-service-for-submitting-metrics-to-g/</guid>
		<description><![CDATA[<p>We&#8217;ve mentioned a couple of Graphite-related projects previously. Jason Dixon and Michael Gorsuch from Heroku have released Backstop, a simple HTTP-to-Graphite proxy to make it simple to send metrics. Using the /publish method, metrics and annotations can be posted that match any approved prefixes found in the PREFIXES environment variable, custom in the following example: [...]</p><p>The post <a href="http://thechangelog.com/backstop-simple-http-service-for-submitting-metrics-to-g/">Backstop &#8211; Simple HTTP service for submitting metrics to Graphite</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>We&#8217;ve <a href="/graphiti-customizable-graph-dashboard-for-graphite-power">mentioned a couple of Graphite-related projects</a> previously. <a href="http://obfuscurity.com/">Jason Dixon</a> and <a href="https://twitter.com/#!/michaelgorsuch">Michael Gorsuch</a> from Heroku have released <a href="https://github.com/obfuscurity/backstop">Backstop</a>, a simple HTTP-to-Graphite proxy to make it simple to send metrics. Using the <code>/publish</code> method, metrics and annotations can be posted that match any approved prefixes found in the <code>PREFIXES</code> environment variable, <code>custom</code> in the following example:</p>

<pre><code># Send a metric
RestClient.post("https://backstop.example.com/publish/custom",
   [{:metric =&gt; key, :value =&gt; value, :measure_time =&gt; Time.now.to_i}].to_json)

# Send an annotation
RestClient.post("https://backstop.example.com/publish/note",
   [{:metric =&gt; "foobar.release", :value =&gt; "v214", :measure_time =&gt; Time.now.to_i}].to_json)
</code></pre>

<p>Check the <a href="https://github.com/obfuscurity/backstop#readme">README</a> for local usage and instructions for deploying to Heroku.</p>
<p>The post <a href="http://thechangelog.com/backstop-simple-http-service-for-submitting-metrics-to-g/">Backstop &#8211; Simple HTTP service for submitting metrics to Graphite</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/backstop-simple-http-service-for-submitting-metrics-to-g/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Episode 0.8.1 &#8211; Celluloid, concurrency, and more with Tony Arcieri</title>
		<link>http://thechangelog.com/episode-0-8-1-celluloid-concurrency-and-more-with-tony-a/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=episode-0-8-1-celluloid-concurrency-and-more-with-tony-a</link>
		<comments>http://thechangelog.com/episode-0-8-1-celluloid-concurrency-and-more-with-tony-a/#comments</comments>
		<pubDate>Thu, 31 May 2012 15:10:56 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Podcast]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/episode-0-8-1-celluloid-concurrency-and-more-with-tony-a/</guid>
		<description><![CDATA[<p>Wynn talked with Tony Arcieri, creator of Celluloid, about concurrency in Ruby and his thoughts on Erlang, Clojure, and design patterns. Items mentioned in the show Tony Arcieri, creator of Celluloid. Celluloid is painless multithreaded programming for Ruby. Celluloid:IO provides evented I/O for Celluloid actors. DCell lets you build distributed Celluloid apps over 0MQ. Adam [...]</p><p>The post <a href="http://thechangelog.com/episode-0-8-1-celluloid-concurrency-and-more-with-tony-a/">Episode 0.8.1 &#8211; Celluloid, concurrency, and more with Tony Arcieri</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Wynn talked with Tony Arcieri, creator of Celluloid, about concurrency in Ruby and his thoughts on Erlang, Clojure, and design patterns.</p>

<audio src="http://changelogshow.com/105/50052-episode-0-8-1-celluloid-concurrency-and-more-with-tony-arcieri.mp3" controls="controls" preload="none"></audio>

<p>Items mentioned in the show</p>

<ul><li><a href="https://twitter.com/bascule">Tony Arcieri</a>, creator of Celluloid.</li>
<li><a href="http://celluloid.io/">Celluloid</a> is painless multithreaded programming for Ruby.</li>
<li><a href="https://github.com/celluloid/celluloid-io">Celluloid:IO</a> provides evented I/O for Celluloid actors.</li>
<li><a href="https://github.com/celluloid/dcell">DCell</a> lets you build distributed Celluloid apps over 0MQ.</li>
<li><a href="http://twitter.com/therealadam">Adam Keys</a>, formerly of Gowalla, is now teammates with Tony at Living Social.</li>
<li>Zed gave us the lowdown on <a href="http://www.zeromq.org/">0MQ</a> on <a href="http://thechangelog.com/post/1087757312/episode-0-3-4-mongrel2-guitar-and-more-with-zed-shaw">0.3.4</a>.</li>
<li><a href="https://github.com/celluloid/reel">Reel</a> aims to be a fast, non-blocking evented web server <em>without</em> a Rack API.</li>
<li>Tony is aiming to get Reel working with <a href="http://wiki.basho.com/Webmachine.html">Webmachine</a>.</li>
<li><a href="https://twitter.com/seancribbs">Sean Cribbs</a> talked Riak on a <a href="http://thechangelog.com/post/397364245/episode-0-1-4-andy-gross-and-sean-cribbs-on-riak">previous episode</a>.</li>
<li><a href="http://hubot.github.com/">Hubot</a> is GitHub&#8217;s awesome Campfire bot.</li>
<li><a href="http://travis-ci.org/">Travis</a> uses Celluloid, as discussed on <a href="http://thechangelog.com/post/18847458083/episode-0-7-5-travis-ci-riak-and-more-with-josh-kalderim">0.7.5</a>.</li>
<li>Tony is shutting down <a href="https://github.com/lightness/lightrail">LightRail</a> since the release of <a href="https://github.com/spastorino/rails-api">Rails::API</a>, from <a href="https://twitter.com/#!/spastorino">Santiago Pastorino</a>.</li>
<li><a href="https://github.com/josevalim/active_model_serializers">ActiveModel::Serializer</a> aims to provide an object to encapsulate serialization of ActiveModel objects, including ActiveRecord objects.</li>
<li>Wynn loves <a href="https://github.com/rails/jbuilder">jbuilder</a> despite its name.</li>
<li><a href="http://erights.org/">E</a> is the secure distributed pure-object platform and p2p scripting language.</li>
<li><a href="http://en.wikipedia.org/wiki/Data,_Context,_and_Interaction">Data, context and interaction</a> is a paradigm used in computer software to program systems of communicating objects.</li>
<li><a href="https://github.com/warner/tahoe-lafs">Tahoe-LAFS</a> is a Python-powered decentralized secure filesystem.</li>
<li>Tony likes <a href="http://clojure.org/">Clojure</a>.</li>
<li><a href="http://twitter.com/joeerl">Joe Armstrong</a> and <a href="https://twitter.com/rvirding">Robert Virding</a>, creators of Erlang are Tony&#8217;s programming heroes.</li>
</ul>
<p>The post <a href="http://thechangelog.com/episode-0-8-1-celluloid-concurrency-and-more-with-tony-a/">Episode 0.8.1 &#8211; Celluloid, concurrency, and more with Tony Arcieri</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/episode-0-8-1-celluloid-concurrency-and-more-with-tony-a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://changelogshow.com/105/50052-episode-0-8-1-celluloid-concurrency-and-more-with-tony-arcieri.mp3" length="104" type="audio/mpeg" />
		</item>
		<item>
		<title>Sextant &#8211; view your Rails routes without waiting on Rake</title>
		<link>http://thechangelog.com/sextant-view-your-rails-routes-without-waiting-on-rake/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sextant-view-your-rails-routes-without-waiting-on-rake</link>
		<comments>http://thechangelog.com/sextant-view-your-rails-routes-without-waiting-on-rake/#comments</comments>
		<pubDate>Tue, 22 May 2012 14:54:48 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[routes]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/sextant-view-your-rails-routes-without-waiting-on-rake/</guid>
		<description><![CDATA[<p>When given the option, I&#8217;ll always opt for text mode when completing a task. In Rails that usually means Rake. There&#8217;s a point in most Rails apps, however, when the time to boot Rails just to rake -T is painful. So when Richard Schneeman got tired of waiting on Rails to run rake routes, he [...]</p><p>The post <a href="http://thechangelog.com/sextant-view-your-rails-routes-without-waiting-on-rake/">Sextant &#8211; view your Rails routes without waiting on Rake</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>When given the option, I&#8217;ll always opt for text mode when completing a task. In Rails that usually means Rake. There&#8217;s a point in most Rails apps, however, when the time to boot Rails just to <code>rake -T</code> is painful. So when <a href="http://twitter.com/schneems">Richard Schneeman</a> got tired of waiting on Rails to run <code>rake routes</code>, he created <a href="https://github.com/schneems/sextant">Sextant</a>, a gem that lists your routes in development mode right in your browser.</p>

<p><a href="https://github.com/schneems/sextant"><img src="http://cl.ly/0j3A390P132C0c2Z1I3N/Sextant%20Output.png" alt="screencap" /></a></p>

<p>Since your web server is presumably already booted, there&#8217;s no startup tax to see your routes. Check out Richard&#8217;s <a href="http://schneems.com/post/23543653526/sextant-a-gem-to-help-you-find-your-routes">blog post</a> or the <a href="https://github.com/schneems/sextant">source on GitHub</a> for more.</p>
<p>The post <a href="http://thechangelog.com/sextant-view-your-rails-routes-without-waiting-on-rake/">Sextant &#8211; view your Rails routes without waiting on Rake</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/sextant-view-your-rails-routes-without-waiting-on-rake/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rspec-rails-uncommitted &#8211; Selectively run specs based on git status</title>
		<link>http://thechangelog.com/rspec-rails-uncommitted-selectively-run-specs-based-on-g/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rspec-rails-uncommitted-selectively-run-specs-based-on-g</link>
		<comments>http://thechangelog.com/rspec-rails-uncommitted-selectively-run-specs-based-on-g/#comments</comments>
		<pubDate>Wed, 16 May 2012 14:28:00 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/rspec-rails-uncommitted-selectively-run-specs-based-on-g/</guid>
		<description><![CDATA[<p>Marshall Yount has released a project to make it easier to run Rspec specs in Rails based on git status: rake rspec:uncommitted rake rspec:unpushed rake rspec:unmerged It looks like a nice way to filter specs for those using a git-based workflow. Source on GitHub. UPDATE: As Alex Soulim points out, it works with SVN, too.</p><p>The post <a href="http://thechangelog.com/rspec-rails-uncommitted-selectively-run-specs-based-on-g/">rspec-rails-uncommitted &#8211; Selectively run specs based on git status</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a href="https://twitter.com/#!/marshallyount">Marshall Yount</a> has released <a href="https://github.com/marshally/rspec-rails-uncommitted">a project</a> to make it easier to run Rspec specs in Rails based on git status:</p>

<pre><code>rake rspec:uncommitted    
rake rspec:unpushed
rake rspec:unmerged
</code></pre>

<p>It looks like a nice way to filter specs for those using a git-based workflow. <a href="https://github.com/marshally/rspec-rails-uncommitted">Source on GitHub</a>.</p>

<p>UPDATE: As <a href="https://twitter.com/#!/soulim">Alex Soulim</a> points out, it works with SVN, too.</p>
<p>The post <a href="http://thechangelog.com/rspec-rails-uncommitted-selectively-run-specs-based-on-g/">rspec-rails-uncommitted &#8211; Selectively run specs based on git status</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/rspec-rails-uncommitted-selectively-run-specs-based-on-g/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Imperator &#8211; Command pattern for Ruby apps</title>
		<link>http://thechangelog.com/imperator-command-pattern-for-ruby-apps/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=imperator-command-pattern-for-ruby-apps</link>
		<comments>http://thechangelog.com/imperator-command-pattern-for-ruby-apps/#comments</comments>
		<pubDate>Tue, 08 May 2012 13:19:32 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[command-pattern]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/imperator-command-pattern-for-ruby-apps/</guid>
		<description><![CDATA[<p>Jon Leighton isn&#8217;t the only one picking a fight with Rails controllers. Keith Gaddis suggests in The Problem With Controllers that we&#8217;ve relegated the command pattern to the depths of our queuing frameworks: The problem with controllers in Rails is that they&#8217;re a part of the web domain—their job is to respond to requests, and [...]</p><p>The post <a href="http://thechangelog.com/imperator-command-pattern-for-ruby-apps/">Imperator &#8211; Command pattern for Ruby apps</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Jon Leighton isn&#8217;t the only one <a href="http://thechangelog.com/post/21493208725/focused-controller-aiming-for-real-oop-in-rails-controll">picking a fight with Rails controllers</a>. <a href="https://twitter.com/#!/karmajunkie">Keith Gaddis</a> suggests in <a href="http://karmajunkie.com/blog/2012/05/07/the-problem-with-controllers/"><em>The Problem With Controllers</em></a> that we&#8217;ve <a href="https://github.com/karmajunkie/imperator#why-use-commands">relegated the command pattern to the depths of our queuing frameworks</a>:</p>

<blockquote>
  <p>The problem with controllers in Rails is that they&#8217;re a part of the web domain—their job is to respond to requests, and ONLY to respond to requests. Anything that happens between the receipt of a request and sending a response is Somebody Else&#8217;s Job™. Commands are that Somebody Else™. Commands are also very commonly utilized to put work into the background.</p>
  
  <p>Why are commands an appropriate place to handle that logic? Commands give you the opportunity to encapsulate all of the logic required for an interaction in one spot. Sometimes that interaction is as simple as a method call—more often there are several method calls involved, not all of which deal with domain logic (and thus, are inappropriate for inclusion on the models). Commands give you a place to bring all of these together in one spot without increasing coupling in your controllers or models.</p>
</blockquote>

<p>He&#8217;s released <a href="http://github.com/karmajunkie/imperator">Imperator</a>, a Ruby gem to help move that logic, simplify our controllers, and make them less model-dependent.</p>

<pre><code>class DoSomethingCommand &lt; Imperator::Command
  attribute :some_object_id
  attribute :some_value

  validates_presence_of :some_object_id

  action do
    obj = SomeObject.find(self.some_object_id)
    obj.do_something(self.some_value)
    end
  end
end
</code></pre>

<p>The project is brand new and will likely evolve so <a href="https://github.com/karmajunkie/imperator">check the source on GitHub</a>.</p>
<p>The post <a href="http://thechangelog.com/imperator-command-pattern-for-ruby-apps/">Imperator &#8211; Command pattern for Ruby apps</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/imperator-command-pattern-for-ruby-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby Motion Samples &#8211; Write iPhone Apps In Ruby</title>
		<link>http://thechangelog.com/ruby-motion-samples-write-iphone-apps-in-ruby/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ruby-motion-samples-write-iphone-apps-in-ruby</link>
		<comments>http://thechangelog.com/ruby-motion-samples-write-iphone-apps-in-ruby/#comments</comments>
		<pubDate>Fri, 04 May 2012 14:25:00 +0000</pubDate>
		<dc:creator>Sam Soffes</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Motion]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/ruby-motion-samples-write-iphone-apps-in-ruby/</guid>
		<description><![CDATA[<p>RubyMotion was just released by Laurent Sansonetti, the creator of MacRuby. RubyMotion lets you write iOS apps in Ruby! RubyMotion is a revolutionary toolchain for iOS. It lets you quickly develop and test native iOS applications for iPhone or iPad, all using the awesome Ruby language you know and love. RubyMotion is a commercial product [...]</p><p>The post <a href="http://thechangelog.com/ruby-motion-samples-write-iphone-apps-in-ruby/">Ruby Motion Samples &#8211; Write iPhone Apps In Ruby</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>RubyMotion was just released by <a href="http://github.com/lrz">Laurent Sansonetti</a>, the creator of <a href="http://macruby.com">MacRuby</a>. RubyMotion lets you write iOS apps in Ruby!</p>

<blockquote>
  <p>RubyMotion is a revolutionary toolchain for iOS. It lets you quickly develop and test native iOS applications for iPhone or iPad, all using the awesome Ruby language you know and love.</p>
</blockquote>

<p>RubyMotion is a commercial product with introductory pricing of $149. We wanted to cover it on The Changelog anyway since it&#8217;s such an exciting new tool with an open source heritage.</p>

<p>Writing Objective-C in Ruby is really fantastic, especially for Ruby engineers new to iOS. You can use all of the Ruby features like mixins, monkey patching, etc but on Objective-C objects. So when you make a string, it&#8217;s really an <code>NSMutableString</code> which is a Ruby <code>String</code> in MacRuby.</p>

<p>Probably the coolest thing about RubyMotion is that it statically compiles your Ruby code so it doesn&#8217;t have to include the entire Ruby source and an interpreter. In theory, it should be just as fast as Objective-C code.</p>

<p>RubyMotion even has an interactive REPL. See it in action in their demo. Skip to 3:58 in if you just want to see the REPL.</p>

<p>There&#8217;s a ton of stuff in RubyMotion that is just fantastic like the build system, REPL, testing, etc. Read my full review <a href="http://samsoff.es/posts/rubymotion-review">on my blog</a>. Also, there are <a href="https://github.com/HipByte/RubyMotionSamples">several sample applications on GitHub</a>.</p>
<p>The post <a href="http://thechangelog.com/ruby-motion-samples-write-iphone-apps-in-ruby/">Ruby Motion Samples &#8211; Write iPhone Apps In Ruby</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/ruby-motion-samples-write-iphone-apps-in-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>t &#8211; Powerful command line interface for Twitter</title>
		<link>http://thechangelog.com/t-powerful-command-line-interface-for-twitter/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=t-powerful-command-line-interface-for-twitter</link>
		<comments>http://thechangelog.com/t-powerful-command-line-interface-for-twitter/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 22:11:00 +0000</pubDate>
		<dc:creator>Wynn Netherland</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyGems]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/t-powerful-command-line-interface-for-twitter/</guid>
		<description><![CDATA[<p>As regular listeners know, I love Earthquake, the super awesome text mode Twitter client from jugyo (十行). What Earthquake is to the streaming API, t from Erik Michaels-Ober is to REST API in the command line. Erik and I have helped maintain John Nunemaker&#8217;s Twitter gem for a few years now. While John included a [...]</p><p>The post <a href="http://thechangelog.com/t-powerful-command-line-interface-for-twitter/">t &#8211; Powerful command line interface for Twitter</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>As regular listeners know, I love <a href="http://thechangelog.com/post/4005924669/earthquake-twitter-client-on-terminal-with-streaming-api">Earthquake</a>, the super awesome text mode Twitter client from <a href="https://github.com/jugyo">jugyo (十行)</a>. What Earthquake is to the streaming API, <a href="http://github.com/sferik/t">t</a> from <a href="http://twitter.com/sferik">Erik Michaels-Ober</a> is to REST API in the command line. Erik and I have helped maintain <a href="http://twitter.com/jnunemaker">John Nunemaker</a>&#8217;s <a href="http://github.com/jnunemaker/twitter">Twitter gem</a> for a few years now. While John included a basic command line interface early on, it never approached the level of Unix-y sophistication as Erik has created.</p>

<p>T supports a <a href="https://github.com/sferik/t#usage-examples">massive list</a> of commands and subcommands including anything you&#8217;d expect in a Twitter client, but the real power is in piping commands together, Unix style:</p>

<p>Favorite the last 10 tweets that mention you:</p>

<pre><code>t mentions -n 10 -l | awk '{print $1}' | xargs t favorite
</code></pre>

<p>Count the number of employees who work for Twitter:</p>

<pre><code>t list members twitter team | wc -l
</code></pre>

<p>Add everyone you&#8217;re following to that list (up to 500 users):</p>

<pre><code>t followings | xargs t list add following-`date "+%Y-%m-%d"
</code></pre>

<p>Check out the <a href="https://github.com/sferik/t#installation">README</a> for installation and usage.</p>
<p>The post <a href="http://thechangelog.com/t-powerful-command-line-interface-for-twitter/">t &#8211; Powerful command line interface for Twitter</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/t-powerful-command-line-interface-for-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
