summaryrefslogtreecommitdiffstats
path: root/articles/the-story-so-far/index.html
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2017-10-03 13:39:41 +0200
committerLoïc Hoguin <[email protected]>2017-10-03 13:39:41 +0200
commitb5d4cb91f80c833795a2d87050c3674bb7aecdc5 (patch)
tree62bf0ad8326006fcd3407fcb7c34c844c0dc0874 /articles/the-story-so-far/index.html
parent1f8d51dd2692fc3978080419987bbe4d49a41a90 (diff)
downloadninenines.eu-b5d4cb91f80c833795a2d87050c3674bb7aecdc5.tar.gz
ninenines.eu-b5d4cb91f80c833795a2d87050c3674bb7aecdc5.tar.bz2
ninenines.eu-b5d4cb91f80c833795a2d87050c3674bb7aecdc5.zip
Update Hugo, docs
Diffstat (limited to 'articles/the-story-so-far/index.html')
-rw-r--r--articles/the-story-so-far/index.html552
1 files changed, 302 insertions, 250 deletions
diff --git a/articles/the-story-so-far/index.html b/articles/the-story-so-far/index.html
index 72936401..dc642a87 100644
--- a/articles/the-story-so-far/index.html
+++ b/articles/the-story-so-far/index.html
@@ -7,7 +7,7 @@
<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" />
+ <meta name="generator" content="Hugo 0.26" />
<title>Nine Nines: The story so far</title>
@@ -74,230 +74,230 @@
</p>
</header>
-<div class="paragraph"><p>As I am away from home with little to do (some call this
-a vacation) I wanted to reflect a little on the story so far,
-or how I arrived to Erlang and got to where I am now. The
-raw personal experience. It&#8217;ll be an article that&#8217;s more
-about social aspect, communities and marketing a project than
-technical considerations. As a period piece, it will also
-allow me to reflect on the evolution of Erlang in recent
-years.</p></div>
-<div class="paragraph"><p>Once upon a time-- Okay this isn&#8217;t a fairy tale. The story
-begins with a short chapter in 2010. The year 2010 started
-with a fairly major event in my life: the US servers for the
-online game I stopped playing a few months before, but was
-still involved with through its community, were closing. OMG!
-Someone found a way to log packets and started working on a
-private server; meanwhile the JP servers were still up. And
-that&#8217;s pretty much it.</p></div>
-<div class="paragraph"><p>Fast forward a few months and it became pretty clear that
-the private server was going nowhere considering all the drama
-surrounding it-- which is actually not unusual, but it was
-more entertaining than average and the technical abilities of
-people running the project were obviously lacking so I decided
-to obtain those logged packets and look at things myself. I
-didn&#8217;t want to do a private server yet, I only wanted to take
-a peek to see how things worked, and perhaps organize some
-effort to document the protocol.</p></div>
-<div class="paragraph"><p>There was 10GB of logs. I didn&#8217;t have an easy to use
-language to analyze them, and hex editors wouldn&#8217;t cut it for
-most purposes, so I had to look elsewhere. This was a good
-opportunity to start learning this PHP killer I read about
-before, which also happens to feature syntax for matching
-binaries, called Erlang. To be perfectly honest I wouldn&#8217;t
-have touched the logs if I didn&#8217;t have the added motivation
-to play with and learn a new language.</p></div>
-<div class="paragraph"><p>At the time it was pretty hard to learn Erlang. In my
-experience there was Joe&#8217;s book (which I always recommend
-first as I believe it is the best to learn the Erlang side
-of things; but falls a little short on OTP), and there was
-about 5 chapters of LYSE. There were a couple other books
-I never managed to get into (sorry guys), and there was also
-a few interesting blogs, some of which I can&#8217;t find anymore.
-Finally the #erlang IRC community was there but I was strictly
-lurking at the time.</p></div>
-<div class="paragraph"><p>What a difference compared to 4 years later! (That&#8217;s
-today, by the way!) Now we have more books than I can
-remember, tons of articles covering various aspects of the
-language and platform, many targeting beginners but a good
-number of them also about advanced topics. We even have a
-free online book, LYSE, with more than 30 chapters covering
-pretty much everything. Needless to say I never finished
-reading LYSE as it got written slower than I learnt.</p></div>
-<div class="paragraph"><p>Back to 2010. I wrote a parser for the logs, and
-aggregated those results into one CSV file per packet type
-so I could open them in Gnumeric and aggregate some more,
-but manually this time, and draw conclusions on the packet
-structures. That was pretty easy. Even for a beginner.
-Anyone can go from zero to that level in a day or two.
-Then, having mastered binary pattern matching, I wanted
-to learn some more Erlang, by making this aggregation
-faster. What I had done before worked, but I wasn&#8217;t going
-to wait forever to process everything sequentially. So I
-looked and found a project called <code>plists</code> (still exists,
-but not maintained AFAIK). I downloaded that project and
-replaced my <code>lists:</code> calls to <code>plists:</code>.
-Boom. In just a few minutes all logs were processed, and
-I had learnt something new.</p></div>
-<div class="paragraph"><p>It is particularly interesting to note that the lack of
-a package manager or index never bothered me. Neither before
-nor after learning Erlang. My experience with package
-managers was mostly related to Ubuntu, a little Perl and
-Python, and PHP&#8217;s Pear. Let&#8217;s just stay polite and say it
-was always a terrible experience. So searching on the Web
-didn&#8217;t feel awkward, because even if I used a tool or
-website I would have ended up doing a search or two anyway.
-This is in contrast to the package index feature in
-<a href="https://github.com/ninenines/erlang.mk">Erlang.mk</a>,
-which is meant to simplify specifying dependencies more
-than anything: <code>DEPS = cowboy</code>. It does not
-attempt to solve any other problem, and will only attempt
-to solve one extra problem in the near future, which is
-the discovery of packages. So expect some kind of website
-listing packages soon enough.</p></div>
-<div class="paragraph"><p>I want to use this parenthese to also point out that at
-the time there was a very small number of projects out there,
-at least compared to today. While you sometimes hear people
-complain about lack of certain libraries, it is so much
-better now than it was before! The situation improves very
-quickly, so much that it&#8217;s not going to be that big an issue
-soon enough.</p></div>
-<div class="paragraph"><p>Wanting to know more about that game&#8217;s protocol, in the
-year 2010, I ended up starting to write more Erlang code to
-simulate a server and use the server to query the client and
-see what was happening, documenting the packets and so on.
-This eventually lead to a larger project implementing more
-and more until people got their hopes up for a revival of
-the game, all the while the now competing original server
-project died in a stream of drama and technical incompetence.
-Of course, I ended up doing what any good Internet citizen
-would do, I crushed people&#8217;s hopes, but that&#8217;s not important
-to our story. The important part is that before giving up
-on this project, I not only learnt a good deal of Erlang
-and a little deal of OTP (which I did not touch until 6
-months after I started with Erlang; see the paragraph
-about learning material above), but I also had an intriguing
-idea pop into my mind for what would become my greatest
-success yet.</p></div>
-<div class="paragraph"><p>The giving up part was not easy. Having had financial
-difficulties all year 2010 and part of 2009, I resolved
-to travel back to Paris to try and make it. I ended up
-sleeping in offices for 6 months, being hosted by a shady
-person, and hearing my fair share of stories about
-the dark side of business. While there I also worked for
-another company with someone who would end up becoming
-another high profile Erlang developer. The situation
-slowly improved, I started taking part in the #erlang
-IRC discussions, giving up my status of lurker and, a
-few months into 2011, started working on the Apache killer
-project: Cowboy.</p></div>
-<div class="paragraph"><p>This is the part where I probably should get accused of
-racism and other fun things, but I never did. And I think
-that speaks lots about the Erlang community. In all my time
-writing Erlang code, I can count the number of conflicts I
-had with other people on a single hand. This is the nicest
-programming community I have ever seen, by far. And the
-humblest too. The Erlang community feels like Japan. And
-I love Japan. So I love the Erlang community. I can&#8217;t say
-this enough. This is something that stayed true for all
-my time using Erlang, and despite the rise of alternative
-languages that are not Japan the Erlang community has
-remained very Japan.</p></div>
-<div class="paragraph"><p>The first published version of Cowboy was written in
-two weeks. A little before those two weeks, during, and
-a while after, pretty much everything I said on the
-Internets was that Cowboy was going to be the greatest
-HTTP server ever, that the other servers were problematic
-(and just to be clear, Yaws was rarely if ever mentioned,
-due to being in a perceived different league of "full
-featured servers" while Cowboy was a "lightweight server"),
-and that Cowboy will be the best replacement to a Mochiweb
-or Misultin application. This, alongside a lot of time
-spent on IRC telling people to use Cowboy when they were
-asking for an HTTP server to use, probably made me sound
-very annoying. But it worked, and Cowboy started getting
-its first users, despite being only a few weeks old. Of
-course, as soon as I got my very first user, I started
-claiming Cowboy had "a lot of users".</p></div>
-<div class="paragraph"><p>Looking back today I would definitely find myself annoying,
-this wasn&#8217;t just an idle comment there. For about a year,
-maybe a little more, all I ever said was that Cowboy was
-the best. This probably made me a little dumber in the
-process (as if I wasn&#8217;t enough! I know). Being French, I
-sometimes would also say things quite abruptly. To stay
-polite, I probably sounded like an asshole. I learnt to
-stop being so French over time thankfully.</p></div>
-<div class="paragraph"><p>I think what was most important to Cowboy at the time,
-was three things. First, it felt fresh. It was new, had new
-ideas, tried to do things differently and followed "new" old
-best practices (the OTP way-- which was simply too obscure
-for most people at the time). Second, it had me spending
-all my time telling people to use it whenever they were
-looking for an HTTP server. Third, it had me helping people
-get started with it and guide them all the steps of the way.
-Mostly because it didn&#8217;t have a very good documentation, but
-still, hand holding does wonders.</p></div>
-<div class="paragraph"><p>To be able to help people every time they had a problem,
-I did not spend all my days reading IRC. Instead I simply
-made sure to be notified when someone said <code>cowboy</code>.
-The same way many people subscribe to alerts when their
-company is mentioned in the news. Nothing fancy.</p></div>
-<div class="paragraph"><p>Time went on, Cowboy grew, or as some like to say,
-completely destroyed the competition, and many people
-eventually moved from Mochiweb and Misultin to Cowboy.
-And then Roberto Ostinelli stopped Misultin development
-and told everyone to move to Cowboy. This is the most
-humble and selfless act I have ever seen in the programming
-sphere, and I only have one thing to say about it: GG.
-Thanks for the fish. He left me with the tasks of improving
-Cowboy examples, documentation and strongly believed that
-the Misultin interface was more user friendly out of all
-the servers. So I added many examples, as many lines of
-documentation as we have of code, and strongly believe
-that Cowboy 2.0 will be the most user friendly interface
-out of all servers. But only time will tell.</p></div>
-<div class="paragraph"><p>With the rise of the project and the rise in the number
-of users, my previous strategy (completely incidental, by
-the way, and definitely not a well thought out plan to
-become popular) stopped working. It was taking me too much
-time. The important aspects slowly drifted. If I wanted to
-support more users, I would have to spend less time with
-each individual user. This was actually a hard problem.
-You basically have to make people understand they can&#8217;t
-just come to you directly when they have a problem, they
-have to follow proper channels. It becomes less personal,
-and might be felt like you don&#8217;t care about them anymore.
-You have to hurt some people&#8217;s feelings at this point. It
-is quite unfortunate, and also quite difficult to do. There
-is some unwritten rule that says early adopters deserve
-more, but in the real world it never works like this. So
-I probably hurt some people&#8217;s feelings at some point. But
-that&#8217;s okay. Because even if you make sure to be as nice
-as possible when you tell people to go through proper
-channels from now on, some people will still get offended.
-There&#8217;s nothing you can do about it.</p></div>
-<div class="paragraph"><p>From that point onward the important points about the
-project was getting the documentation done, making sure
-people knew about the proper channels to get help and
-report issues, etc. Basically making myself less needed.
-This is quite a contrast with the first days, but I believe
-Cowboy made that transition successfully.</p></div>
-<div class="paragraph"><p>Not only did I win time by not having to hold hands with
-everyone all the time (not that I didn&#8217;t like it, but you
-know, the sweat), but I also won time thanks to the increased
-project popularity. Indeed, the more users you have, the more
-annoying guys there are to tell people to use your project
-and that it&#8217;s the best and everything. Which is great. At
-least, it&#8217;s great if you don&#8217;t pay too much attention to it.
-Sometimes people will give an advice that is, in your opinion,
-a bad advice. And that&#8217;s okay. Don&#8217;t intervene every time
-someone gives a bad advice, learn to let it go. People will
-figure it out. You learn by making mistakes, after all. Use
-this extra time to make sure other people don&#8217;t end up
-giving the same bad advice instead. Fix the code or the
-documentation that led to this mistake. Slowly improve the
-project and make sure it doesn&#8217;t happen again.</p></div>
-<div class="paragraph"><p>This is my story. So far, anyway.</p></div>
+<div class="paragraph"><p>As I am away from home with little to do (some call this
+a vacation) I wanted to reflect a little on the story so far,
+or how I arrived to Erlang and got to where I am now. The
+raw personal experience. It&#8217;ll be an article that&#8217;s more
+about social aspect, communities and marketing a project than
+technical considerations. As a period piece, it will also
+allow me to reflect on the evolution of Erlang in recent
+years.</p></div>
+<div class="paragraph"><p>Once upon a time-- Okay this isn&#8217;t a fairy tale. The story
+begins with a short chapter in 2010. The year 2010 started
+with a fairly major event in my life: the US servers for the
+online game I stopped playing a few months before, but was
+still involved with through its community, were closing. OMG!
+Someone found a way to log packets and started working on a
+private server; meanwhile the JP servers were still up. And
+that&#8217;s pretty much it.</p></div>
+<div class="paragraph"><p>Fast forward a few months and it became pretty clear that
+the private server was going nowhere considering all the drama
+surrounding it-- which is actually not unusual, but it was
+more entertaining than average and the technical abilities of
+people running the project were obviously lacking so I decided
+to obtain those logged packets and look at things myself. I
+didn&#8217;t want to do a private server yet, I only wanted to take
+a peek to see how things worked, and perhaps organize some
+effort to document the protocol.</p></div>
+<div class="paragraph"><p>There was 10GB of logs. I didn&#8217;t have an easy to use
+language to analyze them, and hex editors wouldn&#8217;t cut it for
+most purposes, so I had to look elsewhere. This was a good
+opportunity to start learning this PHP killer I read about
+before, which also happens to feature syntax for matching
+binaries, called Erlang. To be perfectly honest I wouldn&#8217;t
+have touched the logs if I didn&#8217;t have the added motivation
+to play with and learn a new language.</p></div>
+<div class="paragraph"><p>At the time it was pretty hard to learn Erlang. In my
+experience there was Joe&#8217;s book (which I always recommend
+first as I believe it is the best to learn the Erlang side
+of things; but falls a little short on OTP), and there was
+about 5 chapters of LYSE. There were a couple other books
+I never managed to get into (sorry guys), and there was also
+a few interesting blogs, some of which I can&#8217;t find anymore.
+Finally the #erlang IRC community was there but I was strictly
+lurking at the time.</p></div>
+<div class="paragraph"><p>What a difference compared to 4 years later! (That&#8217;s
+today, by the way!) Now we have more books than I can
+remember, tons of articles covering various aspects of the
+language and platform, many targeting beginners but a good
+number of them also about advanced topics. We even have a
+free online book, LYSE, with more than 30 chapters covering
+pretty much everything. Needless to say I never finished
+reading LYSE as it got written slower than I learnt.</p></div>
+<div class="paragraph"><p>Back to 2010. I wrote a parser for the logs, and
+aggregated those results into one CSV file per packet type
+so I could open them in Gnumeric and aggregate some more,
+but manually this time, and draw conclusions on the packet
+structures. That was pretty easy. Even for a beginner.
+Anyone can go from zero to that level in a day or two.
+Then, having mastered binary pattern matching, I wanted
+to learn some more Erlang, by making this aggregation
+faster. What I had done before worked, but I wasn&#8217;t going
+to wait forever to process everything sequentially. So I
+looked and found a project called <code>plists</code> (still exists,
+but not maintained AFAIK). I downloaded that project and
+replaced my <code>lists:</code> calls to <code>plists:</code>.
+Boom. In just a few minutes all logs were processed, and
+I had learnt something new.</p></div>
+<div class="paragraph"><p>It is particularly interesting to note that the lack of
+a package manager or index never bothered me. Neither before
+nor after learning Erlang. My experience with package
+managers was mostly related to Ubuntu, a little Perl and
+Python, and PHP&#8217;s Pear. Let&#8217;s just stay polite and say it
+was always a terrible experience. So searching on the Web
+didn&#8217;t feel awkward, because even if I used a tool or
+website I would have ended up doing a search or two anyway.
+This is in contrast to the package index feature in
+<a href="https://github.com/ninenines/erlang.mk">Erlang.mk</a>,
+which is meant to simplify specifying dependencies more
+than anything: <code>DEPS = cowboy</code>. It does not
+attempt to solve any other problem, and will only attempt
+to solve one extra problem in the near future, which is
+the discovery of packages. So expect some kind of website
+listing packages soon enough.</p></div>
+<div class="paragraph"><p>I want to use this parenthese to also point out that at
+the time there was a very small number of projects out there,
+at least compared to today. While you sometimes hear people
+complain about lack of certain libraries, it is so much
+better now than it was before! The situation improves very
+quickly, so much that it&#8217;s not going to be that big an issue
+soon enough.</p></div>
+<div class="paragraph"><p>Wanting to know more about that game&#8217;s protocol, in the
+year 2010, I ended up starting to write more Erlang code to
+simulate a server and use the server to query the client and
+see what was happening, documenting the packets and so on.
+This eventually lead to a larger project implementing more
+and more until people got their hopes up for a revival of
+the game, all the while the now competing original server
+project died in a stream of drama and technical incompetence.
+Of course, I ended up doing what any good Internet citizen
+would do, I crushed people&#8217;s hopes, but that&#8217;s not important
+to our story. The important part is that before giving up
+on this project, I not only learnt a good deal of Erlang
+and a little deal of OTP (which I did not touch until 6
+months after I started with Erlang; see the paragraph
+about learning material above), but I also had an intriguing
+idea pop into my mind for what would become my greatest
+success yet.</p></div>
+<div class="paragraph"><p>The giving up part was not easy. Having had financial
+difficulties all year 2010 and part of 2009, I resolved
+to travel back to Paris to try and make it. I ended up
+sleeping in offices for 6 months, being hosted by a shady
+person, and hearing my fair share of stories about
+the dark side of business. While there I also worked for
+another company with someone who would end up becoming
+another high profile Erlang developer. The situation
+slowly improved, I started taking part in the #erlang
+IRC discussions, giving up my status of lurker and, a
+few months into 2011, started working on the Apache killer
+project: Cowboy.</p></div>
+<div class="paragraph"><p>This is the part where I probably should get accused of
+racism and other fun things, but I never did. And I think
+that speaks lots about the Erlang community. In all my time
+writing Erlang code, I can count the number of conflicts I
+had with other people on a single hand. This is the nicest
+programming community I have ever seen, by far. And the
+humblest too. The Erlang community feels like Japan. And
+I love Japan. So I love the Erlang community. I can&#8217;t say
+this enough. This is something that stayed true for all
+my time using Erlang, and despite the rise of alternative
+languages that are not Japan the Erlang community has
+remained very Japan.</p></div>
+<div class="paragraph"><p>The first published version of Cowboy was written in
+two weeks. A little before those two weeks, during, and
+a while after, pretty much everything I said on the
+Internets was that Cowboy was going to be the greatest
+HTTP server ever, that the other servers were problematic
+(and just to be clear, Yaws was rarely if ever mentioned,
+due to being in a perceived different league of "full
+featured servers" while Cowboy was a "lightweight server"),
+and that Cowboy will be the best replacement to a Mochiweb
+or Misultin application. This, alongside a lot of time
+spent on IRC telling people to use Cowboy when they were
+asking for an HTTP server to use, probably made me sound
+very annoying. But it worked, and Cowboy started getting
+its first users, despite being only a few weeks old. Of
+course, as soon as I got my very first user, I started
+claiming Cowboy had "a lot of users".</p></div>
+<div class="paragraph"><p>Looking back today I would definitely find myself annoying,
+this wasn&#8217;t just an idle comment there. For about a year,
+maybe a little more, all I ever said was that Cowboy was
+the best. This probably made me a little dumber in the
+process (as if I wasn&#8217;t enough! I know). Being French, I
+sometimes would also say things quite abruptly. To stay
+polite, I probably sounded like an asshole. I learnt to
+stop being so French over time thankfully.</p></div>
+<div class="paragraph"><p>I think what was most important to Cowboy at the time,
+was three things. First, it felt fresh. It was new, had new
+ideas, tried to do things differently and followed "new" old
+best practices (the OTP way-- which was simply too obscure
+for most people at the time). Second, it had me spending
+all my time telling people to use it whenever they were
+looking for an HTTP server. Third, it had me helping people
+get started with it and guide them all the steps of the way.
+Mostly because it didn&#8217;t have a very good documentation, but
+still, hand holding does wonders.</p></div>
+<div class="paragraph"><p>To be able to help people every time they had a problem,
+I did not spend all my days reading IRC. Instead I simply
+made sure to be notified when someone said <code>cowboy</code>.
+The same way many people subscribe to alerts when their
+company is mentioned in the news. Nothing fancy.</p></div>
+<div class="paragraph"><p>Time went on, Cowboy grew, or as some like to say,
+completely destroyed the competition, and many people
+eventually moved from Mochiweb and Misultin to Cowboy.
+And then Roberto Ostinelli stopped Misultin development
+and told everyone to move to Cowboy. This is the most
+humble and selfless act I have ever seen in the programming
+sphere, and I only have one thing to say about it: GG.
+Thanks for the fish. He left me with the tasks of improving
+Cowboy examples, documentation and strongly believed that
+the Misultin interface was more user friendly out of all
+the servers. So I added many examples, as many lines of
+documentation as we have of code, and strongly believe
+that Cowboy 2.0 will be the most user friendly interface
+out of all servers. But only time will tell.</p></div>
+<div class="paragraph"><p>With the rise of the project and the rise in the number
+of users, my previous strategy (completely incidental, by
+the way, and definitely not a well thought out plan to
+become popular) stopped working. It was taking me too much
+time. The important aspects slowly drifted. If I wanted to
+support more users, I would have to spend less time with
+each individual user. This was actually a hard problem.
+You basically have to make people understand they can&#8217;t
+just come to you directly when they have a problem, they
+have to follow proper channels. It becomes less personal,
+and might be felt like you don&#8217;t care about them anymore.
+You have to hurt some people&#8217;s feelings at this point. It
+is quite unfortunate, and also quite difficult to do. There
+is some unwritten rule that says early adopters deserve
+more, but in the real world it never works like this. So
+I probably hurt some people&#8217;s feelings at some point. But
+that&#8217;s okay. Because even if you make sure to be as nice
+as possible when you tell people to go through proper
+channels from now on, some people will still get offended.
+There&#8217;s nothing you can do about it.</p></div>
+<div class="paragraph"><p>From that point onward the important points about the
+project was getting the documentation done, making sure
+people knew about the proper channels to get help and
+report issues, etc. Basically making myself less needed.
+This is quite a contrast with the first days, but I believe
+Cowboy made that transition successfully.</p></div>
+<div class="paragraph"><p>Not only did I win time by not having to hold hands with
+everyone all the time (not that I didn&#8217;t like it, but you
+know, the sweat), but I also won time thanks to the increased
+project popularity. Indeed, the more users you have, the more
+annoying guys there are to tell people to use your project
+and that it&#8217;s the best and everything. Which is great. At
+least, it&#8217;s great if you don&#8217;t pay too much attention to it.
+Sometimes people will give an advice that is, in your opinion,
+a bad advice. And that&#8217;s okay. Don&#8217;t intervene every time
+someone gives a bad advice, learn to let it go. People will
+figure it out. You learn by making mistakes, after all. Use
+this extra time to make sure other people don&#8217;t end up
+giving the same bad advice instead. Fix the code or the
+documentation that led to this mistake. Slowly improve the
+project and make sure it doesn&#8217;t happen again.</p></div>
+<div class="paragraph"><p>This is my story. So far, anyway.</p></div>
</article>
</div>
@@ -306,55 +306,107 @@ 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/cowboy-2.0.0-rc.2/">Cowboy 2.0 release candidate 2</a></li>
+
+ <li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.2/">Cowboy 2.0 release candidate 2</a></li>
+
- <li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.1/">Cowboy 2.0 release candidate 1</a></li>
+
+ <li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.1/">Cowboy 2.0 release candidate 1</a></li>
+
- <li><a href="https://ninenines.eu/articles/the-elephant-in-the-room/">The elephant in the room</a></li>
+
+ <li><a href="https://ninenines.eu/articles/the-elephant-in-the-room/">The elephant in the room</a></li>
+
- <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/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/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/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/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/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-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/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/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/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/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/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/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/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/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.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/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/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.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.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/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/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>
+
+ <li><a href="https://ninenines.eu/articles/tictactoe/">Erlang Tic Tac Toe</a></li>
+
+
+
</ul>