<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ruby on Jake Worth</title><link>https://jakeworth.com/tags/ruby/</link><description>Recent content in Ruby on Jake Worth</description><image><title>Jake Worth</title><url>https://jakeworth.com/twittercard.png</url><link>https://jakeworth.com/twittercard.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 21 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jakeworth.com/tags/ruby/index.xml" rel="self" type="application/rss+xml"/><item><title>Why sleep Is Risky in Production Code</title><link>https://jakeworth.com/posts/why-we-discourage-sleep/</link><pubDate>Thu, 05 Feb 2026 08:00:51 -0500</pubDate><guid>https://jakeworth.com/posts/why-we-discourage-sleep/</guid><description>&lt;p&gt;You might have heard that using blocking, waiting code, &lt;em&gt;e.g.&lt;/em&gt;, &lt;code&gt;sleep&lt;/code&gt; in many
languages, is discouraged. Why?&lt;/p&gt;</description></item><item><title>Origin of ActiveRecord</title><link>https://jakeworth.com/tils/origin-of-activerecord/</link><pubDate>Tue, 22 Jul 2025 16:33:47 -0400</pubDate><guid>https://jakeworth.com/tils/origin-of-activerecord/</guid><description>&lt;p&gt;As a long-time Ruby on Rails programmer, I thought that the name ActiveRecord –the model layer of Rails&amp;rsquo; MVC– was branding. I didn&amp;rsquo;t know that it&amp;rsquo;s an architectural pattern, described by Martin Fowler in the 2003 book Patterns of Enterprise Application Architecture.&lt;/p&gt;
&lt;p&gt;An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.martinfowler.com/eaaCatalog/activeRecord.html"&gt;https://www.martinfowler.com/eaaCatalog/activeRecord.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>The Factory Pattern, Explained in Ruby</title><link>https://jakeworth.com/posts/why-use-factorybot/</link><pubDate>Mon, 17 Oct 2022 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/why-use-factorybot/</guid><description>&lt;p&gt;In this post, I&amp;rsquo;ll explain what factories are and why you want them, using Ruby.&lt;/p&gt;</description></item><item><title>Why Ruby?</title><link>https://jakeworth.com/posts/why-ruby/</link><pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/why-ruby/</guid><description>&lt;p&gt;Why should someone learn Ruby in 2022? Ruby was my first programming language, and although I&amp;rsquo;ve drifted elsewhere, I
write Ruby every day. Many people in my network are Ruby diehards. As a result,
it&amp;rsquo;s been a long time since I&amp;rsquo;ve gotten the chance to sell someone on Ruby.&lt;/p&gt;</description></item><item><title>Hash Fetch Instead of If/Else</title><link>https://jakeworth.com/posts/hash-fetch-instead-of-if-else/</link><pubDate>Sat, 16 Apr 2022 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/hash-fetch-instead-of-if-else/</guid><description>&lt;p&gt;Conditional logic has its place, but often there&amp;rsquo;s a better alternative.
Today, we&amp;rsquo;ll look at a Ruby solution: a hash with &lt;code&gt;.fetch&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>RSpec.describe vs. describe: Which Should I Use?</title><link>https://jakeworth.com/posts/rspec-describe-vs-describe/</link><pubDate>Sat, 02 Apr 2022 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/rspec-describe-vs-describe/</guid><description>&lt;p&gt;Ruby&amp;rsquo;s RSpec &lt;code&gt;describe&lt;/code&gt; block has two common syntaxes. Which should you use?&lt;/p&gt;</description></item><item><title>Ruby's Frozen String Literal Comment: YAGNI</title><link>https://jakeworth.com/posts/frozen-string-comment-yagni/</link><pubDate>Wed, 09 Feb 2022 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/frozen-string-comment-yagni/</guid><description>&lt;p&gt;Open a production Ruby file, and you&amp;rsquo;ll often see this magic comment at the
top.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# frozen_string_literal: true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Today I&amp;rsquo;d like to argue that most Ruby files do not need this comment. YAGNI— You
Aren&amp;rsquo;t Going to Need It.&lt;/p&gt;</description></item><item><title>Find Stale Gems</title><link>https://jakeworth.com/tils/find-stale-gems/</link><pubDate>Tue, 16 Nov 2021 14:19:45 -0500</pubDate><guid>https://jakeworth.com/tils/find-stale-gems/</guid><description>&lt;p&gt;Unused dependencies are bad: they increase the size of your project, slow down
processes, require maintenance, and send incorrect messages to fellow
developers about what&amp;rsquo;s important.&lt;/p&gt;
&lt;p&gt;To get find unused dependencies in Ruby, I&amp;rsquo;ve been using &lt;code&gt;gem stale&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gem stale
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;gem stale&lt;/code&gt; list gems along with most recent access times. If the last access
time was the day you set up the app, that gem is a candidate for removal.&lt;/p&gt;</description></item><item><title>Ignore Rubocop Block Length Lint in RSpec</title><link>https://jakeworth.com/tils/ignore-rubocop-block-length-lint-in-rspec/</link><pubDate>Tue, 09 Nov 2021 18:12:52 -0500</pubDate><guid>https://jakeworth.com/tils/ignore-rubocop-block-length-lint-in-rspec/</guid><description>&lt;p&gt;Linters are great, except when they aren&amp;rsquo;t. One example is Rubocop&amp;rsquo;s
&lt;code&gt;BlockLength&lt;/code&gt; lint. For example, I don&amp;rsquo;t care if my RSpec &lt;code&gt;describe&lt;/code&gt; and
&lt;code&gt;context&lt;/code&gt; blocks are too long. Nontrivial test blocks will never be short
enough to match a reasonable rule about blocks.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve disabled this lint for these blocks with Rubocop&amp;rsquo;s configuration file:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# .rubocop.yml
Metrics/BlockLength:
IgnoredMethods: [&amp;#39;context&amp;#39;, &amp;#39;describe&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Opting out of just these blocks lets me enforce this rule everywhere else.&lt;/p&gt;</description></item><item><title>Object ID</title><link>https://jakeworth.com/tils/object-id/</link><pubDate>Mon, 08 Nov 2021 09:51:01 -0500</pubDate><guid>https://jakeworth.com/tils/object-id/</guid><description>&lt;p&gt;Today I learned about the method &lt;code&gt;__id__&lt;/code&gt;, aliased &lt;code&gt;object_id&lt;/code&gt;, in Ruby. It
returns a unique integer identifier for any Ruby object.&lt;/p&gt;
&lt;p&gt;A few examples:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Object&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;new&lt;span style="color:#f92672"&gt;.&lt;/span&gt;object_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;7024702983434&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;jake&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;jake&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; name&lt;span style="color:#f92672"&gt;.&lt;/span&gt;object_id &lt;span style="color:#f92672"&gt;==&lt;/span&gt; name&lt;span style="color:#f92672"&gt;.&lt;/span&gt;object_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;thawed&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;object_id &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;thawed&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;object_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;frozen&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;freeze&lt;span style="color:#f92672"&gt;.&lt;/span&gt;object_id &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;frozen&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;freeze&lt;span style="color:#f92672"&gt;.&lt;/span&gt;object_id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve never used this method in practice, but I hope to someday.&lt;/p&gt;</description></item><item><title>`group_by` with default</title><link>https://jakeworth.com/tils/group-by-with-default/</link><pubDate>Fri, 05 Nov 2021 08:16:02 -0400</pubDate><guid>https://jakeworth.com/tils/group-by-with-default/</guid><description>&lt;p&gt;Here&amp;rsquo;s some code that made me do a double take.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;something &lt;span style="color:#f92672"&gt;=&lt;/span&gt; items&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s that &lt;code&gt;[nil]&lt;/code&gt;. What&amp;rsquo;s going on here?&lt;/p&gt;
&lt;p&gt;It turns out that &lt;code&gt;items&lt;/code&gt; is the return of a call to Ruby&amp;rsquo;s &lt;code&gt;group_by&lt;/code&gt;.
&lt;code&gt;group_by&lt;/code&gt; groups by whatever the block evaluates to, including &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#e6db74"&gt;shipping&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;fedex&amp;#39;&lt;/span&gt;, id: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#e6db74"&gt;shipping&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;fedex&amp;#39;&lt;/span&gt;, id: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { id: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;].&lt;/span&gt;group_by { &lt;span style="color:#f92672"&gt;|&lt;/span&gt;item&lt;span style="color:#f92672"&gt;|&lt;/span&gt; item&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:shipping&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;fedex&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;{ &lt;span style="color:#e6db74"&gt;shipping&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;fedex&amp;#39;&lt;/span&gt;, id: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; }, { &lt;span style="color:#e6db74"&gt;shipping&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;fedex&amp;#39;&lt;/span&gt;, id: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; }&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;{ id: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; }&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hence the key &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Edit in Pry</title><link>https://jakeworth.com/tils/edit-in-pry/</link><pubDate>Tue, 03 Aug 2021 16:30:47 -0400</pubDate><guid>https://jakeworth.com/tils/edit-in-pry/</guid><description>&lt;p&gt;Here&amp;rsquo;s a scenario: you&amp;rsquo;re hacking on Ruby code in &lt;code&gt;pry&lt;/code&gt;, and it&amp;rsquo;s a mess.
Blocks chained on blocks, variables named &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;other_one&lt;/code&gt;, assignments to
&lt;code&gt;_&lt;/code&gt;. You can understand it, but nobody else can, and one extra &lt;code&gt;}&lt;/code&gt; breaks
everything.&lt;/p&gt;
&lt;p&gt;The solution is the &lt;code&gt;edit&lt;/code&gt; command. Typing &lt;code&gt;edit&lt;/code&gt; in &lt;code&gt;pry&lt;/code&gt; loads the current
buffer into your editor of choice. Jump in there and turn those inline blocks
into &lt;code&gt;do&lt;/code&gt;/&lt;code&gt;end&lt;/code&gt;, assign some variables, write a method: iterate on some quality
code in the comfortable, predictable setting of your text editor.&lt;/p&gt;</description></item><item><title>Hash Equality</title><link>https://jakeworth.com/tils/hash-equality/</link><pubDate>Wed, 05 May 2021 09:32:46 -0400</pubDate><guid>https://jakeworth.com/tils/hash-equality/</guid><description>&lt;p&gt;Ruby&amp;rsquo;s &amp;lsquo;principle of least surprise&amp;rsquo; strikes me again. From the docs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Equality— Two hashes are equal if they each contain the same number of keys
and if each key-value pair is equal to (according to &lt;code&gt;Object#==&lt;/code&gt;) the
corresponding elements in the other hash.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;hash = { 7 =&amp;gt; 35, &amp;#34;c&amp;#34; =&amp;gt; 2, &amp;#34;a&amp;#34; =&amp;gt; 1 }
doppelganger = { &amp;#34;a&amp;#34; =&amp;gt; 1, &amp;#34;c&amp;#34; =&amp;gt; 2, 7 =&amp;gt; 35 }
hash == doppelganger #=&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Show Proc Source Location</title><link>https://jakeworth.com/tils/show-proc-source-location/</link><pubDate>Wed, 28 Apr 2021 17:02:11 -0400</pubDate><guid>https://jakeworth.com/tils/show-proc-source-location/</guid><description>&lt;p&gt;Today I was investigating a Ruby Proc created in a gem, and I wanted to know
how it was defined. Other than reading source code, there doesn&amp;rsquo;t seem to be a
good way to do this! Prove me wrong.&lt;/p&gt;
&lt;p&gt;We can get close by using Ruby&amp;rsquo;s &lt;code&gt;#source_location&lt;/code&gt; function on &lt;code&gt;Proc&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;some_proc.source_location
=&amp;gt; [&amp;#34;/gems/2.4.0/bundler/gems/spree/core/app/models/spree/order.rb&amp;#34;, 34]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This command shows us the line where Proc is defined. Go there to continue
source-diving.&lt;/p&gt;</description></item><item><title>Steps Within Steps</title><link>https://jakeworth.com/tils/steps-within-steps/</link><pubDate>Wed, 21 Apr 2021 16:51:29 -0400</pubDate><guid>https://jakeworth.com/tils/steps-within-steps/</guid><description>&lt;p&gt;Cucumber step definitions are useful for explaining in detail the actions a user might take on your site. But after a while, they become repetitive. Certain sequences of steps, like a user signing in, happen frequently in a robust test suite. We should not have to repeat them all every time we build a feature.&lt;/p&gt;
&lt;p&gt;One solution is calling several steps from within another step:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;Given&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;I am a signed in developer&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; steps &lt;span style="color:#e6db74"&gt;%Q{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Given I am a developer with credentials
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; And I see the homepage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; When I click sign in
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Then I see the signin page
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; When I enter my credentials
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; And I click the sign in button
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Then I see my username in the upper right
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When you assert the topmost &lt;code&gt;Given&lt;/code&gt;, all steps in the block will be interpolated and called. You still get the confidence of a rigorous test, but with a more concise declaration.&lt;/p&gt;</description></item><item><title>Upgrade Rubygems</title><link>https://jakeworth.com/tils/upgrade-rubygems/</link><pubDate>Wed, 21 Apr 2021 09:28:21 -0400</pubDate><guid>https://jakeworth.com/tils/upgrade-rubygems/</guid><description>&lt;p&gt;To update rubygems:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gem install rubygems-update
update_rubygems
gem update --system
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Reset a Gem</title><link>https://jakeworth.com/tils/reset-a-gem/</link><pubDate>Tue, 20 Apr 2021 17:12:51 -0400</pubDate><guid>https://jakeworth.com/tils/reset-a-gem/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been mucking around in your Ruby dependencies, &lt;code&gt;bundle pristine&lt;/code&gt; is
your friend; it resets all of the gems in your Gemfile to their pristine
condition.&lt;/p&gt;
&lt;p&gt;This can be a slow on a big project. Target the specific gems you worked on today with:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ bundle pristine &amp;lt;gemname&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Augmenting an Object With the Proxy Pattern</title><link>https://jakeworth.com/posts/proxy-pattern/</link><pubDate>Fri, 26 Feb 2021 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/proxy-pattern/</guid><description>&lt;p&gt;Let&amp;rsquo;s look at the proxy pattern in Ruby.&lt;/p&gt;</description></item><item><title>Porting TIL from Rails to Phoenix: Initial Commits</title><link>https://jakeworth.com/posts/porting-til-to-phoenix-initial-commits/</link><pubDate>Tue, 29 Nov 2016 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/porting-til-to-phoenix-initial-commits/</guid><description>&lt;p&gt;Last week, I started a new project: porting &lt;a href="https://til.hashrocket.com"&gt;Today I
Learned&lt;/a&gt; from Ruby on Rails to Phoenix (Elixir).&lt;/p&gt;</description></item><item><title>Server Side Sorting in Ruby</title><link>https://jakeworth.com/posts/server-side-sorting/</link><pubDate>Tue, 28 Jun 2016 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/server-side-sorting/</guid><description>&lt;p&gt;Recently a friend asked me this question about server-side sorting in Rails. Here&amp;rsquo;s the question
and my answer.&lt;/p&gt;</description></item><item><title>From One End to the Other in Ruby</title><link>https://jakeworth.com/posts/from-one-end-to-the-other-in-ruby/</link><pubDate>Sun, 06 Mar 2016 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/from-one-end-to-the-other-in-ruby/</guid><description>&lt;p&gt;A while back I tackled the following programming challenge:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;From One End to the Other: Find the smallest possible
(positive) integer that ends in a six such that if that six is removed and
placed in front of the remaining digits of the number, the resulting number
will be four times as large as the original.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Variable Hoisting in Ruby</title><link>https://jakeworth.com/tils/variable-hoisting-in-ruby/</link><pubDate>Wed, 10 Feb 2016 20:45:51 -0600</pubDate><guid>https://jakeworth.com/tils/variable-hoisting-in-ruby/</guid><description>&lt;p&gt;This afternoon my pair and I spent quite a while on a subtle bug. The culprit? Variable hoisting.&lt;/p&gt;
&lt;p&gt;Take this file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;self&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;hoist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; require &lt;span style="color:#e6db74"&gt;&amp;#39;pry&amp;#39;&lt;/span&gt;; binding&lt;span style="color:#f92672"&gt;.&lt;/span&gt;pry;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;Test&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;hoist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When we hit the PRY debugger, what will the value of &lt;code&gt;bar&lt;/code&gt; be? I would have thought it would raise &lt;code&gt;NameError&lt;/code&gt;, because &lt;code&gt;bar&lt;/code&gt; has seemingly not yet been defined.&lt;/p&gt;
&lt;p&gt;Wrong:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ruby test.rb
From: /test.rb @ line 4 Test.hoist:
2: def self.hoist
3: require &amp;#39;pry&amp;#39;; binding.pry;
=&amp;gt; 4: bar = 1
5: end
[1] pry(Test)&amp;gt; bar
=&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When Ruby parses a file, it &amp;lsquo;hoists&amp;rsquo; each variable to the top of its scope, declaring and setting it to &lt;code&gt;nil&lt;/code&gt;, even if that variable is never assigned by our code. So variables inside an &lt;code&gt;if false&lt;/code&gt; conditional get hoisted and set to &lt;code&gt;nil&lt;/code&gt;, as described in this &lt;a href="http://eftimov.net/variable-hoisting-ruby"&gt;blog post&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Succeed, Precede, and Surround in Haml</title><link>https://jakeworth.com/tils/succeed-precede-and-surround-in-haml/</link><pubDate>Wed, 06 Jan 2016 21:59:41 -0600</pubDate><guid>https://jakeworth.com/tils/succeed-precede-and-surround-in-haml/</guid><description>&lt;p&gt;Haml&amp;rsquo;s design makes HTML and Ruby tricky to mix inline. But we have Haml helper methods to make it easier.&lt;/p&gt;
&lt;p&gt;Here is &lt;code&gt;succeed&lt;/code&gt; in action:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-haml" data-lang="haml"&gt;Developer at
= succeed &amp;#39;, &amp;#39; do
= link_to &amp;#34;Hashrocket&amp;#34;, &amp;#34;https://hashrocket.com/&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This becomes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Developer at
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://hashrocket.com/&amp;#34;&lt;/span&gt;&amp;gt;Hashrocket&amp;lt;/&lt;span style="color:#f92672"&gt;a&lt;/span&gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice the comma at the end, outside of the &lt;code&gt;a&lt;/code&gt; tag?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;precede&lt;/code&gt; and &lt;code&gt;surround&lt;/code&gt; work in a similar fashion, and do what we&amp;rsquo;d expect.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://haml.info/docs/yardoc/file.REFERENCE.html#succeed"&gt;http://haml.info/docs/yardoc/file.REFERENCE.html#succeed&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ruby's Kernel::abort</title><link>https://jakeworth.com/tils/rubys-kernel-abort/</link><pubDate>Thu, 05 Nov 2015 18:30:56 -0600</pubDate><guid>https://jakeworth.com/tils/rubys-kernel-abort/</guid><description>&lt;p&gt;Today I used Ruby&amp;rsquo;s &lt;code&gt;Kernel::abort&lt;/code&gt; for the first time. It&amp;rsquo;s one of those incredibly useful methods I can&amp;rsquo;t believe I&amp;rsquo;ve never seen before.&lt;/p&gt;
&lt;p&gt;Observe:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# abort.rb {1}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;no_message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abort
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abort(&lt;span style="color:#e6db74"&gt;&amp;#39;Process terminated&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;$ irb
2.2.2 :001 &amp;gt; require &amp;#39;./abort&amp;#39;
=&amp;gt; true
2.2.2 :002 &amp;gt; no_message
$ irb {1}
2.2.2 :001 &amp;gt; require &amp;#39;./abort&amp;#39;
=&amp;gt; true
2.2.2 :002 &amp;gt; message
Process terminated
$
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Use it to bail from a script.&lt;/p&gt;</description></item><item><title>Accessor Performance Gap</title><link>https://jakeworth.com/tils/accessor-performance-gap/</link><pubDate>Sun, 25 Oct 2015 12:34:28 -0500</pubDate><guid>https://jakeworth.com/tils/accessor-performance-gap/</guid><description>&lt;p&gt;This week I learned that &lt;code&gt;attr_reader&lt;/code&gt; is more performant than a simple getter method.&lt;/p&gt;
&lt;p&gt;Here’s a gist from five years ago where Aaron Patterson explains:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/pjb3/629716"&gt;https://gist.github.com/pjb3/629716&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I ran that same benchmarking script today on Ruby 2.2.3. The gap has narrowed, but still exists:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ruby-2.2.3
Rehearsal -----------------------------------------------
method 0.070000 0.000000 0.070000 ( 0.074840)
attr_reader 0.050000 0.000000 0.050000 ( 0.052603)
-------------------------------------- total: 0.120000sec
user system total real
method 0.070000 0.000000 0.070000 ( 0.072229)
attr_reader 0.050000 0.000000 0.050000 ( 0.053374)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I like &lt;code&gt;attr_reader&lt;/code&gt; because it’s a Ruby convention and is one line instead of three. Now, I also like its performance relative to a getter.&lt;/p&gt;</description></item><item><title>Fetch Your Environmental Variables</title><link>https://jakeworth.com/tils/fetch-your-environmental-variables/</link><pubDate>Sat, 26 Sep 2015 18:56:00 -0500</pubDate><guid>https://jakeworth.com/tils/fetch-your-environmental-variables/</guid><description>&lt;p&gt;It&amp;rsquo;s important to &lt;code&gt;fetch&lt;/code&gt; Ruby environmental variables rather than directly referencing them.&lt;/p&gt;
&lt;p&gt;This code depends on &amp;lsquo;secret_key&amp;rsquo;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ENV&lt;/span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;secret_key&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When &amp;lsquo;secret_key&amp;rsquo; is not set, &amp;lsquo;key&amp;rsquo; will be assigned &lt;code&gt;nil&lt;/code&gt;, which is an object.&lt;/p&gt;
&lt;p&gt;Later, a call to &lt;code&gt;key.upcase&lt;/code&gt; will produce a &lt;code&gt;NoMethodError&lt;/code&gt;, because Ruby doesn&amp;rsquo;t know how to uppercase &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is better:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ENV&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fetch(&lt;span style="color:#e6db74"&gt;&amp;#39;secret_key&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, when &amp;lsquo;secret_key&amp;rsquo; is not set, &lt;code&gt;KeyError&lt;/code&gt; will be raised. The code fails fast.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fetch&lt;/code&gt; takes a second argument as a default, which means you can even prevent &lt;code&gt;KeyError&lt;/code&gt; entirely, if you choose.&lt;/p&gt;</description></item><item><title>Ruby Regex Literal</title><link>https://jakeworth.com/tils/ruby-regex-literal/</link><pubDate>Thu, 10 Sep 2015 22:35:52 -0500</pubDate><guid>https://jakeworth.com/tils/ruby-regex-literal/</guid><description>&lt;p&gt;Ruby has a nice percent string literal for regular expressions, &lt;code&gt;%r&lt;/code&gt;. It&amp;rsquo;s like &lt;code&gt;//&lt;/code&gt; but allows your regex to contain backslashes without escaping them.&lt;/p&gt;
&lt;p&gt;Check it out:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;2.1.0 :001 &amp;gt; &amp;#39;http://google.com&amp;#39;.gsub(/http:\/\/google.com/, &amp;#39;fine&amp;#39;)
=&amp;gt; &amp;#34;fine&amp;#34;
2.1.0 :002 &amp;gt; &amp;#39;http://google.com&amp;#39;.gsub(%r{http://google.com}, &amp;#39;better&amp;#39;)
=&amp;gt; &amp;#34;better&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As the example implies, this is useful when matching URLs.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ruby-doc.org/core-2.2.3/doc/syntax/literals_rdoc.html#label-Percent+Strings"&gt;Documentation&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Building a Markov-Chain MVP in Ruby</title><link>https://jakeworth.com/posts/ceramic-nation/</link><pubDate>Fri, 11 Sep 2015 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/ceramic-nation/</guid><description>&lt;p&gt;Project announcement! Last night I built a &lt;a href="https://en.wikipedia.org/wiki/Markov_chain"&gt;Markov Chain&lt;/a&gt;-generated
novel, titled &lt;em&gt;Ceramic Nation&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Keyword Precedence</title><link>https://jakeworth.com/tils/keyword-precedence/</link><pubDate>Thu, 02 Jul 2015 17:43:57 -0500</pubDate><guid>https://jakeworth.com/tils/keyword-precedence/</guid><description>&lt;p&gt;The Ruby keyword &lt;code&gt;not&lt;/code&gt; and the unary &lt;code&gt;!&lt;/code&gt; aren&amp;rsquo;t the same. They have a different precedence, and therefore are not interchangeable, despite seeming very similar.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;irb &amp;gt; not 3 == 4
=&amp;gt; true
irb &amp;gt; !3 == 4
=&amp;gt; false
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The first example is evaluated as &lt;code&gt;not (3 == 4)&lt;/code&gt;, or &lt;code&gt;not false&lt;/code&gt;, which is true. The second example is evaluated as &lt;code&gt;(not 3) == 4&lt;/code&gt;, or &lt;code&gt;false == 4&lt;/code&gt;, which is false.&lt;/p&gt;</description></item><item><title>Skid Keywords</title><link>https://jakeworth.com/tils/skid-keywords/</link><pubDate>Thu, 02 Jul 2015 15:28:02 -0500</pubDate><guid>https://jakeworth.com/tils/skid-keywords/</guid><description>&lt;p&gt;Ruby has a few interesting old keywords that use the underscore, or &amp;lsquo;skid&amp;rsquo;, to convey meta information about the file.&lt;/p&gt;
&lt;p&gt;Here they are in action:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# test.rb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;puts __ENCODING__
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;puts __FILE__
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;puts __LINE__
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;__END__
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Because this is after &amp;#39;end&amp;#39;, it should not be executed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Running this file produces:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ruby test.rb
UTF-8
test.rb
3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pretty cool!&lt;/p&gt;</description></item><item><title>Puts Multiple Lines</title><link>https://jakeworth.com/tils/puts-multiple-lines/</link><pubDate>Tue, 26 May 2015 10:28:54 -0500</pubDate><guid>https://jakeworth.com/tils/puts-multiple-lines/</guid><description>&lt;p&gt;Ruby&amp;rsquo;s &lt;code&gt;puts&lt;/code&gt; can take multiple arguments!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; :&lt;span style="color:#ae81ff"&gt;002&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; puts &lt;span style="color:#e6db74"&gt;&amp;#39;so&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;many&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;statements&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;to&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;puts&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;so
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;many
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;statements
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;to
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;puts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Truthy Strings</title><link>https://jakeworth.com/tils/truthy-strings/</link><pubDate>Tue, 26 May 2015 10:28:48 -0500</pubDate><guid>https://jakeworth.com/tils/truthy-strings/</guid><description>&lt;p&gt;Ruby strings are truthy, and they evaluate to zero, unless they start with a number.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;nine to five&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;to_i
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;9 to 5&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;to_i
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Minmax</title><link>https://jakeworth.com/tils/minmax/</link><pubDate>Mon, 18 May 2015 19:32:59 -0500</pubDate><guid>https://jakeworth.com/tils/minmax/</guid><description>&lt;p&gt;Ruby&amp;rsquo;s &lt;code&gt;Enumerable&lt;/code&gt; class includes &lt;code&gt;minmax&lt;/code&gt;, which returns a two element array with the minimum and maximum values of an enumerable.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#f92672"&gt;].&lt;/span&gt;minmax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;alpha&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;bravo&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;zulu&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;].&lt;/span&gt;minmax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;alpha&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;zulu&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Case Insensitive Matchers</title><link>https://jakeworth.com/tils/case-insensitive-matchers/</link><pubDate>Fri, 15 May 2015 15:34:38 -0500</pubDate><guid>https://jakeworth.com/tils/case-insensitive-matchers/</guid><description>&lt;p&gt;You can make Ruby regex matchers case insensitive with an &lt;code&gt;i&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; :&lt;span style="color:#ae81ff"&gt;001&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Expected output&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=~&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/expected/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; :&lt;span style="color:#ae81ff"&gt;002&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Expected output&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=~&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/expected/i&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is useful when writing tests, when you care about a message, but are not interested in its exact format.&lt;/p&gt;</description></item><item><title>Ruby Symbol#to_proc</title><link>https://jakeworth.com/posts/ruby-symbolto_proc/</link><pubDate>Fri, 31 Oct 2014 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/ruby-symbolto_proc/</guid><description>&lt;p&gt;What does &lt;code&gt;&amp;amp;:&lt;/code&gt; mean in Ruby? In this post, I&amp;rsquo;ll explain.&lt;/p&gt;</description></item></channel></rss>