<?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; Steve Klabnik</title>
	<atom:link href="http://thechangelog.com/author/steveklabnik/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>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>Reminder: Upgrade your Postgres today!</title>
		<link>http://thechangelog.com/reminder-upgrade-your-postgres-today/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=reminder-upgrade-your-postgres-today</link>
		<comments>http://thechangelog.com/reminder-upgrade-your-postgres-today/#comments</comments>
		<pubDate>Thu, 04 Apr 2013 16:16:59 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[releases]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4257</guid>
		<description><![CDATA[<p>Last week, I told you all about an incoming security patch for Postgres. Well, today, it&#8217;s here. Please check out this page and upgrade your Postgres. As the Postgres team says, &#8216;This is the first security issue of this magnitude since 2006.&#8217; What&#8217;s the issue? As always, you can find the latest information about security [...]</p><p>The post <a href="http://thechangelog.com/reminder-upgrade-your-postgres-today/">Reminder: Upgrade your Postgres today!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Last week, I told you all about <a href="http://thechangelog.com/postgres-preps-for-a-big-security-release/">an incoming security patch for Postgres</a>. Well, today, it&#8217;s here. <a href="http://www.postgresql.org/about/news/1456/">Please check out this page and upgrade your Postgres</a>. As the Postgres team says, <em>&#8216;This is the first security issue of this magnitude since 2006.&#8217;</em></p>

<h2>What&#8217;s the issue?</h2>

<p>As always, you can find the latest information about security patches via the CVE system. <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-1899">Here&#8217;s the one for this vulnerability, CVE-2013-1899</a>.</p>

<p>There are three things that can happen with this vulnerability:</p>

<ul>
<li>Denial of Service. Error messages can be appended to files in Postgres&#8217; data directory. This can fill up disks, or cause Postgres to crash.</li>
<li>Configuration Setting Privilege Escalation. If they have a legitimate login, and the username and database name are identical, then that user can set a config variable as the superuser.</li>
<li>Arbitrary Code Execution. The &#8216;boss level&#8217; of vulnerabilities. If they can do both of the above things, and can save files outside of the data directory, then they can execute arbitrary C code.</li>
</ul>

<p>Damn.</p>

<h2>What versions are affected?</h2>

<p><em>Versions 9.0, 9.1 and 9.2.</em></p>

<h2>Where can I find more?</h2>

<p>The Postgres team has a <a href="http://www.postgresql.org/support/security/faq/2013-04-04/">FAQ</a> for this release, and <a href="http://www.postgresql.org/about/news/1456/">here</a> are the release announcements.</p>

<p>You can also <a href="http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a6e0cd7b76c04acc8c8f868a3bcd0f9ff13e16c8">see the commit that fixed the issue, with all the gory details</a>.</p>

<p>Or, <a href="https://news.ycombinator.com/item?id=5493509">discuss on Hacker News</a>.</p>
<p>The post <a href="http://thechangelog.com/reminder-upgrade-your-postgres-today/">Reminder: Upgrade your Postgres today!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/reminder-upgrade-your-postgres-today/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Today is a big day for Rust</title>
		<link>http://thechangelog.com/today-is-a-big-day-for-rust/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=today-is-a-big-day-for-rust</link>
		<comments>http://thechangelog.com/today-is-a-big-day-for-rust/#comments</comments>
		<pubDate>Wed, 03 Apr 2013 18:02:06 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Rust]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4224</guid>
		<description><![CDATA[<p>Lots of great stuff in the Rust world today. Rust 0.6 First of all, Rust 0.6.0 has been released! You can find the announcement here. As always, Rust works on Mac, Windows, and Linux. To get it, do this: $ wget http://static.rust-lang.org/dist/rust-0.6.tar.gz $ $ shasum -a 256 rust-0.6.tar.gz e11cb529a1e20f27d99033181a9e0e131817136b46d2742f0fa1afa1210053e5 rust-0.6.tar.gz $ tar xvf rust-0.6.tar.gz $ [...]</p><p>The post <a href="http://thechangelog.com/today-is-a-big-day-for-rust/">Today is a big day for Rust</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Lots of great stuff in the Rust world today.</p>

<h2>Rust 0.6</h2>

<p>First of all, Rust 0.6.0 has been released! You can find the announcement <a href="https://mail.mozilla.org/pipermail/rust-dev/2013-April/003427.html">here</a>.</p>

<p>As always, Rust works on Mac, Windows, and Linux. To get it, do this:</p>

<pre><code>$ wget http://static.rust-lang.org/dist/rust-0.6.tar.gz
$ $ shasum -a 256 rust-0.6.tar.gz
e11cb529a1e20f27d99033181a9e0e131817136b46d2742f0fa1afa1210053e5  rust-0.6.tar.gz
$ tar xvf rust-0.6.tar.gz
$ rust-0.6
$ ./configure
$ make
# make install
</code></pre>

<p>I added the SHA in there so you can verify you got everything properly. Now, compiling Rust is still pretty slow: it took about an hour on my MacBook Air.</p>

<p>I also have a <a href="https://github.com/mxcl/homebrew/pull/18940">pull request in on Homebrew</a>, so after that&#8217;s merged, you should be able to use homebrew instead of mucking about on the command line.</p>

<h3>What&#8217;s new</h3>

<p>So what&#8217;s new in Rust 0.6? <a href="https://github.com/mozilla/rust/wiki/Doc-detailed-release-notes#06-april-2013">You can find a detailed list of changes here</a>, and the <a href="https://github.com/mozilla/rust/compare/release-0.5...release-0.6">commit list here</a>. There were 2,398 commits by 17 authors, damn!</p>

<blockquote>
  <p>While we cannot promise that this is the last time there will be incompatible changes, the great majority of anticipated language-level changes are complete in this version. We expect subsequent releases before a beta and final 1.0 to be more focused on non-language-level work (performance, libraries, packaging and building, runtime system) with only modest language-level changes as we discover bugs and areas requiring residual polish (primarily in the trait system, macro system, and borrow check).</p>
</blockquote>

<p>This is the biggest thing for me. The language is almost completely settled down. You can find the meta-bug which describes all of the things that have yet to be removed <a href="https://github.com/mozilla/rust/issues/4707">here</a>.</p>

<p>Here&#8217;s some of my favorite changes from the release:</p>

<ul>
<li>Trailing sigils on closure types such as <code>fn@</code>, <code>fn~</code> and <code>fn&amp;</code> were removed in favour of the more-consistent leading sigils <code>@fn</code>, <code>~fn</code> and <code>&amp;fn</code>. (More consistent syntax is always good)</li>
<li>The <code>move</code> keyword was removed; owned types are always passed and assigned by moving now. (It was sorta odd that <code>move</code> was needed in places where the compiler could just infer it. This removes a bunch of clutter in code that sent owned types into spawned tasks, for example.)</li>
<li>The <code>fail</code> and <code>assert</code> keywords were replaced with macros <code>fail!()</code> and <code>assert!()</code>. (I&#8217;m generally pro-remove keywords, add macros)</li>
<li>in all cases mutability is controlled by mutability of the owner (inherited mutability). (Read this section in more depth, but I think this really helps the visibility of the mutability rules for a struct).</li>
<li><code>impl Ty : Trait {</code>  -> <code>impl Ty for Trait {</code>. (pretty!)</li>
<li>the &#8220;main function&#8221; doesn&#8217;t need to be called <code>main</code> anymore, you can use <code>#[main]</code> to change it.</li>
<li>Rust now supports using inline assembly through the <code>asm!</code> macro. (WEBSCALE!!!!111lolz)</li>
</ul>

<p>Neat stuff!</p>

<h2>Mozilla + Samsung</h2>

<p>Mozilla put out a press release today called <a href="https://blog.mozilla.org/blog/2013/04/03/mozilla-and-samsung-collaborate-on-next-generation-web-browser-engine/">&#8220;Mozilla and Samsung Collaborate on Next Generation Web Browser Engine&#8221;</a>.</p>

<p>Translation? Servo is a real project now. At least, that&#8217;s how I read it.</p>

<blockquote>
  <p>We are now pleased to announce with Samsung that together we are bringing both the Rust programming language and Servo, the experimental web browser engine, to Android and ARM. This is an exciting step in the evolution of both projects that will allow us to start deeper research with Servo on mobile.</p>
  
  <p>n the coming year, we are racing to complete the first major revision of Rust – cleaning up, expanding and documenting the libraries, building out our tools to improve the user experience, and beefing up performance. At the same time, we will be putting more resources into Servo, trying to prove that we can build a fast web browser with pervasive parallelism, and in a safe, fun language.</p>
</blockquote>

<p>Cool! If you&#8217;re not aware, <a href="https://github.com/mozilla/servo">Servo</a> is a massively parallel browser rendering engine, written in Rust. I haven&#8217;t been covering it here on the Changelog because it&#8217;s been a purely research project, but I&#8217;m really excited to see it move forward.</p>
<p>The post <a href="http://thechangelog.com/today-is-a-big-day-for-rust/">Today is a big day for Rust</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/today-is-a-big-day-for-rust/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>simple-web-server: A web server in Rust</title>
		<link>http://thechangelog.com/simple-web-server-a-web-server-in-rust/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=simple-web-server-a-web-server-in-rust</link>
		<comments>http://thechangelog.com/simple-web-server-a-web-server-in-rust/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 19:03:22 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=4153</guid>
		<description><![CDATA[<p>There&#8217;s a project that I&#8217;d been meaning to try with Rust, and that&#8217;s write a basic web server. I kept putting it off, and when I saw the 0.6 rc land recently, I said I&#8217;d give it a try to play with 0.6. But schaars has beaten me to it, and released simple-web-server today. simple-web-server [...]</p><p>The post <a href="http://thechangelog.com/simple-web-server-a-web-server-in-rust/">simple-web-server: A web server in Rust</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>There&#8217;s a project that I&#8217;d been meaning to try with Rust, and that&#8217;s write a basic web server. I kept putting it off, and when I saw the 0.6 rc land recently, I said I&#8217;d give it a try to play with 0.6. But <a href="https://github.com/schaars">schaars</a> has beaten me to it, and released <a href="https://github.com/schaars/simple-web-server">simple-web-server</a> today.</p>

<p><code>simple-web-server</code> was written with Rust 0.5 in mind. It&#8217;s pretty easy to build, just use <code>make</code>!</p>

<pre><code>$ cd rust
$ make
</code></pre>

<p>Trying it out is easy, too:</p>

<pre><code>$ ./ws -p port -s pool_size -d web_dir
</code></pre>

<p>Right now, the server is simple, very simple. It only supports GET requests as HTTP/1.0. That said, that&#8217;s enough to qualify, and it&#8217;s certainly enough to toy around with Rust. As schaars says,</p>

<blockquote>
  <p>The goal is not performance, but rather discovering the language and building a simple distributed system.</p>
</blockquote>

<p>Rust&#8217;s concurrency features, used properly, should make for a really awesome web server. I&#8217;m excited to see what happens when a production-ready one comes out.</p>
<p>The post <a href="http://thechangelog.com/simple-web-server-a-web-server-in-rust/">simple-web-server: A web server in Rust</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/simple-web-server-a-web-server-in-rust/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>Postgres preps for a big security release</title>
		<link>http://thechangelog.com/postgres-preps-for-a-big-security-release/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=postgres-preps-for-a-big-security-release</link>
		<comments>http://thechangelog.com/postgres-preps-for-a-big-security-release/#comments</comments>
		<pubDate>Fri, 29 Mar 2013 16:40:42 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3998</guid>
		<description><![CDATA[<p>UPDATE: Reminder: Upgrade your Postgres today! Yesterday, I became aware of this email to the PostgresSQL-hackers email list. The email states that there is a very serious security release coming up next week &#8212; so bad that they&#8217;re taking extra precautions. Here&#8217;s my summary of the email: The core committee has decided that one of [...]</p><p>The post <a href="http://thechangelog.com/postgres-preps-for-a-big-security-release/">Postgres preps for a big security release</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><em>UPDATE</em>: <a href="http://thechangelog.com/reminder-upgrade-your-postgres-today/">Reminder: Upgrade your Postgres today!</a></p>

<p>Yesterday, I became aware of <a href="http://www.postgresql.org/message-id/14040.1364490185@sss.pgh.pa.us">this email</a> to <a href="http://www.postgresql.org/list/pgsql-hackers/">the PostgresSQL-hackers email list</a>. The email states that there is <em>a very serious security release</em> coming up next week &#8212; so bad that they&#8217;re taking extra precautions.</p>

<p>Here&#8217;s my summary of <a href="http://www.postgresql.org/message-id/14040.1364490185@sss.pgh.pa.us">the email</a>:</p>

<blockquote>
  <p>The core committee has decided that one of the security issues due to be
  fixed next week is sufficiently bad that we need to take extra measures
  to prevent it from becoming public before packages containing the fix
  are available.</p>
  
  <p>What we intend to do is shut off updates from the master git repo to
  the anonymous-git mirror, and to github, from Monday afternoon until
  Thursday morning.</p>
  
  <p>We do not intend to start doing this
  as a routine thing, and apologize in advance for any disruption.</p>
</blockquote>

<p>Every project has security flaws, and <em>it&#8217;s great to see the Postgres team take this so seriously</em>. If your team relies heavily on Postgres, consider scheduling a maintenance window sometime shortly after the patch is due to be released, so that you can get your servers fixed up. This one looks to be anomalously big.</p>

<p><a href="https://news.ycombinator.com/item?id=5464442">Share your thoughts and vote this up on Hacker News</a>.</p>
<p>The post <a href="http://thechangelog.com/postgres-preps-for-a-big-security-release/">Postgres preps for a big security release</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/postgres-preps-for-a-big-security-release/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rustyhex &#8211; a roguelike in Rust</title>
		<link>http://thechangelog.com/rustyhex-a-rougelike-in-rust/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rustyhex-a-rougelike-in-rust</link>
		<comments>http://thechangelog.com/rustyhex-a-rougelike-in-rust/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 17:54:11 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[gaming]]></category>
		<category><![CDATA[roguelike]]></category>
		<category><![CDATA[Rust]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3993</guid>
		<description><![CDATA[<p>I love roguelikes. My first ever interaction with a computer was in a related genre: interactive fiction. As soon as I saw Adventure, I was hooked on computers forever. Then, in college, I discovered nethack, and friends and I wasted way too much time attempting to ascend. I mean, how can you resist this? -------------------------------------------------------------------- [...]</p><p>The post <a href="http://thechangelog.com/rustyhex-a-rougelike-in-rust/">Rustyhex &#8211; a roguelike in Rust</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I love roguelikes. My first ever interaction with a computer was in a related genre: interactive fiction. As soon as I saw <a href="http://en.wikipedia.org/wiki/Colossal_Cave_Adventure">Adventure</a>, I was hooked on computers forever. Then, in college, I discovered <a href="http://www.nethack.org/">nethack</a>, and friends and I wasted way too much time attempting to ascend.</p>

<p>I mean, how can you resist this?</p>

<pre><code>--------------------------------------------------------------------
The bat bites!

     ------
     |....|    ----------
     |.&lt;..|####...@...$.|
     |....-#   |...B....+
     |....|    |.d......|
     ------    -------|--


Player the Rambler     St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15  Neutral
Dlvl:1 $:0  HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak

--------------------------------------------------------------------
</code></pre>

<p>Well, they&#8217;ve gotten a bit better since then. Here&#8217;s what Rustyhex looks like:</p>

<p><img src="http://a248.e.akamai.net/camo.github.com/43020e4e6d8e7a51741f4f195ee008d7538dfa8b/687474703a2f2f692e696d6775722e636f6d2f4331457a487a552e706e67" alt="rusthex" /></p>

<p>As <a href="https://github.com/dpc/rustyhex/blob/master/README.md">the README</a> mentions:</p>

<blockquote>
  <p>Rustyhex is a work toward implementing a simple rouge-like game with hex tiles.</p>
  
  <p>It&#8217;s written in Rust and it&#8217;s primary purpose is to learn and practice Rust language.</p>
</blockquote>

<p>Seems cool! It uses the <a href="https://github.com/brson/rust-sdl">Rust SDL bindings</a> to interface with the outside world, and is pretty small: it&#8217;s right around a thousand lines of code, by my rough count.</p>

<p>Games are one area that I&#8217;m really excited about with Rust: given that it&#8217;s native to Mac/Windows/Linux, and has an emphasis on low-level speed, Rust could be a pretty decent language for making them.</p>
<p>The post <a href="http://thechangelog.com/rustyhex-a-rougelike-in-rust/">Rustyhex &#8211; a roguelike in Rust</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/rustyhex-a-rougelike-in-rust/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>rust-antlr: An ANTLR grammar for Rust</title>
		<link>http://thechangelog.com/rust-antlr-an-antlr-grammar-for-rust/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rust-antlr-an-antlr-grammar-for-rust</link>
		<comments>http://thechangelog.com/rust-antlr-an-antlr-grammar-for-rust/#comments</comments>
		<pubDate>Wed, 27 Mar 2013 18:44:30 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[compilers]]></category>
		<category><![CDATA[Rust]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3957</guid>
		<description><![CDATA[<p>I just heard about a neat new project: rust-antlr. Basically, it&#8217;s an ANTLR grammar for Rust. Unfortunately, if you&#8217;re not a compiler nerd, you may not know what that means. At the highest level of detail, implementations of a language&#8217;s grammar are useful even outside of the compiler itself. For example, syntax highlighting tools, static [...]</p><p>The post <a href="http://thechangelog.com/rust-antlr-an-antlr-grammar-for-rust/">rust-antlr: An ANTLR grammar for Rust</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I just heard about a neat new project: <a href="https://github.com/jbclements/rust-antlr/">rust-antlr</a>. Basically, it&#8217;s an ANTLR grammar for <a href="http://www.rust-lang.org/">Rust</a>.</p>

<p>Unfortunately, if you&#8217;re not a compiler nerd, you may not know what that means.</p>

<p>At the highest level of detail, implementations of a language&#8217;s grammar are useful even outside of the compiler itself. For example, syntax highlighting tools, static analysis tools, and alternate language implementations are all good usages of a grammar that&#8217;s separate from the official language implementation. So, this project should help out anyone wanting to do something along those lines.</p>

<p>More specifically, <a href="http://www.antlr.org/">ANTLR</a> is a tool for writing grammars. You can write an ANTLR grammar, then have it generate a bunch of code that you can compile into a project, or use standalone as a grammar checker.</p>

<p>Anyway, as <a href="https://github.com/jbclements/rust-antlr/#rust-antlr">the README</a> shows, it&#8217;s pretty easy to get started:</p>

<pre><code>1. install antlr 4 jar, put it in your classpath
2. run make
3. try java org.antlr.v4.runtime.misc.TestRig Rust tts -tree &lt; foo.rs
</code></pre>

<p>That&#8217;s it! I&#8217;m excited to see some tooling pop up around Rust, and hopefully this will enable even more neat tools to be built.</p>
<p>The post <a href="http://thechangelog.com/rust-antlr-an-antlr-grammar-for-rust/">rust-antlr: An ANTLR grammar for Rust</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/rust-antlr-an-antlr-grammar-for-rust/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>otr.js: Off The Record Protocol in JavaScript</title>
		<link>http://thechangelog.com/otr-js-off-the-record-protocol-in-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=otr-js-off-the-record-protocol-in-javascript</link>
		<comments>http://thechangelog.com/otr-js-off-the-record-protocol-in-javascript/#comments</comments>
		<pubDate>Fri, 22 Mar 2013 19:28:41 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[crypto]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[privacy]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3808</guid>
		<description><![CDATA[<p>Before we talk about otr.js, we have to talk about crypto in JavaScript. It&#8217;s important to discuss issues with cryptography, because bugs are much more severe than in &#8216;normal&#8217; code. If your Rails app has a bug, maybe some emails don&#8217;t get sent out. If your crypto has a flow, your secrets are all wide [...]</p><p>The post <a href="http://thechangelog.com/otr-js-off-the-record-protocol-in-javascript/">otr.js: Off The Record Protocol in JavaScript</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Before we talk about otr.js, we have to talk about crypto in JavaScript. It&#8217;s important to discuss issues with cryptography, because bugs are much more severe than in &#8216;normal&#8217; code. If your Rails app has a bug, maybe some emails don&#8217;t get sent out. If your crypto has a flow, your secrets are all wide open.</p>

<p>So, before discussing a JavaScript crypto library, I must point you to the first line of <a href="https://github.com/arlolra/otr#warning">the README</a>:</p>

<blockquote>
  <p>This library hasn&#8217;t been properly vetted by security researchers. Do not use in life and death situations!</p>
</blockquote>

<p>Furthermore, for more on the issues of crypto and JavaScript specifically, I refer you to <a href="http://www.matasano.com/articles/javascript-cryptography/">this post by Matasano Security</a>, whose opinions I trust when it comes to security.</p>

<hr />

<p>Okay, now that we&#8217;ve got that out of the way, let&#8217;s talk about otr.js! <a href="http://www.cypherpunks.ca/otr/">OTR</a> is a protocol which allows you to have private conversations over IM. As you may guess, otr.js is an implementation of this protocol in JavaScript.</p>

<p>There&#8217;s a lot of setup required, so please <a href="https://github.com/arlolra/otr/blob/master/readme.md">read the README</a>, but once you&#8217;ve got it set up, it&#8217;s pretty easy to use:</p>

<pre><code>var newmsg = "Message to userA."
buddy.sendMsg(newmsg)
</code></pre>

<p>Not that hard, right? There&#8217;s a ton of different options, though they are pretty well-documented. What is odd though, is that apparently messages aren&#8217;t encrypted at first; you must call</p>

<pre><code>buddy.sendQueryMsg()
</code></pre>

<p>to make that happen. I believe this is because the OTR protocol itself allows for unencrypted messages, and otr.js seems to be a lower-level library that others will build upon, rather than something you&#8217;d use directly.</p>
<p>The post <a href="http://thechangelog.com/otr-js-off-the-record-protocol-in-javascript/">otr.js: Off The Record Protocol in JavaScript</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/otr-js-off-the-record-protocol-in-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>log2viz: Logs as Data for Performance Visibility</title>
		<link>http://thechangelog.com/log2viz-logs-as-data-for-performance-visibility/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=log2viz-logs-as-data-for-performance-visibility</link>
		<comments>http://thechangelog.com/log2viz-logs-as-data-for-performance-visibility/#comments</comments>
		<pubDate>Tue, 19 Mar 2013 18:53:19 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[heroku]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3737</guid>
		<description><![CDATA[<p>Today, Heroku announced log2viz: a way to visualize your log data. Here&#8217;s what it looks like: This is for one of my applications, running on Heroku. It gives you real-time updates; these graphs actually change as you watch them. It&#8217;s pretty easy to use the version Heroku has up, located at https://log2viz.herokuapp.com/, I was already [...]</p><p>The post <a href="http://thechangelog.com/log2viz-logs-as-data-for-performance-visibility/">log2viz: Logs as Data for Performance Visibility</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Today, Heroku announced log2viz: a way to visualize your log data. Here&#8217;s what it looks like:</p>

<p><a href="http://i.imgur.com/G0OmXWx.png"><img src="http://i.imgur.com/G0OmXWx.png" alt="logviz" /></a></p>

<p>This is for one of my applications, running on Heroku. It gives you real-time updates; these graphs actually change as you watch them.</p>

<p>It&#8217;s pretty easy to use the version Heroku has up, located at <a href="https://log2viz.herokuapp.com/">https://log2viz.herokuapp.com/</a>, I was already logged into my Heroku account, and all my apps were there.</p>

<p>If you&#8217;d like to use your own private install, that&#8217;s easy too: just clone <a href="https://github.com/heroku/log2viz">the repo</a> and do this:</p>

<pre><code>$ heroku create -a myviz
# create a new oauth client
$ curl -i -n -X POST \
-d "client[name]=myviz-production&amp;client[[redirect_uri]=https://myviz.herokuapp.com/auth/heroku/callback" https://api.heroku.com/oauth/clients
$ heroku config:set HEROKU_ID=xxxxxxxx HEROKU_SECRET=xxxxxx HEROKU_AUTH_URL=https://id.heroku.com
$ git push heroku master
</code></pre>

<p>Pretty easy! Now you have your own copy running on an app.</p>

<p>For more details, check out the <a href="https://blog.heroku.com/archives/2013/3/19/log2viz">official blog post</a> over on Heroku&#8217;s blog: it explains more details about how it actually works.</p>
<p>The post <a href="http://thechangelog.com/log2viz-logs-as-data-for-performance-visibility/">log2viz: Logs as Data for Performance Visibility</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/log2viz-logs-as-data-for-performance-visibility/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git 1.8.2 released</title>
		<link>http://thechangelog.com/git-1-8-2-released/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=git-1-8-2-released</link>
		<comments>http://thechangelog.com/git-1-8-2-released/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 18:01:31 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3692</guid>
		<description><![CDATA[<p>I&#8217;m pretty sure that most of you who read The Changelog care about git. Well, yesterday, 1.8.2 was released! Of course, linking to the commit that actually did the release isn&#8217;t mega-helpful, so here&#8217;s a link to the CHANGELOG instead. My favorite change is this one: The patterns in .gitignore and .gitattributes files can have [...]</p><p>The post <a href="http://thechangelog.com/git-1-8-2-released/">Git 1.8.2 released</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m pretty sure that most of you who read The Changelog care about <code>git</code>. Well, yesterday, <a href="https://git.kernel.org/cgit/git/git.git/commit/?id=239222f587ed06f96d90dd71c66d80a2b1e3dc9f">1.8.2 was released!</a></p>

<p>Of course, linking to the commit that actually did the release isn&#8217;t mega-helpful, so <a href="https://git.kernel.org/cgit/git/git.git/tree/Documentation/RelNotes/1.8.2.txt?id=v1.8.2">here&#8217;s a link to the CHANGELOG instead</a>.</p>

<p>My favorite change is this one:</p>

<blockquote>
  <p>The patterns in .gitignore and .gitattributes files can have <code>**/</code>,
   as a pattern that matches 0 or more levels of subdirectory.
   E.g. <code>foo/**/bar</code> matches <code>bar</code> in <code>foo</code> itself or in a
   subdirectory of <code>foo</code>.</p>
</blockquote>

<p>I find myself wanting this a bunch, so it&#8217;s nice to have in. I&#8217;m also pumped about &#8216;git check-ignore&#8217;, which helps you figure out if what you added to your <code>.gitignore</code> actually did what it&#8217;s supposed to do.</p>

<hr />

<p><a href="https://news.ycombinator.com/item?id=5377123">Discuss on Hacker News</a></p>
<p>The post <a href="http://thechangelog.com/git-1-8-2-released/">Git 1.8.2 released</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/git-1-8-2-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>halbert: a JavaScript implementation of HAL</title>
		<link>http://thechangelog.com/halbert-a-javascript-implementation-of-hal/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=halbert-a-javascript-implementation-of-hal</link>
		<comments>http://thechangelog.com/halbert-a-javascript-implementation-of-hal/#comments</comments>
		<pubDate>Wed, 13 Mar 2013 22:55:21 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[hypermedia]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3679</guid>
		<description><![CDATA[<p>Building an awesome hypermedia API, and using HAL to do it? You might want to check out halbert. Halbert is pretty easy to install and use, just do this: $ npm install halbert And then, in your code: var parser = require('halbert').parser; var resource = parser(json_object); And that&#8217;s it! Of course, you&#8217;ll get an error [...]</p><p>The post <a href="http://thechangelog.com/halbert-a-javascript-implementation-of-hal/">halbert: a JavaScript implementation of HAL</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Building an awesome hypermedia API, and using <a href="http://stateless.co/hal_specification.html">HAL</a> to do it? You might want to check out halbert.</p>

<p>Halbert is pretty easy to install and use, just do this:</p>

<pre><code>$ npm install halbert
</code></pre>

<p>And then, in your code:</p>

<pre><code>var parser = require('halbert').parser;
var resource = parser(json_object);
</code></pre>

<p>And that&#8217;s it! Of course, you&#8217;ll get an error if the JSON isn&#8217;t proper HAL.</p>
<p>The post <a href="http://thechangelog.com/halbert-a-javascript-implementation-of-hal/">halbert: a JavaScript implementation of HAL</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/halbert-a-javascript-implementation-of-hal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On GitHub and Workflows</title>
		<link>http://thechangelog.com/on-github-and-workflows/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=on-github-and-workflows</link>
		<comments>http://thechangelog.com/on-github-and-workflows/#comments</comments>
		<pubDate>Mon, 11 Mar 2013 18:40:57 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[workflow]]></category>

		<guid isPermaLink="false">http://thechangelog.com/?p=3613</guid>
		<description><![CDATA[<p>One of the best things about git is that it allows you to do whatever you want. One of the worst things about git is that it allows you to do whatever you want. This has lead to a bunch of different &#8216;workflows&#8217; for managing an open source project. I remember when &#8220;Git Flow&#8221; hit [...]</p><p>The post <a href="http://thechangelog.com/on-github-and-workflows/">On GitHub and Workflows</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>One of the best things about git is that it allows you to do whatever you want.</p>

<p>One of the worst things about git is that it allows you to do whatever you want.</p>

<p>This has lead to a bunch of different &#8216;workflows&#8217; for managing an open source project. I remember when <a href="http://nvie.com/posts/a-successful-git-branching-model/">&#8220;Git Flow&#8221;</a> hit the scene, and everyone was mega-excited by it. Then, GitHub themselves fired back with <a href="http://scottchacon.com/2011/08/31/github-flow.html">&#8220;GitHub flow,&#8221;</a> which was a bit simpler and talked about how they handle things.</p>

<p>Here&#8217;s Yet Another Entry into this ongoing saga: <a href="http://blog.selfassembled.org/posts/github_and_workflows.html">&#8220;On GitHub and Workflows&#8221;</a> Basically, it&#8217;s somewhere in between the two: you have three branches, representing production, staging, and development. On top of development, you work like GitHub Flow, and when things go from development -> staging and staging -> production, there&#8217;s an opportunity for a last code review.</p>

<p>As a bonus, there&#8217;s a little script at the bottom for making pull requests from the command-line with <code>hub</code>. Neat! We originally saw this from <a href="https://twitter.com/moo9000/status/310580419248672768">this tweet by @moo9000</a>.</p>
<p>The post <a href="http://thechangelog.com/on-github-and-workflows/">On GitHub and Workflows</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/on-github-and-workflows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx gains support for WebSockets</title>
		<link>http://thechangelog.com/nginx-gains-support-for-websockets/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nginx-gains-support-for-websockets</link>
		<comments>http://thechangelog.com/nginx-gains-support-for-websockets/#comments</comments>
		<pubDate>Tue, 19 Feb 2013 17:50:54 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[websockets]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=3022</guid>
		<description><![CDATA[<p>I saw this commit land a few days ago, and now it&#8217;s out in a release. nginx 1.3.13 has support for proxying WebSockets requests. What does that mean? Well, let&#8217;s look at the commit that introduced the change: This allows to proxy WebSockets? by using configuration like this: location /chat/ { proxy_pass ​http://backend; proxy_http_version 1.1; [...]</p><p>The post <a href="http://thechangelog.com/nginx-gains-support-for-websockets/">Nginx gains support for WebSockets</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I saw this commit land a few days ago, and now it&#8217;s out in a release. nginx 1.3.13 has support for proxying WebSockets requests.</p>

<p>What does that mean? Well, let&#8217;s <a href="http://trac.nginx.org/nginx/changeset/5073/nginx">look at the commit</a> that introduced the change:</p>

<p>This allows to proxy <code>WebSockets?</code> by using configuration like this:</p>

<pre><code>location /chat/ {

    proxy_pass ​http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

}
</code></pre>

<p>A nice example, right there! Before you could do this, you needed to do some kind of extra tricks, like <a href="http://thruflo.com/post/23226473852/websockets-varnish-nginx">using varnish in front of nginx</a> and having varnish proxy the requests straight to your back end servers. Super awkward.</p>

<p>You can grab a copy of nginx 1.3.13 <a href="http://nginx.org/en/download.html">on their download page</a>.</p>

<p><a href="http://news.ycombinator.com/item?id=5246136">Discuss on Hacker News</a>.</p>
<p>The post <a href="http://thechangelog.com/nginx-gains-support-for-websockets/">Nginx gains support for WebSockets</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/nginx-gains-support-for-websockets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Rust backend for Ragel</title>
		<link>http://thechangelog.com/a-rust-backend-for-ragel/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-rust-backend-for-ragel</link>
		<comments>http://thechangelog.com/a-rust-backend-for-ragel/#comments</comments>
		<pubDate>Sun, 17 Feb 2013 22:02:38 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[ragel]]></category>
		<category><![CDATA[Rust]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2999</guid>
		<description><![CDATA[<p>Yesterday, I read that Rust&#8217;s bindings to Ragel have been updated to work with Rust HEAD, so I figured I&#8217;d tell you! Here&#8217;s erickt&#8217;s repository. What is Ragel? Ragel is a DSL that&#8217;s used to produce state machines that can be used to match some input. For example: HTTP has a grammar, so you could [...]</p><p>The post <a href="http://thechangelog.com/a-rust-backend-for-ragel/">A Rust backend for Ragel</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Yesterday, I read that Rust&#8217;s bindings to Ragel have been updated to work with Rust HEAD, so I figured I&#8217;d tell you! <a href="https://github.com/erickt/ragel">Here&#8217;s erickt&#8217;s repository</a>.</p>

<p>What is Ragel? <a href="http://www.complang.org/ragel/">Ragel</a> is a DSL that&#8217;s used to produce state machines that can be used to match some input. For example: HTTP has a grammar, so you could write it down with Ragel, and then Ragel would be able to spit out something that matches given input with the grammar.</p>

<p>Mongrel has a famously good Ragel HTTP parser that&#8217;s been used in basically every Ruby web server since. <a href="https://github.com/mongrel/mongrel/blob/master/ext/http11/http11_parser.rl">Here&#8217;s what an .rl file looks like</a>. Zed Shaw, the author, <a href="http://www.zedshaw.com/essays/ragel_state_charts.html">once blogged about it</a>:</p>

<blockquote>
  <p>Ragel is the software behind Mongrel’s speed and correct HTTP processing. With very little effort I was able to use Ragel to create a full HTTP processor that can process the protocol at insane speeds. From a developer point of view Ragel let me crank out a fully functioning web server in about a week. In fact, the number of changes to the parser in Mongrel only accounts for 4.2% of the total revisions.</p>
</blockquote>

<p>Fun! Anyway, so here&#8217;s how it works: you write a <code>.rl</code> file that contains the grammar you&#8217;d like to make. You then run ragel on it, and tell it what language you&#8217;d like to use it in, and it makes a file with code in that language that you can use. <a href="https://github.com/mongrel/mongrel/blob/master/ext/http11/http11_parser.c">Here</a> is the C code that Ragel spit out for that <code>.rl</code> file above.</p>

<p>So, that&#8217;s what this project is: a fork of Ragel that supports a Rust backend. So you could take that HTTP parser from Zed, have it spit out some Rust code that parses HTTP requests, and you&#8217;d be on your way to writing a web sever in Rust. Awesome.</p>
<p>The post <a href="http://thechangelog.com/a-rust-backend-for-ragel/">A Rust backend for Ragel</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/a-rust-backend-for-ragel/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>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>sprocketnes is a work-in-progress NES emulator in Rust</title>
		<link>http://thechangelog.com/sprocketnes-a-work-in-progress-nes-emulator-in-rust/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sprocketnes-a-work-in-progress-nes-emulator-in-rust</link>
		<comments>http://thechangelog.com/sprocketnes-a-work-in-progress-nes-emulator-in-rust/#comments</comments>
		<pubDate>Sun, 10 Feb 2013 19:48:29 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Emulator]]></category>
		<category><![CDATA[Nintendo]]></category>
		<category><![CDATA[Rust]]></category>

		<guid isPermaLink="false">https://thechangelog.com/?p=2886</guid>
		<description><![CDATA[<p>I&#8217;ve been really getting into Rust lately, and while it&#8217;s still quite young, there&#8217;s lots of neat things going on with this language. One fun project that popped up on my radar this week was sprocketnes, an NES (Nintendo) emulator. It&#8217;s not perfect, but it&#8217;s getting there! From the README: Its purpose is to serve [...]</p><p>The post <a href="http://thechangelog.com/sprocketnes-a-work-in-progress-nes-emulator-in-rust/">sprocketnes is a work-in-progress NES emulator in Rust</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been really getting into Rust lately, and while it&#8217;s still quite young, there&#8217;s lots of neat things going on with this language. One fun project that popped up on my radar this week was <a href="https://github.com/pcwalton/sprocketnes">sprocketnes</a>, an NES (Nintendo) emulator.</p>

<p><img src="http://i.imgur.com/7i691Vy.png" alt="rust nes screenshot 1" /></p>

<p>It&#8217;s not perfect, but it&#8217;s getting there!</p>

<p>From <a href="https://github.com/pcwalton/sprocketnes/blob/master/README.md">the README</a>:</p>

<blockquote>
  <p><em>Its purpose is</em> to serve as a technology demonstration <em>to show how the Rust programming language is suitable for systems software</em> such as emulators. It has many shortcomings and is not intended to be a production-quality emulator. sprocketnes is also designed to be a relatively clean example codebase, showing off various Rust idioms.</p>
</blockquote>

<p><a href="https://twitter.com/pcwalton">Patrick Walton</a> is one of the more active Rustics, (a term I think I like even more than Rubyist! ;) ), so if you&#8217;re looking for a good example of Rust code, <a href="https://github.com/pcwalton/sprocketnes">sprocketnes</a> is a project you should check out.</p>
<p>The post <a href="http://thechangelog.com/sprocketnes-a-work-in-progress-nes-emulator-in-rust/">sprocketnes is a work-in-progress NES emulator in Rust</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/sprocketnes-a-work-in-progress-nes-emulator-in-rust/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fr_public: Demoscene tools</title>
		<link>http://thechangelog.com/fr-public-demoscene-tools/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=fr-public-demoscene-tools</link>
		<comments>http://thechangelog.com/fr-public-demoscene-tools/#comments</comments>
		<pubDate>Fri, 11 May 2012 17:05:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[demo]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/fr-public-demoscene-tools/</guid>
		<description><![CDATA[<p>Hey everyone! It&#8217;s Friday, and a good friend of mine (@DeMarko) just tipped me off to a really interesting repository. If you&#8217;re not aware of the Demoscene, you should be. Basically, they make awesome crazy videos with computer graphics. That sounds boring, until you realize that they work within crazy constraints. For example, here&#8217;s a [...]</p><p>The post <a href="http://thechangelog.com/fr-public-demoscene-tools/">fr_public: Demoscene tools</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Hey everyone! It&#8217;s Friday, and a good friend of mine (@DeMarko) just tipped me off to a really interesting repository.</p>

<p>If you&#8217;re not aware of the <a href="http://en.wikipedia.org/wiki/Demoscene">Demoscene</a>, you should be. Basically, they make awesome crazy videos with computer graphics. That sounds boring, until you realize that they work within crazy constraints.</p>

<p>For example, here&#8217;s a ten minute Demo made on the Amiga:</p>

<p><a href="http://www.youtube.com/watch?v=k8JbAdEzvMA">http://www.youtube.com/watch?v=k8JbAdEzvMA</a></p>

<p>Here&#8217;s one on the Commodore 64, in 1982:</p>

<p><a href="http://www.youtube.com/watch?v=8Nfgdr4fOS8">http://www.youtube.com/watch?v=8Nfgdr4fOS8</a></p>

<p>While these videos are old, the Demoscene certainly isn&#8217;t dead. Here&#8217;s another C64 demo, this time from 2010:</p>

<p><a href="http://www.youtube.com/watch?v=L8onlB0F1_A">http://www.youtube.com/watch?v=L8onlB0F1_A</a></p>

<p>Anyway, I could go on and on. Point is, many modern demos are made on modern computers, but with a different constraint: file size. Generally, it&#8217;s &#8220;make an awesome video with graphics and sound that&#8217;s less than 4k.&#8221; That&#8217;s smaller than a blank word document. Here&#8217;s an example of one of these:</p>

<p><a href="http://www.youtube.com/watch?feature=player_embedded&amp;v=0w_xEUoK79o">http://www.youtube.com/watch?feature=player_embedded&amp;v=0w_xEUoK79o</a></p>

<p>Make sure to tell YouTube you want the 1080p (!) version.</p>

<p>Anyway, I&#8217;ll stop with the history. Here&#8217;s the point: There&#8217;s a repository that&#8217;s basically just a raw dump of the code people have written to make these kinds of demos. An archive of the last ten years of a bunch of people making awesome things.</p>

<p>The README warns that much of the code is hard to compile, and if you don&#8217;t know C or C++, you probably won&#8217;t be able to make heads or tails of it. Note also that these are tools used to make demos, not necessarily the code of the demo itself. Point is, there be dragons in this repo. Lots of dragons.</p>

<p>You can check out the Farbrausch tools repo <a href="https://github.com/farbrausch/fr_public">here</a>.</p>

<p>UPDATE: One of my other friends (@davewilkinsonii) pointed me to this article, which refers to the above repository, but also has links to download source code of a TON of demos: <a href="http://www.displayhack.org/2012/the-great-demoscene-sourcecode-giveaway/">http://www.displayhack.org/2012/the-great-demoscene-sourcecode-giveaway/</a></p>
<p>The post <a href="http://thechangelog.com/fr-public-demoscene-tools/">fr_public: Demoscene tools</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/fr-public-demoscene-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Postgres.app: Postgres for the Mac</title>
		<link>http://thechangelog.com/postgres-app-postgres-for-the-mac/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=postgres-app-postgres-for-the-mac</link>
		<comments>http://thechangelog.com/postgres-app-postgres-for-the-mac/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 19:06:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[postgres]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/postgres-app-postgres-for-the-mac/</guid>
		<description><![CDATA[<p>The ever-awesome @mattt has released Postgres.app. From the README: Postgres.app is the easiest way to get started with PostgreSQL on the Mac. Open the app, and you have a PostgreSQL server ready and awaiting new connections. Close the app, and the server shuts down. Even with homebrew, installing postgres can kind of be a pain [...]</p><p>The post <a href="http://thechangelog.com/postgres-app-postgres-for-the-mac/">Postgres.app: Postgres for the Mac</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>The ever-awesome <a href="http://twitter.com/mattt">@mattt</a> has released Postgres.app. From the README:</p>

<blockquote>
  <p>Postgres.app is the easiest way to get started with PostgreSQL on the Mac. Open the app, and you have a PostgreSQL server ready and awaiting new connections. Close the app, and the server shuts down.</p>
</blockquote>

<p>Even with homebrew, installing postgres can kind of be a pain sometimes. I&#8217;m always for any project that makes software installation even easier.</p>

<p>You can get Postgres.app from <a href="http://postgresapp.com/">its website</a> or check it out <a href="https://github.com/mattt/Postgres-for-Mac">on GitHub</a>.</p>
<p>The post <a href="http://thechangelog.com/postgres-app-postgres-for-the-mac/">Postgres.app: Postgres for the Mac</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/postgres-app-postgres-for-the-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quiet Assets: Silence Asset Pipeline Messages</title>
		<link>http://thechangelog.com/quiet-assets-silence-asset-pipeline-messages/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=quiet-assets-silence-asset-pipeline-messages</link>
		<comments>http://thechangelog.com/quiet-assets-silence-asset-pipeline-messages/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 17:53:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[assets]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/quiet-assets-silence-asset-pipeline-messages/</guid>
		<description><![CDATA[<p>The Rails 3&#160;Asset Pipeline is super powerful, but it has one thing about it that&#8217;s truly annoying: tons of logger output in development mode. Here&#8217;s a simple Rails app&#8217;s log output when hitting an index page: Started GET "/" for 127.0.0.1 at 2012-04-16 13:48:27 -0400 Processing by ArticlesController#index as HTML Article Load (0.2ms) SELECT "articles".* [...]</p><p>The post <a href="http://thechangelog.com/quiet-assets-silence-asset-pipeline-messages/">Quiet Assets: Silence Asset Pipeline Messages</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>The Rails 3&#160;<a href="http://guides.rubyonrails.org/asset_pipeline.html">Asset Pipeline</a> is super powerful, but it has one thing about it that&#8217;s truly annoying: tons of logger output in development mode. Here&#8217;s a simple Rails app&#8217;s log output when hitting an index page:</p>

<pre><code>Started GET "/" for 127.0.0.1 at 2012-04-16 13:48:27 -0400
Processing by ArticlesController#index as HTML
  Article Load (0.2ms)  SELECT "articles".* FROM "articles" 
  Rendered articles/index.html.erb within layouts/application (2.3ms)
Completed 200 OK in 11ms (Views: 9.5ms | ActiveRecord: 0.2ms)

Started GET "/assets/authors.css?body=1" for 127.0.0.1 at 2012-04-16 13:48:27 -0400
 Served asset /authors.css - 304 Not Modified (0ms)
 [2012-04-16 13:48:27] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

Started GET "/assets/tags.css?body=1" for 127.0.0.1 at 2012-04-16 13:48:27 -0400
Served asset /tags.css - 304 Not Modified (0ms)
[2012-04-16 13:48:27] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

 Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2012-04-16 13:48:27 -0400
 Served asset /jquery.js - 304 Not Modified (0ms)
 [2012-04-16 13:48:27] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true


Started GET "/assets/comments.js?body=1" for 127.0.0.1 at 2012-04-16 13:48:27 -0400
Served asset /comments.js - 304 Not Modified (0ms)
[2012-04-16 13:48:27] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true


Started GET "/assets/tags.js?body=1" for 127.0.0.1 at 2012-04-16 13:48:27 -0400
Served asset /tags.js - 304 Not Modified (0ms)
[2012-04-16 13:48:27] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true


Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2012-04-16 13:48:27 -0400
Served asset /application.js - 304 Not Modified (0ms)
[2012-04-16 13:48:27] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
</code></pre>

<p>Seriously, I chopped about <em>half</em> of that out. Really, really annoying.</p>

<p>Enter quiet_assets. This little gem makes all of this junk go away. To install it, just add</p>

<pre><code>gem 'quiet_assets', :group =&gt; :development
</code></pre>

<p>to your Gemfile, bundle, and breathe. Now, it just looks like this:</p>

<pre><code>Started GET "/" for 127.0.0.1 at 2012-04-16 13:51:54 -0400
Processing by ArticlesController#index as HTML
  Article Load (0.1ms)  SELECT "articles".* FROM "articles" 
  Rendered articles/index.html.erb within layouts/application (2.7ms)
 Completed 200 OK in 115ms (Views: 65.2ms | ActiveRecord: 1.8ms)
[2012-04-16 13:51:54] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
[2012-04-16 13:51:54] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
</code></pre>

<p>Much nicer. I can actually tell what&#8217;s going on!</p>

<p><a href="https://github.com/evrone/quiet_assets">Check it out on GitHub</a>.</p>
<p>The post <a href="http://thechangelog.com/quiet-assets-silence-asset-pipeline-messages/">Quiet Assets: Silence Asset Pipeline Messages</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/quiet-assets-silence-asset-pipeline-messages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsOneClick &#8211; an easy installer for Rails</title>
		<link>http://thechangelog.com/railsoneclick-an-easy-installer-for-rails/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=railsoneclick-an-easy-installer-for-rails</link>
		<comments>http://thechangelog.com/railsoneclick-an-easy-installer-for-rails/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 17:45:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/railsoneclick-an-easy-installer-for-rails/</guid>
		<description><![CDATA[<p>Apparently, Rails is really hard to install on Mac OSX. It can be easy to forget once you&#8217;re an experienced dev, but there&#8217;s been a rash of new projects to make it easier if you&#8217;re not. Yehuda Katz is working on Tokaido, Jeremy McAnally has Railcar, and now Oscar Del Ben built RailsOneClick. He&#8217;s got [...]</p><p>The post <a href="http://thechangelog.com/railsoneclick-an-easy-installer-for-rails/">RailsOneClick &#8211; an easy installer for Rails</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Apparently, Rails is really hard to install on Mac OSX. It can be easy to forget once you&#8217;re an experienced dev, but there&#8217;s been a rash of new projects to make it easier if you&#8217;re not. Yehuda Katz is working on <a href="http://yehudakatz.com/2012/04/13/tokaido-my-hopes-and-dreams/">Tokaido</a>, Jeremy McAnally has <a href="https://github.com/arcturo/Railcar">Railcar</a>, and now Oscar Del Ben built RailsOneClick.</p>

<p>He&#8217;s got a video of how it works, which you can find <a href="http://vimeo.com/40403458">here</a>.</p>

<p>So many projects that all do the same thing! I smell a merge coming&#8230;</p>

<p>Check it out <a href="https://github.com/oscardelben/RailsOneClick">here</a> on GitHub.</p>
<p>The post <a href="http://thechangelog.com/railsoneclick-an-easy-installer-for-rails/">RailsOneClick &#8211; an easy installer for Rails</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/railsoneclick-an-easy-installer-for-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bundler 1.1.rc is out!</title>
		<link>http://thechangelog.com/bundler-1-1-rc-is-out/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bundler-1-1-rc-is-out</link>
		<comments>http://thechangelog.com/bundler-1-1-rc-is-out/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 16:04:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[bundler]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/bundler-1-1-rc-is-out/</guid>
		<description><![CDATA[<p>If you do any work with Ruby and Rails, then you&#8217;ve (probably) grown to love Bundler, an awesome gem that resolves the dependencies for all your other gems. The bundler team has been working hard on a new release, and they&#8217;d love for some people to try it out. I&#8217;ve linked to the changelog for [...]</p><p>The post <a href="http://thechangelog.com/bundler-1-1-rc-is-out/">Bundler 1.1.rc is out!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>If you do any work with Ruby and Rails, then you&#8217;ve (probably) grown to love Bundler, an awesome gem that resolves the dependencies for all your other gems.</p>

<p>The bundler team has been working hard on a new release, and they&#8217;d love for some people to try it out. I&#8217;ve linked to the changelog for the 1.1 release here, but the biggest change is that it actually uses the RubyGems API, so bundling is much, much faster.</p>

<p>You can get it by typing</p>

<pre><code>$ gem install bundler --pre
</code></pre>

<p>If you find any issues, please report them on their <a href="https://github.com/carlhuda/bundler/issues">bug tracker</a>.</p>

<p>[<a href="https://github.com/carlhuda/bundler/blob/master/README.md">README</a>] [<a href="https://github.com/carlhuda/bundler/commit/2c9c2e3e7562f0a421652e4b9776fe0e52bc1bdd">CHANGELOG</a>]</p>
<p>The post <a href="http://thechangelog.com/bundler-1-1-rc-is-out/">Bundler 1.1.rc is out!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/bundler-1-1-rc-is-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Color Picker Pro for Mac</title>
		<link>http://thechangelog.com/color-picker-pro-for-mac/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=color-picker-pro-for-mac</link>
		<comments>http://thechangelog.com/color-picker-pro-for-mac/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 19:43:59 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/color-picker-pro-for-mac/</guid>
		<description><![CDATA[<p>It&#8217;s always neat to see desktop applications go open source. Oscar Del Ben has done just that with Color Picker Pro; it&#8217;s a desktop app that lets you, well, pick colors. If you&#8217;ve ever wondered how other people structure their desktop apps, or if you&#8217;re looking to figure out what exactly that color someone else [...]</p><p>The post <a href="http://thechangelog.com/color-picker-pro-for-mac/">Color Picker Pro for Mac</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s always neat to see desktop applications go open source. Oscar Del Ben has done just that with Color Picker Pro; it&#8217;s a desktop app that lets you, well, pick colors.</p>

<p>If you&#8217;ve ever wondered how other people structure their desktop apps, or if you&#8217;re looking to figure out what <em>exactly</em> that color someone else used is, you might want to give it a look.</p>

<p>Check out the <a href="https://github.com/oscardelben/Color-Picker-Pro/blob/master/Readme.md">README</a> for more.</p>
<p>The post <a href="http://thechangelog.com/color-picker-pro-for-mac/">Color Picker Pro for Mac</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/color-picker-pro-for-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sprockets 2.0 is out!</title>
		<link>http://thechangelog.com/sprockets-2-0-is-out/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sprockets-2-0-is-out</link>
		<comments>http://thechangelog.com/sprockets-2-0-is-out/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 18:11:11 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Asset Pipeline]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Sprockets]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/sprockets-2-0-is-out/</guid>
		<description><![CDATA[<p>After 15 beta releases, Sprockets has finally released the big 2.0. Why&#8217;s this a big deal? Well, Sprockets is the gem that&#8217;s powering the new asset pipeline in Rails 3.1. It can automatically process, minify, combine, and serve all of your assets in a variety of formats. If you&#8217;re using Rails, I&#8217;d recommend upgrading your [...]</p><p>The post <a href="http://thechangelog.com/sprockets-2-0-is-out/">Sprockets 2.0 is out!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>After 15 beta releases, <a href="https://github.com/sstephenson/sprockets">Sprockets</a> has finally released the big 2.0.</p>

<p>Why&#8217;s this a big deal? Well, Sprockets is the gem that&#8217;s powering the new asset pipeline in Rails 3.1. It can automatically process, minify, combine, and serve all of your assets in a variety of formats.</p>

<p>If you&#8217;re using Rails, I&#8217;d recommend upgrading your application to Rails 3.1. Even though it&#8217;s still just an RC release, the final is about to come very soon. Then, sprockets is all set up for you. If you&#8217;re not on Rails, then you should check out <a href="http://blog.envylabs.com/2011/08/using-the-asset-pipeline-outside-of-rails-serving-and-running-coffeescript-2/">this awesome blog post by Envy Labs</a>. It&#8217;ll get you going. Of course, you don&#8217;t need to use the Git URL now that version 2 is out.</p>

<p>Check out <a href="https://github.com/sstephenson/sprockets">the source</a> on GitHub and <a href="https://github.com/sstephenson/sprockets/blob/master/README.md">the readme</a> for more details.</p>
<p>The post <a href="http://thechangelog.com/sprockets-2-0-is-out/">Sprockets 2.0 is out!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/sprockets-2-0-is-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deployinator &#8211; Deploy with Style, by Etsy</title>
		<link>http://thechangelog.com/deployinator-deploy-with-style-by-etsy/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deployinator-deploy-with-style-by-etsy</link>
		<comments>http://thechangelog.com/deployinator-deploy-with-style-by-etsy/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 20:17:19 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[etsy]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Rack]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/deployinator-deploy-with-style-by-etsy/</guid>
		<description><![CDATA[<p>I am super excited to make this post. One of my favorite engineering blogs is Code as Craft. Etsy is one of my favorite startups, they&#8217;ve got cool people working there, they help people make and sell neat things, and contribute a lot back to the community. A while ago, they mentioned that they had [...]</p><p>The post <a href="http://thechangelog.com/deployinator-deploy-with-style-by-etsy/">Deployinator &#8211; Deploy with Style, by Etsy</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I am super excited to make this post.</p>

<p>One of my favorite engineering blogs is <a href="http://codeascraft.etsy.com/">Code as Craft</a>. Etsy is one of my favorite startups, they&#8217;ve got cool people working there, they help people make and sell neat things, and contribute a lot back to the community.</p>

<p>A while ago, they mentioned that they had an in-house, custom deployment tool. And they were thinking about open sourcing it. I&#8217;m really fascinated by what (by now) is being hailed as &#8220;DevOps,&#8221; and so I was really interested to see what they were building.</p>

<p>And then I waited.</p>

<p>And now, they&#8217;ve released it. From <a href="https://github.com/etsy/deployinator">their GitHub</a>, it&#8217;s just a little Sinatra app that you can run. It has the concept of &#8216;stacks,&#8217; so you can roll things out in waves if you&#8217;d like. They give an example of having a &#8216;search&#8217; stack and a &#8216;web&#8217; stack. Each stack can have environments, so you have &#8216;search staging&#8217; and &#8216;search production,&#8217; for example.</p>

<p>It&#8217;s a bit light on documentation at the moment, and since it came out under an hour ago, I have yet to try it out for myself. But I&#8217;m super excited to, and wanted to share. Bust out those fork buttons!</p>

<p>Check out <a href="https://github.com/etsy/deployinator">the source</a> on GitHub.</p>
<p>The post <a href="http://thechangelog.com/deployinator-deploy-with-style-by-etsy/">Deployinator &#8211; Deploy with Style, by Etsy</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/deployinator-deploy-with-style-by-etsy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BDSM: Yes, Bash is a Real Programming Language</title>
		<link>http://thechangelog.com/bdsm-yes-bash-is-a-real-programming-language/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bdsm-yes-bash-is-a-real-programming-language</link>
		<comments>http://thechangelog.com/bdsm-yes-bash-is-a-real-programming-language/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 17:25:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bdsm]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[rvm]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/bdsm-yes-bash-is-a-real-programming-language/</guid>
		<description><![CDATA[<p>Wayne Seguin is the only Rubyist I know that&#8217;s not really known for writing Ruby. When writing RVM, Wayne built it in Bash shell scripts, and as it grew, it got big and unwieldy. Wayne, being the kind of person he is, decided to make Bash more respectable rather than just move to a better [...]</p><p>The post <a href="http://thechangelog.com/bdsm-yes-bash-is-a-real-programming-language/">BDSM: Yes, Bash is a Real Programming Language</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Wayne Seguin is the only Rubyist I know that&#8217;s not really known for writing Ruby. When writing RVM, Wayne built it in Bash shell scripts, and as it grew, it got big and unwieldy. Wayne, being the kind of person he is, decided to make Bash more respectable rather than just move to a better language.</p>

<p>Hence BDSM. It stands for &#8220;Badass Delectable Scripting Modules&#8221;, and that&#8217;s what it does: gives you some great tools for writing larger programs in Bash script. The first thing that it&#8217;s been applied to has been deployments. You can use BDSM to set up your application&#8217;s environment in the same way that you can use RVM to set up your Ruby environment.</p>

<p>Check it out, here&#8217;s an example from the <a href="http://beginrescueend.com/deployment/best-practices/">RVM deployments page</a>:</p>

<pre><code>appuser$ bdsm bdsmrc      # Put a default ~/.bdsmrc in place.
appuser$ vim ~/.bdsmrc     # Update settings, specifically repository_url, etc...
appuser$ bdsm rails setup # This sets up ~/shared path etc
appuser$ bdsm deploy      # Updates ~/current with a fresh release.
appuser$ vim ~/shared/config/database.yml # setup your db connection info.
appuser$ cd ~/current
appuser$ gem install bundler &amp;&amp; bundle install # Be sure that 'gem "unicorn"' is in Gemfile first, no version.
appuser$ bdsm unicorn start
root# bdsm nginx package install
root# chmod go+rx /home/appuser # This makes sure that Nginx can read the dir.
root# bdsm nginx service appuser # This creates /etc/nginx/servers/appuser.conf configured for a unicorn UDS proxy by default.
root# bdsm nginx service start
</code></pre>

<p>You can follow along with the comments, but that gets you set up with a system ready to deploy Rails apps. When you have a second app on the same box, you make a new user, and do the first half again.</p>

<p>I&#8217;ve done this with two small apps on a VPS, and it&#8217;s really awesome. It gives me 90% of the feel of Heroku, but for only $15/month. Heh. Here&#8217;s what I did: Since the deployed apps are stored in /home/appuser/current, I make a /home/appuser/code, and that holds the git repo. I set that up as &#8216;production&#8217; in git, and add a post-commit hook that automatically, runs <code>bdsm deploy &amp;&amp; bdsm unicorn restart</code>, and now, ever time I <code>git push production</code>, my site just redeploys. And it&#8217;s totally separate from the other app on the server.</p>

<p>Really, all of this is enabled by having these modules provide a common interface to each package. &#8220;bdsm unicorn restart&#8221; is the same as &#8220;bdsm nginx restart&#8221;, which makes it really easy to get up and going, start using a different package, etc. It&#8217;s all great stuff.</p>

<p>Anyway, this is a tiny little overview of what BDSM can do right now. Wayne&#8217;s got big plans for the future, so keep an eye on this cool little project.</p>

<p>[<a href="https://github.com/wayneeseguin/bdsm">Github</a>] [<a href="https://bdsm.beginrescueend.com/">Website</a>] [<a href="https://github.com/wayneeseguin/bdsm/blob/master/README.md">README</a>]</p>
<p>The post <a href="http://thechangelog.com/bdsm-yes-bash-is-a-real-programming-language/">BDSM: Yes, Bash is a Real Programming Language</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/bdsm-yes-bash-is-a-real-programming-language/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java SE 7 has been released</title>
		<link>http://thechangelog.com/java-se-7-has-been-released/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=java-se-7-has-been-released</link>
		<comments>http://thechangelog.com/java-se-7-has-been-released/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 15:48:11 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/java-se-7-has-been-released/</guid>
		<description><![CDATA[<p>Oracle has released Java 7 today. This is a big release, but not so much for Java: it&#8217;s more about the JVM itself. The biggest change that everyone will love is the addition of InvokeDynamic, which will help dynamic languages built on top of the JVM (like JRuby) immensely. There are some other new features [...]</p><p>The post <a href="http://thechangelog.com/java-se-7-has-been-released/">Java SE 7 has been released</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Oracle has released Java 7 today. This is a big release, but not so much for Java: it&#8217;s more about the JVM itself. The biggest change that everyone will love is the addition of InvokeDynamic, which will help dynamic languages built on top of the JVM (like JRuby) immensely.</p>

<p>There are some other new features as well, though it&#8217;s disappointing to me that <a href="http://www.jcp.org/en/jsr/proposalDetails?id=335">JSR335</a> (also known as &#8216;zomg lambdas!&#8217;) got pushed back to Java 8. Oh well, that ship sailed long ago, but if you haven&#8217;t paid attention to the state of Java in a while, you might have heard that this was going to be in Java 7.</p>

<p>You can check out the <a href="http://www.oracle.com/us/corporate/press/444374">press release for Java SE 7</a> on Oracle&#8217;s website.</p>
<p>The post <a href="http://thechangelog.com/java-se-7-has-been-released/">Java SE 7 has been released</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/java-se-7-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails 3.1 Hackfest next weekend on IRC and IRL!</title>
		<link>http://thechangelog.com/rails-3-1-hackfest-next-weekend-on-irc-and-irl/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rails-3-1-hackfest-next-weekend-on-irc-and-irl</link>
		<comments>http://thechangelog.com/rails-3-1-hackfest-next-weekend-on-irc-and-irl/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 16:00:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[hackfest]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[irl]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/rails-3-1-hackfest-next-weekend-on-irc-and-irl/</guid>
		<description><![CDATA[<p>NEXT weekend this weekend, there&#8217;s going to be a hackfest for Rails 3.1! If you&#8217;ve wanted to contribute to Rails in the past but you were too intimidated, now you have a chance to get involved, meet your heros and make a few friends along the way! Members of the Rails core team as well [...]</p><p>The post <a href="http://thechangelog.com/rails-3-1-hackfest-next-weekend-on-irc-and-irl/">Rails 3.1 Hackfest next weekend on IRC and IRL!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>NEXT weekend <del>this weekend</del>, there&#8217;s going to be a hackfest for Rails 3.1!</p>

<p>If you&#8217;ve wanted to contribute to Rails in the past but you were too intimidated, now you have a chance to get involved, meet your heros and make a few friends along the way! Members of the Rails core team as well as core contributors will be hanging out on IRC. Don&#8217;t hesitate to ask whatever questions you may have.</p>

<h3>Who</h3>

<p>Core Team Members:</p>

<ul><li>Aaron Patterson (tenderlove)</li>
<li>Xavier Noria (fxn)</li>
<li>Santiago Pastorino (spastorino)</li>
</ul>

<p>Core Contributors:</p>

<ul><li>Damien Mathieu (dmathieu)</li>
<li>Prem Sichanugrist (sikachu)</li>
<li>Josh Kalderimis (joshk)</li>
</ul>

<h3>When</h3>

<p>The weekend of July 23rd and 24th, 2011</p>

<h3>Where</h3>

<p>On IRC:</p>

<ul><li>Server: irc.freenode.net</li>
<li>Channel: #rails-contrib</li>
</ul>

<h3>In real life?</h3>

<p>Outside of this, there will be some get togethers of people (in real life) hacking on Rails, if you&#8217;d prefer that. There are a number of places that have confirmed meeting places for this gathering and they are listed on the <a href="http://weblog.rubyonrails.org/2011/7/14/rails-3-1-hackfest">official Rails blog</a>.</p>

<h3>More details?</h3>

<p>Get all the details on this hackfest at the <a href="http://weblog.rubyonrails.org/2011/7/14/rails-3-1-hackfest">official Rails blog</a>. Happy hacking!</p>
<p>The post <a href="http://thechangelog.com/rails-3-1-hackfest-next-weekend-on-irc-and-irl/">Rails 3.1 Hackfest next weekend on IRC and IRL!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/rails-3-1-hackfest-next-weekend-on-irc-and-irl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ruby-patches: a repository for custom Ruby modifications</title>
		<link>http://thechangelog.com/ruby-patches-a-repository-for-custom-ruby/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ruby-patches-a-repository-for-custom-ruby</link>
		<comments>http://thechangelog.com/ruby-patches-a-repository-for-custom-ruby/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 17:23:33 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/ruby-patches-a-repository-for-custom-ruby/</guid>
		<description><![CDATA[<p>It might seem crazy to you, but sometimes, people just want to add wacky features to their programming language of choice. Sometimes, they&#8217;re useful, sometimes, they&#8217;re just fun. Any time you&#8217;re working on getting a new feature implemented, it&#8217;s really nice to be able to say &#8220;Here&#8217;s the code!&#8221; Michael Edgar is one of those [...]</p><p>The post <a href="http://thechangelog.com/ruby-patches-a-repository-for-custom-ruby/">ruby-patches: a repository for custom Ruby modifications</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>It might seem crazy to you, but sometimes, people just want to add wacky features to their programming language of choice. Sometimes, they&#8217;re useful, sometimes, they&#8217;re just fun. Any time you&#8217;re working on getting a new feature implemented, it&#8217;s really nice to be able to say &#8220;Here&#8217;s the code!&#8221;</p>

<p>Michael Edgar is one of those people. He also had the foresight to notice that <a href="https://rvm.beginrescueend.com/">rvm</a> makes it really easy to build your own custom Ruby, with patches. So he&#8217;s created a repository where people can share experimental Ruby patches, and is working on making the integration with rvm even easier.</p>

<p>Let&#8217;s say, for example, you want to try out <a href="http://timelessrepo.com/refinements-in-ruby">Refinements</a>, which are a proposed feature for Ruby 2.0. Here&#8217;s the old way, without rvm:</p>

<pre><code>$ svn checkout -q -r 29837 <a href="http://svn.ruby-lang.org/repos/ruby/trunk">http://svn.ruby-lang.org/repos/ruby/trunk</a> ruby-refinements
$ cd ruby-refinements
$ curl <a href="http://stuff.judofyr.net/refinements.diff">http://stuff.judofyr.net/refinements.diff</a> | patch -p1
$ autoconf
$ ./configure --prefix /usr/local/ruby-refinements
$ make
$ make install
$ export PATH="/usr/local/ruby-refinements/bin:$PATH"
</code></pre>

<p>With rvm and this repository, you could instead</p>

<pre><code>$ rvm install 1.9.2-head --patch 1.9/refinements/refinements.diff -n refinedruby
</code></pre>

<p>And then</p>

<pre><code>$ rvm use refinedruby
</code></pre>

<p>and bam! You&#8217;re done!</p>

<p>He&#8217;s also got fun patches for JRuby, as well. If you&#8217;ve got one you&#8217;d like to add, fork the repo and make a pull request!</p>

<p>View <a href="https://github.com/michaeledgar/ruby-patches">the source</a> on GitHub.</p>
<p>The post <a href="http://thechangelog.com/ruby-patches-a-repository-for-custom-ruby/">ruby-patches: a repository for custom Ruby modifications</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/ruby-patches-a-repository-for-custom-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>forever &#8211; daemon μ-framework in Ruby</title>
		<link>http://thechangelog.com/forever-daemon-framework-in-ruby/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=forever-daemon-framework-in-ruby</link>
		<comments>http://thechangelog.com/forever-daemon-framework-in-ruby/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 16:50:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/forever-daemon-framework-in-ruby/</guid>
		<description><![CDATA[<p>Apparently, &#8216;forever&#8217; is a great name for a project that daemonizes things. This isn&#8217;t the forever that we covered two weeks ago, but it is similar. EDIT: Davide has changed the name to &#8216;foreverb&#8217;, to distinguish the two. With Davide D&#8217;Agostino&#8217;s project, you can make any little bit of Ruby code into a daemon quickly [...]</p><p>The post <a href="http://thechangelog.com/forever-daemon-framework-in-ruby/">forever &#8211; daemon μ-framework in Ruby</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Apparently, &#8216;forever&#8217; is a great name for a project that daemonizes things. This isn&#8217;t the <a href="http://thechangelog.com/post/6637623247/forever-node-js-daemon-manager">forever</a> that we covered two weeks ago, but it is similar. EDIT: Davide has changed the name to &#8216;foreverb&#8217;, to distinguish the two.</p>

<p>With Davide D&#8217;Agostino&#8217;s project, you can make any little bit of Ruby code into a daemon quickly and easily. I&#8217;d used the <a href="http://labs.headlondon.com/2010/07/skinny-daemons/">skinny daemons</a> technique in the past, but this is even easier! Let&#8217;s say I have a module named <code>Foo</code>, and it has a method <code>long_running_process</code>. I could daemonize this with a simple</p>

<pre><code>#!/usr/bin/env ruby
require 'rubygems'
require 'forever'

Forever.run do
  on_ready do
    Foo.long_running_process
  end
end
</code></pre>

<p>It&#8217;s just that easy! You can check out the <a href="https://github.com/DAddYE/foreverb/blob/master/README.md">README</a> for more details, including monitoring your daemons and handling errors.</p>

<p>View <a href="https://github.com/DAddYE/foreverb">the project</a> on GitHub and <a href="http://news.ycombinator.com/item?id=2739332">discuss on Hacker News</a>.</p>
<p>The post <a href="http://thechangelog.com/forever-daemon-framework-in-ruby/">forever &#8211; daemon μ-framework in Ruby</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/forever-daemon-framework-in-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nokogiri 1.5.0 has been released!</title>
		<link>http://thechangelog.com/nokogiri-1-5-0-has-been-released/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nokogiri-1-5-0-has-been-released</link>
		<comments>http://thechangelog.com/nokogiri-1-5-0-has-been-released/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 17:10:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[parser]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/nokogiri-1-5-0-has-been-released/</guid>
		<description><![CDATA[<p>If you&#8217;re a Rubyist, and you have to work with XML, then you know and love Nokogiri. It&#8217;s a great way to parse all kinds of XML and HTML documents. Today, the Nokogiri team has a big announcement: 1.5.0 is out! Why&#8217;s the &#8220;Y U NO RELEASE? Edition&#8221; so important? Well, if you&#8217;re using JRuby, [...]</p><p>The post <a href="http://thechangelog.com/nokogiri-1-5-0-has-been-released/">Nokogiri 1.5.0 has been released!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>If you&#8217;re a Rubyist, and you have to work with XML, then you know and love Nokogiri. It&#8217;s a great way to parse all kinds of XML and HTML documents.</p>

<p>Today, the Nokogiri team has a <a href="http://groups.google.com/group/jruby-users/browse_thread/thread/0f2293656d738cff#">big announcement</a>: 1.5.0 is out! Why&#8217;s the &#8220;Y U NO RELEASE? Edition&#8221; so important? Well, if you&#8217;re using JRuby, no longer are you dependent on any C code via FFI: it&#8217;s all Ruby, all the way down. There&#8217;s also a nice little feature that lets you take a native Java XML document and parse it with Nokogiri without having to translate to text first.</p>

<p>You can see the full changelog <a href="https://github.com/tenderlove/nokogiri/blob/master/CHANGELOG.rdoc">here</a> and <a href="https://github.com/tenderlove/nokogiri">the source</a> here.</p>
<p>The post <a href="http://thechangelog.com/nokogiri-1-5-0-has-been-released/">Nokogiri 1.5.0 has been released!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/nokogiri-1-5-0-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coffeebeans: extra CoffeeScript helpers for Rails 3.1</title>
		<link>http://thechangelog.com/coffeebeans-extra-coffeescript-helpers-for-rails-3-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=coffeebeans-extra-coffeescript-helpers-for-rails-3-1</link>
		<comments>http://thechangelog.com/coffeebeans-extra-coffeescript-helpers-for-rails-3-1/#comments</comments>
		<pubDate>Fri, 20 May 2011 19:49:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/coffeebeans-extra-coffeescript-helpers-for-rails-3-1/</guid>
		<description><![CDATA[<p>If you didn&#8217;t catch DHH&#8217;s keynote at Railsconf, he made a strong assertion: CoffeeScript is here to stay. You don&#8217;t have to use it if you don&#8217;t want to, but by default, Rails 3.1 will generate CoffeeScript for all your JavaScript needs. With that said, Mark Bates thinks they didn&#8217;t go far enough. When he [...]</p><p>The post <a href="http://thechangelog.com/coffeebeans-extra-coffeescript-helpers-for-rails-3-1/">Coffeebeans: extra CoffeeScript helpers for Rails 3.1</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>If you didn&#8217;t catch <a href="http://www.youtube.com/watch?v=cGdCI2HhfAU&amp;feature=relmfu">DHH&#8217;s keynote at Railsconf</a>, he made a strong assertion: CoffeeScript is here to stay. You don&#8217;t have to use it if you don&#8217;t want to, but by default, Rails 3.1 will generate CoffeeScript for all your JavaScript needs.</p>

<p>With that said, Mark Bates thinks they didn&#8217;t go far enough. When he <a href="https://github.com/rails/rails/pull/1130">pitched Rails core about adding some more helpers</a>, they said they wanted to work on the implementation, but they liked the idea. So Mark put together a gem to hold you off until this makes its way into core!</p>

<p>So what&#8217;d they leave out? Well, for one thing, inline CoffeeScript:</p>

<pre><code>&lt;%= coffee_script_tag do %&gt;
  alert 'coffee script is awesome!'
&lt;% end %&gt;
</code></pre>

<p>This generates</p>

<pre><code> // a script tag
  (function() {
    alert('coffee script is awesome!');
  }).call(this);
// closing script tag
</code></pre>

<p>via the CoffeeScript compiler. It also lets you more closely integrate CoffeeScript into your existing scripts, and some other small things, too.</p>

<p>You can get it through Rubygems, it&#8217;s just a</p>

<pre><code>gem install coffeebeans
</code></pre>

<p>away!</p>

<p>[<a href="https://github.com/markbates/coffeebeans/blob/master/README.textile">README</a>] [<a href="https://github.com/markbates/coffeebeans">GitHub</a>]</p>
<p>The post <a href="http://thechangelog.com/coffeebeans-extra-coffeescript-helpers-for-rails-3-1/">Coffeebeans: extra CoffeeScript helpers for Rails 3.1</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/coffeebeans-extra-coffeescript-helpers-for-rails-3-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>You (yes, you!) should contribute to open source</title>
		<link>http://thechangelog.com/you-yes-you-should-contribute-to-open-source/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=you-yes-you-should-contribute-to-open-source</link>
		<comments>http://thechangelog.com/you-yes-you-should-contribute-to-open-source/#comments</comments>
		<pubDate>Tue, 10 May 2011 19:46:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Opinions]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/you-yes-you-should-contribute-to-open-source/</guid>
		<description><![CDATA[<p>If you read this blog, you obviously care about open source. If you&#8217;ve never contributed to an open source project, though, you might have some cold feet about it. So, inspired by the Ruby 1.9.3 Documentation Challenge, I wrote up a post for my blog about how to contribute documentation to Ruby. I got some [...]</p><p>The post <a href="http://thechangelog.com/you-yes-you-should-contribute-to-open-source/">You (yes, you!) should contribute to open source</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>If you read this blog, you obviously care about open source. If you&#8217;ve never <em>contributed</em> to an open source project, though, you might have some cold feet about it. So, inspired by the <a href="http://blog.segment7.net/2011/05/09/ruby-1-9-3-documentation-challenge">Ruby 1.9.3 Documentation Challenge</a>, I wrote up a post for my blog about <a href="http://blog.steveklabnik.com/contributing-to-rubys-documentation">how to contribute documentation to Ruby</a>. I got some feedback like this:</p>

<blockquote class="twitter-tweet" data-in-reply-to="67998882075918336"><p>@<a href="https://twitter.com/steveklabnik">steveklabnik</a> Hey this is awesome. It&#8217;s time for me to solider up and pitch in. Thanks for the added incentive!</p>&mdash; Chris Baglieri (@chrisbaglieri) <a href="https://twitter.com/chrisbaglieri/status/68003125000290304" data-datetime="2011-05-10T17:23:03+00:00">May 10, 2011</a></blockquote>

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

<p>So I figured something more general might encourage you to get involved with whatever open source project you&#8217;re using, even if it&#8217;s not in Ruby. Every project can use a hand, especially the small ones.</p>

<h3>A small aside about getting cold feet.</h3>

<p>If you&#8217;re not contributing because you think you&#8217;re not ready, don&#8217;t worry about it! I know that this is easier said that done, but really, you&#8217;re ready. A friend of mine <a href="http://brandonhays.com/blog/2011/05/03/why-i-still-dont-contribute-to-open-source/">posted an article about why he doesn&#8217;t contribute</a>, and I&#8217;m sure that many people share these kinds of fears. <a href="http://brandonhays.com/blog/2011/05/04/please-watch-this-video/">Greg Brown responded</a> and addressed some of his concerns, but most of the people I&#8217;ve talked to object for two basic reasons:</p>

<ul><li>It&#8217;s too hard.</li>
<li>I&#8217;m not good enough to contribute.</li>
<li>I don&#8217;t have the time.</li>
</ul>

<p>Let&#8217;s talk about each of these, in reverse order. It&#8217;s true, you may have a busy life. I don&#8217;t know your personal schedule. But I&#8217;m sure you could find a spare hour or two, maybe on a weekend? That&#8217;s all it takes to get started. Most projects are built on the backs of a thousand tiny commits. You don&#8217;t need to make a large contribution, even small ones are valuable.</p>

<p>If you have fears about the quality of your code, well, the only way you&#8217;ll get better is with practice. So fire up that editor, and submit a patch! Generally, if something isn&#8217;t quite right about your submission, there&#8217;ll be a discussion about it on GitHub, and everyone learns. Take <a href="https://github.com/hotsh/rstat.us/pull/332">this pull request</a>, for example. Colin originally submitted a patch that linked to the wrong URL, wilkie mentioned this, and Colin updated his code. It&#8217;s going to get merged as soon as I stop writing posts for the Changelog. :) But, this is generally what happens if your first submission is a bit off the mark. Don&#8217;t be scared! This is how we all learned, from each other.</p>

<p>The &#8220;It&#8217;s too hard&#8221; complaint usually comes out of &#8220;I&#8217;m not good enough.&#8221; But it can also happen if you try to contribute to a large project, where there are a lot of rules. Contribution guidelines, code coverage requirements, updating AUTHORS and CHANGELOG files&#8230; big projects need to have process to manage the large number of contributors, but this can certainly create a barrier to entry for newcomers. If process intimidates you, I have a suggestion: start small! Smaller projects often have little to no process whatsoever. Plus, you&#8217;ll make someone feel incredibly good. Think about it: Python receives a bunch of patches every day, but if you had a little tool you wrote up on GitHub, and all of a sudden you got an email, &#8220;Hey, someone has a patch for you,&#8221; I bet you&#8217;d feel pretty good about it!</p>

<h3>The absolute basics</h3>

<p>When contributing to an open source project on GitHub, there&#8217;s a very basic workflow that almost every project follows. Three steps: Fork, commit, pull request.</p>

<p>GitHub makes the fork step really easy. Just click on the &#8216;fork&#8217; button found on any project page. Let&#8217;s use Ruby as an example. The project page is <a href="https://github.com/ruby/ruby">here</a>. You can see the fork button on the upper right. It looks like this:</p>

<p><img src="http://new.thechangelog.com/wp-content/uploads/ruby-ruby-·-GitHub.png" alt="Fork button" /></p>

<p>Click that, and you&#8217;ll see some &#8216;hardcore forking action,&#8217; and then you&#8217;ll be at your own fork! This is your own version of your project, and it appears on your GitHub page. For example, <a href="https://github.com/steveklabnik/ruby">here&#8217;s my fork of Ruby</a>. You&#8217;ll see a URL on that page, and that lets you clone the project down.</p>

<pre><code>$ git clone git@github.com:steveklabnik/ruby.git
</code></pre>

<p>This creates a &#8216;ruby&#8217; directory with all of the code in it. Next, let&#8217;s add a remote for upstream, so we can keep track of changes they make:</p>

<pre><code>$ cd ruby
$ git remote add upstream <a href="https://github.com/ruby/ruby.git">https://github.com/ruby/ruby.git</a>
$ git fetch upstream
</code></pre>

<p>Now at any time, we can grab all of the changes the main Ruby repository by doing a rebase:</p>

<pre><code>$ git rebase upstream/master
</code></pre>

<p>A small note: ruby still uses both <code>svn</code> as well as <code>git</code>, so they call the master branch trunk. If you&#8217;re doing this for ruby, you&#8217;ll need <code>git rebase upstream/trunk</code>.</p>

<p>Now that you&#8217;ve cloned, you can do you work! I like to work in feature branches, as it makes things nice and clean, and I can work on two features at once.</p>

<pre><code>$ git checkout -b feature/super-cool-feature
$ vim something
$ git add something
$ git commit -m "Fixed something in something"
</code></pre>

<p>Once you&#8217;ve got some commits that fix your problem, push them up to GitHub:</p>

<pre><code>$ git push origin feature/super-cool-feature
</code></pre>

<p>And then you click the pull request button:</p>

<p><img src="http://new.thechangelog.com/wp-content/uploads/kneath-pull-request.png" alt="GitHub pull request" /></p>

<p>Select your branch, change the description of you want, and you&#8217;re good to go! The maintainer of the project will look it over, you might end up with a discussion, and you&#8217;ll soon get something accepted in somewhere!</p>

<h3>What should I contribute to?</h3>

<p>The best way to contribute is to help out with a project that you actually use. That way you&#8217;ll get to take advantage of the fruits of your labors. You&#8217;ll be more motivated, you already understand the project and what it does, and that&#8217;ll make it easier on you.</p>

<p>If you don&#8217;t want to or can&#8217;t figure out how to work on something you use, the next best way is to start using some new software! Keep reading the Changelog and pick a project that looks interesting, use it for a few weeks, and then contribute!</p>

<h3>We&#8217;re all in this together.</h3>

<p>I hope this encourages you to get your hands dirty, roll up your sleeves, and contribute. Even the smallest patch has worth, so please, make some time out in your schedule, pick a project, and give it a shot. You might just find yourself hooked.</p>
<p>The post <a href="http://thechangelog.com/you-yes-you-should-contribute-to-open-source/">You (yes, you!) should contribute to open source</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/you-yes-you-should-contribute-to-open-source/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Other notes from CodeConf</title>
		<link>http://thechangelog.com/other-notes-from-codeconf/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=other-notes-from-codeconf</link>
		<comments>http://thechangelog.com/other-notes-from-codeconf/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 22:03:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[codeconf]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/other-notes-from-codeconf/</guid>
		<description><![CDATA[<p>Even though I&#8217;m working on notes for CodeConf, I figured I&#8217;d link you to some other notes as well. Check out Jeff Remer&#8217;s Code Conf 2011 notes, and I&#8217;ll post my notes for day 2 after all the talks are over!</p><p>The post <a href="http://thechangelog.com/other-notes-from-codeconf/">Other notes from CodeConf</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Even though I&#8217;m working on notes for CodeConf, I figured I&#8217;d link you to some other notes as well.</p>

<p>Check out <a href="https://github.com/jeffremer">Jeff Remer&#8217;s</a> <a href="http://jeffremer.com/codeconf.html">Code Conf 2011 notes</a>, and I&#8217;ll post my notes for day 2 after all the talks are over!</p>
<p>The post <a href="http://thechangelog.com/other-notes-from-codeconf/">Other notes from CodeConf</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/other-notes-from-codeconf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ruby-metrics: it pretty much explains itself</title>
		<link>http://thechangelog.com/ruby-metrics-it-pretty-much-explains-itself/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ruby-metrics-it-pretty-much-explains-itself</link>
		<comments>http://thechangelog.com/ruby-metrics-it-pretty-much-explains-itself/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 21:06:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/ruby-metrics-it-pretty-much-explains-itself/</guid>
		<description><![CDATA[<p>One of the hottest talks at day 1 of CodeConf was Coda Hale&#8217;s talk on metrics. At the end, he mentioned that while this was on the JVM, he&#8217;d love to see a similar package for Ruby. So, naturally, someone picked it up! There&#8217;s going to be a port of this really cool library over [...]</p><p>The post <a href="http://thechangelog.com/ruby-metrics-it-pretty-much-explains-itself/">ruby-metrics: it pretty much explains itself</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>One of the hottest talks at <a href="http://thechangelog.com/post/4481277637/codeconf-saturday-summary">day 1 of CodeConf</a> was Coda Hale&#8217;s talk on metrics. At the end, he mentioned that while this was on the JVM, he&#8217;d love to see a similar package for Ruby.</p>

<p>So, naturally, someone picked it up! There&#8217;s going to be a port of this really cool library over to Ruby, so check it out!</p>

<p>As <a href="https://github.com/johnewart">johnewart</a> said in <a href="https://convore.com/">Convore</a> a few minutes ago,</p>

<blockquote>
  <p>In talking with Coda last night I decided to start writing a Ruby version of metrics &#8212; slowly adding measurements but available on GH. I&#8217;m adding gauges with callbacks at the moment.</p>
</blockquote>

<p>There&#8217;s also a port of <a href="https://github.com/twitter/ostrich">Ostrich</a>, a similar library, to Python, <a href="https://github.com/wadey/python-ostrich">over here</a>.</p>
<p>The post <a href="http://thechangelog.com/ruby-metrics-it-pretty-much-explains-itself/">ruby-metrics: it pretty much explains itself</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/ruby-metrics-it-pretty-much-explains-itself/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CodeConf: GitHub Issues 2.0</title>
		<link>http://thechangelog.com/codeconf-github-issues-2-0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=codeconf-github-issues-2-0</link>
		<comments>http://thechangelog.com/codeconf-github-issues-2-0/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 00:41:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/codeconf-github-issues-2-0/</guid>
		<description><![CDATA[<p>Hey everyone! I&#8217;m at CodeConf, and I just watched a lightning talk by Kyle Neath: he just pushed GitHub Issues 2.0 to production in front of us! Check it out, you can now add milestones and assign tickets! Badass! Come say hi if you&#8217;re here. And if not, don&#8217;t worry, I&#8217;ve been taking extensive notes [...]</p><p>The post <a href="http://thechangelog.com/codeconf-github-issues-2-0/">CodeConf: GitHub Issues 2.0</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Hey everyone! I&#8217;m at <a href="http://codeconf.com/">CodeConf</a>, and I just watched a lightning talk by <a href="https://github.com/kneath">Kyle Neath</a>: he just pushed <a href="https://github.com/blog/831-issues-2-0-the-next-generation">GitHub Issues 2.0</a> to production in front of us! Check it out, you can now add milestones and assign tickets! Badass!</p>

<p>Come say hi if you&#8217;re here. And if not, don&#8217;t worry, I&#8217;ve been taking extensive notes on all the presentations, and will be posting links to slides as well as summaries of the talks on both days.</p>
<p>The post <a href="http://thechangelog.com/codeconf-github-issues-2-0/">CodeConf: GitHub Issues 2.0</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/codeconf-github-issues-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rstat.us &#8211; Distributed Twitter with Ruby and ostatus</title>
		<link>http://thechangelog.com/rstat-us-distributed-twitter-with-ruby-and-ostatus/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rstat-us-distributed-twitter-with-ruby-and-ostatus</link>
		<comments>http://thechangelog.com/rstat-us-distributed-twitter-with-ruby-and-ostatus/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 12:29:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[coffescript]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/rstat-us-distributed-twitter-with-ruby-and-ostatus/</guid>
		<description><![CDATA[<p>So, I&#8217;m sure you&#8217;ve all been waiting with baited breath for me to begin my licensing series. I got lots of great feedback, but something&#8217;s made me put it off for a moment: coding. I plan on starting the series in earnest next week, but in its stead, I offer you this: rstat.us. If you [...]</p><p>The post <a href="http://thechangelog.com/rstat-us-distributed-twitter-with-ruby-and-ostatus/">rstat.us &#8211; Distributed Twitter with Ruby and ostatus</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>So, I&#8217;m sure you&#8217;ve all been waiting with baited breath for me to begin my <a href="http://thechangelog.com/post/3639289324/new-series-software-licenses-and-you">licensing series</a>. I got lots of great feedback, but something&#8217;s made me put it off for a moment: coding. I plan on starting the series in earnest next week, but in its stead, I offer you this: rstat.us.</p>

<p>If you didn&#8217;t hear, a week ago Friday <a href="http://www.dracos.co.uk/scribblings/twitter-tos-change/">Twitter changed their terms of service</a>. This got a lot of people upset, including me. My friends and I started thinking about it, and the real problem is this: any software that&#8217;s owned by one entity, corporate or not, is open to the possibility of being abused.</p>

<p>So we decided to fix it. Ten days later, here we are: <a href="http://rstat.us/"><a href="http://rstat.us/">http://rstat.us/</a></a> is born.</p>

<p><img src="http://i.imgur.com/SCdGH.png" alt="rstat.us" /></p>

<p>To boil it down, rstat.us is a Sinatra application that clones the basic functionality of Twitter. Fine. But here&#8217;s the interesting part: if you want to follow someone that&#8217;s not on the main rstat.us site, you can copy/paste a URL into a form, and from then on out, it just transparently works. We&#8217;re building on the <a href="http://ostatus.org/">ostatus</a> protocol that other sites like Identi.ca uses, so you can actually follow Identica users on rstat.us right now, and after we work out a kink or two, they can follow you, too.</p>

<p>Oh, and I should mention that: this is very much an alpha release. rstat.us was put together by 6 or 8 of my closest friends in a marathon coding session, so there&#8217;s some refactoring work to be done. The documentation is also a bit obtuse, partially to slightly discourage people from running their own nodes just yet. Eventually, this should be a two or three line process, and you can be running your own node up on Heroku. We also want to significantly improve our test coverage.</p>

<p>There&#8217;s some pretty big plans for the future: we want to extract a Sinatra extension that will enable anyone to easily build their own distributed network. We&#8217;re also releasing <a href="http://github.com/hotsh">three Ruby gems</a> that will let anyone work with the few standards that we build upon, so that other people can make their own tools that work with us, or build their own implementations and copy of the site. Check it out on GitHub, or drop by #rstatus on Freenode if you&#8217;d like to say hello.</p>

<p>It&#8217;s a distributed world that we live in. Own your own data. Build decentralized networks. Take control of your own social networking. And help us do it. :)</p>

<p>[<a href="https://github.com/hotsh/rstat.us">GitHub</a>] [<a href="https://github.com/hotsh/rstat.us/blob/master/README.md">README</a>] [<a href="http://news.ycombinator.com/item?id=2363857">Discuss on HN</a>]</p>
<p>The post <a href="http://thechangelog.com/rstat-us-distributed-twitter-with-ruby-and-ostatus/">rstat.us &#8211; Distributed Twitter with Ruby and ostatus</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/rstat-us-distributed-twitter-with-ruby-and-ostatus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>inception &#8211; The movie, explained through C code</title>
		<link>http://thechangelog.com/inception-the-movie-explained-through-c-code/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=inception-the-movie-explained-through-c-code</link>
		<comments>http://thechangelog.com/inception-the-movie-explained-through-c-code/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 14:00:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[movies]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/inception-the-movie-explained-through-c-code/</guid>
		<description><![CDATA[<p>I&#8217;ll be honest: this is one of the cooler things I&#8217;ve seen recently: /* * Create separate threads for the main protagonists involved in the inception */ static void *inception(void *unused) { struct sched_param param = {.sched_priority = 99 }; int policy = SCHED_OTHER; if(!getuid() &#124;&#124; !geteuid()) { output("Setting policy to real time processn"); policy [...]</p><p>The post <a href="http://thechangelog.com/inception-the-movie-explained-through-c-code/">inception &#8211; The movie, explained through C code</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ll be honest: this is one of the cooler things I&#8217;ve seen recently:</p>

<pre><code>/*
 * Create separate threads for the main protagonists involved in the inception
 */
static void *inception(void *unused)
{
    struct sched_param param = {.sched_priority = 99 };
    int policy = SCHED_OTHER;
    if(!getuid() 
       ||
       !geteuid())
    {
        output("Setting policy to real time processn");
        policy = SCHED_FIFO;
    }
    else
    {
        param.sched_priority = 0;
    }
    assert(pthread_setschedparam(pthread_self(), policy, &amp;param) == 0);
    lucid_dreamer("Fischer", DREAM_INCEPTION_TARGET);
    lucid_dreamer("Cobb", DREAM_INCEPTION_PERFORMER);
    lucid_dreamer("Ariadne", DREAM_WORLD_ARCHITECT);
    lucid_dreamer("Arthur", DREAM_ORGANIZER);
    lucid_dreamer("Eames", DREAM_SHAPES_FAKER);
    lucid_dreamer("Yusuf", DREAM_SEDATIVE_CREATOR);
    lucid_dreamer("Saito", DREAM_OVERLOOKER);
    pthread_mutex_lock(&amp;inception_reality_mutex);
    pthread_cond_wait(&amp;inception_reality_wakeup_for_all, &amp;inception_reality_mutex);
    pthread_mutex_unlock(&amp;inception_reality_mutex);
    return NULL;
}
</code></pre>

<p>That&#8217;s right: karthick18&#8217;s &#8216;inception&#8217; repository contains a 1900 line C program that simulates the plot of the movie <a href="http://www.imdb.com/title/tt1375666/">Inception</a>. How, you ask?</p>

<p><a href="http://instantrimshot.com/">We need to go deeper.</a></p>

<p>Have you heard of the Dining Philosopher&#8217;s problem? Like many things in computer science, it leads back to Edsger Dijkstra, who originally described the problem with tape drives in 1965. Here&#8217;s <a href="http://en.wikipedia.org/wiki/Dining_philosophers_problem">a summary</a>:</p>

<blockquote>
  <p>Five philosophers sit around a table, with five bowls of rice in front of them. In between each bowl of rice is a chopstick. A philosopher can do two things: think and eat. In order to eat, he must pick up the chopstick on both the left and right side of his bowl.</p>
</blockquote>

<p><img src="http://upload.wikimedia.org/wikipedia/commons/6/6a/Dining_philosophers.png" alt="dining philosophers" /></p>

<p>This is problem demonstrates many problems with concurrency: the philosophers can literally starve each other by never giving up resources. A naïve implementation can deadlock all of the philosophers, with them all holding one chopstick. Simulations of this problem are often written using <a href="http://en.wikipedia.org/wiki/Lock_(computer_science)">mutexes</a> for chopsticks and <a href="http://en.wikipedia.org/wiki/Threads_(computer_science)">threads</a> for the philosophers.</p>

<p>This same style is used in inception&#8217;s implementation: there are mutexes representing dream levels, as well as all of the <code>lucid_dreamer</code>s. There are queues, the dreamers do things, and the output ends up looking something <a href="https://gist.github.com/840077">like this</a>. I don&#8217;t want to spoil too much for you, and the code has a reasonable number of comments, though if you&#8217;re not familiar with pthreads, you might find it a bit sparse.</p>

<p>Totally cool.</p>

<p>The <a href="https://github.com/karthick18/inception">code on GitHub</a>.</p>
<p>The post <a href="http://thechangelog.com/inception-the-movie-explained-through-c-code/">inception &#8211; The movie, explained through C code</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/inception-the-movie-explained-through-c-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby4Kids: Another initiative to teach kids with Ruby</title>
		<link>http://thechangelog.com/ruby4kids-another-initiative-to-teach-kids-with-ruby/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ruby4kids-another-initiative-to-teach-kids-with-ruby</link>
		<comments>http://thechangelog.com/ruby4kids-another-initiative-to-teach-kids-with-ruby/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 17:19:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/ruby4kids-another-initiative-to-teach-kids-with-ruby/</guid>
		<description><![CDATA[<p>There&#8217;s a lot of exciting things going on in the Ruby community, but something that&#8217;s really exploded lately is education. I&#8217;m personally pretty heavily invested in teaching with Ruby, but there are a lot of other great initiatives, too. Today, I&#8217;d like to share with you a really, really cool project: Ruby4Kids. It&#8217;s a neat [...]</p><p>The post <a href="http://thechangelog.com/ruby4kids-another-initiative-to-teach-kids-with-ruby/">Ruby4Kids: Another initiative to teach kids with Ruby</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>There&#8217;s a lot of exciting things going on in the Ruby community, but something that&#8217;s really exploded lately is education. I&#8217;m personally <a href="http://hackety-hack.com">pretty heavily invested in teaching with Ruby</a>, but there are a lot of other great initiatives, too.</p>

<p><img src="http://3.bp.blogspot.com/_hOOncWKCWJg/TTNx2nQ3oAI/AAAAAAAAAAk/tk2mP7GBXHU/S1600-R/ruby4kids2.png" alt="ruby4kids" /></p>

<p>Today, I&#8217;d like to share with you a really, really cool project: <a href="http://ruby4kids.com/">Ruby4Kids</a>. It&#8217;s a neat little organization that puts out screencasts, teaches classes, and generally just gets kids excited to make their own games with the always-fun <a href="http://libgosu.org/">Gosu</a> gem.</p>

<p>Another thing that&#8217;s really great about Ruby4Kids is that the kids make screencasts sharing what they&#8217;ve done. <a href="http://ruby4kids.com/ruby4kids/videos/show_and_tell/kritika.mov">Here&#8217;s one</a>, for example. They also have <a href="http://blog.ruby4kids.com/">a blog</a>, and even <a href="https://github.com/ruby4kids/">some fun stuff up on GitHub</a>.</p>

<p>The project is fairly new, kicking off shortly after the new year. Right now, it feels more like a collection of &#8220;here&#8217;s what we&#8217;ve done in classes!&#8221; than an actual independent way to learn, but that is by no means a bad thing. And as more classes are held, and more materials are developed, it&#8217;s going to be a great resource for independent learners, too.</p>
<p>The post <a href="http://thechangelog.com/ruby4kids-another-initiative-to-teach-kids-with-ruby/">Ruby4Kids: Another initiative to teach kids with Ruby</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/ruby4kids-another-initiative-to-teach-kids-with-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://ruby4kids.com/ruby4kids/videos/show_and_tell/kritika.mov" length="12161684" type="video/quicktime" />
		</item>
		<item>
		<title>dmca &#8211; GitHub is publicly posting DMCA notices</title>
		<link>http://thechangelog.com/dmca-github-is-publicly-posting-dmca-notices/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dmca-github-is-publicly-posting-dmca-notices</link>
		<comments>http://thechangelog.com/dmca-github-is-publicly-posting-dmca-notices/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 20:16:43 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/dmca-github-is-publicly-posting-dmca-notices/</guid>
		<description><![CDATA[<p>As developers, it&#8217;s important that we have knowledge of intellectual property laws. Regardless of your opinion of them, (I&#8217;m very publicly outspoken about desiring an abolishment of IP) the law is the law. As a profession, programmers basically spend most of our time creating intellectual property, and so we need to have a good working [...]</p><p>The post <a href="http://thechangelog.com/dmca-github-is-publicly-posting-dmca-notices/">dmca &#8211; GitHub is publicly posting DMCA notices</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>As developers, it&#8217;s important that we have knowledge of intellectual property laws. Regardless of your opinion of them, (I&#8217;m very publicly outspoken about desiring an abolishment of IP) the law is the law. As a profession, programmers basically spend most of our time creating intellectual property, and so we need to have a good working knowledge of these issues.</p>

<p>Of course, this all comes with the giant disclaimer: I am not a lawyer. If you&#8217;re involved with any of this stuff, you should consult one.</p>

<p>One of the largest intellectual property laws in recent years is the <a href="http://en.wikipedia.org/wiki/Dmca">Digital Millennium Copyright Act</a>. A portion of it that&#8217;s particularly relevant to programmers is <a href="http://en.wikipedia.org/wiki/Dmca#Title_II:_Online_Copyright_Infringement_Liability_Limitation_Act">Title II</a> which is also known as <a href="http://en.wikipedia.org/wiki/Online_Copyright_Infringement_Liability_Limitation_Act">the Online Copyright Infringement Liability Limitation Act</a>, which added <a href="http://www.law.cornell.edu/uscode/17/usc_sec_17_00000512----000-.html">Section 512</a> to Section 17. It&#8217;s best known as being the bill that introduced the &#8216;safe harbor&#8217; provision, which affects online service providers such as GitHub. Here&#8217;s what the safe harbor means in laymen&#8217;s terms: if you have a website where users post content, you&#8217;re not liable for the things they post as long as you respond in a timely manner to &#8216;takedown notices&#8217; from copyright holders. Hence, a &#8216;safe harbor&#8217; for companies.</p>

<p>Due to the recent kerfluffle between Sony and the group of hackers who are hacking the PS3, Sony&#8217;s been on a tear to try and remove the code from the Internet. Of course, some people are hosting said code on GitHub, as well as many other public source code hosts. And so, <a href="http://arstechnica.com/gaming/news/2011/01/sony-sends-dmca-notice-to-github-over-ps3-files-master-key.ars">Sony sent a takedown notice to GitHub</a>. In light of this, GitHub has <a href="http://help.github.com/dmca/">put up a page</a> which clarifies their position regarding the DMCA. Of course, they&#8217;re responding to takedown notices. However, they&#8217;re also doing two really neat things: They&#8217;re publicly posting the text of these notices <a href="https://github.com/github/dmca">in this repository</a>, and they&#8217;ve also provided a framework so that people who have had takedown notices sent about their repos can &#8216;counter-notify&#8217; and have their content brought back up. All of this is laid out in a very straightforward manner in the law, but most companies simply delete the content and let that be it.</p>

<p>There&#8217;s only three notices so far, but I applaud GitHub for being transparent and fair about this whole thing. Good stuff!</p>
<p>The post <a href="http://thechangelog.com/dmca-github-is-publicly-posting-dmca-notices/">dmca &#8211; GitHub is publicly posting DMCA notices</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/dmca-github-is-publicly-posting-dmca-notices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MongoDB 1.7.5 released: Single Server Durability!</title>
		<link>http://thechangelog.com/mongodb-1-7-5-released-single-server-durability/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mongodb-1-7-5-released-single-server-durability</link>
		<comments>http://thechangelog.com/mongodb-1-7-5-released-single-server-durability/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 16:59:09 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[MongoDB]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/mongodb-1-7-5-released-single-server-durability/</guid>
		<description><![CDATA[<p>Today brings a new release of MongoDB. Normally I wouldn&#8217;t make a fuss about a point release, but this one has a big feature: Single server durability. For those of you not in the know, many NoSQL databases have their own little nooks, crannies, and special cases where they diverge from what you were expecting [...]</p><p>The post <a href="http://thechangelog.com/mongodb-1-7-5-released-single-server-durability/">MongoDB 1.7.5 released: Single Server Durability!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Today brings a new release of MongoDB. Normally I wouldn&#8217;t make a fuss about a point release, but this one has a big feature: Single server durability.</p>

<p>For those of you not in the know, many NoSQL databases have their own little nooks, crannies, and special cases where they diverge from what you were expecting with traditional data stores. In Mongo&#8217;s case, you had no guarantee of durability with only one instance running: you&#8217;d better have both a master as well as at least one slave if you&#8217;re doing anything in production.</p>

<p>You can try this out by passing a flag to <code>mongod</code>:</p>

<pre><code>$ mongod --dur
</code></pre>

<p>This turns on journaling. From <a href="http://www.mongodb.org/display/DOCS/Journaling">the documentation</a>:</p>

<blockquote>
  <p>With &#8212;dur enabled, journal files will be created in a journal/ subdirectory under your chosen db path. These files are write-ahead redo logs. In addition, a last sequence number file, journal/lsn, will be created. A clean shutdown removes ll files under journal/.</p>
</blockquote>

<p>In addition, 1.7.5 also brings a few other changes. You can see the changelog <a href="http://jira.mongodb.org/browse/SERVER/fixforversion/10214">here</a>.</p>

<p>One quick note: MongoDB uses the standard &#8220;odd numbers are development, even are stable&#8221; versioning scheme. So the 1.7.x series is still under development, and you should probably wait until the release of 1.8.x to use this feature in production unless you fully understand what you&#8217;re doing.</p>

<p>[<a href="http://groups.google.com/group/mongodb-user/browse_thread/thread/4b94744f1f709048?pli=1">Mailing list announcement</a>] [<a href="http://www.mongodb.org/downloads">Downloads page</a>]</p>
<p>The post <a href="http://thechangelog.com/mongodb-1-7-5-released-single-server-durability/">MongoDB 1.7.5 released: Single Server Durability!</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/mongodb-1-7-5-released-single-server-durability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rogue &#8211; A Lift/MongoDB query DSL from Foursquare</title>
		<link>http://thechangelog.com/rogue-a-lift-mongodb-query-dsl-from-foursquare/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rogue-a-lift-mongodb-query-dsl-from-foursquare</link>
		<comments>http://thechangelog.com/rogue-a-lift-mongodb-query-dsl-from-foursquare/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 18:05:15 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[foursquare]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/rogue-a-lift-mongodb-query-dsl-from-foursquare/</guid>
		<description><![CDATA[<p>Foursquare just announced a really neat new framework: rogue. Foursquare uses Scala to power their website, along with the Lift framework. They&#8217;ve been pretty vocal about their usage of MongoDB as well. This project combines all of that together. Here&#8217;s what they have to say about the motivations for developing rogue: Unfortunately, we found [Lift&#8217;s [...]</p><p>The post <a href="http://thechangelog.com/rogue-a-lift-mongodb-query-dsl-from-foursquare/">rogue &#8211; A Lift/MongoDB query DSL from Foursquare</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>Foursquare <a href="http://engineering.foursquare.com/2011/01/21/rogue-a-type-safe-scala-dsl-for-querying-mongodb/">just announced</a> a really neat new framework: rogue. Foursquare uses <a href="http://www.scala-lang.org/">Scala</a> to power their website, along with the <a href="http://liftweb.com/">Lift</a> framework. They&#8217;ve been pretty vocal about their usage of <a href="http://mongodb.org/">MongoDB</a> as well. This project combines all of that together.</p>

<p>Here&#8217;s what they have to say about the motivations for developing rogue:</p>

<blockquote>
  <p>Unfortunately, we found [Lift&#8217;s ORM] querying support a bit too expressive — you can pass in a query object that doesn’t represent a valid query, or query against fields that aren’t part of the record. And in addition it isn’t very type-safe. You can ask for, say, all Venue records where mayor = “Bob”, and it happily executes that query for you, returning nothing, never informing you that the mayor field is not a String but a Long representing the ID of the user. Well, we thought we could use the Scala type system to prevent this from ever happening, and that’s what we set out to do.</p>
</blockquote>

<p>So what&#8217;s it look like? Here&#8217;s an example that should be familliar to anyone who&#8217;s used Foursquare:</p>

<pre><code>Checkin where (_.venueid eqs id)
  and (_.userid eqs mayor.id)
  and (_.cheat eqs false)
  and (_._id after sixtyDaysAgo) 
  select(_._id) fetch()
</code></pre>

<p>Pretty cool. This will actually use Scala&#8217;s static type system to make sure you aren&#8217;t doing something stupid. For example, it will make sure that <code>venueid</code> is an actual member of <code>Checkin</code>, and also that <code>id</code> is of the same type as <code>venueid</code>.</p>

<p>Foursquare has made sure to mention that contributions are very welcome, so if Scala is your thing, fork away!</p>
<p>The post <a href="http://thechangelog.com/rogue-a-lift-mongodb-query-dsl-from-foursquare/">rogue &#8211; A Lift/MongoDB query DSL from Foursquare</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/rogue-a-lift-mongodb-query-dsl-from-foursquare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>koans &#8211; a pattern for learning languages</title>
		<link>http://thechangelog.com/koans-a-pattern-for-learning-languages/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=koans-a-pattern-for-learning-languages</link>
		<comments>http://thechangelog.com/koans-a-pattern-for-learning-languages/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 22:01:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/koans-a-pattern-for-learning-languages/</guid>
		<description><![CDATA[<p>As you all know, I&#8217;m a big fan of education. One of the best ways that I know to pick up a new language or library is to use one of the really awesome &#8216;koans&#8217; tutorials that are modeled after the first: Ruby Koans, by EdgeCase. So what are Koans? Well, there&#8217;s been a long [...]</p><p>The post <a href="http://thechangelog.com/koans-a-pattern-for-learning-languages/">koans &#8211; a pattern for learning languages</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>As you all know, I&#8217;m a big fan of education. One of the best ways that I know to pick up a new language or library is to use one of the really awesome &#8216;koans&#8217; tutorials that are modeled after the first: Ruby Koans, by <a href="https://github.com/edgecase/ruby_koans">EdgeCase</a>.</p>

<p>So what are Koans? Well, there&#8217;s been a long tradition in hacker culture to make references to eastern religions; we&#8217;ve got <a href="http://perlmonks.org/">Perl Monks</a>, the <a href="http://www.canonical.org/~kragen/tao-of-programming.html">Tao of Programming</a>, for instance. Back in 2003, esr wrote <a href="http://catb.org/~esr/writings/unix-koans/">the UNIX koans of Master Foo</a>, which told the story of various students becoming enlightened. Ruby Koans (and others) continue to enlighten students to this day.</p>

<p>I still haven&#8217;t answered, so what is a koan? Well, here&#8217;s what Wikipedia says:</p>

<blockquote>
  <p>A kōan (pronounced /ˈkoʊ.ɑːn/) is a fundamental part of the history and lore of Zen Buddhism. It consists of a story, dialogue, question, or statement, the meaning of which cannot be understood by rational thinking but may be accessible through intuition. One widely known kōan is &#8220;Two hands clap and there is a sound; what is the sound of one hand?&#8221;</p>
</blockquote>

<p>So of course, it&#8217;s completely obvious to you that koans are a set of unit tests that ask you questions about the nature of the uni&#8230;err, programming.</p>

<p>Check it out. If you want to learn some Ruby, just do this:</p>

<pre><code>$ git clone <a href="https://github.com/edgecase/ruby_koans.git">https://github.com/edgecase/ruby_koans.git</a>
$ cd ruby_koans
$ rake
</code></pre>

<p>You&#8217;ll get this:</p>

<pre><code>AboutAsserts#test_assert_truth has damaged your karma.

The Master says:
  You have not yet reached enlightenment.

The answers you seek...
  &lt;false&gt; is not true.

Please meditate on the following code:
  ./about_asserts.rb:10:in `test_assert_truth'
  path_to_enlightenment.rb:38:in `each_with_index'
  path_to_enlightenment.rb:38

mountains are merely mountains
your path thus far [X_________________________________________________] 0/274
</code></pre>

<p>Get it? If you check out the <code>koans/about_asserts.rb</code> file, line 10, you&#8217;ll see this:</p>

<pre><code>  # We shall contemplate truth by testing reality, via asserts.
  def test_assert_truth
    assert false                # This should be true
  end
</code></pre>

<p>There are a bunch of these tests (274, at the time of this writing), and they&#8217;ll walk you through a bunch of things you&#8217;ll need to know if you want to program with Ruby.</p>

<p>This has sort of taken off as a meme, a <a href="https://github.com/search?langOverride=&amp;q=koans&amp;repo=&amp;start_value=1&amp;type=Repositories">GitHub search for &#8216;koans&#8217;</a> shows 92 repositories, most of which are variations on this idea for many different libraries and toolkits.</p>

<p>Not to rest on their laurels, edgecase has a variation of koans up too, <a href="https://github.com/edgecase/ruby_koans_online">ruby_koans_online</a>. Yep. It&#8217;s a little sinatra App, that gives you a webpage that shows the koans and allows you to fill things in:</p>

<p><img src="http://i.imgur.com/xHbZt.png" alt="ruby koans online" /></p>

<p>You can then hit a &#8216;meditate&#8217; button and it&#8217;ll change them over from green to red. Fun! It&#8217;s still very much a work in progress, it seems: You can see the start of an error there about an &#8216;insecure operation.&#8217; But otherwise, it&#8217;s mostly functional.</p>
<p>The post <a href="http://thechangelog.com/koans-a-pattern-for-learning-languages/">koans &#8211; a pattern for learning languages</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/koans-a-pattern-for-learning-languages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Haskell to make a Mac App Store App</title>
		<link>http://thechangelog.com/using-haskell-to-make-a-mac-app-store-app/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-haskell-to-make-a-mac-app-store-app</link>
		<comments>http://thechangelog.com/using-haskell-to-make-a-mac-app-store-app/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 19:56:00 +0000</pubDate>
		<dc:creator>Steve Klabnik</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[app-store]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://new.thechangelog.com/using-haskell-to-make-a-mac-app-store-app/</guid>
		<description><![CDATA[<p>Now that the Mac App store is open, everyone is wondering what they can get away with. Apple has added some interesting restrictions that applications must be compiled with XCode. There are tons of languages for which this is not exactly normal, and so people have been curious to see what kinds of things will [...]</p><p>The post <a href="http://thechangelog.com/using-haskell-to-make-a-mac-app-store-app/">Using Haskell to make a Mac App Store App</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.apple.com/mac/app-store/"><img src="http://cl.ly/0W0g2z182X2t2p0Z3U3Z/app-store.png" alt="app-store.png" /></a></p>

<p>Now that the <a href="http://www.apple.com/mac/app-store/">Mac App store</a> is open, everyone is wondering what they can get away with. Apple has added some interesting restrictions that applications must be compiled with XCode. There are tons of languages for which this is not exactly normal, and so people have been curious to see what kinds of things will actually make it in. In particular, the Ruby community has been pretty excited about building apps with <a href="http://thechangelog.com/tagged/MacRuby">MacRuby</a>, since it fits the bill.</p>

<p>Well, I just heard about another oddball case, and it&#8217;s been successful: <a href="https://github.com/nfjinjing">Jinjing Wang</a> created an application called <a href="http://itunes.apple.com/us/app/clippingdetector/id412382707?mt=12">ClippingDetector</a>, and he&#8217;s made <a href="https://github.com/nfjinjing/haskell-cocoa-currency-converter-example">a GitHub repo</a> showing how he did it. Now, this isn&#8217;t the code for the ClippingDetector app itself, it&#8217;s Apple&#8217;s famed Currency Converter example. However, it does show how to use XCode together with a custom Python script that makes all of the magic happen.</p>

<p>I&#8217;m excited to see all kinds of programming languages being used for desktop Mac development; while I enjoy Objective-C, sometimes it can be a bit unwieldy. It&#8217;s also cool to have a real, working example of something when you&#8217;re attempting to do something new and interesting.</p>

<p>[<a href="https://github.com/nfjinjing/haskell-cocoa-currency-converter-example">Source on GitHub</a>] [<a href="https://github.com/nfjinjing/haskell-cocoa-currency-converter-example/blob/master/readme.md">README</a>]</p>
<p>The post <a href="http://thechangelog.com/using-haskell-to-make-a-mac-app-store-app/">Using Haskell to make a Mac App Store App</a> appeared first on <a href="http://thechangelog.com">The Changelog</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://thechangelog.com/using-haskell-to-make-a-mac-app-store-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
