diff options
Diffstat (limited to 'articles')
24 files changed, 600 insertions, 162 deletions
diff --git a/articles/cowboy-2.0.0-pre.4/index.html b/articles/cowboy-2.0.0-pre.4/index.html new file mode 100644 index 00000000..092ea08e --- /dev/null +++ b/articles/cowboy-2.0.0-pre.4/index.html @@ -0,0 +1,277 @@ +<!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: Cowboy 2.0 pre-release 4</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>Cowboy 2.0 pre-release 4</span></h1> + <p class="date"> + <span class="day">03</span> + <span class="month">Jan</span> + </p> +</header> + +<div class="paragraph"><p>Cowboy <code>2.0.0-pre.4</code> has been released!</p></div>
+<div class="paragraph"><p>This is the new recommended version of Cowboy.
+While I would not recommend putting it in production
+just yet, I do recommend you start writing new
+applications with this Cowboy version.</p></div>
+<div class="paragraph"><p>The most significant changes in the pre-release are:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+A new architecture: there now is one process per
+ connection and one process per request. This was
+ done because HTTP/2 allows running requests concurrently.
+</p>
+</li>
+<li>
+<p>
+Stream handlers. Every request, response and data goes
+ through stream handlers. They are meant to replace hooks
+ and more. They will be documented in a future pre-release.
+ Check <code>cowboy_stream</code> and <code>cowboy_stream_h</code> if interested.
+</p>
+</li>
+<li>
+<p>
+Numerous changes to the <code>cowboy_req</code> interface. This
+ is very close to final. Check the manual for what changed.
+</p>
+</li>
+<li>
+<p>
+The Req object is no longer passed in Websocket callbacks.
+</p>
+</li>
+<li>
+<p>
+It is now possible to send frames directly from <code>websocket_init/1</code>.
+</p>
+</li>
+<li>
+<p>
+SPDY support was removed, now that we have HTTP/2.
+</p>
+</li>
+<li>
+<p>
+Update Ranch to 1.3. We still depend on Cowlib master
+ for the time being.
+</p>
+</li>
+<li>
+<p>
+A much improved manual.
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>The manual received a lot of love. It now has one page per
+function with a detailed description, arguments list, return
+value, changelog and examples. It also links to the other
+relevant manual pages: <a href="https://ninenines.eu/docs/en/cowboy/2.0/manual/">https://ninenines.eu/docs/en/cowboy/2.0/manual/</a></p></div>
+<div class="paragraph"><p>I am quite proud of the manual right now. While more
+improvements can be made, what we have now is way better
+than before. Feedback for further improvements is welcome!</p></div>
+<div class="paragraph"><p>This is a significant step toward Cowboy 2.0. Almost all
+the breaking changes are in. A few more pre-releases are
+planned and will be released on a weekly basis (with exceptions).</p></div>
+<div class="paragraph"><p>Cowboy is now tested and supported with Erlang/OTP 18.0 or above
+on Arch Linux, FreeBSD, OSX, Ubuntu and Windows 7. Contact me
+if you can provide permanent access to another platform for the
+purposes of testing.</p></div>
+<div class="paragraph"><p>Cowboy is now available from four locations:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<a href="https://git.ninenines.eu/cowboy.git">https://git.ninenines.eu/cowboy.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://github.com/ninenines/cowboy.git">https://github.com/ninenines/cowboy.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://bitbucket.org/ninenines/cowboy.git">https://bitbucket.org/ninenines/cowboy.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://gitlab.com/ninenines/cowboy.git">https://gitlab.com/ninenines/cowboy.git</a>
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>They are updated at the same time so there is no real difference.</p></div>
+<div class="paragraph"><p>Cowboy 2.0 will be released once all the breaking changes
+are completed and the temporarily removed features are
+added back.</p></div>
+<div class="paragraph"><p>Thanks for your patience. I know it took a long time.</p></div>
+<hr/>
+<div class="paragraph"><p>Half-price on all donations because I need a new hat:</p></div>
+<form action="https://www.paypal.com/cgi-bin/webscr" method="post" style="display:inline">
+<input type="hidden" name="cmd" value="_donations">
+<input type="hidden" name="business" value="[email protected]">
+<input type="hidden" name="lc" value="FR">
+<input type="hidden" name="item_name" value="Loic Hoguin">
+<input type="hidden" name="item_number" value="99s">
+<input type="hidden" name="currency_code" value="EUR">
+<input type="hidden" name="bn" value="PP-DonationsBF:btn_donate_LG.gif:NonHosted">
+<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
+<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
+</form>
+ +</article> +</div> + +<div class="span3 sidecol"> +<h3>More articles</h3> +<ul id="articles-nav" class="extra_margin"> + + <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 © 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/cowboy2-qs/index.html b/articles/cowboy2-qs/index.html index 21a34b55..da450bf8 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/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> diff --git a/articles/erlang-scalability/index.html b/articles/erlang-scalability/index.html index 2dcf76a7..46871c4d 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/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> diff --git a/articles/erlang-validate-utf8/index.html b/articles/erlang-validate-utf8/index.html index d9564e01..6940ae6b 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/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> diff --git a/articles/erlang.mk-and-relx/index.html b/articles/erlang.mk-and-relx/index.html index 13a95ceb..0173f34a 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/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> diff --git a/articles/erlanger-playbook-september-2015-update/index.html b/articles/erlanger-playbook-september-2015-update/index.html index 17eaf142..cb472372 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/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> diff --git a/articles/erlanger-playbook/index.html b/articles/erlanger-playbook/index.html index ea83bcad..b8345523 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/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> diff --git a/articles/farwest-funded/index.html b/articles/farwest-funded/index.html index 2e7d2079..def68b84 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/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> diff --git a/articles/index.html b/articles/index.html index 10f7ba30..b1edcd8a 100644 --- a/articles/index.html +++ b/articles/index.html @@ -74,6 +74,25 @@ <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> + <span class="month">Jan</span> + </p> + </header> + + <p>Cowboy 2.0.0-pre.4 has been released! +
This is the new recommended version of Cowboy.
While I would not recommend putting it in production
just yet, I do recommend you start writing new
applications with this Cowboy version. +
The most significant changes in the pre-release are: +
A new architecture: there now is one process per
connection and one process per request. This was
done because HTTP/2 allows running requests concurrently.</p> + + <p style="text-align:right"> + <a class="read_more" href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Read More</a> + </p> + </article> + + <article class="blog_item"> + <header> <h2><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></h2> <p class="date"> <span class="day">28</span> @@ -413,26 +432,15 @@ </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> - <span class="month">Oct</span> - </p> - </header> - - <p>Everyone knows Tic Tac Toe,
right? -
Players choose either to be the Xs or the Os, then place their symbol
on a 3x3 board one after another, trying to create a line of 3 of them. -
Writing an algorithm to check for victory sounds easy, right? It’s
easily tested, considering there’s only 8 possible winning rows (3 horizontal,
3 vertical and 2 diagonal). -
In Erlang though, you probably wouldn’t want an algorithm.</p> - - <p style="text-align:right"> - <a class="read_more" href="https://ninenines.eu/articles/tictactoe/">Read More</a> - </p> - </article> +<nav class="pagination" role="pagination"> + + <span>1 / 2</span> + + <a href="/articles/page/2/"><i class="fa fa-angle-double-right"></i></a> + +</nav> diff --git a/articles/index.xml b/articles/index.xml index 0e8c3dea..40507060 100644 --- a/articles/index.xml +++ b/articles/index.xml @@ -6,10 +6,129 @@ <description>Recent content in Articles-rsses on Nine Nines</description> <generator>Hugo -- gohugo.io</generator> <language>en-us</language> - <lastBuildDate>Mon, 28 Nov 2016 00:00:00 +0100</lastBuildDate> + <lastBuildDate>Tue, 03 Jan 2017 00:00:00 +0100</lastBuildDate> <atom:link href="https://ninenines.eu/articles/index.xml" rel="self" type="application/rss+xml" /> <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> + + <guid>https://ninenines.eu/articles/cowboy-2.0.0-pre.4/</guid> + <description><div class="paragraph"><p>Cowboy <code>2.0.0-pre.4</code> has been released!</p></div>
+<div class="paragraph"><p>This is the new recommended version of Cowboy.
+While I would not recommend putting it in production
+just yet, I do recommend you start writing new
+applications with this Cowboy version.</p></div>
+<div class="paragraph"><p>The most significant changes in the pre-release are:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+A new architecture: there now is one process per
+ connection and one process per request. This was
+ done because HTTP/2 allows running requests concurrently.
+</p>
+</li>
+<li>
+<p>
+Stream handlers. Every request, response and data goes
+ through stream handlers. They are meant to replace hooks
+ and more. They will be documented in a future pre-release.
+ Check <code>cowboy_stream</code> and <code>cowboy_stream_h</code> if interested.
+</p>
+</li>
+<li>
+<p>
+Numerous changes to the <code>cowboy_req</code> interface. This
+ is very close to final. Check the manual for what changed.
+</p>
+</li>
+<li>
+<p>
+The Req object is no longer passed in Websocket callbacks.
+</p>
+</li>
+<li>
+<p>
+It is now possible to send frames directly from <code>websocket_init/1</code>.
+</p>
+</li>
+<li>
+<p>
+SPDY support was removed, now that we have HTTP/2.
+</p>
+</li>
+<li>
+<p>
+Update Ranch to 1.3. We still depend on Cowlib master
+ for the time being.
+</p>
+</li>
+<li>
+<p>
+A much improved manual.
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>The manual received a lot of love. It now has one page per
+function with a detailed description, arguments list, return
+value, changelog and examples. It also links to the other
+relevant manual pages: <a href="https://ninenines.eu/docs/en/cowboy/2.0/manual/">https://ninenines.eu/docs/en/cowboy/2.0/manual/</a></p></div>
+<div class="paragraph"><p>I am quite proud of the manual right now. While more
+improvements can be made, what we have now is way better
+than before. Feedback for further improvements is welcome!</p></div>
+<div class="paragraph"><p>This is a significant step toward Cowboy 2.0. Almost all
+the breaking changes are in. A few more pre-releases are
+planned and will be released on a weekly basis (with exceptions).</p></div>
+<div class="paragraph"><p>Cowboy is now tested and supported with Erlang/OTP 18.0 or above
+on Arch Linux, FreeBSD, OSX, Ubuntu and Windows 7. Contact me
+if you can provide permanent access to another platform for the
+purposes of testing.</p></div>
+<div class="paragraph"><p>Cowboy is now available from four locations:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<a href="https://git.ninenines.eu/cowboy.git">https://git.ninenines.eu/cowboy.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://github.com/ninenines/cowboy.git">https://github.com/ninenines/cowboy.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://bitbucket.org/ninenines/cowboy.git">https://bitbucket.org/ninenines/cowboy.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://gitlab.com/ninenines/cowboy.git">https://gitlab.com/ninenines/cowboy.git</a>
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>They are updated at the same time so there is no real difference.</p></div>
+<div class="paragraph"><p>Cowboy 2.0 will be released once all the breaking changes
+are completed and the temporarily removed features are
+added back.</p></div>
+<div class="paragraph"><p>Thanks for your patience. I know it took a long time.</p></div>
+<hr/>
+<div class="paragraph"><p>Half-price on all donations because I need a new hat:</p></div>
+<form action="https://www.paypal.com/cgi-bin/webscr" method="post" style="display:inline">
+<input type="hidden" name="cmd" value="_donations">
+<input type="hidden" name="business" value="[email protected]">
+<input type="hidden" name="lc" value="FR">
+<input type="hidden" name="item_name" value="Loic Hoguin">
+<input type="hidden" name="item_number" value="99s">
+<input type="hidden" name="currency_code" value="EUR">
+<input type="hidden" name="bn" value="PP-DonationsBF:btn_donate_LG.gif:NonHosted">
+<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
+<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
+</form>
+</description> + </item> + + <item> <title>Ranch 1.3</title> <link>https://ninenines.eu/articles/ranch-1.3/</link> <pubDate>Mon, 28 Nov 2016 00:00:00 +0100</pubDate> @@ -1469,148 +1588,5 @@ expressions so I thought it was a good idea to anticipate.</p></div> </description> </item> - <item> - <title>Erlang Scalability</title> - <link>https://ninenines.eu/articles/erlang-scalability/</link> - <pubDate>Mon, 18 Feb 2013 00:00:00 +0100</pubDate> - - <guid>https://ninenines.eu/articles/erlang-scalability/</guid> - <description><div class="paragraph"><p>I would like to share some experience and theories on
-Erlang scalability.</p></div>
-<div class="paragraph"><p>This will be in the form of a series of hints, which
-may or may not be accompanied with explanations as to why
-things are this way, or how they improve or reduce the scalability
-of a system. I will try to do my best to avoid giving falsehoods,
-even if that means a few things won&#8217;t be explained.</p></div>
-<div class="sect1">
-<h2 id="_nifs">NIFs</h2>
-<div class="sectionbody">
-<div class="paragraph"><p>NIFs are considered harmful. I don&#8217;t know any single NIF-based
-library that I would recommend. That doesn&#8217;t mean they should
-all be avoided, just that if you&#8217;re going to want your system to
-scale, you probably shouldn&#8217;t use a NIF.</p></div>
-<div class="paragraph"><p>A common case for using NIFs is JSON processing. The problem
-is that JSON is a highly inefficient data structure (similar
-in inefficiency to XML, although perhaps not as bad). If you can
-avoid using JSON, you probably should. MessagePack can replace
-it in many situations.</p></div>
-<div class="paragraph"><p>Long-running NIFs will take over a scheduler and prevent Erlang
-from efficiently handling many processes.</p></div>
-<div class="paragraph"><p>Short-running NIFs will still confuse the scheduler if they
-take more than a few microseconds to run.</p></div>
-<div class="paragraph"><p>Threaded NIFs, or the use of the <code>enif_consume_timeslice</code>
-might help allievate this problem, but they&#8217;re not a silver bullet.</p></div>
-<div class="paragraph"><p>And as you already know, a crashing NIF will take down your VM,
-destroying any claims you may have at being scalable.</p></div>
-<div class="paragraph"><p>Never use a NIF because "C is fast". This is only true in
-single-threaded programs.</p></div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_bifs">BIFs</h2>
-<div class="sectionbody">
-<div class="paragraph"><p>BIFs can also be harmful. While they are generally better than
-NIFs, they are not perfect and some of them might have harmful
-effects on the scheduler.</p></div>
-<div class="paragraph"><p>A great example of this is the <code>erlang:decode_packet/3</code>
-BIF, when used for HTTP request or response decoding. Avoiding
-its use in <em>Cowboy</em> allowed us to see a big increase in
-the number of requests production systems were able to handle,
-up to two times the original amount. Incidentally this is something
-that is impossible to detect using synthetic benchmarks.</p></div>
-<div class="paragraph"><p>BIFs that return immediately are perfectly fine though.</p></div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_binary_strings">Binary strings</h2>
-<div class="sectionbody">
-<div class="paragraph"><p>Binary strings use less memory, which means you spend less time
-allocating memory compared to list-based strings. They are also
-more natural for strings manipulation because they are optimized
-for appending (as opposed to prepending for lists).</p></div>
-<div class="paragraph"><p>If you can process a binary string using a single match context,
-then the code will run incredibly fast. The effects will be much
-increased if the code was compiled using HiPE, even if your Erlang
-system isn&#8217;t compiled natively.</p></div>
-<div class="paragraph"><p>Avoid using <code>binary:split</code> or <code>binary:replace</code>
-if you can avoid it. They have a certain overhead due to supporting
-many options that you probably don&#8217;t need for most operations.</p></div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_buffering_and_streaming">Buffering and streaming</h2>
-<div class="sectionbody">
-<div class="paragraph"><p>Use binaries. They are great for appending, and it&#8217;s a direct copy
-from what you receive from a stream (usually a socket or a file).</p></div>
-<div class="paragraph"><p>Be careful to not indefinitely receive data, as you might end up
-having a single binary taking up huge amounts of memory.</p></div>
-<div class="paragraph"><p>If you stream from a socket and know how much data you expect,
-then fetch that data in a single <code>recv</code> call.</p></div>
-<div class="paragraph"><p>Similarly, if you can use a single <code>send</code> call, then
-you should do so, to avoid going back and forth unnecessarily between
-your Erlang process and the Erlang port for your socket.</p></div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_list_and_binary_comprehensions">List and binary comprehensions</h2>
-<div class="sectionbody">
-<div class="paragraph"><p>Prefer list comprehensions over <code>lists:map/2</code>. The
-compiler will be able to optimize your code greatly, for example
-not creating the result if you don&#8217;t need it. As time goes on,
-more optimizations will be added to the compiler and you will
-automatically benefit from them.</p></div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_gen_server_is_no_silver_bullet">gen_server is no silver bullet</h2>
-<div class="sectionbody">
-<div class="paragraph"><p>It&#8217;s a bad idea to use <code>gen_server</code> for everything.
-For two reasons.</p></div>
-<div class="paragraph"><p>There is an overhead everytime the <code>gen_server</code> receives
-a call, a cast or a simple message. It can be a problem if your
-<code>gen_server</code> is in a critical code path where speed
-is all that matters. Do not hesitate to create other kinds of
-processes where it makes sense. And depending on the kind of process,
-you might want to consider making them special processes, which
-would essentially behave the same as a <code>gen_server</code>.</p></div>
-<div class="paragraph"><p>A common mistake is to have a unique <code>gen_server</code> to
-handle queries from many processes. This generally becomes the
-biggest bottleneck you&#8217;ll want to fix. You should try to avoid
-relying on a single process, using a pool if you can.</p></div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_supervisor_and_monitoring">Supervisor and monitoring</h2>
-<div class="sectionbody">
-<div class="paragraph"><p>A <code>supervisor</code> is also a <code>gen_server</code>,
-so the previous points also apply to them.</p></div>
-<div class="paragraph"><p>Sometimes you&#8217;re in a situation where you have supervised
-processes but also want to monitor them in one or more other
-processes, effectively duplicating the work. The supervisor
-already knows when processes die, why not use this to our
-advantage?</p></div>
-<div class="paragraph"><p>You can create a custom supervisor process that will perform
-both the supervision and handle exit and other events, allowing
-to avoid the combination of supervising and monitoring which
-can prove harmful when many processes die at once, or when you
-have many short lived processes.</p></div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_ets_for_lolspeed_tm">ets for LOLSPEED(tm)</h2>
-<div class="sectionbody">
-<div class="paragraph"><p>If you have data queried or modified by many processes, then
-<code>ets</code> public or protected tables will give you the
-performance boost you require. Do not forget to set the
-<code>read_concurrency</code> or <code>write_concurrency</code>
-options though.</p></div>
-<div class="paragraph"><p>You might also be thrilled to know that Erlang R16B will feature
-a big performance improvement for accessing <code>ets</code> tables
-concurrently.</p></div>
-</div>
-</div>
-</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 4e7500fa..24fc69a2 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/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> diff --git a/articles/ml-archives/index.html b/articles/ml-archives/index.html index 0ccad3dc..41a87cb2 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/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> diff --git a/articles/on-open-source/index.html b/articles/on-open-source/index.html index ee693024..66387794 100644 --- a/articles/on-open-source/index.html +++ b/articles/on-open-source/index.html @@ -201,6 +201,8 @@ of your company’s money.</p></div> <h3>More articles</h3> <ul id="articles-nav" class="extra_margin"> + <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> diff --git a/articles/page/2/index.html b/articles/page/2/index.html new file mode 100644 index 00000000..694bed10 --- /dev/null +++ b/articles/page/2/index.html @@ -0,0 +1,137 @@ +<!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: Articles</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"> + + + <link rel="alternate" href="https://ninenines.eu/articles/index.xml" type="application/rss+xml" title="Nine Nines" /> + +</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" class="two_col"> +<div class="container"> +<div class="row"> +<div class="span9 maincol"> + +<h1 class="lined-header"><span>Articles</span></h1> + + + <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> + <span class="month">Oct</span> + </p> + </header> + + <p>Everyone knows Tic Tac Toe,
right? +
Players choose either to be the Xs or the Os, then place their symbol
on a 3x3 board one after another, trying to create a line of 3 of them. +
Writing an algorithm to check for victory sounds easy, right? It’s
easily tested, considering there’s only 8 possible winning rows (3 horizontal,
3 vertical and 2 diagonal). +
In Erlang though, you probably wouldn’t want an algorithm.</p> + + <p style="text-align:right"> + <a class="read_more" href="https://ninenines.eu/articles/tictactoe/">Read More</a> + </p> + </article> + + + +<nav class="pagination" role="pagination"> + + <a href="/articles/"><i class="fa fa-angle-double-left"></i></a> + + <span>2 / 2</span> + +</nav> + + + +</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 © 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/ranch-1.3/index.html b/articles/ranch-1.3/index.html index bd0abba1..6286a77d 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/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> diff --git a/articles/ranch-ftp/index.html b/articles/ranch-ftp/index.html index cbb9fa83..307deea8 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/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> diff --git a/articles/the-story-so-far/index.html b/articles/the-story-so-far/index.html index fc562291..9d01ab67 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’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-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> diff --git a/articles/tictactoe/index.html b/articles/tictactoe/index.html index 62edce65..a96fda88 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/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> diff --git a/articles/website-update/index.html b/articles/website-update/index.html index 70305e8e..9f20a0ba 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/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> diff --git a/articles/xerl-0.1-empty-modules/index.html b/articles/xerl-0.1-empty-modules/index.html index c3ea83a4..d8c103d3 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/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> diff --git a/articles/xerl-0.2-two-modules/index.html b/articles/xerl-0.2-two-modules/index.html index 7f357026..b5979ee5 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’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/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> diff --git a/articles/xerl-0.3-atomic-expressions/index.html b/articles/xerl-0.3-atomic-expressions/index.html index 383cdeba..d34c591e 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/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> diff --git a/articles/xerl-0.4-expression-separator/index.html b/articles/xerl-0.4-expression-separator/index.html index bad74b62..55c68ce1 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/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> diff --git a/articles/xerl-0.5-intermediate-module/index.html b/articles/xerl-0.5-intermediate-module/index.html index 8f00fa4a..c12c6ce7 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/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> |