summaryrefslogtreecommitdiffstats
path: root/articles
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2017-01-22 13:51:38 +0100
committerLoïc Hoguin <[email protected]>2017-01-22 13:51:38 +0100
commit7bb98d0476dbe4ee5e9317e42ca17e4a7d717e0d (patch)
tree29b5fe0d72b65b9382d8b4e1d66a560a55557b77 /articles
parent1e5b5eb16cd528185246ad2b6cb356696ecafab6 (diff)
downloadninenines.eu-7bb98d0476dbe4ee5e9317e42ca17e4a7d717e0d.tar.gz
ninenines.eu-7bb98d0476dbe4ee5e9317e42ca17e4a7d717e0d.tar.bz2
ninenines.eu-7bb98d0476dbe4ee5e9317e42ca17e4a7d717e0d.zip
Publish the "Don't let it crash" article
Diffstat (limited to 'articles')
-rw-r--r--articles/cowboy-2.0.0-pre.4/index.html2
-rw-r--r--articles/cowboy2-qs/index.html2
-rw-r--r--articles/dont-let-it-crash/index.html281
-rw-r--r--articles/erlang-scalability/index.html2
-rw-r--r--articles/erlang-validate-utf8/index.html2
-rw-r--r--articles/erlang.mk-and-relx/index.html2
-rw-r--r--articles/erlanger-playbook-september-2015-update/index.html2
-rw-r--r--articles/erlanger-playbook/index.html2
-rw-r--r--articles/farwest-funded/index.html2
-rw-r--r--articles/index.html34
-rw-r--r--articles/index.xml184
-rw-r--r--articles/january-2014-status/index.html2
-rw-r--r--articles/ml-archives/index.html2
-rw-r--r--articles/on-open-source/index.html2
-rw-r--r--articles/page/2/index.html17
-rw-r--r--articles/ranch-1.3/index.html2
-rw-r--r--articles/ranch-ftp/index.html2
-rw-r--r--articles/the-story-so-far/index.html2
-rw-r--r--articles/tictactoe/index.html2
-rw-r--r--articles/website-update/index.html2
-rw-r--r--articles/xerl-0.1-empty-modules/index.html2
-rw-r--r--articles/xerl-0.2-two-modules/index.html2
-rw-r--r--articles/xerl-0.3-atomic-expressions/index.html2
-rw-r--r--articles/xerl-0.4-expression-separator/index.html2
-rw-r--r--articles/xerl-0.5-intermediate-module/index.html2
25 files changed, 479 insertions, 79 deletions
diff --git a/articles/cowboy-2.0.0-pre.4/index.html b/articles/cowboy-2.0.0-pre.4/index.html
index 092ea08e..3ce369fb 100644
--- a/articles/cowboy-2.0.0-pre.4/index.html
+++ b/articles/cowboy-2.0.0-pre.4/index.html
@@ -194,6 +194,8 @@ added back.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/cowboy2-qs/index.html b/articles/cowboy2-qs/index.html
index da450bf8..42343c77 100644
--- a/articles/cowboy2-qs/index.html
+++ b/articles/cowboy2-qs/index.html
@@ -233,6 +233,8 @@ thoughts that went into this rather than just the conclusion.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/dont-let-it-crash/index.html b/articles/dont-let-it-crash/index.html
new file mode 100644
index 00000000..9fe54196
--- /dev/null
+++ b/articles/dont-let-it-crash/index.html
@@ -0,0 +1,281 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: Don&#39;t let it crash</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li class="active"><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents">
+<div class="container">
+<div class="row">
+<div class="span9 maincol">
+
+<article class="blog_item">
+<header>
+ <h1 class="lined-header"><span>Don&#39;t let it crash</span></h1>
+ <p class="date">
+ <span class="day">22</span>
+ <span class="month">Jan</span>
+ </p>
+</header>
+
+<div class="paragraph"><p>We have a specific mindset when writing Erlang
+programs. We focus on the normal execution of the
+program and don&#8217;t handle most of the errors that may
+occur. We sometimes call this normal execution the
+<em>happy path</em>.</p></div>
+<div class="paragraph"><p>The general pattern behind writing only for the
+<em>happy path</em>, letting the VM catch errors (writing
+them to a log for future consumption) and then
+having a supervisor restart the processes that
+failed from a clean state, has a name. We call it
+<em>let it crash</em>; and it drives many of our design
+decisions.</p></div>
+<div class="paragraph"><p>It&#8217;s a really great way to program and the results
+are fantastic compared to most other programming
+languages. And yet, <em>let it crash</em> barely convinced
+anyone that they should use Erlang. Why would that
+be?</p></div>
+<div class="paragraph"><p>You may already know that Cowboy is capable of
+handling at least 2 million Websocket connections
+on a single server. This is in large part thanks
+to the capabilities of the VM. Still, 2 million
+is good, much better than most other servers can
+do.</p></div>
+<div class="paragraph"><p>Cowboy is not just a Websocket server; it&#8217;s also
+an HTTP and HTTP/2 server, and it handles many
+related features like long polling or the parsing
+of most request headers.</p></div>
+<div class="paragraph"><p>Can you guess how large the Cowboy codebase is,
+without looking at the source?</p></div>
+<div class="paragraph"><p>Do make sure you have a clear answer in your mind
+before you go check.</p></div>
+<div class="paragraph"><p>Good, you are back. Now what were the results? If
+I am correct, you overestimated the size of Cowboy.
+Cowboy is in fact about five thousand lines of code.
+You probably thought it was at least ten thousand.
+About eighty percent of readers will have
+overestimated the size of Cowboy. And you did only
+because I mentioned it can handle millions of
+Websocket connections.</p></div>
+<div class="paragraph"><p>Numerous studies show this effect. Just mentioning
+the large number already prepared your mind to think
+in that direction. Repeating the number made you
+focus even more on it. Then the question asked for
+a number, which ended up larger than the reality.</p></div>
+<div class="paragraph"><p>The same effect can be applied to negotiation for
+example. You generally want to start by giving your
+offer (and not let the other party initiate) and
+you want to give a really large number first. You
+can also prepare your customer by mentioning an even
+larger number in the previous discussion.</p></div>
+<div class="paragraph"><p>And it&#8217;s not just numbers either. An experiment
+showed that just by looking at an image of clouds,
+customers of a pillow store were buying pillows
+more comfortable (and more expensive) than those
+who didn&#8217;t see that image.</p></div>
+<div class="paragraph"><p>This is the power of associations. It is covered in
+much larger detail in the books
+<a href="https://www.amazon.com/Influence-Psychology-Persuasion-Robert-Cialdini/dp/006124189X">Influence</a>
+and
+<a href="https://www.amazon.com/Pre-Suasion-Revolutionary-Way-Influence-Persuade/dp/1501109790">Pre-suasion</a>.
+I highly recommend reading those and applying what
+you learn to your daily life. I&#8217;m definitely not
+a professional psychologist so take this post with
+a grain of salt.</p></div>
+<div class="paragraph"><p>When selling Erlang, whether we are selling it to
+a customer or trying to convince a developer friend
+to start using it, we often talk about how Erlang
+<em>lets you sleep at night</em>, that it is auto healing
+and always gets fantastic uptimes.</p></div>
+<div class="paragraph"><p>And then we talk about <em>let it crash</em>.</p></div>
+<div class="paragraph"><p>And we describe what it means.</p></div>
+<div class="paragraph"><p>We might as well just say that Erlang crashes a lot
+and then take the door. It would have the same effect.
+It doesn&#8217;t even stop at programs crashing. You know
+what else crashes? Cars, planes, trains. Often with
+disastrous consequences. Is that really the message
+we want to convey?</p></div>
+<div class="paragraph"><p>They even <a href="https://img.youtube.com/vi/oEUBW2lCkIk/0.jpg">printed it on a t-shirt</a>!
+Keep calm and let it crash. It&#8217;s the kind of t-shirt
+you probably shouldn&#8217;t wear in an airport, and for good
+reasons. A few people did, then realized what they were
+wearing and were not too smug about it.</p></div>
+<div class="paragraph"><p>And yet this is how we sell Erlang.</p></div>
+<div class="paragraph"><p>A better way would be to focus on the positives, of
+course, but also to make sure that those positives
+are phrased in a way that prevents bad associations
+to be formed in people&#8217;s minds.</p></div>
+<div class="paragraph"><p>Instead of <em>let it crash</em>, you can say that Erlang
+has <em>auto healing mechanisms</em>. Healing is a good
+thing and accurately describes what happens in the
+system.</p></div>
+<div class="paragraph"><p>Should you need to go into more details, you will
+probably want to avoid <em>recover from crashes</em> and
+instead say <em>recover from exceptions</em>. Exceptions
+are a pretty neutral word and, should you explain
+what you mean by that, you can talk about exceptions
+that occur for reasons unrelated to Erlang, like
+hardware failure or network instability.</p></div>
+<div class="paragraph"><p>The trick is to always use positive words and
+phrases to describe Erlang, and to use external
+factors to explain how Erlang deals with failures.
+Never mention the failures internal to Erlang
+systems unless you are asked specifically, in
+which case you can say that the auto healing
+applies to all exceptions.</p></div>
+<div class="paragraph"><p>The <em>let it crash</em> philosophy is great when
+learning Erlang or when writing fault-tolerant
+systems. But it&#8217;s not going to convince anyone
+to use it unless they were already looking for
+it.</p></div>
+<div class="paragraph"><p>Do you like this post? Tell me on Twitter. I might
+make more.</p></div>
+
+</article>
+</div>
+
+<div class="span3 sidecol">
+<h3>More articles</h3>
+<ul id="articles-nav" class="extra_margin">
+
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
+ <li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
+
+ <li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
+
+ <li><a href="https://ninenines.eu/articles/ml-archives/">Mailing list archived</a></li>
+
+ <li><a href="https://ninenines.eu/articles/website-update/">Website update</a></li>
+
+ <li><a href="https://ninenines.eu/articles/erlanger-playbook-september-2015-update/">The Erlanger Playbook September 2015 Update</a></li>
+
+ <li><a href="https://ninenines.eu/articles/erlanger-playbook/">The Erlanger Playbook</a></li>
+
+ <li><a href="https://ninenines.eu/articles/erlang-validate-utf8/">Validating UTF-8 binaries with Erlang</a></li>
+
+ <li><a href="https://ninenines.eu/articles/on-open-source/">On open source</a></li>
+
+ <li><a href="https://ninenines.eu/articles/the-story-so-far/">The story so far</a></li>
+
+ <li><a href="https://ninenines.eu/articles/cowboy2-qs/">Cowboy 2.0 and query strings</a></li>
+
+ <li><a href="https://ninenines.eu/articles/january-2014-status/">January 2014 status</a></li>
+
+ <li><a href="https://ninenines.eu/articles/farwest-funded/">Farwest got funded!</a></li>
+
+ <li><a href="https://ninenines.eu/articles/erlang.mk-and-relx/">Build Erlang releases with Erlang.mk and Relx</a></li>
+
+ <li><a href="https://ninenines.eu/articles/xerl-0.5-intermediate-module/">Xerl: intermediate module</a></li>
+
+ <li><a href="https://ninenines.eu/articles/xerl-0.4-expression-separator/">Xerl: expression separator</a></li>
+
+ <li><a href="https://ninenines.eu/articles/erlang-scalability/">Erlang Scalability</a></li>
+
+ <li><a href="https://ninenines.eu/articles/xerl-0.3-atomic-expressions/">Xerl: atomic expressions</a></li>
+
+ <li><a href="https://ninenines.eu/articles/xerl-0.2-two-modules/">Xerl: two modules</a></li>
+
+ <li><a href="https://ninenines.eu/articles/xerl-0.1-empty-modules/">Xerl: empty modules</a></li>
+
+ <li><a href="https://ninenines.eu/articles/ranch-ftp/">Build an FTP Server with Ranch in 30 Minutes</a></li>
+
+ <li><a href="https://ninenines.eu/articles/tictactoe/">Erlang Tic Tac Toe</a></li>
+
+</ul>
+
+<h3>Feedback</h3>
+<p>Feel free to <a href="mailto:[email protected]">email us</a>
+if you found any mistake or need clarification on any of the
+articles.</p>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
diff --git a/articles/erlang-scalability/index.html b/articles/erlang-scalability/index.html
index 46871c4d..04a4c42f 100644
--- a/articles/erlang-scalability/index.html
+++ b/articles/erlang-scalability/index.html
@@ -218,6 +218,8 @@ concurrently.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/erlang-validate-utf8/index.html b/articles/erlang-validate-utf8/index.html
index 6940ae6b..cc0068ce 100644
--- a/articles/erlang-validate-utf8/index.html
+++ b/articles/erlang-validate-utf8/index.html
@@ -269,6 +269,8 @@ http://www.gnu.org/software/src-highlite -->
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/erlang.mk-and-relx/index.html b/articles/erlang.mk-and-relx/index.html
index 0173f34a..0a966c02 100644
--- a/articles/erlang.mk-and-relx/index.html
+++ b/articles/erlang.mk-and-relx/index.html
@@ -172,6 +172,8 @@ containing all the flags to pass to the Erlang VM, for example
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/erlanger-playbook-september-2015-update/index.html b/articles/erlanger-playbook-september-2015-update/index.html
index cb472372..0b8026b9 100644
--- a/articles/erlanger-playbook-september-2015-update/index.html
+++ b/articles/erlanger-playbook-september-2015-update/index.html
@@ -97,6 +97,8 @@ will be used to allow me to work on open source full time.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/erlanger-playbook/index.html b/articles/erlanger-playbook/index.html
index b8345523..4ec81c34 100644
--- a/articles/erlanger-playbook/index.html
+++ b/articles/erlanger-playbook/index.html
@@ -150,6 +150,8 @@ You will receive updates to the book for free as soon as they are available.</p>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/farwest-funded/index.html b/articles/farwest-funded/index.html
index def68b84..a3ec6011 100644
--- a/articles/farwest-funded/index.html
+++ b/articles/farwest-funded/index.html
@@ -105,6 +105,8 @@ can help!</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/index.html b/articles/index.html
index b1edcd8a..9e473f54 100644
--- a/articles/index.html
+++ b/articles/index.html
@@ -74,6 +74,23 @@
<article class="blog_item">
<header>
+ <h2><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></h2>
+ <p class="date">
+ <span class="day">22</span>
+ <span class="month">Jan</span>
+ </p>
+ </header>
+
+ <p>We have a specific mindset when writing Erlang programs. We focus on the normal execution of the program and don&#8217;t handle most of the errors that may occur. We sometimes call this normal execution the happy path.
+ The general pattern behind writing only for the happy path, letting the VM catch errors (writing them to a log for future consumption) and then having a supervisor restart the processes that failed from a clean state, has a name.</p>
+
+ <p style="text-align:right">
+ <a class="read_more" href="https://ninenines.eu/articles/dont-let-it-crash/">Read More</a>
+ </p>
+ </article>
+
+ <article class="blog_item">
+ <header>
<h2><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></h2>
<p class="date">
<span class="day">03</span>
@@ -415,23 +432,6 @@
</p>
</article>
- <article class="blog_item">
- <header>
- <h2><a href="https://ninenines.eu/articles/ranch-ftp/">Build an FTP Server with Ranch in 30 Minutes</a></h2>
- <p class="date">
- <span class="day">14</span>
- <span class="month">Nov</span>
- </p>
- </header>
-
- <p>Last week I was speaking at the London Erlang Factory Lite where I presented a live demonstration of building an FTP server using Ranch. As there was no slide, you should use this article as a reference instead.
- The goal of this article is to showcase how to use Ranch for writing a network protocol implementation, how Ranch gets out of the way to let you write the code that matters, and the common techniques used when writing servers.</p>
-
- <p style="text-align:right">
- <a class="read_more" href="https://ninenines.eu/articles/ranch-ftp/">Read More</a>
- </p>
- </article>
-
<nav class="pagination" role="pagination">
diff --git a/articles/index.xml b/articles/index.xml
index 40507060..dbb9bb8f 100644
--- a/articles/index.xml
+++ b/articles/index.xml
@@ -6,10 +6,131 @@
<description>Recent content in Articles-rsses on Nine Nines</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
- <lastBuildDate>Tue, 03 Jan 2017 00:00:00 +0100</lastBuildDate>
+ <lastBuildDate>Sun, 22 Jan 2017 00:00:00 +0100</lastBuildDate>
<atom:link href="https://ninenines.eu/articles/index.xml" rel="self" type="application/rss+xml" />
<item>
+ <title>Don&#39;t let it crash</title>
+ <link>https://ninenines.eu/articles/dont-let-it-crash/</link>
+ <pubDate>Sun, 22 Jan 2017 00:00:00 +0100</pubDate>
+
+ <guid>https://ninenines.eu/articles/dont-let-it-crash/</guid>
+ <description>&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;We have a specific mindset when writing Erlang
+programs. We focus on the normal execution of the
+program and don&amp;#8217;t handle most of the errors that may
+occur. We sometimes call this normal execution the
+&lt;em&gt;happy path&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;The general pattern behind writing only for the
+&lt;em&gt;happy path&lt;/em&gt;, letting the VM catch errors (writing
+them to a log for future consumption) and then
+having a supervisor restart the processes that
+failed from a clean state, has a name. We call it
+&lt;em&gt;let it crash&lt;/em&gt;; and it drives many of our design
+decisions.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;It&amp;#8217;s a really great way to program and the results
+are fantastic compared to most other programming
+languages. And yet, &lt;em&gt;let it crash&lt;/em&gt; barely convinced
+anyone that they should use Erlang. Why would that
+be?&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;You may already know that Cowboy is capable of
+handling at least 2 million Websocket connections
+on a single server. This is in large part thanks
+to the capabilities of the VM. Still, 2 million
+is good, much better than most other servers can
+do.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Cowboy is not just a Websocket server; it&amp;#8217;s also
+an HTTP and HTTP/2 server, and it handles many
+related features like long polling or the parsing
+of most request headers.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Can you guess how large the Cowboy codebase is,
+without looking at the source?&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Do make sure you have a clear answer in your mind
+before you go check.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Good, you are back. Now what were the results? If
+I am correct, you overestimated the size of Cowboy.
+Cowboy is in fact about five thousand lines of code.
+You probably thought it was at least ten thousand.
+About eighty percent of readers will have
+overestimated the size of Cowboy. And you did only
+because I mentioned it can handle millions of
+Websocket connections.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Numerous studies show this effect. Just mentioning
+the large number already prepared your mind to think
+in that direction. Repeating the number made you
+focus even more on it. Then the question asked for
+a number, which ended up larger than the reality.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;The same effect can be applied to negotiation for
+example. You generally want to start by giving your
+offer (and not let the other party initiate) and
+you want to give a really large number first. You
+can also prepare your customer by mentioning an even
+larger number in the previous discussion.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;And it&amp;#8217;s not just numbers either. An experiment
+showed that just by looking at an image of clouds,
+customers of a pillow store were buying pillows
+more comfortable (and more expensive) than those
+who didn&amp;#8217;t see that image.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;This is the power of associations. It is covered in
+much larger detail in the books
+&lt;a href=&#34;https://www.amazon.com/Influence-Psychology-Persuasion-Robert-Cialdini/dp/006124189X&#34;&gt;Influence&lt;/a&gt;
+and
+&lt;a href=&#34;https://www.amazon.com/Pre-Suasion-Revolutionary-Way-Influence-Persuade/dp/1501109790&#34;&gt;Pre-suasion&lt;/a&gt;.
+I highly recommend reading those and applying what
+you learn to your daily life. I&amp;#8217;m definitely not
+a professional psychologist so take this post with
+a grain of salt.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;When selling Erlang, whether we are selling it to
+a customer or trying to convince a developer friend
+to start using it, we often talk about how Erlang
+&lt;em&gt;lets you sleep at night&lt;/em&gt;, that it is auto healing
+and always gets fantastic uptimes.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;And then we talk about &lt;em&gt;let it crash&lt;/em&gt;.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;And we describe what it means.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;We might as well just say that Erlang crashes a lot
+and then take the door. It would have the same effect.
+It doesn&amp;#8217;t even stop at programs crashing. You know
+what else crashes? Cars, planes, trains. Often with
+disastrous consequences. Is that really the message
+we want to convey?&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;They even &lt;a href=&#34;https://img.youtube.com/vi/oEUBW2lCkIk/0.jpg&#34;&gt;printed it on a t-shirt&lt;/a&gt;!
+Keep calm and let it crash. It&amp;#8217;s the kind of t-shirt
+you probably shouldn&amp;#8217;t wear in an airport, and for good
+reasons. A few people did, then realized what they were
+wearing and were not too smug about it.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;And yet this is how we sell Erlang.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;A better way would be to focus on the positives, of
+course, but also to make sure that those positives
+are phrased in a way that prevents bad associations
+to be formed in people&amp;#8217;s minds.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Instead of &lt;em&gt;let it crash&lt;/em&gt;, you can say that Erlang
+has &lt;em&gt;auto healing mechanisms&lt;/em&gt;. Healing is a good
+thing and accurately describes what happens in the
+system.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Should you need to go into more details, you will
+probably want to avoid &lt;em&gt;recover from crashes&lt;/em&gt; and
+instead say &lt;em&gt;recover from exceptions&lt;/em&gt;. Exceptions
+are a pretty neutral word and, should you explain
+what you mean by that, you can talk about exceptions
+that occur for reasons unrelated to Erlang, like
+hardware failure or network instability.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;The trick is to always use positive words and
+phrases to describe Erlang, and to use external
+factors to explain how Erlang deals with failures.
+Never mention the failures internal to Erlang
+systems unless you are asked specifically, in
+which case you can say that the auto healing
+applies to all exceptions.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;The &lt;em&gt;let it crash&lt;/em&gt; philosophy is great when
+learning Erlang or when writing fault-tolerant
+systems. But it&amp;#8217;s not going to convince anyone
+to use it unless they were already looking for
+it.&lt;/p&gt;&lt;/div&gt;
+&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Do you like this post? Tell me on Twitter. I might
+make more.&lt;/p&gt;&lt;/div&gt;
+</description>
+ </item>
+
+ <item>
<title>Cowboy 2.0 pre-release 4</title>
<link>https://ninenines.eu/articles/cowboy-2.0.0-pre.4/</link>
<pubDate>Tue, 03 Jan 2017 00:00:00 +0100</pubDate>
@@ -1527,66 +1648,5 @@ http://www.gnu.org/software/src-highlite --&gt;
</description>
</item>
- <item>
- <title>Xerl: expression separator</title>
- <link>https://ninenines.eu/articles/xerl-0.4-expression-separator/</link>
- <pubDate>Fri, 01 Mar 2013 00:00:00 +0100</pubDate>
-
- <guid>https://ninenines.eu/articles/xerl-0.4-expression-separator/</guid>
- <description>&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;As promised we are adding an expression separator this time.
-This will be short and easy.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;In the tokenizer we only need to add a line recognizing the
-comma as a valid token.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;listingblock&#34;&gt;
-&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite --&gt;
-&lt;pre&gt;&lt;tt&gt;, &lt;span style=&#34;color: #990000&#34;&gt;:&lt;/span&gt; {&lt;span style=&#34;color: #FF6600&#34;&gt;token&lt;/span&gt;, {&lt;span style=&#34;color: #FF6600&#34;&gt;&#39;,&#39;&lt;/span&gt;, &lt;span style=&#34;color: #009900&#34;&gt;TokenLine&lt;/span&gt;}}&lt;span style=&#34;color: #990000&#34;&gt;.&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Then we need to change the following lines in the parser:&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;listingblock&#34;&gt;
-&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite --&gt;
-&lt;pre&gt;&lt;tt&gt;&lt;span style=&#34;color: #FF6600&#34;&gt;exprs&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;expr&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color: #FF6600&#34;&gt;&#39;$1&#39;&lt;/span&gt;]&lt;span style=&#34;color: #990000&#34;&gt;.&lt;/span&gt;
-&lt;span style=&#34;color: #FF6600&#34;&gt;exprs&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;expr&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;exprs&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color: #FF6600&#34;&gt;&#39;$1&#39;&lt;/span&gt; | &lt;span style=&#34;color: #FF6600&#34;&gt;&#39;$2&#39;&lt;/span&gt;]&lt;span style=&#34;color: #990000&#34;&gt;.&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;And add a comma between the expressions on the second line:&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;listingblock&#34;&gt;
-&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite --&gt;
-&lt;pre&gt;&lt;tt&gt;&lt;span style=&#34;color: #FF6600&#34;&gt;exprs&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;expr&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color: #FF6600&#34;&gt;&#39;$1&#39;&lt;/span&gt;]&lt;span style=&#34;color: #990000&#34;&gt;.&lt;/span&gt;
-&lt;span style=&#34;color: #FF6600&#34;&gt;exprs&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;expr&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;&#39;,&#39;&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;exprs&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color: #FF6600&#34;&gt;&#39;$1&#39;&lt;/span&gt; | &lt;span style=&#34;color: #FF6600&#34;&gt;&#39;$3&#39;&lt;/span&gt;]&lt;span style=&#34;color: #990000&#34;&gt;.&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;That takes care of everything except the optional trailing
-comma at the end of our lists of expressions. We just need an
-additional rule to take care of this.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;listingblock&#34;&gt;
-&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite --&gt;
-&lt;pre&gt;&lt;tt&gt;&lt;span style=&#34;color: #FF6600&#34;&gt;exprs&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;expr&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;&#39;,&#39;&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color: #FF6600&#34;&gt;&#39;$1&#39;&lt;/span&gt;]&lt;span style=&#34;color: #990000&#34;&gt;.&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;That&amp;#8217;s it.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Wondering why we don&amp;#8217;t have this optional trailing comma in
-Erlang considering how easy it was and the number of people
-complaining about it? Yeah, me too. But that&amp;#8217;s for someone else
-to answer.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Another change I want to talk about is a simple modification
-of the compiler code to use an &lt;code&gt;#env{}&lt;/code&gt; record for
-tracking state instead of passing around individual variables.
-This will be required later on when we make modules into proper
-expressions so I thought it was a good idea to anticipate.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;ulist&#34;&gt;&lt;ul&gt;
-&lt;li&gt;
-&lt;p&gt;
-&lt;a href=&#34;https://github.com/extend/xerl/blob/0.4/&#34;&gt;View the source&lt;/a&gt;
-&lt;/p&gt;
-&lt;/li&gt;
-&lt;/ul&gt;&lt;/div&gt;
-</description>
- </item>
-
</channel>
</rss> \ No newline at end of file
diff --git a/articles/january-2014-status/index.html b/articles/january-2014-status/index.html
index 24fc69a2..da0a5b8d 100644
--- a/articles/january-2014-status/index.html
+++ b/articles/january-2014-status/index.html
@@ -224,6 +224,8 @@ the sponsoring idea, anything really! Thanks.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/ml-archives/index.html b/articles/ml-archives/index.html
index 41a87cb2..6284b2d5 100644
--- a/articles/ml-archives/index.html
+++ b/articles/ml-archives/index.html
@@ -94,6 +94,8 @@ underlying problem in the project or its documentation.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/on-open-source/index.html b/articles/on-open-source/index.html
index 66387794..a21b30eb 100644
--- a/articles/on-open-source/index.html
+++ b/articles/on-open-source/index.html
@@ -201,6 +201,8 @@ of your company&#8217;s money.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/page/2/index.html b/articles/page/2/index.html
index 694bed10..b7448109 100644
--- a/articles/page/2/index.html
+++ b/articles/page/2/index.html
@@ -74,6 +74,23 @@
<article class="blog_item">
<header>
+ <h2><a href="https://ninenines.eu/articles/ranch-ftp/">Build an FTP Server with Ranch in 30 Minutes</a></h2>
+ <p class="date">
+ <span class="day">14</span>
+ <span class="month">Nov</span>
+ </p>
+ </header>
+
+ <p>Last week I was speaking at the London Erlang Factory Lite where I presented a live demonstration of building an FTP server using Ranch. As there was no slide, you should use this article as a reference instead.
+ The goal of this article is to showcase how to use Ranch for writing a network protocol implementation, how Ranch gets out of the way to let you write the code that matters, and the common techniques used when writing servers.</p>
+
+ <p style="text-align:right">
+ <a class="read_more" href="https://ninenines.eu/articles/ranch-ftp/">Read More</a>
+ </p>
+ </article>
+
+ <article class="blog_item">
+ <header>
<h2><a href="https://ninenines.eu/articles/tictactoe/">Erlang Tic Tac Toe</a></h2>
<p class="date">
<span class="day">17</span>
diff --git a/articles/ranch-1.3/index.html b/articles/ranch-1.3/index.html
index 6286a77d..8e182a0e 100644
--- a/articles/ranch-1.3/index.html
+++ b/articles/ranch-1.3/index.html
@@ -166,6 +166,8 @@ that need fixing sooner rather than later.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/ranch-ftp/index.html b/articles/ranch-ftp/index.html
index 307deea8..f20cefcc 100644
--- a/articles/ranch-ftp/index.html
+++ b/articles/ranch-ftp/index.html
@@ -294,6 +294,8 @@ binary protocol implementations in just a few lines of code.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/the-story-so-far/index.html b/articles/the-story-so-far/index.html
index 9d01ab67..2e6d1db6 100644
--- a/articles/the-story-so-far/index.html
+++ b/articles/the-story-so-far/index.html
@@ -308,6 +308,8 @@ project and make sure it doesn&#8217;t happen again.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/tictactoe/index.html b/articles/tictactoe/index.html
index a96fda88..dfeff96b 100644
--- a/articles/tictactoe/index.html
+++ b/articles/tictactoe/index.html
@@ -167,6 +167,8 @@ of writing algorithms to do things.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/website-update/index.html b/articles/website-update/index.html
index 9f20a0ba..aa890a89 100644
--- a/articles/website-update/index.html
+++ b/articles/website-update/index.html
@@ -141,6 +141,8 @@ upgrading JS libraries.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/xerl-0.1-empty-modules/index.html b/articles/xerl-0.1-empty-modules/index.html
index d8c103d3..1fb11ce7 100644
--- a/articles/xerl-0.1-empty-modules/index.html
+++ b/articles/xerl-0.1-empty-modules/index.html
@@ -222,6 +222,8 @@ the next few articles.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/xerl-0.2-two-modules/index.html b/articles/xerl-0.2-two-modules/index.html
index b5979ee5..9651e83a 100644
--- a/articles/xerl-0.2-two-modules/index.html
+++ b/articles/xerl-0.2-two-modules/index.html
@@ -227,6 +227,8 @@ though, so let&#8217;s get back to it after we add more.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/xerl-0.3-atomic-expressions/index.html b/articles/xerl-0.3-atomic-expressions/index.html
index d34c591e..32e6fc1c 100644
--- a/articles/xerl-0.3-atomic-expressions/index.html
+++ b/articles/xerl-0.3-atomic-expressions/index.html
@@ -231,6 +231,8 @@ do that.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/xerl-0.4-expression-separator/index.html b/articles/xerl-0.4-expression-separator/index.html
index 55c68ce1..039ff166 100644
--- a/articles/xerl-0.4-expression-separator/index.html
+++ b/articles/xerl-0.4-expression-separator/index.html
@@ -136,6 +136,8 @@ expressions so I thought it was a good idea to anticipate.</p></div>
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
diff --git a/articles/xerl-0.5-intermediate-module/index.html b/articles/xerl-0.5-intermediate-module/index.html
index c12c6ce7..be22f0d4 100644
--- a/articles/xerl-0.5-intermediate-module/index.html
+++ b/articles/xerl-0.5-intermediate-module/index.html
@@ -214,6 +214,8 @@ http://www.gnu.org/software/src-highlite -->
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
+ <li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don&#39;t let it crash</a></li>
+
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>