decode me2017-09-29T18:31:58+00:00http://dec0de.meJulien Letessiermezis@dec0de.meEvery service is an island2017-03-27T00:00:00+00:00http://dec0de.me/2017/03/every-service-is-an-island
<p>We had an incident yesterday.
It wasn’t that bad as incidents go, but it got me really worried — it’s something that has the potential to become <em>much</em> worse as we move towards a distributed, multi-service world.</p>
<hr/>
<br/><a href="http://dec0de.me/2017/03/every-service-is-an-island">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Optimising Redis storage, part two2017-01-19T00:00:00+00:00http://dec0de.me/2017/01/optimising-membership-queries
<p>Counting unique users, checking if a credit card has already been used, or checking if this is a mobile user’s first visit ever — all of these require maintaining a large set of fingerprints (unique visitor ID, card fingerprint, IDFVs depending on the use case).</p>
<p>Because this usually needs to be queried very rapidly, Redis is naturally our store of choice. While using its <code class="highlighter-rouge">SET</code> feels obvious, what data structure to select? Are there memory/performance compromises?</p>
<p>This shows that while plain key/value is a safe bet, there are possible optimisations with hashes and traps to avoid with sets and sorted sets.</p>
<hr/>
<br/><a href="http://dec0de.me/2017/01/optimising-membership-queries">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Running A/B tests on our hosting infrastructure2016-09-19T00:00:00+00:00http://dec0de.me/2016/09/ab-testing-cdns
<p>Split testing is a cornerstone of how we improve our products. While we usually run such tests for user-visible interface changes, this is an example of running a (successful!) multivariate test between CDNs.</p>
<p>The outcome is a <strong>7% improvement</strong> in asset load times globally, translating into a <strong>+1% conversion</strong> on our site.</p>
<hr/>
<br/><a href="http://dec0de.me/2016/09/ab-testing-cdns">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Remote work: an engineering leader's perspective2014-11-25T00:00:00+00:00http://dec0de.me/2014/11/remote
<p>A lot has been written on remote work in the software industry, most notably
Jason Fried’s <a href="http://37signals.com/remote/">Remote</a>.
But many of us were left agape by the recent backlash on telecommuting by
three megacompanies:
<a href="http://www.forbes.com/sites/jennagoudreau/2013/02/25/back-to-the-stone-age-new-yahoo-ceo-marissa-mayer-bans-working-from-home/">Yahoo</a>,
then
<a href="http://venturebeat.com/2014/10/01/after-raising-50m-reddit-forces-remote-workers-to-relocate-to-sf-or-get-fired/">Reddit</a>,
the final straw being
<a href="http://www.technologyreview.com/news/531056/google-execs-have-ideas-on-how-to-run-your-business/">Google’s</a>
reactionary attitude on the matter.
<br />
I thought I’d share my experience as a tech lead to help spread the word: in
spite of lingering 20th century management, the knowledge industry <em>can</em>
go remote, and benefit from it.</p>
<p>Mine is a real-world story about successfully turning a 10-person on-site team
into a 30-person distributed team.
This article is a handful of factual observations, measurements, and tips from
my time as HouseTrip’s head geek.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/11/remote">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Managing complexity in Go2014-11-09T00:00:00+00:00http://dec0de.me/2014/11/go-classes
<p>The standard build mechanics of Go can be surprising to developers coming from
other languages, sparking numerous questions like <em><a href="http://stackoverflow.com/questions/9985559">What is the standard way to
organize a Go project during
development?</a></em></p>
<p>It turns out Go packages can feel really similar to classes in object-oriented
languages.
<br />
Read on for details.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/11/go-classes">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Using machine learning to rank search results (part 2)2014-10-23T00:00:00+00:00http://dec0de.me/2014/10/learning-to-rank-2
<p>In the <a href="/2014/10/learning-to-rank-1/">previous episode</a>, we’ve presented ANNs
(artificial neural networks) that could be used to improve the relevance of
search results in an e-commerce context.</p>
<p>We didn’t go beyond the proof of concept though, and ended with more
questions than when we begun.</p>
<p>How can we make ANNs fast enough to sort tens of thousands of products? What
network structure should we pick? How long does it take to train a network?
Are we using the right inputs?</p>
<p>We’ll try to address and illustrate all of these questions.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/10/learning-to-rank-2">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Using machine learning to rank search results (part 1)2014-10-17T00:00:00+00:00http://dec0de.me/2014/10/learning-to-rank-1
<p>A large catalog of products can be daunting for users. Providing a very fine
grained filtering of search results can be counter-productive: it leads them
from information overload to lack of choice.</p>
<p>On e-commerce sites, this results in poor conversion—users leaving the site
without checking out.</p>
<p>The key is obviously to provide <em>relevance</em> and <em>choice</em>, which is much more
complicated than it sounds, as different users may have very different tastes.</p>
<p>This describes how I explored a machine learning, neural networks based
solution to relevance ranking.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/10/learning-to-rank-1">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Pow + SSL without the hassle2014-10-13T00:00:00+00:00http://dec0de.me/2014/10/pow-ssl
<p><a href="http://pow.cx/">Pow</a> is awesome for local web development: it lets you talk to development
instances of apps using a domain name (<code class="highlighter-rouge">myapp.dev</code> typically), and without
worrying about having to start them.</p>
<p>Unfortunately, using Pow with SSL-enabled web services (or SSL-only services
like <a href="https://github.com/mezis/routemaster#routemaster">Routemaster</a> is a bit of a
<a href="http://dev.scottw.com/using-ssl-pow">hassle</a>, usually involving Nginx.</p>
<p>Here’s a possibly simpler way.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/10/pow-ssl">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Neural net training fail2014-10-01T00:00:00+00:00http://dec0de.me/2014/10/neural-net-fail
<p>So here I am, having collected test and control samples to train a neural
network, an measure its predictive power.</p>
<p>But something’s fishy: it works well, from the get go.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/10/neural-net-fail">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
How I'm going to land my dream job2014-09-28T00:00:00+00:00http://dec0de.me/2014/09/the-hunt-begins
<p>It’s that time of the decade again: in about 6 weeks, I’m going to pick up my
bags, leave the <a href="http://about.housetrip.com">team</a> I’ve grown to love, and
find a new (professional) home.</p>
<p class="dc-summary-sidebar">
if you have a job for me, <a href="http://dec0de.me/recruiters.html">read this</a>!
</p>
<p>Since I’m a geek (can’t really help it), I thought I’d share some data, the
viewpoint of someone who’s been on both sides several times, and my process to
try and nail this.</p>
<p>If you’re considering a new job, hopefully this will give you some
inspiration.</p>
<p>Fingers crossed—I’ll find a team as fab as the one I’m leaving.
Let the (job) hunt begin!</p>
<hr/>
<br/><a href="http://dec0de.me/2014/09/the-hunt-begins">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Designing APIs in a resource-oriented architecture2014-09-23T00:00:00+00:00http://dec0de.me/2014/09/designing-apis
<p>At HouseTrip, we chose to rely on conventions where we could, rather than
intense documentation, and let the rest of the necessary knowledge propagate
throuh team osmosis… and the odd Wiki.</p>
<p>In many cases though, those conventions are the minimum you have to document.</p>
<p>In a distributed system, consistency in how applications communicate with
eachtother facilitates discovery and maintenance.
It also makes scaling a team much easier.</p>
<p>This is our attempt at documenting how we think APIs should be designed.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/09/designing-apis">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
RESTful -and- fast: Representational State Notification2014-09-20T00:00:00+00:00http://dec0de.me/2014/09/resn-routemaster
<p>Adding lightweight state change notifications to the REST architecture style
can alleviate some of its performance limitations, without violating its
principles. It also obviates the temptation to revert from a RESTful,
domain-centric resource oriented architecture to an RPC-style,
function-centric microservice architecture.</p>
<p>If you care mostly about the solution, feel free to skip to the section
about <a href="#introducing-routemaster">Routemaster</a>. The beginning of the article
presents the concepts and rationale.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/09/resn-routemaster">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Donjon, sharing passwords securely2014-09-01T00:00:00+00:00http://dec0de.me/2014/09/donjon
<p>Donjon is a secure, multi-user store for key-value pairs.</p>
<p>We built <a href="https://github.com/mezis/donjon#donjon">Donjon</a> to share credentials
in a (small) devops team, for services where single user accounts don’t make
sense, e.g.:</p>
<ul>
<li>root passwords for databases and servers</li>
<li>root credentials for hosting accounts</li>
<li>accounts for web services that don’t do multi-user/multi-admin</li>
<li>Two-factor tokens for single-user web services.</li>
</ul>
<hr/>
<br/><a href="http://dec0de.me/2014/09/donjon">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Document and comment code? Or don't?2014-04-07T00:00:00+00:00http://dec0de.me/2014/04/a-take-on-docs
<p>The stance on documentation in the Ruby community seems to oscillate between
“RDoc the hell out of it” or “nah, the code (or the test suite) is the
documentation”.</p>
<p>We think both are untrue, and have a pragmatic middle ground: “documentation”
<em>per se</em> exists mostly under the skullcaps of team members, but some things do
need minimal documentation.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/04/a-take-on-docs">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Timing Rack Middlewares with metaprogramming, recursive monkey-patching, and a sprinkle of statistics2014-03-16T00:00:00+00:00http://dec0de.me/2014/03/rack-timer
<p>Analysing performance of your Rails or Sinatra is easy enough with New Relic,
but figuring out whether the soft outer shell of your stack is under-performing
is more of a challenge. We’ve written
<a href="https://github.com/mezis/rack-timer#rack-timer">rack-timer</a> to figure things
out.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/03/rack-timer">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Dragonfly backed by ActiveRecord2014-01-13T00:00:00+00:00http://dec0de.me/2014/01/dragonfly-activerecord
<p>If your app’s dynamic assets (user uploaded images for instance) weigh up to a
few gigabytes, it can make sense to store them in the app’s database instead of
another service (e.g. Amazon’s S3): your stack has one less dependency to care
about, and backups get more complicated.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/01/dragonfly-activerecord">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Rebund for 4x faster Travis builds2014-01-06T00:00:00+00:00http://dec0de.me/2014/01/rebund
<p>Running <code class="highlighter-rouge">bundle install</code> to get all gems ready is often the longest part of a
build. Any Rails application will depend on tens of gems; and any gem, besides
dependencies, may have a fairly large build matrix.</p>
<p><a href="http://github.com/mezis/rebund">Rebund</a> can easily cut your build times by
75%, saving you time and saving the good folks at <a href="https://travis-ci.org/">Travis
CI</a> some money.</p>
<hr/>
<br/><a href="http://dec0de.me/2014/01/rebund">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Good software comes with a good README2013-11-29T00:00:00+00:00http://dec0de.me/2013/11/good-readmes
<p>Having a good README is crucial to see a software project get adopted and well used.</p>
<p>Starting with a good README also helps you focus on your API or UI first.</p>
<p>The TL,DR:</p>
<ul>
<li>be concise and a bit sales-y</li>
<li>hand-hold your users into installation and initial usage, and around traps</li>
<li>make it a portal for further information</li>
</ul>
<p>Read on for a few hopefully useful hints.</p>
<hr/>
<br/><a href="http://dec0de.me/2013/11/good-readmes">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Using data tiering to squeeze scale out of SQL2013-11-14T00:00:00+00:00http://dec0de.me/2013/11/data-tiering
<p>As traffic grows, some of the data structures our application has to
manipulate gets contended. Ours is an unusual, but effective solution: segregate data into read-mostly and write-mostly.</p>
<p>Read on for the nitty gritty.</p>
<hr/>
<br/><a href="http://dec0de.me/2013/11/data-tiering">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Rubinius 2.0.0 + Rbenv2013-10-13T00:00:00+00:00http://dec0de.me/2013/10/rubinius-rbenv
<p><a href="http://rubini.us/">Rubinius 2</a> didn’t work for me out of the box using
<a href="https://github.com/sstephenson/rbenv">RBenv</a>: in particular it wouldn’t
find gem executables like <code class="highlighter-rouge">bundler</code>. Here’s how to fix it.</p>
<hr/>
<br/><a href="http://dec0de.me/2013/10/rubinius-rbenv">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
A case of PEBKAC2013-09-26T00:00:00+00:00http://dec0de.me/2013/09/pebkac
<p>The general population is quite technology-unsavvy. Here’s my most recent
encounter with this ever-so-true nugget of geek wisdom I tend to forget.</p>
<p>Lesson learned for software developers: listen to your users’
pain, but wear earplugs. They’re often wrong, especially about the
details.</p>
<p>Learn their <a href="http://en.wikipedia.org/wiki/Availability_heuristic">cognitive biases</a>.
And <a href="http://www.codinghorror.com/blog/2009/12/responsible-open-source-code-parenting.html">own what you build</a>.</p>
<hr/>
<br/><a href="http://dec0de.me/2013/09/pebkac">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Monitoring backend services, a tale of delays and dogs2013-09-12T00:00:00+00:00http://dec0de.me/2013/09/monitoring-jobs
<p>We wanted to share how we evolved our asynchronous job processing over the past year. The TL,DR of our findings are:</p>
<ul>
<li>Using <a href="https://github.com/collectiveidea/delayed_job">DelayedJob</a> for
queueing/running asynchronous tasks scales well, in terms of throughput,
variety of jobs, and cost of maintenance.</li>
<li>This does require backing it with
<a href="https://github.com/collectiveidea/delayed_job_mongoid">Mongo</a> (for high
throughput) and keeping it agnostic to the type of jobs it’s running
(for low maintenance).</li>
<li>We found it more practical to manage a limited number of queues based on
urgency bands, rather thand trying to prioritise individual jobs based
on (perceived) importance.</li>
<li>Good monitoring is imperative, but trivial to achieve with
<a href="https://github.com/etsy/statsd/">statsd</a> and a good frontend/alerter
like <a href="http://www.datadoghq.com">Datadog</a>.</li>
</ul>
<hr/>
<br/><a href="http://dec0de.me/2013/09/monitoring-jobs">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Yarp, a Rubygems proxy-cache2013-08-25T00:00:00+00:00http://dec0de.me/2013/08/yarp
<br/><a href="http://dec0de.me/2013/08/yarp">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
fuzzily and blurrily - two fast fuzzy-text search/match gems2013-05-06T00:00:00+00:00http://dec0de.me/2013/05/fuzzily-blurrily
<p>Users make spelling mistakes… especially when typing the name of an exotic destination. These two gems help you setup fast fuzzy matching on user input.</p>
<hr/>
<br/><a href="http://dec0de.me/2013/05/fuzzily-blurrily">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
mrd - MySQL in a RAMDisk for speedier tests2013-04-29T00:00:00+00:00http://dec0de.me/2013/04/mrd-mysql-ramdisk
<p>We try to live by the “red, green, refactor” mantra at HouseTrip. As a
consequence we have good test coverage, but our test suite is getting
larger. This is just one of the tricks that help us run our tests faster.</p>
<hr/>
<br/><a href="http://dec0de.me/2013/04/mrd-mysql-ramdisk">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
DCI in Ruby is not broken2013-02-03T00:00:00+00:00http://dec0de.me/2013/02/dci-performance
<p>Applying the DCI pattern by using Ruby’s dynamic object metaclass manipulation, also known as <code class="highlighter-rouge">Object#extend</code>, has been getting heat.
Turns out it’s quite all right.</p>
<p>This article aims to show that object delegation does not have a significant performance advantage over object extension, with the notable exception of MRI Ruby 1.9.2. And delegation actually much, much slower in 1.8.</p>
<hr/>
<br/><a href="http://dec0de.me/2013/02/dci-performance">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Released git-whistles 0.6.12012-10-28T00:00:00+00:00http://dec0de.me/2012/10/git-whistles-release
<br/><a href="http://dec0de.me/2012/10/git-whistles-release">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Pure CSS speech bubbles - configurable, with shadows2012-10-27T00:00:00+00:00http://dec0de.me/2012/10/pure-css-bubbles
<p>Without any trickyness or workaround involved, it is possible to render speech bubbles with perfect shadows entirely with CSS, using no images whatsoever.</p>
<p>Even better, it degrades gracefully in Internet Explorer 7 and 8!</p>
<p>This is how it looks like in modern browsers (Chrome, Opera, and Firefox):</p>
<p><img src="/public/2012-10-27-pure-css-bubbles.png" alt="Rendered in Chrome" /></p>
<hr/>
<br/><a href="http://dec0de.me/2012/10/pure-css-bubbles">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Fuzzily, a Ruby gem for blazing-fast fuzzy text search2012-10-25T00:00:00+00:00http://dec0de.me/2012/10/fuzzily-released
<p>I just released <a href="http://github.com/mezis/fuzzily">fuzzily</a>, a small piece of software that gives you a way to very quickly perform fuzzy searches against tables in exchange for a little data and write overhead.</p>
<hr/>
<br/><a href="http://dec0de.me/2012/10/fuzzily-released">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Released guignol 0.3.02012-09-30T00:00:00+00:00http://dec0de.me/2012/09/guignol-release
<br/><a href="http://dec0de.me/2012/09/guignol-release">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Tip: Good indices in relational databases2012-09-26T00:00:00+00:00http://dec0de.me/2012/09/good-database-indices
<p>ActiveRecord, like any other ORM (Hibernate, Datamapper, et al.) adds lots of
sugar for your persistence needs, but it’s not magic.</p>
<p>On of the things it won’t do for you is make sure your queries run quickly.</p>
<p>Here’s a few tips to achieve what is often overlooked in Rubyland.</p>
<hr/>
<br/><a href="http://dec0de.me/2012/09/good-database-indices">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
RFC: Donjon, a credentials server2012-08-31T00:00:00+00:00http://dec0de.me/2012/08/donjon-white-paper
<p>I’ve been bugged by the fact that everyone seems pretty content with
unencrypted credentials lying around in the codebases of their apps.</p>
<p>To fix this, some rely on delivering sensitive information (certificate files,
passwords) via Puppet, which is overly complicated and doesn’t specifically
address the handling of credentials.</p>
<p>Others, because they work with a PaaS, work around it by having a few select
people push the keys and passwords to their host—as done with
<a href="https://devcenter.heroku.com/articles/config-vars">Heroku</a>) for instance.</p>
<p>Here’s my take of what (my) ideal credentials management solution would look
like: a Heroku-like, distributed and secure credential management tool.</p>
<p>What’s you opinion?</p>
<hr/>
<br/><a href="http://dec0de.me/2012/08/donjon-white-paper">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Released git-whistles 0.3.12012-08-25T00:00:00+00:00http://dec0de.me/2012/08/git-whistles-release
<br/><a href="http://dec0de.me/2012/08/git-whistles-release">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Where do I put my data?2012-08-17T00:00:00+00:00http://dec0de.me/2012/08/where-do-i-put-my-data
<p>Your typical web application doesn’t just need data about your customers’ accounts and your products’ prices.</p>
<p>Quite a part of the information you need is transient: last login timestamp, number of times a product was sold, a user’s unread message count, and so on.</p>
<p>It doesn’t really matter which language, ORM, or structured datastore you’re using–be it Ruby on Rails, Django, or Symphony, backed by MySQL or MongoDB.
Structured storage is complex to manage.</p>
<p>Where should you store data? Here’s a few tips.</p>
<hr/>
<br/><a href="http://dec0de.me/2012/08/where-do-i-put-my-data">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Fitting output to your terminal width2012-08-15T00:00:00+00:00http://dec0de.me/2012/08/fit-shell-output
<br/><a href="http://dec0de.me/2012/08/fit-shell-output">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
The case of Haml v. Erb2012-08-12T00:00:00+00:00http://dec0de.me/2012/08/haml-vs-erb
<p>Is using Haml over plain old Erb just trendy?
It migh be a fad, but I hope it lasts: my opinion is Haml is superior in every respect to embedded Ruby (or almost any kind of “embedding” templating engine) just like Sass and LESS are to CSS.</p>
<p>Here’s why.</p>
<hr/>
<br/><a href="http://dec0de.me/2012/08/haml-vs-erb">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>
Us craftsmens2012-08-11T00:00:00+00:00http://dec0de.me/2012/08/tools-craftsmen
<br/><a href="http://dec0de.me/2012/08/tools-craftsmen">Read more...</a>
<iframe height="1" width="1" frameborder="0" src="http://dec0de.me/tracking.html?utm_medium=rss"></iframe>