diff options
28 files changed, 1029 insertions, 1695 deletions
diff --git a/_build/content/articles/ranch-1.3.asciidoc b/_build/content/articles/ranch-1.3.asciidoc new file mode 100644 index 00000000..4eec9330 --- /dev/null +++ b/_build/content/articles/ranch-1.3.asciidoc @@ -0,0 +1,85 @@ ++++ +date = "2016-11-28T00:00:00+01:00" +title = "Ranch 1.3" + ++++ + +Ranch `1.3.0` has been released! + +This release fixes a number of long standing issues and adds +a small number of features: + +The `ssl` application has been added to the list of dependencies. +If you don't need it, you can remove it automatically when fetching +Ranch or when building the release. If you do need it, you will no +longer have issues shutting down a node because of Ranch. + +The `ranch:info/0` and `ranch:procs/2` can be used to retrieve +information about Ranch's state. Use it for diagnostic and +discovery purposes. + +SSL listeners can now be configured without a certificate, for setups +that make use of the SNI extension. + +Transport options are now a blacklist, meaning all unknown options +will be accepted. However Dialyzer will warn if said option is not +defined in Ranch's type specifications. Please send a patch when that +happens! + +Various bugs have been fixed, including the bug where the +number of active connections could become negative. Common +errors at listener startup should be easier to read (for +example when the port is already in use). + +See the https://git.ninenines.eu/ranch.git/plain/CHANGELOG.asciidoc[CHANGELOG] +for more details. + +Ranch is now tested and supported with Erlang/OTP R16B 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. + +Ranch is now available from four locations: + +* https://git.ninenines.eu/ranch.git +* https://github.com/ninenines/ranch.git +* https://bitbucket.org/ninenines/ranch.git +* https://gitlab.com/ninenines/ranch.git + +They are updated at the same time so there is no real difference. + +The most recent Ranch commit is now always signed. You can import the +https://pgp.mit.edu/pks/lookup?op=vindex&fingerprint=on&exact=on&search=0xF19F189CECC7439699CEDD7A6EF7A77066CCCC8A[signing key for Loïc Hoguin] with: + +[source,bash] +$ gpg --keyserver hkp://keys.gnupg.net --recv-key 66CCCC8A + +The primary key fingerprint is `F19F 189C ECC7 4396 99CE DD7A 6EF7 A770 66CC CC8A`. + +When verifying signatures in git, the following should appear: + +[source,bash] +---- +gpg: Signature made Sat 26 Nov 2016 12:58:35 PM CET +gpg: using RSA key 71366FF21851DF03 +gpg: Good signature from "Loïc Hoguin <[email protected]>" [unknown] +gpg: WARNING: This key is not certified with a trusted signature! +gpg: There is no indication that the signature belongs to the owner. +Primary key fingerprint: F19F 189C ECC7 4396 99CE DD7A 6EF7 A770 66CC CC8A + Subkey fingerprint: FEDA 6E41 B390 F745 A385 5CDC 7136 6FF2 1851 DF03 +---- + +You can safely ignore the warning if you don't know what it +means, as long as everything else is correct. + +Mirrors and signature verification will soon be implemented +directly in Erlang.mk. In the meantime, you will need to +set them up manually. + +Most of this work was done to fix issues in RabbitMQ. Paid +customers get priority; contact me if you have some issues +that need fixing sooner rather than later. + +Expect future releases to be announced in this space. + +Thanks for reading! diff --git a/articles/cowboy2-qs/index.html b/articles/cowboy2-qs/index.html index 435cd076..21a34b55 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/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> diff --git a/articles/erlang-scalability/index.html b/articles/erlang-scalability/index.html index b970dd20..2dcf76a7 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/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> diff --git a/articles/erlang-validate-utf8/index.html b/articles/erlang-validate-utf8/index.html index 9e6ad29a..d9564e01 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/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> diff --git a/articles/erlang.mk-and-relx/index.html b/articles/erlang.mk-and-relx/index.html index b83e3205..13a95ceb 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/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> diff --git a/articles/erlanger-playbook-september-2015-update/index.html b/articles/erlanger-playbook-september-2015-update/index.html index f79d285e..17eaf142 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/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> diff --git a/articles/erlanger-playbook/index.html b/articles/erlanger-playbook/index.html index 672fd232..ea83bcad 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/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> diff --git a/articles/farwest-funded/index.html b/articles/farwest-funded/index.html index 21b8a687..2e7d2079 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/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> diff --git a/articles/index.html b/articles/index.html index d8077213..10f7ba30 100644 --- a/articles/index.html +++ b/articles/index.html @@ -74,6 +74,24 @@ <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> + <span class="month">Nov</span> + </p> + </header> + + <p>Ranch 1.3.0 has been released! +
This release fixes a number of long standing issues and adds
a small number of features: +
The ssl application has been added to the list of dependencies.
If you don’t need it, you can remove it automatically when fetching
Ranch or when building the release. If you do need it, you will no
longer have issues shutting down a node because of Ranch.</p> + + <p style="text-align:right"> + <a class="read_more" href="https://ninenines.eu/articles/ranch-1.3/">Read More</a> + </p> + </article> + + <article class="blog_item"> + <header> <h2><a href="https://ninenines.eu/articles/ml-archives/">Mailing list archived</a></h2> <p class="date"> <span class="day">29</span> diff --git a/articles/index.xml b/articles/index.xml index 794de53c..0e8c3dea 100644 --- a/articles/index.xml +++ b/articles/index.xml @@ -6,10 +6,101 @@ <description>Recent content in Articles-rsses on Nine Nines</description> <generator>Hugo -- gohugo.io</generator> <language>en-us</language> - <lastBuildDate>Mon, 29 Aug 2016 00:00:00 +0100</lastBuildDate> + <lastBuildDate>Mon, 28 Nov 2016 00:00:00 +0100</lastBuildDate> <atom:link href="https://ninenines.eu/articles/index.xml" rel="self" type="application/rss+xml" /> <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> + + <guid>https://ninenines.eu/articles/ranch-1.3/</guid> + <description><div class="paragraph"><p>Ranch <code>1.3.0</code> has been released!</p></div>
+<div class="paragraph"><p>This release fixes a number of long standing issues and adds
+a small number of features:</p></div>
+<div class="paragraph"><p>The <code>ssl</code> application has been added to the list of dependencies.
+If you don&#8217;t need it, you can remove it automatically when fetching
+Ranch or when building the release. If you do need it, you will no
+longer have issues shutting down a node because of Ranch.</p></div>
+<div class="paragraph"><p>The <code>ranch:info/0</code> and <code>ranch:procs/2</code> can be used to retrieve
+information about Ranch&#8217;s state. Use it for diagnostic and
+discovery purposes.</p></div>
+<div class="paragraph"><p>SSL listeners can now be configured without a certificate, for setups
+that make use of the SNI extension.</p></div>
+<div class="paragraph"><p>Transport options are now a blacklist, meaning all unknown options
+will be accepted. However Dialyzer will warn if said option is not
+defined in Ranch&#8217;s type specifications. Please send a patch when that
+happens!</p></div>
+<div class="paragraph"><p>Various bugs have been fixed, including the bug where the
+number of active connections could become negative. Common
+errors at listener startup should be easier to read (for
+example when the port is already in use).</p></div>
+<div class="paragraph"><p>See the <a href="https://git.ninenines.eu/ranch.git/plain/CHANGELOG.asciidoc">CHANGELOG</a>
+for more details.</p></div>
+<div class="paragraph"><p>Ranch is now tested and supported with Erlang/OTP R16B 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>Ranch is now available from four locations:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<a href="https://git.ninenines.eu/ranch.git">https://git.ninenines.eu/ranch.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://github.com/ninenines/ranch.git">https://github.com/ninenines/ranch.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://bitbucket.org/ninenines/ranch.git">https://bitbucket.org/ninenines/ranch.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://gitlab.com/ninenines/ranch.git">https://gitlab.com/ninenines/ranch.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>The most recent Ranch commit is now always signed. You can import the
+<a href="https://pgp.mit.edu/pks/lookup?op=vindex&amp;fingerprint=on&amp;exact=on&amp;search=0xF19F189CECC7439699CEDD7A6EF7A77066CCCC8A">signing key for Loïc Hoguin</a> with:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>$ gpg --keyserver hkp<span style="color: #990000">:</span>//keys<span style="color: #990000">.</span>gnupg<span style="color: #990000">.</span>net --recv-key 66CCCC8A</tt></pre></div></div>
+<div class="paragraph"><p>The primary key fingerprint is <code>F19F 189C ECC7 4396 99CE DD7A 6EF7 A770 66CC CC8A</code>.</p></div>
+<div class="paragraph"><p>When verifying signatures in git, the following should appear:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>gpg<span style="color: #990000">:</span> Signature made Sat <span style="color: #993399">26</span> Nov <span style="color: #993399">2016</span> <span style="color: #993399">12</span><span style="color: #990000">:</span><span style="color: #993399">58</span><span style="color: #990000">:</span><span style="color: #993399">35</span> PM CET
+gpg<span style="color: #990000">:</span> using RSA key 71366FF21851DF03
+gpg<span style="color: #990000">:</span> Good signature from <span style="color: #FF0000">"Loïc Hoguin &lt;[email protected]&gt;"</span> <span style="color: #990000">[</span>unknown<span style="color: #990000">]</span>
+gpg<span style="color: #990000">:</span> WARNING<span style="color: #990000">:</span> This key is not certified with a trusted signature<span style="color: #990000">!</span>
+gpg<span style="color: #990000">:</span> There is no indication that the signature belongs to the owner<span style="color: #990000">.</span>
+Primary key fingerprint<span style="color: #990000">:</span> F19F 189C ECC7 <span style="color: #993399">4396</span> 99CE DD7A 6EF7 A770 66CC CC8A
+ Subkey fingerprint<span style="color: #990000">:</span> FEDA <span style="color: #993399">6E41</span> B390 F745 A385 5CDC <span style="color: #993399">7136</span> 6FF2 <span style="color: #993399">1851</span> DF03</tt></pre></div></div>
+<div class="paragraph"><p>You can safely ignore the warning if you don&#8217;t know what it
+means, as long as everything else is correct.</p></div>
+<div class="paragraph"><p>Mirrors and signature verification will soon be implemented
+directly in Erlang.mk. In the meantime, you will need to
+set them up manually.</p></div>
+<div class="paragraph"><p>Most of this work was done to fix issues in RabbitMQ. Paid
+customers get priority; contact me if you have some issues
+that need fixing sooner rather than later.</p></div>
+<div class="paragraph"><p>Expect future releases to be announced in this space.</p></div>
+<div class="paragraph"><p>Thanks for reading!</p></div>
+</description> + </item> + + <item> <title>Mailing list archived</title> <link>https://ninenines.eu/articles/ml-archives/</link> <pubDate>Mon, 29 Aug 2016 00:00:00 +0100</pubDate> @@ -1521,161 +1612,5 @@ concurrently.</p></div> </description> </item> - <item> - <title>Xerl: atomic expressions</title> - <link>https://ninenines.eu/articles/xerl-0.3-atomic-expressions/</link> - <pubDate>Mon, 18 Feb 2013 00:00:00 +0100</pubDate> - - <guid>https://ninenines.eu/articles/xerl-0.3-atomic-expressions/</guid> - <description><div class="paragraph"><p>We will be adding atomic integer expressions to our language.
-These look as follow in Erlang:</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre><tt><span style="color: #993399">42</span><span style="color: #990000">.</span></tt></pre></div></div>
-<div class="paragraph"><p>And the result of this expression is of course 42.</p></div>
-<div class="paragraph"><p>We will be running this expression at compile time, since we
-don&#8217;t have the means to run code at runtime yet. This will of
-course result in no module being compiled, but that&#8217;s OK, it will
-allow us to discuss a few important things we&#8217;ll have to plan for
-later on.</p></div>
-<div class="paragraph"><p>First, we must of course accept integers in the tokenizer.</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre><tt>{<span style="color: #009900">D</span>}<span style="color: #990000">+</span> <span style="color: #990000">:</span> {<span style="color: #FF6600">token</span>, {<span style="font-weight: bold"><span style="color: #000080">integer</span></span>, <span style="color: #009900">TokenLine</span>, <span style="font-weight: bold"><span style="color: #000080">list_to_integer</span></span>(<span style="color: #009900">TokenChars</span>)}}<span style="color: #990000">.</span></tt></pre></div></div>
-<div class="paragraph"><p>We must then accept atomic integer expressions in the parser.
-This is a simple change. The integer token is terminal so we need
-to add it to the list of terminals, and then we only need to add
-it as a possible expression.</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre><tt><span style="color: #FF6600">expr</span> <span style="color: #990000">-&gt;</span> <span style="color: #FF6600">integer</span> <span style="color: #990000">:</span> <span style="color: #FF6600">'$1'</span><span style="color: #990000">.</span></tt></pre></div></div>
-<div class="paragraph"><p>A file containing only the number 42 (with no terminating dot)
-will give the following result when parsing it. This is incidentally
-the same result as when tokenizing.</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre><tt>[{<span style="font-weight: bold"><span style="color: #000080">integer</span></span>,<span style="color: #993399">1</span>,<span style="color: #993399">42</span>}]</tt></pre></div></div>
-<div class="paragraph"><p>We must then evaluate it. We&#8217;re going to interpret it for now.
-Since the result of this expression is not stored in a variable,
-we are going to simply print it on the screen and discard it.</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre><tt><span style="font-weight: bold"><span style="color: #000000">execute</span></span>(<span style="color: #009900">Filename</span>, [{<span style="font-weight: bold"><span style="color: #000080">integer</span></span>, <span style="color: #990000">_</span>, <span style="color: #009900">Int</span>}|<span style="color: #009900">Tail</span>], <span style="color: #009900">Modules</span>) <span style="color: #990000">-&gt;</span>
- <span style="font-weight: bold"><span style="color: #000000">io:format</span></span>(<span style="color: #FF0000">"integer ~p~n"</span>, [<span style="color: #009900">Int</span>]),
- <span style="font-weight: bold"><span style="color: #000000">execute</span></span>(<span style="color: #009900">Filename</span>, <span style="color: #009900">Tail</span>, <span style="color: #009900">Modules</span>)<span style="color: #990000">.</span></tt></pre></div></div>
-<div class="paragraph"><p>You might think by now that what we&#8217;ve done so far this time
-is useless. It brings up many interesting questions though.</p></div>
-<div class="ulist"><ul>
-<li>
-<p>
-What happens if a file contains two integers?
-</p>
-</li>
-<li>
-<p>
-Can we live without expression separators?
-</p>
-</li>
-<li>
-<p>
-Do we need an interpreter for the compile step?
-</p>
-</li>
-</ul></div>
-<div class="paragraph"><p>This is what happens when we create a file that contains two
-integers on two separate lines:</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre><tt>[{<span style="font-weight: bold"><span style="color: #000080">integer</span></span>,<span style="color: #993399">1</span>,<span style="color: #993399">42</span>},{<span style="font-weight: bold"><span style="color: #000080">integer</span></span>,<span style="color: #993399">2</span>,<span style="color: #993399">43</span>}]</tt></pre></div></div>
-<div class="paragraph"><p>And on the same lines:</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre><tt>[{<span style="font-weight: bold"><span style="color: #000080">integer</span></span>,<span style="color: #993399">1</span>,<span style="color: #993399">42</span>},{<span style="font-weight: bold"><span style="color: #000080">integer</span></span>,<span style="color: #993399">1</span>,<span style="color: #993399">43</span>}]</tt></pre></div></div>
-<div class="paragraph"><p>Does this mean we do not need separators between expressions?
-Not quite. The <code>+</code> and <code>-</code> operators are an
-example of why we can&#8217;t have nice things. They are ambiguous. They
-have two different meanings: make an atomic integer positive or
-negative, or perform an addition or a substraction between two
-integers. Without a separator you won&#8217;t be able to know if the
-following snippet is one or two expressions:</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre><tt><span style="color: #993399">42</span> <span style="color: #990000">-</span> <span style="color: #993399">12</span></tt></pre></div></div>
-<div class="paragraph"><p>Can we use the line ending as an expression separator then?
-Some languages make whitespace important, often the line
-separator becomes the expression separator. I do not think this
-is the best idea, it can lead to errors. For example the following
-snippet would be two expressions:</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite -->
-<pre><tt><span style="color: #009900">Var</span> <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">some_module:some_function</span></span>() <span style="color: #990000">+</span> <span style="font-weight: bold"><span style="color: #000000">some_module:other_function</span></span>()
- <span style="color: #990000">+</span> <span style="font-weight: bold"><span style="color: #000000">another_module:another_function</span></span>()</tt></pre></div></div>
-<div class="paragraph"><p>It is not obvious what would happen unless you are a veteran
-of the language, and so we will not go down that road. We will use
-an expression separator just like in Erlang: the comma. We will
-however allow a trailing comma to make copy pasting code easier,
-even if this means some old academics guy will go nuts about it
-later on. This trailing comma will be optional and simply discarded
-by the parser when encountered. We will implement this next.</p></div>
-<div class="paragraph"><p>The question as to how we will handle running expressions
-remains. We have two choices here: we can write an interpreter,
-or we can compile the code and run it. Writing an interpreter
-would require us to do twice the work, and we are lazy, so we will
-not do that.</p></div>
-<div class="paragraph"><p>You might already know that Erlang does not use the same code
-for compiling and for evaluating commands in the shell. The main
-reason for this is that in Erlang everything isn&#8217;t an expression.
-Indeed, the compiler compiles forms which contain expressions,
-but you can&#8217;t have forms in the shell.</p></div>
-<div class="paragraph"><p>How are we going to compile the code that isn&#8217;t part of a module
-then? What do we need to run at compile-time, anyway? The body of
-the file itself, of course. The body of module declarations. That&#8217;s
-about it.</p></div>
-<div class="paragraph"><p>For the file itself, we can simply compile it as a big function
-that will be executed. Then, everytime we encounter a module
-declaration, we will run the compiler on its body, making its body
-essentially a big function that will be executed. The same mechanism
-will be applied when we encounter a module declaration at runtime.</p></div>
-<div class="paragraph"><p>At runtime there&#8217;s nothing else for us to do, the result of this
-operation will load all the compiled modules. At compile time we
-will also want to save them to a file. We&#8217;ll see later how we can
-do that.</p></div>
-<div class="ulist"><ul>
-<li>
-<p>
-<a href="https://github.com/extend/xerl/blob/0.3/">View the source</a>
-</p>
-</li>
-</ul></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 c4cc9ec8..4e7500fa 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/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> diff --git a/articles/ml-archives/index.html b/articles/ml-archives/index.html index 9023fb6b..0ccad3dc 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/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> diff --git a/articles/on-open-source/index.html b/articles/on-open-source/index.html index 80e436cf..ee693024 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/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> diff --git a/articles/ranch-1.3/index.html b/articles/ranch-1.3/index.html new file mode 100644 index 00000000..bd0abba1 --- /dev/null +++ b/articles/ranch-1.3/index.html @@ -0,0 +1,247 @@ +<!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: Ranch 1.3</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>Ranch 1.3</span></h1> + <p class="date"> + <span class="day">28</span> + <span class="month">Nov</span> + </p> +</header> + +<div class="paragraph"><p>Ranch <code>1.3.0</code> has been released!</p></div>
+<div class="paragraph"><p>This release fixes a number of long standing issues and adds
+a small number of features:</p></div>
+<div class="paragraph"><p>The <code>ssl</code> application has been added to the list of dependencies.
+If you don’t need it, you can remove it automatically when fetching
+Ranch or when building the release. If you do need it, you will no
+longer have issues shutting down a node because of Ranch.</p></div>
+<div class="paragraph"><p>The <code>ranch:info/0</code> and <code>ranch:procs/2</code> can be used to retrieve
+information about Ranch’s state. Use it for diagnostic and
+discovery purposes.</p></div>
+<div class="paragraph"><p>SSL listeners can now be configured without a certificate, for setups
+that make use of the SNI extension.</p></div>
+<div class="paragraph"><p>Transport options are now a blacklist, meaning all unknown options
+will be accepted. However Dialyzer will warn if said option is not
+defined in Ranch’s type specifications. Please send a patch when that
+happens!</p></div>
+<div class="paragraph"><p>Various bugs have been fixed, including the bug where the
+number of active connections could become negative. Common
+errors at listener startup should be easier to read (for
+example when the port is already in use).</p></div>
+<div class="paragraph"><p>See the <a href="https://git.ninenines.eu/ranch.git/plain/CHANGELOG.asciidoc">CHANGELOG</a>
+for more details.</p></div>
+<div class="paragraph"><p>Ranch is now tested and supported with Erlang/OTP R16B 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>Ranch is now available from four locations:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<a href="https://git.ninenines.eu/ranch.git">https://git.ninenines.eu/ranch.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://github.com/ninenines/ranch.git">https://github.com/ninenines/ranch.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://bitbucket.org/ninenines/ranch.git">https://bitbucket.org/ninenines/ranch.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://gitlab.com/ninenines/ranch.git">https://gitlab.com/ninenines/ranch.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>The most recent Ranch commit is now always signed. You can import the
+<a href="https://pgp.mit.edu/pks/lookup?op=vindex&fingerprint=on&exact=on&search=0xF19F189CECC7439699CEDD7A6EF7A77066CCCC8A">signing key for Loïc Hoguin</a> with:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>$ gpg --keyserver hkp<span style="color: #990000">:</span>//keys<span style="color: #990000">.</span>gnupg<span style="color: #990000">.</span>net --recv-key 66CCCC8A</tt></pre></div></div>
+<div class="paragraph"><p>The primary key fingerprint is <code>F19F 189C ECC7 4396 99CE DD7A 6EF7 A770 66CC CC8A</code>.</p></div>
+<div class="paragraph"><p>When verifying signatures in git, the following should appear:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>gpg<span style="color: #990000">:</span> Signature made Sat <span style="color: #993399">26</span> Nov <span style="color: #993399">2016</span> <span style="color: #993399">12</span><span style="color: #990000">:</span><span style="color: #993399">58</span><span style="color: #990000">:</span><span style="color: #993399">35</span> PM CET
+gpg<span style="color: #990000">:</span> using RSA key 71366FF21851DF03
+gpg<span style="color: #990000">:</span> Good signature from <span style="color: #FF0000">"Loïc Hoguin <[email protected]>"</span> <span style="color: #990000">[</span>unknown<span style="color: #990000">]</span>
+gpg<span style="color: #990000">:</span> WARNING<span style="color: #990000">:</span> This key is not certified with a trusted signature<span style="color: #990000">!</span>
+gpg<span style="color: #990000">:</span> There is no indication that the signature belongs to the owner<span style="color: #990000">.</span>
+Primary key fingerprint<span style="color: #990000">:</span> F19F 189C ECC7 <span style="color: #993399">4396</span> 99CE DD7A 6EF7 A770 66CC CC8A
+ Subkey fingerprint<span style="color: #990000">:</span> FEDA <span style="color: #993399">6E41</span> B390 F745 A385 5CDC <span style="color: #993399">7136</span> 6FF2 <span style="color: #993399">1851</span> DF03</tt></pre></div></div>
+<div class="paragraph"><p>You can safely ignore the warning if you don’t know what it
+means, as long as everything else is correct.</p></div>
+<div class="paragraph"><p>Mirrors and signature verification will soon be implemented
+directly in Erlang.mk. In the meantime, you will need to
+set them up manually.</p></div>
+<div class="paragraph"><p>Most of this work was done to fix issues in RabbitMQ. Paid
+customers get priority; contact me if you have some issues
+that need fixing sooner rather than later.</p></div>
+<div class="paragraph"><p>Expect future releases to be announced in this space.</p></div>
+<div class="paragraph"><p>Thanks for reading!</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/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/ranch-ftp/index.html b/articles/ranch-ftp/index.html index 669c9e65..cbb9fa83 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/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> diff --git a/articles/the-story-so-far/index.html b/articles/the-story-so-far/index.html index 1a3f8d83..fc562291 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/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> diff --git a/articles/tictactoe/index.html b/articles/tictactoe/index.html index c03838b1..62edce65 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/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> diff --git a/articles/website-update/index.html b/articles/website-update/index.html index 8662b475..70305e8e 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/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> diff --git a/articles/xerl-0.1-empty-modules/index.html b/articles/xerl-0.1-empty-modules/index.html index 9a88a351..c3ea83a4 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/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> diff --git a/articles/xerl-0.2-two-modules/index.html b/articles/xerl-0.2-two-modules/index.html index 9f754929..7f357026 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/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> diff --git a/articles/xerl-0.3-atomic-expressions/index.html b/articles/xerl-0.3-atomic-expressions/index.html index 456b34ad..383cdeba 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/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> diff --git a/articles/xerl-0.4-expression-separator/index.html b/articles/xerl-0.4-expression-separator/index.html index 404c8d70..bad74b62 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/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> diff --git a/articles/xerl-0.5-intermediate-module/index.html b/articles/xerl-0.5-intermediate-module/index.html index 9381796f..8f00fa4a 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/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> diff --git a/donate/index.html b/donate/index.html index 0de606b5..325161ba 100644 --- a/donate/index.html +++ b/donate/index.html @@ -1,726 +1,74 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
- "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 8.6.9" />
-<title></title>
-<style type="text/css">
-
-
-
-body {
- font-family: Georgia,serif;
-}
-
-
-h1, h2, h3, h4, h5, h6,
-div.title, caption.title,
-thead, p.table.header,
-#toctitle,
-#author, #revnumber, #revdate, #revremark,
-#footer {
- font-family: Arial,Helvetica,sans-serif;
-}
-
-body {
- margin: 1em 5% 1em 5%;
-}
-
-a {
- color: blue;
- text-decoration: underline;
-}
-a:visited {
- color: fuchsia;
-}
-
-em {
- font-style: italic;
- color: navy;
-}
-
-strong {
- font-weight: bold;
- color: #083194;
-}
-
-h1, h2, h3, h4, h5, h6 {
- color: #527bbd;
- margin-top: 1.2em;
- margin-bottom: 0.5em;
- line-height: 1.3;
-}
-
-h1, h2, h3 {
- border-bottom: 2px solid silver;
-}
-h2 {
- padding-top: 0.5em;
-}
-h3 {
- float: left;
-}
-h3 + * {
- clear: left;
-}
-h5 {
- font-size: 1.0em;
-}
-
-div.sectionbody {
- margin-left: 0;
-}
-
-hr {
- border: 1px solid silver;
-}
-
-p {
- margin-top: 0.5em;
- margin-bottom: 0.5em;
-}
-
-ul, ol, li > p {
- margin-top: 0;
-}
-ul > li { color: #aaa; }
-ul > li > * { color: black; }
-
-.monospaced, code, pre {
- font-family: "Courier New", Courier, monospace;
- font-size: inherit;
- color: navy;
- padding: 0;
- margin: 0;
-}
-pre {
- white-space: pre-wrap;
-}
-
-#author {
- color: #527bbd;
- font-weight: bold;
- font-size: 1.1em;
-}
-#email {
-}
-#revnumber, #revdate, #revremark {
-}
-
-#footer {
- font-size: small;
- border-top: 2px solid silver;
- padding-top: 0.5em;
- margin-top: 4.0em;
-}
-#footer-text {
- float: left;
- padding-bottom: 0.5em;
-}
-#footer-badges {
- float: right;
- padding-bottom: 0.5em;
-}
-
-#preamble {
- margin-top: 1.5em;
- margin-bottom: 1.5em;
-}
-div.imageblock, div.exampleblock, div.verseblock,
-div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
-div.admonitionblock {
- margin-top: 1.0em;
- margin-bottom: 1.5em;
-}
-div.admonitionblock {
- margin-top: 2.0em;
- margin-bottom: 2.0em;
- margin-right: 10%;
- color: #606060;
-}
-
-div.content {
- padding: 0;
-}
-
-
-div.title, caption.title {
- color: #527bbd;
- font-weight: bold;
- text-align: left;
- margin-top: 1.0em;
- margin-bottom: 0.5em;
-}
-div.title + * {
- margin-top: 0;
-}
-
-td div.title:first-child {
- margin-top: 0.0em;
-}
-div.content div.title:first-child {
- margin-top: 0.0em;
-}
-div.content + div.title {
- margin-top: 0.0em;
-}
-
-div.sidebarblock > div.content {
- background: #ffffee;
- border: 1px solid #dddddd;
- border-left: 4px solid #f0f0f0;
- padding: 0.5em;
-}
-
-div.listingblock > div.content {
- border: 1px solid #dddddd;
- border-left: 5px solid #f0f0f0;
- background: #f8f8f8;
- padding: 0.5em;
-}
-
-div.quoteblock, div.verseblock {
- padding-left: 1.0em;
- margin-left: 1.0em;
- margin-right: 10%;
- border-left: 5px solid #f0f0f0;
- color: #888;
-}
-
-div.quoteblock > div.attribution {
- padding-top: 0.5em;
- text-align: right;
-}
-
-div.verseblock > pre.content {
- font-family: inherit;
- font-size: inherit;
-}
-div.verseblock > div.attribution {
- padding-top: 0.75em;
- text-align: left;
-}
-
-div.verseblock + div.attribution {
- text-align: left;
-}
-
-div.admonitionblock .icon {
- vertical-align: top;
- font-size: 1.1em;
- font-weight: bold;
- text-decoration: underline;
- color: #527bbd;
- padding-right: 0.5em;
-}
-div.admonitionblock td.content {
- padding-left: 0.5em;
- border-left: 3px solid #dddddd;
-}
-
-div.exampleblock > div.content {
- border-left: 3px solid #dddddd;
- padding-left: 0.5em;
-}
-
-div.imageblock div.content { padding-left: 0; }
-span.image img { border-style: none; vertical-align: text-bottom; }
-a.image:visited { color: white; }
-
-dl {
- margin-top: 0.8em;
- margin-bottom: 0.8em;
-}
-dt {
- margin-top: 0.5em;
- margin-bottom: 0;
- font-style: normal;
- color: navy;
-}
-dd > *:first-child {
- margin-top: 0.1em;
-}
-
-ul, ol {
- list-style-position: outside;
-}
-ol.arabic {
- list-style-type: decimal;
-}
-ol.loweralpha {
- list-style-type: lower-alpha;
-}
-ol.upperalpha {
- list-style-type: upper-alpha;
-}
-ol.lowerroman {
- list-style-type: lower-roman;
-}
-ol.upperroman {
- list-style-type: upper-roman;
-}
-
-div.compact ul, div.compact ol,
-div.compact p, div.compact p,
-div.compact div, div.compact div {
- margin-top: 0.1em;
- margin-bottom: 0.1em;
-}
-
-tfoot {
- font-weight: bold;
-}
-td > div.verse {
- white-space: pre;
-}
-
-div.hdlist {
- margin-top: 0.8em;
- margin-bottom: 0.8em;
-}
-div.hdlist tr {
- padding-bottom: 15px;
-}
-dt.hdlist1.strong, td.hdlist1.strong {
- font-weight: bold;
-}
-td.hdlist1 {
- vertical-align: top;
- font-style: normal;
- padding-right: 0.8em;
- color: navy;
-}
-td.hdlist2 {
- vertical-align: top;
-}
-div.hdlist.compact tr {
- margin: 0;
- padding-bottom: 0;
-}
-
-.comment {
- background: yellow;
-}
-
-.footnote, .footnoteref {
- font-size: 0.8em;
-}
-
-span.footnote, span.footnoteref {
- vertical-align: super;
-}
-
-#footnotes {
- margin: 20px 0 20px 0;
- padding: 7px 0 0 0;
-}
-
-#footnotes div.footnote {
- margin: 0 0 5px 0;
-}
-
-#footnotes hr {
- border: none;
- border-top: 1px solid silver;
- height: 1px;
- text-align: left;
- margin-left: 0;
- width: 20%;
- min-width: 100px;
-}
-
-div.colist td {
- padding-right: 0.5em;
- padding-bottom: 0.3em;
- vertical-align: top;
-}
-div.colist td img {
- margin-top: 0.3em;
-}
-
-@media print {
- #footer-badges { display: none; }
-}
-
-#toc {
- margin-bottom: 2.5em;
-}
-
-#toctitle {
- color: #527bbd;
- font-size: 1.1em;
- font-weight: bold;
- margin-top: 1.0em;
- margin-bottom: 0.1em;
-}
-
-div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
- margin-top: 0;
- margin-bottom: 0;
-}
-div.toclevel2 {
- margin-left: 2em;
- font-size: 0.9em;
-}
-div.toclevel3 {
- margin-left: 4em;
- font-size: 0.9em;
-}
-div.toclevel4 {
- margin-left: 6em;
- font-size: 0.9em;
-}
-
-span.aqua { color: aqua; }
-span.black { color: black; }
-span.blue { color: blue; }
-span.fuchsia { color: fuchsia; }
-span.gray { color: gray; }
-span.green { color: green; }
-span.lime { color: lime; }
-span.maroon { color: maroon; }
-span.navy { color: navy; }
-span.olive { color: olive; }
-span.purple { color: purple; }
-span.red { color: red; }
-span.silver { color: silver; }
-span.teal { color: teal; }
-span.white { color: white; }
-span.yellow { color: yellow; }
-
-span.aqua-background { background: aqua; }
-span.black-background { background: black; }
-span.blue-background { background: blue; }
-span.fuchsia-background { background: fuchsia; }
-span.gray-background { background: gray; }
-span.green-background { background: green; }
-span.lime-background { background: lime; }
-span.maroon-background { background: maroon; }
-span.navy-background { background: navy; }
-span.olive-background { background: olive; }
-span.purple-background { background: purple; }
-span.red-background { background: red; }
-span.silver-background { background: silver; }
-span.teal-background { background: teal; }
-span.white-background { background: white; }
-span.yellow-background { background: yellow; }
-
-span.big { font-size: 2em; }
-span.small { font-size: 0.6em; }
-
-span.underline { text-decoration: underline; }
-span.overline { text-decoration: overline; }
-span.line-through { text-decoration: line-through; }
-
-div.unbreakable { page-break-inside: avoid; }
-
-
-
-
-div.tableblock {
- margin-top: 1.0em;
- margin-bottom: 1.5em;
-}
-div.tableblock > table {
- border: 3px solid #527bbd;
-}
-thead, p.table.header {
- font-weight: bold;
- color: #527bbd;
-}
-p.table {
- margin-top: 0;
-}
-
-div.tableblock > table[frame="void"] {
- border-style: none;
-}
-div.tableblock > table[frame="hsides"] {
- border-left-style: none;
- border-right-style: none;
-}
-div.tableblock > table[frame="vsides"] {
- border-top-style: none;
- border-bottom-style: none;
-}
-
-
-
-
-table.tableblock {
- margin-top: 1.0em;
- margin-bottom: 1.5em;
-}
-thead, p.tableblock.header {
- font-weight: bold;
- color: #527bbd;
-}
-p.tableblock {
- margin-top: 0;
-}
-table.tableblock {
- border-width: 3px;
- border-spacing: 0px;
- border-style: solid;
- border-color: #527bbd;
- border-collapse: collapse;
-}
-th.tableblock, td.tableblock {
- border-width: 1px;
- padding: 4px;
- border-style: solid;
- border-color: #527bbd;
-}
-
-table.tableblock.frame-topbot {
- border-left-style: hidden;
- border-right-style: hidden;
-}
-table.tableblock.frame-sides {
- border-top-style: hidden;
- border-bottom-style: hidden;
-}
-table.tableblock.frame-none {
- border-style: hidden;
-}
-
-th.tableblock.halign-left, td.tableblock.halign-left {
- text-align: left;
-}
-th.tableblock.halign-center, td.tableblock.halign-center {
- text-align: center;
-}
-th.tableblock.halign-right, td.tableblock.halign-right {
- text-align: right;
-}
-
-th.tableblock.valign-top, td.tableblock.valign-top {
- vertical-align: top;
-}
-th.tableblock.valign-middle, td.tableblock.valign-middle {
- vertical-align: middle;
-}
-th.tableblock.valign-bottom, td.tableblock.valign-bottom {
- vertical-align: bottom;
-}
-
-
-
-
-body.manpage h1 {
- padding-top: 0.5em;
- padding-bottom: 0.5em;
- border-top: 2px solid silver;
- border-bottom: 2px solid silver;
-}
-body.manpage h2 {
- border-style: none;
-}
-body.manpage div.sectionbody {
- margin-left: 3em;
-}
-
-@media print {
- body.manpage div#toc { display: none; }
-}
-
-
-</style>
-<script type="text/javascript">
-
-var asciidoc = {
-
-
-
-
-
- -
-
-
-
-
-
-toc: function (toclevels) {
-
- function getText(el) {
- var text = "";
- for (var i = el.firstChild; i != null; i = i.nextSibling) {
- if (i.nodeType == 3 )
- text += i.data;
- else if (i.firstChild != null)
- text += getText(i);
- }
- return text;
- }
-
- function TocEntry(el, text, toclevel) {
- this.element = el;
- this.text = text;
- this.toclevel = toclevel;
- }
-
- function tocEntries(el, toclevels) {
- var result = new Array;
- var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
-
-
-
- var iterate = function (el) {
- for (var i = el.firstChild; i != null; i = i.nextSibling) {
- if (i.nodeType == 1 ) {
- var mo = re.exec(i.tagName);
- if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
- result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
- }
- iterate(i);
- }
- }
- }
- iterate(el);
- return result;
- }
-
- var toc = document.getElementById("toc");
- if (!toc) {
- return;
- }
-
-
- var tocEntriesToRemove = [];
- var i;
- for (i = 0; i < toc.childNodes.length; i++) {
- var entry = toc.childNodes[i];
- if (entry.nodeName.toLowerCase() == 'div'
- && entry.getAttribute("class")
- && entry.getAttribute("class").match(/^toclevel/))
- tocEntriesToRemove.push(entry);
- }
- for (i = 0; i < tocEntriesToRemove.length; i++) {
- toc.removeChild(tocEntriesToRemove[i]);
- }
-
-
- var entries = tocEntries(document.getElementById("content"), toclevels);
- for (var i = 0; i < entries.length; ++i) {
- var entry = entries[i];
- if (entry.element.id == "")
- entry.element.id = "_toc_" + i;
- var a = document.createElement("a");
- a.href = "#" + entry.element.id;
- a.appendChild(document.createTextNode(entry.text));
- var div = document.createElement("div");
- div.appendChild(a);
- div.className = "toclevel" + entry.toclevel;
- toc.appendChild(div);
- }
- if (entries.length == 0)
- toc.parentNode.removeChild(toc);
-},
-
-
-
-
-
-
- -
-
-footnotes: function () {
-
- var i;
- var noteholder = document.getElementById("footnotes");
- if (!noteholder) {
- return;
- }
- var entriesToRemove = [];
- for (i = 0; i < noteholder.childNodes.length; i++) {
- var entry = noteholder.childNodes[i];
- if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
- entriesToRemove.push(entry);
- }
- for (i = 0; i < entriesToRemove.length; i++) {
- noteholder.removeChild(entriesToRemove[i]);
- }
-
-
- var cont = document.getElementById("content");
- var spans = cont.getElementsByTagName("span");
- var refs = {};
- var n = 0;
- for (i=0; i<spans.length; i++) {
- if (spans[i].className == "footnote") {
- n++;
- var note = spans[i].getAttribute("data-note");
- if (!note) {
-
-
- note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
- spans[i].innerHTML =
- "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
- "' title='View footnote' class='footnote'>" + n + "</a>]";
- spans[i].setAttribute("data-note", note);
- }
- noteholder.innerHTML +=
- "<div class='footnote' id='_footnote_" + n + "'>" +
- "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
- n + "</a>. " + note + "</div>";
- var id =spans[i].getAttribute("id");
- if (id != null) refs["#"+id] = n;
- }
- }
- if (n == 0)
- noteholder.parentNode.removeChild(noteholder);
- else {
-
- for (i=0; i<spans.length; i++) {
- if (spans[i].className == "footnoteref") {
- var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
- href = href.match(/#.*/)[0];
- n = refs[href];
- spans[i].innerHTML =
- "[<a href='#_footnote_" + n +
- "' title='View footnote' class='footnote'>" + n + "</a>]";
- }
- }
- }
-},
-
-install: function(toclevels) {
- var timerId;
-
- function reinstall() {
- asciidoc.footnotes();
- if (toclevels) {
- asciidoc.toc(toclevels);
- }
- }
-
- function reinstallAndRemoveTimer() {
- clearInterval(timerId);
- reinstall();
- }
-
- timerId = setInterval(reinstall, 500);
- if (document.addEventListener)
- document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
- else
- window.onload = reinstallAndRemoveTimer;
-}
-
-}
-asciidoc.install();
-
-</script>
-</head>
-<body class="article">
-<div id="header">
-</div>
-<div id="content">
-<div class="paragraph"><p>date = "2015-07-01T00:00:00+01:00"
-title = "Donate"
-type = "services"</p></div>
+<!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: Donate</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><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 class="active"><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>Services</span></h1> + <div class="sect2">
<h3 id="_like_my_work_donate">Like my work? Donate!</h3>
<div class="paragraph"><p>You can donate via Paypal to reward me, Loïc Hoguin, for my
@@ -737,12 +85,380 @@ work on open source software including Cowboy and Erlang.mk.</p></div> <img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form>
</div>
+ + +</div> +<div class="span3 sidecol"> + + + + + + + + + + + + + + + <div class="sect2">
+<h3 id="_like_my_work_donate">Like my work? Donate!</h3>
+<div class="paragraph"><p>You can donate via Paypal to reward me, Loïc Hoguin, for my
+work on open source software including Cowboy and Erlang.mk.</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>
</div>
-<div id="footnotes"><hr /></div>
-<div id="footer">
-<div id="footer-text">
-Last updated 2016-11-22 14:25:44 CET
-</div>
-</div>
-</body>
-</html>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</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> + @@ -259,6 +259,8 @@ + + <div class="paragraph"><p>The Erlanger Playbook is now available!<br />
<a href="/articles/erlanger-playbook">Buy now</a> — <a href="/services">Become a Cowboy project sponsor</a></p></div>
@@ -568,8 +570,6 @@ - - </div> </div> @@ -6,10 +6,101 @@ <description>Recent content on Nine Nines</description> <generator>Hugo -- gohugo.io</generator> <language>en-us</language> - <lastBuildDate>Mon, 29 Aug 2016 00:00:00 +0100</lastBuildDate> + <lastBuildDate>Mon, 28 Nov 2016 00:00:00 +0100</lastBuildDate> <atom:link href="https://ninenines.eu/index.xml" rel="self" type="application/rss+xml" /> <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> + + <guid>https://ninenines.eu/articles/ranch-1.3/</guid> + <description><div class="paragraph"><p>Ranch <code>1.3.0</code> has been released!</p></div>
+<div class="paragraph"><p>This release fixes a number of long standing issues and adds
+a small number of features:</p></div>
+<div class="paragraph"><p>The <code>ssl</code> application has been added to the list of dependencies.
+If you don&#8217;t need it, you can remove it automatically when fetching
+Ranch or when building the release. If you do need it, you will no
+longer have issues shutting down a node because of Ranch.</p></div>
+<div class="paragraph"><p>The <code>ranch:info/0</code> and <code>ranch:procs/2</code> can be used to retrieve
+information about Ranch&#8217;s state. Use it for diagnostic and
+discovery purposes.</p></div>
+<div class="paragraph"><p>SSL listeners can now be configured without a certificate, for setups
+that make use of the SNI extension.</p></div>
+<div class="paragraph"><p>Transport options are now a blacklist, meaning all unknown options
+will be accepted. However Dialyzer will warn if said option is not
+defined in Ranch&#8217;s type specifications. Please send a patch when that
+happens!</p></div>
+<div class="paragraph"><p>Various bugs have been fixed, including the bug where the
+number of active connections could become negative. Common
+errors at listener startup should be easier to read (for
+example when the port is already in use).</p></div>
+<div class="paragraph"><p>See the <a href="https://git.ninenines.eu/ranch.git/plain/CHANGELOG.asciidoc">CHANGELOG</a>
+for more details.</p></div>
+<div class="paragraph"><p>Ranch is now tested and supported with Erlang/OTP R16B 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>Ranch is now available from four locations:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<a href="https://git.ninenines.eu/ranch.git">https://git.ninenines.eu/ranch.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://github.com/ninenines/ranch.git">https://github.com/ninenines/ranch.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://bitbucket.org/ninenines/ranch.git">https://bitbucket.org/ninenines/ranch.git</a>
+</p>
+</li>
+<li>
+<p>
+<a href="https://gitlab.com/ninenines/ranch.git">https://gitlab.com/ninenines/ranch.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>The most recent Ranch commit is now always signed. You can import the
+<a href="https://pgp.mit.edu/pks/lookup?op=vindex&amp;fingerprint=on&amp;exact=on&amp;search=0xF19F189CECC7439699CEDD7A6EF7A77066CCCC8A">signing key for Loïc Hoguin</a> with:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>$ gpg --keyserver hkp<span style="color: #990000">:</span>//keys<span style="color: #990000">.</span>gnupg<span style="color: #990000">.</span>net --recv-key 66CCCC8A</tt></pre></div></div>
+<div class="paragraph"><p>The primary key fingerprint is <code>F19F 189C ECC7 4396 99CE DD7A 6EF7 A770 66CC CC8A</code>.</p></div>
+<div class="paragraph"><p>When verifying signatures in git, the following should appear:</p></div>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>gpg<span style="color: #990000">:</span> Signature made Sat <span style="color: #993399">26</span> Nov <span style="color: #993399">2016</span> <span style="color: #993399">12</span><span style="color: #990000">:</span><span style="color: #993399">58</span><span style="color: #990000">:</span><span style="color: #993399">35</span> PM CET
+gpg<span style="color: #990000">:</span> using RSA key 71366FF21851DF03
+gpg<span style="color: #990000">:</span> Good signature from <span style="color: #FF0000">"Loïc Hoguin &lt;[email protected]&gt;"</span> <span style="color: #990000">[</span>unknown<span style="color: #990000">]</span>
+gpg<span style="color: #990000">:</span> WARNING<span style="color: #990000">:</span> This key is not certified with a trusted signature<span style="color: #990000">!</span>
+gpg<span style="color: #990000">:</span> There is no indication that the signature belongs to the owner<span style="color: #990000">.</span>
+Primary key fingerprint<span style="color: #990000">:</span> F19F 189C ECC7 <span style="color: #993399">4396</span> 99CE DD7A 6EF7 A770 66CC CC8A
+ Subkey fingerprint<span style="color: #990000">:</span> FEDA <span style="color: #993399">6E41</span> B390 F745 A385 5CDC <span style="color: #993399">7136</span> 6FF2 <span style="color: #993399">1851</span> DF03</tt></pre></div></div>
+<div class="paragraph"><p>You can safely ignore the warning if you don&#8217;t know what it
+means, as long as everything else is correct.</p></div>
+<div class="paragraph"><p>Mirrors and signature verification will soon be implemented
+directly in Erlang.mk. In the meantime, you will need to
+set them up manually.</p></div>
+<div class="paragraph"><p>Most of this work was done to fix issues in RabbitMQ. Paid
+customers get priority; contact me if you have some issues
+that need fixing sooner rather than later.</p></div>
+<div class="paragraph"><p>Expect future releases to be announced in this space.</p></div>
+<div class="paragraph"><p>Thanks for reading!</p></div>
+</description> + </item> + + <item> <title>Mailing list archived</title> <link>https://ninenines.eu/articles/ml-archives/</link> <pubDate>Mon, 29 Aug 2016 00:00:00 +0100</pubDate> @@ -1229,35 +1320,5 @@ the sponsoring idea, anything really! Thanks.</p></div> </description> </item> - <item> - <title>Farwest got funded!</title> - <link>https://ninenines.eu/articles/farwest-funded/</link> - <pubDate>Thu, 27 Jun 2013 00:00:00 +0100</pubDate> - - <guid>https://ninenines.eu/articles/farwest-funded/</guid> - <description><div class="paragraph"><p>This was a triumph! I&#8217;m making a note here: HUGE SUCCESS!!</p></div>
-<iframe frameborder="0" scrolling="no" height="400px" width"236px" seamless="seamless" src="https://api.bountysource.com/user/fundraisers/83/embed"></iframe>
-<div class="paragraph"><p>It&#8217;s hard to overstate my satisfaction. Thanks to everyone who
-made this possible.</p></div>
-<div class="paragraph"><p>If you have backed this fundraiser, and haven&#8217;t provided your
-personal details yet, please do so quickly so that your rewards
-can be sent!</p></div>
-<div class="paragraph"><p>I am hoping that we will be able to make good use of all that
-money. The details of the expenses will be published regularly
-on the <a href="https://github.com/extend/farwest/wiki/2013-Fundraiser">2013 Fundraiser wiki page</a>,
-giving you full disclosure as to how your money is used.</p></div>
-<div class="paragraph"><p>It will take a little time to get things started, we are in
-summer after all! We will however act quickly to make the
-prototype easy enough to use so that the paid UI work can
-begin. This is also when user contributions will be welcome.</p></div>
-<div class="paragraph"><p>You can see the <a href="https://github.com/extend/farwest/wiki/Roadmap">Roadmap</a>
-to get more information on the current plans. This document will
-get updated as time goes on so check again later to see if you
-can help!</p></div>
-<div class="paragraph"><p>Look at me: still talking when there&#8217;s open source to do!</p></div>
-<div class="paragraph"><p>Thanks again for all your support. I really appreciate it.</p></div>
-</description> - </item> - </channel> </rss>
\ No newline at end of file diff --git a/services/index.html b/services/index.html index 2631776a..c16a8065 100644 --- a/services/index.html +++ b/services/index.html @@ -186,6 +186,8 @@ the same restrictions apply.</p></div> + + <div class="sect2">
<h3 id="_like_my_work_donate">Like my work? Donate!</h3>
<div class="paragraph"><p>You can donate via Paypal to reward me, Loïc Hoguin, for my
@@ -242,775 +244,6 @@ work on open source software including Cowboy and Erlang.mk.</p></div> - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
- "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 8.6.9" />
-<title></title>
-<style type="text/css">
-/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
-
-/* Default font. */
-body {
- font-family: Georgia,serif;
-}
-
-/* Title font. */
-h1, h2, h3, h4, h5, h6,
-div.title, caption.title,
-thead, p.table.header,
-#toctitle,
-#author, #revnumber, #revdate, #revremark,
-#footer {
- font-family: Arial,Helvetica,sans-serif;
-}
-
-body {
- margin: 1em 5% 1em 5%;
-}
-
-a {
- color: blue;
- text-decoration: underline;
-}
-a:visited {
- color: fuchsia;
-}
-
-em {
- font-style: italic;
- color: navy;
-}
-
-strong {
- font-weight: bold;
- color: #083194;
-}
-
-h1, h2, h3, h4, h5, h6 {
- color: #527bbd;
- margin-top: 1.2em;
- margin-bottom: 0.5em;
- line-height: 1.3;
-}
-
-h1, h2, h3 {
- border-bottom: 2px solid silver;
-}
-h2 {
- padding-top: 0.5em;
-}
-h3 {
- float: left;
-}
-h3 + * {
- clear: left;
-}
-h5 {
- font-size: 1.0em;
-}
-
-div.sectionbody {
- margin-left: 0;
-}
-
-hr {
- border: 1px solid silver;
-}
-
-p {
- margin-top: 0.5em;
- margin-bottom: 0.5em;
-}
-
-ul, ol, li > p {
- margin-top: 0;
-}
-ul > li { color: #aaa; }
-ul > li > * { color: black; }
-
-.monospaced, code, pre {
- font-family: "Courier New", Courier, monospace;
- font-size: inherit;
- color: navy;
- padding: 0;
- margin: 0;
-}
-pre {
- white-space: pre-wrap;
-}
-
-#author {
- color: #527bbd;
- font-weight: bold;
- font-size: 1.1em;
-}
-#email {
-}
-#revnumber, #revdate, #revremark {
-}
-
-#footer {
- font-size: small;
- border-top: 2px solid silver;
- padding-top: 0.5em;
- margin-top: 4.0em;
-}
-#footer-text {
- float: left;
- padding-bottom: 0.5em;
-}
-#footer-badges {
- float: right;
- padding-bottom: 0.5em;
-}
-
-#preamble {
- margin-top: 1.5em;
- margin-bottom: 1.5em;
-}
-div.imageblock, div.exampleblock, div.verseblock,
-div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
-div.admonitionblock {
- margin-top: 1.0em;
- margin-bottom: 1.5em;
-}
-div.admonitionblock {
- margin-top: 2.0em;
- margin-bottom: 2.0em;
- margin-right: 10%;
- color: #606060;
-}
-
-div.content { /* Block element content. */
- padding: 0;
-}
-
-/* Block element titles. */
-div.title, caption.title {
- color: #527bbd;
- font-weight: bold;
- text-align: left;
- margin-top: 1.0em;
- margin-bottom: 0.5em;
-}
-div.title + * {
- margin-top: 0;
-}
-
-td div.title:first-child {
- margin-top: 0.0em;
-}
-div.content div.title:first-child {
- margin-top: 0.0em;
-}
-div.content + div.title {
- margin-top: 0.0em;
-}
-
-div.sidebarblock > div.content {
- background: #ffffee;
- border: 1px solid #dddddd;
- border-left: 4px solid #f0f0f0;
- padding: 0.5em;
-}
-
-div.listingblock > div.content {
- border: 1px solid #dddddd;
- border-left: 5px solid #f0f0f0;
- background: #f8f8f8;
- padding: 0.5em;
-}
-
-div.quoteblock, div.verseblock {
- padding-left: 1.0em;
- margin-left: 1.0em;
- margin-right: 10%;
- border-left: 5px solid #f0f0f0;
- color: #888;
-}
-
-div.quoteblock > div.attribution {
- padding-top: 0.5em;
- text-align: right;
-}
-
-div.verseblock > pre.content {
- font-family: inherit;
- font-size: inherit;
-}
-div.verseblock > div.attribution {
- padding-top: 0.75em;
- text-align: left;
-}
-/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
-div.verseblock + div.attribution {
- text-align: left;
-}
-
-div.admonitionblock .icon {
- vertical-align: top;
- font-size: 1.1em;
- font-weight: bold;
- text-decoration: underline;
- color: #527bbd;
- padding-right: 0.5em;
-}
-div.admonitionblock td.content {
- padding-left: 0.5em;
- border-left: 3px solid #dddddd;
-}
-
-div.exampleblock > div.content {
- border-left: 3px solid #dddddd;
- padding-left: 0.5em;
-}
-
-div.imageblock div.content { padding-left: 0; }
-span.image img { border-style: none; vertical-align: text-bottom; }
-a.image:visited { color: white; }
-
-dl {
- margin-top: 0.8em;
- margin-bottom: 0.8em;
-}
-dt {
- margin-top: 0.5em;
- margin-bottom: 0;
- font-style: normal;
- color: navy;
-}
-dd > *:first-child {
- margin-top: 0.1em;
-}
-
-ul, ol {
- list-style-position: outside;
-}
-ol.arabic {
- list-style-type: decimal;
-}
-ol.loweralpha {
- list-style-type: lower-alpha;
-}
-ol.upperalpha {
- list-style-type: upper-alpha;
-}
-ol.lowerroman {
- list-style-type: lower-roman;
-}
-ol.upperroman {
- list-style-type: upper-roman;
-}
-
-div.compact ul, div.compact ol,
-div.compact p, div.compact p,
-div.compact div, div.compact div {
- margin-top: 0.1em;
- margin-bottom: 0.1em;
-}
-
-tfoot {
- font-weight: bold;
-}
-td > div.verse {
- white-space: pre;
-}
-
-div.hdlist {
- margin-top: 0.8em;
- margin-bottom: 0.8em;
-}
-div.hdlist tr {
- padding-bottom: 15px;
-}
-dt.hdlist1.strong, td.hdlist1.strong {
- font-weight: bold;
-}
-td.hdlist1 {
- vertical-align: top;
- font-style: normal;
- padding-right: 0.8em;
- color: navy;
-}
-td.hdlist2 {
- vertical-align: top;
-}
-div.hdlist.compact tr {
- margin: 0;
- padding-bottom: 0;
-}
-
-.comment {
- background: yellow;
-}
-
-.footnote, .footnoteref {
- font-size: 0.8em;
-}
-
-span.footnote, span.footnoteref {
- vertical-align: super;
-}
-
-#footnotes {
- margin: 20px 0 20px 0;
- padding: 7px 0 0 0;
-}
-
-#footnotes div.footnote {
- margin: 0 0 5px 0;
-}
-
-#footnotes hr {
- border: none;
- border-top: 1px solid silver;
- height: 1px;
- text-align: left;
- margin-left: 0;
- width: 20%;
- min-width: 100px;
-}
-
-div.colist td {
- padding-right: 0.5em;
- padding-bottom: 0.3em;
- vertical-align: top;
-}
-div.colist td img {
- margin-top: 0.3em;
-}
-
-@media print {
- #footer-badges { display: none; }
-}
-
-#toc {
- margin-bottom: 2.5em;
-}
-
-#toctitle {
- color: #527bbd;
- font-size: 1.1em;
- font-weight: bold;
- margin-top: 1.0em;
- margin-bottom: 0.1em;
-}
-
-div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
- margin-top: 0;
- margin-bottom: 0;
-}
-div.toclevel2 {
- margin-left: 2em;
- font-size: 0.9em;
-}
-div.toclevel3 {
- margin-left: 4em;
- font-size: 0.9em;
-}
-div.toclevel4 {
- margin-left: 6em;
- font-size: 0.9em;
-}
-
-span.aqua { color: aqua; }
-span.black { color: black; }
-span.blue { color: blue; }
-span.fuchsia { color: fuchsia; }
-span.gray { color: gray; }
-span.green { color: green; }
-span.lime { color: lime; }
-span.maroon { color: maroon; }
-span.navy { color: navy; }
-span.olive { color: olive; }
-span.purple { color: purple; }
-span.red { color: red; }
-span.silver { color: silver; }
-span.teal { color: teal; }
-span.white { color: white; }
-span.yellow { color: yellow; }
-
-span.aqua-background { background: aqua; }
-span.black-background { background: black; }
-span.blue-background { background: blue; }
-span.fuchsia-background { background: fuchsia; }
-span.gray-background { background: gray; }
-span.green-background { background: green; }
-span.lime-background { background: lime; }
-span.maroon-background { background: maroon; }
-span.navy-background { background: navy; }
-span.olive-background { background: olive; }
-span.purple-background { background: purple; }
-span.red-background { background: red; }
-span.silver-background { background: silver; }
-span.teal-background { background: teal; }
-span.white-background { background: white; }
-span.yellow-background { background: yellow; }
-
-span.big { font-size: 2em; }
-span.small { font-size: 0.6em; }
-
-span.underline { text-decoration: underline; }
-span.overline { text-decoration: overline; }
-span.line-through { text-decoration: line-through; }
-
-div.unbreakable { page-break-inside: avoid; }
-
-
-/*
- * xhtml11 specific
- *
- * */
-
-div.tableblock {
- margin-top: 1.0em;
- margin-bottom: 1.5em;
-}
-div.tableblock > table {
- border: 3px solid #527bbd;
-}
-thead, p.table.header {
- font-weight: bold;
- color: #527bbd;
-}
-p.table {
- margin-top: 0;
-}
-/* Because the table frame attribute is overriden by CSS in most browsers. */
-div.tableblock > table[frame="void"] {
- border-style: none;
-}
-div.tableblock > table[frame="hsides"] {
- border-left-style: none;
- border-right-style: none;
-}
-div.tableblock > table[frame="vsides"] {
- border-top-style: none;
- border-bottom-style: none;
-}
-
-
-/*
- * html5 specific
- *
- * */
-
-table.tableblock {
- margin-top: 1.0em;
- margin-bottom: 1.5em;
-}
-thead, p.tableblock.header {
- font-weight: bold;
- color: #527bbd;
-}
-p.tableblock {
- margin-top: 0;
-}
-table.tableblock {
- border-width: 3px;
- border-spacing: 0px;
- border-style: solid;
- border-color: #527bbd;
- border-collapse: collapse;
-}
-th.tableblock, td.tableblock {
- border-width: 1px;
- padding: 4px;
- border-style: solid;
- border-color: #527bbd;
-}
-
-table.tableblock.frame-topbot {
- border-left-style: hidden;
- border-right-style: hidden;
-}
-table.tableblock.frame-sides {
- border-top-style: hidden;
- border-bottom-style: hidden;
-}
-table.tableblock.frame-none {
- border-style: hidden;
-}
-
-th.tableblock.halign-left, td.tableblock.halign-left {
- text-align: left;
-}
-th.tableblock.halign-center, td.tableblock.halign-center {
- text-align: center;
-}
-th.tableblock.halign-right, td.tableblock.halign-right {
- text-align: right;
-}
-
-th.tableblock.valign-top, td.tableblock.valign-top {
- vertical-align: top;
-}
-th.tableblock.valign-middle, td.tableblock.valign-middle {
- vertical-align: middle;
-}
-th.tableblock.valign-bottom, td.tableblock.valign-bottom {
- vertical-align: bottom;
-}
-
-
-/*
- * manpage specific
- *
- * */
-
-body.manpage h1 {
- padding-top: 0.5em;
- padding-bottom: 0.5em;
- border-top: 2px solid silver;
- border-bottom: 2px solid silver;
-}
-body.manpage h2 {
- border-style: none;
-}
-body.manpage div.sectionbody {
- margin-left: 3em;
-}
-
-@media print {
- body.manpage div#toc { display: none; }
-}
-
-
-</style>
-<script type="text/javascript">
-/*<+'])');
- // Function that scans the DOM tree for header elements (the DOM2
- // nodeIterator API would be a better technique but not supported by all
- // browsers).
- var iterate = function (el) {
- for (var i = el.firstChild; i != null; i = i.nextSibling) {
- if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
- var mo = re.exec(i.tagName);
- if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
- result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
- }
- iterate(i);
- }
- }
- }
- iterate(el);
- return result;
- }
-
- var toc = document.getElementById("toc");
- if (!toc) {
- return;
- }
-
- // Delete existing TOC entries in case we're reloading the TOC.
- var tocEntriesToRemove = [];
- var i;
- for (i = 0; i < toc.childNodes.length; i++) {
- var entry = toc.childNodes[i];
- if (entry.nodeName.toLowerCase() == 'div'
- && entry.getAttribute("class")
- && entry.getAttribute("class").match(/^toclevel/))
- tocEntriesToRemove.push(entry);
- }
- for (i = 0; i < tocEntriesToRemove.length; i++) {
- toc.removeChild(tocEntriesToRemove[i]);
- }
-
- // Rebuild TOC entries.
- var entries = tocEntries(document.getElementById("content"), toclevels);
- for (var i = 0; i < entries.length; ++i) {
- var entry = entries[i];
- if (entry.element.id == "")
- entry.element.id = "_toc_" + i;
- var a = document.createElement("a");
- a.href = "#" + entry.element.id;
- a.appendChild(document.createTextNode(entry.text));
- var div = document.createElement("div");
- div.appendChild(a);
- div.className = "toclevel" + entry.toclevel;
- toc.appendChild(div);
- }
- if (entries.length == 0)
- toc.parentNode.removeChild(toc);
-},
-
-
-/////////////////////////////////////////////////////////////////////
-// Footnotes generator
-/////////////////////////////////////////////////////////////////////
-
-/* Based on footnote generation code from:
- * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
- */
-
-footnotes: function () {
- // Delete existing footnote entries in case we're reloading the footnodes.
- var i;
- var noteholder = document.getElementById("footnotes");
- if (!noteholder) {
- return;
- }
- var entriesToRemove = [];
- for (i = 0; i < noteholder.childNodes.length; i++) {
- var entry = noteholder.childNodes[i];
- if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
- entriesToRemove.push(entry);
- }
- for (i = 0; i < entriesToRemove.length; i++) {
- noteholder.removeChild(entriesToRemove[i]);
- }
-
- // Rebuild footnote entries.
- var cont = document.getElementById("content");
- var spans = cont.getElementsByTagName("span");
- var refs = {};
- var n = 0;
- for (i=0; i<spans.length; i++) {
- if (spans[i].className == "footnote") {
- n++;
- var note = spans[i].getAttribute("data-note");
- if (!note) {
- // Use [\s\S] in place of . so multi-line matches work.
- // Because JavaScript has no s (dotall) regex flag.
- note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
- spans[i].innerHTML =
- "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
- "' title='View footnote' class='footnote'>" + n + "</a>]";
- spans[i].setAttribute("data-note", note);
- }
- noteholder.innerHTML +=
- "<div class='footnote' id='_footnote_" + n + "'>" +
- "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
- n + "</a>. " + note + "</div>";
- var id =spans[i].getAttribute("id");
- if (id != null) refs["#"+id] = n;
- }
- }
- if (n == 0)
- noteholder.parentNode.removeChild(noteholder);
- else {
- // Process footnoterefs.
- for (i=0; i<spans.length; i++) {
- if (spans[i].className == "footnoteref") {
- var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
- href = href.match(/#.*/)[0]; // Because IE return full URL.
- n = refs[href];
- spans[i].innerHTML =
- "[<a href='#_footnote_" + n +
- "' title='View footnote' class='footnote'>" + n + "</a>]";
- }
- }
- }
-},
-
-install: function(toclevels) {
- var timerId;
-
- function reinstall() {
- asciidoc.footnotes();
- if (toclevels) {
- asciidoc.toc(toclevels);
- }
- }
-
- function reinstallAndRemoveTimer() {
- clearInterval(timerId);
- reinstall();
- }
-
- timerId = setInterval(reinstall, 500);
- if (document.addEventListener)
- document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
- else
- window.onload = reinstallAndRemoveTimer;
-}
-
-}
-asciidoc.install();
-/*]]>*/
-</script>
-</head>
-<body class="article">
-<div id="header">
-</div>
-<div id="content">
-<div class="paragraph"><p>date = "2015-07-01T00:00:00+01:00"
-title = "Donate"
-type = "services"</p></div>
-<div class="sect2">
-<h3 id="_like_my_work_donate">Like my work? Donate!</h3>
-<div class="paragraph"><p>You can donate via Paypal to reward me, Loïc Hoguin, for my
-work on open source software including Cowboy and Erlang.mk.</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>
-</div>
-</div>
-<div id="footnotes"><hr /></div>
-<div id="footer">
-<div id="footer-text">
-Last updated 2016-11-22 14:25:44 CET
-</div>
-</div>
-</body>
-</html>
- - - - diff --git a/sitemap.xml b/sitemap.xml index 9eb04154..2ce35882 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -3,7 +3,12 @@ <url> <loc>https://ninenines.eu/</loc> - <lastmod>2016-08-29T00:00:00+01:00</lastmod> + <lastmod>2016-11-28T00:00:00+01:00</lastmod> + </url> + + <url> + <loc>https://ninenines.eu/articles/ranch-1.3/</loc> + <lastmod>2016-11-28T00:00:00+01:00</lastmod> </url> <url> @@ -127,10 +132,6 @@ </url> <url> - <loc>https://ninenines.eu/donate/</loc> - </url> - - <url> <loc>https://ninenines.eu/docs/en/cowboy/2.0/manual/</loc> </url> |