<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>workflow Archives | Clever Cloud</title>
	<atom:link href="https://stagingv6.cleverapps.io/blog/tag/workflow/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>From Code to Product</description>
	<lastBuildDate>Wed, 12 Oct 2016 16:56:00 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2023/03/cropped-cropped-favicon-32x32.png</url>
	<title>workflow Archives | Clever Cloud</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Intro to Clever Cloud-Driven Development</title>
		<link>https://stagingv6.cleverapps.io/blog/engineering/2016/10/12/clever-cloud-driven-developement/</link>
		
		<dc:creator><![CDATA[Clément Nivolle]]></dc:creator>
		<pubDate>Wed, 12 Oct 2016 16:56:00 +0000</pubDate>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Developers]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[workflow]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2016/10/12/clever-cloud-driven-developement/</guid>

					<description><![CDATA[<p><img width="1400" height="540" src="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" fetchpriority="high" srcset="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd.png 1400w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd-300x116.png 300w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd-1024x395.png 1024w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd-768x296.png 768w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd-1368x528.png 1368w" sizes="(max-width: 1400px) 100vw, 1400px" /></p><p>In ancient times, developers weren&#39;t able to be just developers. They had to be experts in computer networking and development platforms as well.</p>
<span id="more-2807"></span>

<p>Great ideas had to sit on the sidelines and wait. You had to build out a sandbox to play in before you started coding. If you wanted to use Ruby (on or off Rails), you had to start with something like Ruby Version Manager (RVM) to set up the server space you needed. If you decided that Node.JS was a better fit for your next application, you would have to tear it all down and go get Node Version Manager (NVM) from GitHub. Obviously, people couldn&#39;t live that way for long.</p>
<h2 id="the-dawn-of-reason">The Dawn of Reason</h2>
<p>Platform as a Service (PaaS) providers started popping up about a decade ago and civilization took off from there. Now developers worry about development and the host manages the OS, the software stack, the runtime, the servers, virtualization and storage. That problem then became that PaaS providers were too narrow in their focus.</p>
<p>That&#39;s when Clever Cloud Driven Development (CCDD) was born. It evolved the concept of PaaS and made it polyglot. That means that now you have the freedom to work in any of your preferred runtimes (Docker, PHP, Scala, etc.) and have access to your favorite services (MongoDB, PostgreSQL, Redis, etc.). Now, instant access to those capabilities can be deployed with a simple git push.</p>
<h2 id="tell-me-how">Tell Me How</h2>
<p>One of the tricks that do the magic is the <a href="https://github.com/CleverCloud/clever-tools">Clever Tools™</a>, the official and open-source CLI. Installing it allows the rest of us to use Clever Cloud deploying without leaving the terminal. And that&#39;s pretty awesome.</p>
<blockquote>
<p>…deploying without leaving the Terminal.</p>
</blockquote>
<p>Here the quickstart to install and use it without leaving this page: open your term and paste this:</p>
<pre><code class="language-bash"># Do this once, and forget about it
npm install -g clever-tools &amp;&amp; install-clever-completion &amp;&amp; clever login

# Go to your workDir
# For the Terminalesque ones, create your app without touching a mouse
clever create -t node &quot;My Great Application&quot;
clever deploy
## PROFITT
clever open
## Grep logs as in ye olden days
clever logs --before 2016-10-13 | grep &quot;undefined is not a function&quot;
</code></pre>
<h2 id="what-to-do-with-all-the-extra-time">What to Do With All the Extra Time</h2>
<p>CCDD is not merely a convenience. It actually <em>makes the app world a better place</em>™. It allows developers to do a better job at continuous delivery. When you don&#39;t have to set up and maintain your local environment, your time is freed up to create the additional features that customers want or concentrate on performance tuning.</p>
<p>You don&#39;t need to manage your sandboxes for dev and production. CCDD can update your apps in production with no downtime and assure that they will automatically self-heal and redeploy after a crash.</p>
<p>For lean startups and small developer teams, CCDD means scalability from day one. You don&#39;t need to invest in more servers to handle spikes in traffic if you suddenly someone says something nice about you on Hacker News (one can only hope). CCDD scales horizontally and vertically as needed in an instant.</p>
<p>Every developer deserves top-of-the-line security and reactive monitoring. CCDD is built to handle the infrastructure while you handle the accolades.</p>
]]></description>
										<content:encoded><![CDATA[<p><img width="1400" height="540" src="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" srcset="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd.png 1400w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd-300x116.png 300w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd-1024x395.png 1024w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd-768x296.png 768w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/ccdd-1368x528.png 1368w" sizes="(max-width: 1400px) 100vw, 1400px" /></p><p>In ancient times, developers weren&#39;t able to be just developers. They had to be experts in computer networking and development platforms as well.</p>
<span id="more-2807"></span>

<p>Great ideas had to sit on the sidelines and wait. You had to build out a sandbox to play in before you started coding. If you wanted to use Ruby (on or off Rails), you had to start with something like Ruby Version Manager (RVM) to set up the server space you needed. If you decided that Node.JS was a better fit for your next application, you would have to tear it all down and go get Node Version Manager (NVM) from GitHub. Obviously, people couldn&#39;t live that way for long.</p>
<h2 id="the-dawn-of-reason">The Dawn of Reason</h2>
<p>Platform as a Service (PaaS) providers started popping up about a decade ago and civilization took off from there. Now developers worry about development and the host manages the OS, the software stack, the runtime, the servers, virtualization and storage. That problem then became that PaaS providers were too narrow in their focus.</p>
<p>That&#39;s when Clever Cloud Driven Development (CCDD) was born. It evolved the concept of PaaS and made it polyglot. That means that now you have the freedom to work in any of your preferred runtimes (Docker, PHP, Scala, etc.) and have access to your favorite services (MongoDB, PostgreSQL, Redis, etc.). Now, instant access to those capabilities can be deployed with a simple git push.</p>
<h2 id="tell-me-how">Tell Me How</h2>
<p>One of the tricks that do the magic is the <a href="https://github.com/CleverCloud/clever-tools">Clever Tools™</a>, the official and open-source CLI. Installing it allows the rest of us to use Clever Cloud deploying without leaving the terminal. And that&#39;s pretty awesome.</p>
<blockquote>
<p>…deploying without leaving the Terminal.</p>
</blockquote>
<p>Here the quickstart to install and use it without leaving this page: open your term and paste this:</p>
<pre><code class="language-bash"># Do this once, and forget about it
npm install -g clever-tools &amp;&amp; install-clever-completion &amp;&amp; clever login

# Go to your workDir
# For the Terminalesque ones, create your app without touching a mouse
clever create -t node &quot;My Great Application&quot;
clever deploy
## PROFITT
clever open
## Grep logs as in ye olden days
clever logs --before 2016-10-13 | grep &quot;undefined is not a function&quot;
</code></pre>
<h2 id="what-to-do-with-all-the-extra-time">What to Do With All the Extra Time</h2>
<p>CCDD is not merely a convenience. It actually <em>makes the app world a better place</em>™. It allows developers to do a better job at continuous delivery. When you don&#39;t have to set up and maintain your local environment, your time is freed up to create the additional features that customers want or concentrate on performance tuning.</p>
<p>You don&#39;t need to manage your sandboxes for dev and production. CCDD can update your apps in production with no downtime and assure that they will automatically self-heal and redeploy after a crash.</p>
<p>For lean startups and small developer teams, CCDD means scalability from day one. You don&#39;t need to invest in more servers to handle spikes in traffic if you suddenly someone says something nice about you on Hacker News (one can only hope). CCDD scales horizontally and vertically as needed in an instant.</p>
<p>Every developer deserves top-of-the-line security and reactive monitoring. CCDD is built to handle the infrastructure while you handle the accolades.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>null is not the issue</title>
		<link>https://stagingv6.cleverapps.io/blog/engineering/2016/07/21/null-is-not-the-issue/</link>
		
		<dc:creator><![CDATA[Clement Delafargue]]></dc:creator>
		<pubDate>Thu, 21 Jul 2016 14:56:00 +0000</pubDate>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[thoughts]]></category>
		<category><![CDATA[workflow]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2016/07/21/null-is-not-the-issue/</guid>

					<description><![CDATA[<p><img width="1400" height="540" src="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" srcset="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1.jpg 1400w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1-300x116.jpg 300w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1-1024x395.jpg 1024w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1-768x296.jpg 768w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1-1368x528.jpg 1368w" sizes="(max-width: 1400px) 100vw, 1400px" /></p><p>Nowadays, we know that <code>null</code> is to be avoided. It&#39;s been dubbed the <em>billion dollar mistake</em> by its own creator, and the dreaded <code>NullPointerException</code> everyone knows about. Yet, when it comes to getting rid of <code>null</code>s, nobody agrees.</p>
<span id="more-2806"></span>

<h2 id="null-is-bad-mkay"><code>null</code> is bad, m&#39;kay</h2>
<ul>
<li>NPEs</li>
<li>hard to read (is this value always defined?)</li>
<li>handling possibly undefined values is tedious</li>
</ul>
<p>The issue is that we focus on <code>null</code>, and not on the actual problems it causes. If your only goal is to get rid of NPEs at all costs, then you will pay those costs. Dearly.</p>
<p>The memory safety issues caused by <code>null</code> are solved on most platforms. In many languages, <code>null</code> is a pointer to a specific value with specific properties, so not literally a null pointer anymore, and on modern OSs, the memory protection system will prevent your code from directly accessing the address <code>0x00</code>.</p>
<p>So the big risk is having your program blow up (<code>NPE</code>, <code>segfault</code>, <code>panic</code>, …) because of an unexpected missing value. The core issue is that you were unable to express that the value was possibly missing; the crash is a consequence of this issue. Yet many people try to solve the issue by preventing the crash (null check, <a href="https://en.wikipedia.org/wiki/Null_Object_pattern">null object pattern</a>, …) instead of handling the core issue: a value could be missing and you weren&#39;t able to express it.</p>
<h2 id="stop-chasing-npes-and-fix-your-domain-model">Stop chasing NPEs and fix your domain model</h2>
<p>If you&#39;re trying to get rid of NPEs by removing the difference between &quot;there is a meaningful value&quot; and &quot;there is no value&quot;, then not only you&#39;re not solving your issue, but you&#39;re making it far, far worse.</p>
<p>Your domain model didn&#39;t let you express statically the possible absence of a value, but the presence of null at least gave you a stuctural difference at runtime. That&#39;s why putting default values or worse, following the null object pattern, is terrible. You had structural information, but couldn&#39;t use it in a rigorous way, so you&#39;re just throwing it all away because of an implementation detail.</p>
<p>If you&#39;re searching for a replacement to <code>null</code> to denote missing values, it has to be structurally different from a regular value (it cannot belong to the domain of the value you may have). So if you&#39;re in a typed system, then a value that may be not there has to have a different type from a value that&#39;s definitely there. In an untyped language, you can&#39;t have a static difference, so using <code>null</code> is kind of OK (though there are better solutions).</p>
<p>For example, in java you can do:</p>
<pre><code class="language-java">// Bad
String notThere = null;
String there = &quot;my string&quot;;
// Turbo-bad
String notThere = &quot;&quot;; // or &quot;N/A&quot;, etc
String there = &quot;my string&quot;;
// Good
Optional&lt;String&gt; notThere = Optional.empty();
Optional&lt;String&gt; there = Optional.of(&quot;my string&quot;);
</code></pre>
<p>With optional, not only you have a structural difference between defined and undefined strings (instead of having to check if the string is equal to <code>&quot;&quot;</code> or <code>&quot;N/A&quot;</code>, without any guarantee that it&#39;s not the actual value), but it&#39;s clearly documented in the type.</p>
<p><code>Optional</code> is available in Java 8 (and in Guava if you&#39;re not using java 8 yet). In scala, rust, ocaml and many other languages, it&#39;s called <code>Option</code>, in Haskell it&#39;s called <code>Maybe</code>.</p>
<h2 id="this-is-why-you-can-have-nice-things">This is why you <em>can</em> have nice things</h2>
<p>Ok so now you have a proper representation for your optional values. In a typed language it means that you&#39;re forced to check if the value is already there before using it.</p>
<p>For instance, in java:</p>
<pre><code class="language-java">Optional&lt;Integer&gt; parseOptionalString(Optional&lt;String&gt; myOptionalString) {
    if(myOptionalString.isPresent()) {
        Optional&lt;Integer&gt; result = parseInt(myOptionalString.get());
        return result;
    } else {
        return Optional.empty();
    }
}
</code></pre>
<p>This works perfectly well, but is still as verbose as using explicit <code>null</code> checks. So if you&#39;re only concerned about code terseness (you really shouldn&#39;t), it can feel like a marginal improvement (it&#39;s way better than that).</p>
<p>Thankfully that&#39;s not the idiomatic way of handling <code>Optional</code> values: now that we can denote the abstract concept of <em>being possibly not there</em> (in this case, <code>Optional&lt;_&gt;</code>), then we can do useful stuff about it:</p>
<ul>
<li>transforming it only if it&#39;s defined (with <code>map</code>)</li>
<li>eliminate the option by providing a default value when we don&#39;t need the
information anymore (with <code>orElseGet</code>)</li>
<li>sequencing several operations returning options (with <code>flatMap</code>)</li>
</ul>
<p>All of this comes for free because we were able to clearly define our domain model. Some languages like Kotlin provide approaching solutions with things like the Safe Call Operator for chaining operations (instead of using <code>map</code> and <code>flatMap</code>) and the Elvis Operator for providing default values. This, however, is less extensible and less composable than having proper options (<code>map</code> and <code>flatMap</code> are not specific to <code>Optional</code>).</p>
<pre><code class="language-java">Optional&lt;Integer&gt; parseOptionalString(Optional&lt;String&gt; myOptionalString) {
    return myOptionalString.flatMap(parseInt);
}
</code></pre>
<p>Once you have properly defined your domain model, then you can have cleaner code thanks to the information encoded in your types. Aiming at terser code without proper abstraction will lead you to perlish nightmares.</p>
<h2 id="to-sum-up">To sum up</h2>
<p>Using <code>null</code> causes problems. Resorting to solutions that erase information (setting a default value too early or worse, the null object pattern) will cause graver and subtler problems.</p>
<p>In order of decreasing importance, the problems with <code>null</code> are:</p>
<ol>
<li>it&#39;s not clear for people if a value can be missing</li>
<li>the program can blow up if somebody forgot to handle a missing value</li>
<li>it&#39;s tedious to sequence operations returning null</li>
</ol>
<p>Don&#39;t settle for solutions that only address #2 and #3.</p>
]]></description>
										<content:encoded><![CDATA[<p><img width="1400" height="540" src="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1.jpg 1400w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1-300x116.jpg 300w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1-1024x395.jpg 1024w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1-768x296.jpg 768w, https://staging-cc-assetsv6.cellar-c2.services.clever-cloud.com/uploads/2021/08/null-issue-1-1368x528.jpg 1368w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p><p>Nowadays, we know that <code>null</code> is to be avoided. It&#39;s been dubbed the <em>billion dollar mistake</em> by its own creator, and the dreaded <code>NullPointerException</code> everyone knows about. Yet, when it comes to getting rid of <code>null</code>s, nobody agrees.</p>
<span id="more-2806"></span>

<h2 id="null-is-bad-mkay"><code>null</code> is bad, m&#39;kay</h2>
<ul>
<li>NPEs</li>
<li>hard to read (is this value always defined?)</li>
<li>handling possibly undefined values is tedious</li>
</ul>
<p>The issue is that we focus on <code>null</code>, and not on the actual problems it causes. If your only goal is to get rid of NPEs at all costs, then you will pay those costs. Dearly.</p>
<p>The memory safety issues caused by <code>null</code> are solved on most platforms. In many languages, <code>null</code> is a pointer to a specific value with specific properties, so not literally a null pointer anymore, and on modern OSs, the memory protection system will prevent your code from directly accessing the address <code>0x00</code>.</p>
<p>So the big risk is having your program blow up (<code>NPE</code>, <code>segfault</code>, <code>panic</code>, …) because of an unexpected missing value. The core issue is that you were unable to express that the value was possibly missing; the crash is a consequence of this issue. Yet many people try to solve the issue by preventing the crash (null check, <a href="https://en.wikipedia.org/wiki/Null_Object_pattern">null object pattern</a>, …) instead of handling the core issue: a value could be missing and you weren&#39;t able to express it.</p>
<h2 id="stop-chasing-npes-and-fix-your-domain-model">Stop chasing NPEs and fix your domain model</h2>
<p>If you&#39;re trying to get rid of NPEs by removing the difference between &quot;there is a meaningful value&quot; and &quot;there is no value&quot;, then not only you&#39;re not solving your issue, but you&#39;re making it far, far worse.</p>
<p>Your domain model didn&#39;t let you express statically the possible absence of a value, but the presence of null at least gave you a stuctural difference at runtime. That&#39;s why putting default values or worse, following the null object pattern, is terrible. You had structural information, but couldn&#39;t use it in a rigorous way, so you&#39;re just throwing it all away because of an implementation detail.</p>
<p>If you&#39;re searching for a replacement to <code>null</code> to denote missing values, it has to be structurally different from a regular value (it cannot belong to the domain of the value you may have). So if you&#39;re in a typed system, then a value that may be not there has to have a different type from a value that&#39;s definitely there. In an untyped language, you can&#39;t have a static difference, so using <code>null</code> is kind of OK (though there are better solutions).</p>
<p>For example, in java you can do:</p>
<pre><code class="language-java">// Bad
String notThere = null;
String there = &quot;my string&quot;;
// Turbo-bad
String notThere = &quot;&quot;; // or &quot;N/A&quot;, etc
String there = &quot;my string&quot;;
// Good
Optional&lt;String&gt; notThere = Optional.empty();
Optional&lt;String&gt; there = Optional.of(&quot;my string&quot;);
</code></pre>
<p>With optional, not only you have a structural difference between defined and undefined strings (instead of having to check if the string is equal to <code>&quot;&quot;</code> or <code>&quot;N/A&quot;</code>, without any guarantee that it&#39;s not the actual value), but it&#39;s clearly documented in the type.</p>
<p><code>Optional</code> is available in Java 8 (and in Guava if you&#39;re not using java 8 yet). In scala, rust, ocaml and many other languages, it&#39;s called <code>Option</code>, in Haskell it&#39;s called <code>Maybe</code>.</p>
<h2 id="this-is-why-you-can-have-nice-things">This is why you <em>can</em> have nice things</h2>
<p>Ok so now you have a proper representation for your optional values. In a typed language it means that you&#39;re forced to check if the value is already there before using it.</p>
<p>For instance, in java:</p>
<pre><code class="language-java">Optional&lt;Integer&gt; parseOptionalString(Optional&lt;String&gt; myOptionalString) {
    if(myOptionalString.isPresent()) {
        Optional&lt;Integer&gt; result = parseInt(myOptionalString.get());
        return result;
    } else {
        return Optional.empty();
    }
}
</code></pre>
<p>This works perfectly well, but is still as verbose as using explicit <code>null</code> checks. So if you&#39;re only concerned about code terseness (you really shouldn&#39;t), it can feel like a marginal improvement (it&#39;s way better than that).</p>
<p>Thankfully that&#39;s not the idiomatic way of handling <code>Optional</code> values: now that we can denote the abstract concept of <em>being possibly not there</em> (in this case, <code>Optional&lt;_&gt;</code>), then we can do useful stuff about it:</p>
<ul>
<li>transforming it only if it&#39;s defined (with <code>map</code>)</li>
<li>eliminate the option by providing a default value when we don&#39;t need the
information anymore (with <code>orElseGet</code>)</li>
<li>sequencing several operations returning options (with <code>flatMap</code>)</li>
</ul>
<p>All of this comes for free because we were able to clearly define our domain model. Some languages like Kotlin provide approaching solutions with things like the Safe Call Operator for chaining operations (instead of using <code>map</code> and <code>flatMap</code>) and the Elvis Operator for providing default values. This, however, is less extensible and less composable than having proper options (<code>map</code> and <code>flatMap</code> are not specific to <code>Optional</code>).</p>
<pre><code class="language-java">Optional&lt;Integer&gt; parseOptionalString(Optional&lt;String&gt; myOptionalString) {
    return myOptionalString.flatMap(parseInt);
}
</code></pre>
<p>Once you have properly defined your domain model, then you can have cleaner code thanks to the information encoded in your types. Aiming at terser code without proper abstraction will lead you to perlish nightmares.</p>
<h2 id="to-sum-up">To sum up</h2>
<p>Using <code>null</code> causes problems. Resorting to solutions that erase information (setting a default value too early or worse, the null object pattern) will cause graver and subtler problems.</p>
<p>In order of decreasing importance, the problems with <code>null</code> are:</p>
<ol>
<li>it&#39;s not clear for people if a value can be missing</li>
<li>the program can blow up if somebody forgot to handle a missing value</li>
<li>it&#39;s tedious to sequence operations returning null</li>
</ol>
<p>Don&#39;t settle for solutions that only address #2 and #3.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Handling a Massive TV Effect on Your Website</title>
		<link>https://stagingv6.cleverapps.io/blog/features/2014/01/13/handling-a-massive-live-tv-effect/</link>
		
		<dc:creator><![CDATA[Clément Nivolle]]></dc:creator>
		<pubDate>Mon, 13 Jan 2014 00:00:00 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[feature]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[workflow]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2014/01/13/handling-a-massive-live-tv-effect/</guid>

					<description><![CDATA[French version below On Saturday 11 January, Denis Payre, the president of &#39;Nous Citoyens&#39; (a new French political movement) was a guest on French presenter Laurent Ruquier&#39;s show, &#39;On n&#39;est pas couché.&#39; This new french political movement has been officially launched on the 10th of october 2013, and allow its members to be part of [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><em>French version below</em></p>
<p>On Saturday 11 January, Denis Payre, the president of &#39;<a href="http://www.nouscitoyens.fr">Nous Citoyens</a>&#39; (a new French political movement) was a guest on French presenter Laurent Ruquier&#39;s show, &#39;On n&#39;est pas couché.&#39;</p>
<p>This new french political movement has been officially launched on the 10th of october 2013, and allow its members to be part of it, thanks to its collaborative website, developed by the parisian web agency <a href="http://www.sooyoos.com/">Sooyoos</a>.</p>
<p><span id="more-2846"></span></p>
<p>Coded with PHP, a few configuration steps on Clever Cloud made by Sooyoos were needed to get the app ready for the TV broadcast.</p>
<p>Usually, the app runs on a 2GB and 2CPU scaler type (scalers are the equivalent of instances on Clever Cloud). But the TV audience brought 2 massive peaks of visits.</p>
<p>Around midnight, the webapp scaled from a L scaler size to a XXXL scaler size (8 CPU, 16GB of RAM), in a few seconds.</p>
<p><center></p>
<figure>
    <img decoding="async" height="180" src="https://www2.cleverapps.io/app/uploads/2021/08/traffic-peak.png"><figcaption>The trafic peak recorded at 0h15.</figcaption></figure>
<p></center></p>
<p>In most cases, media exposure of this kind (over 30 mins for Nous Citoyens here) leads to a huge load on the servers of the sites concerned, causing slowing down, and in the worst cases, periods of unavailability. For those who are lucky enough to be able to foresee such a load, the solution is to prepare a migration of the site to a more suitable infrastructure.</p>
<p>Unfortunately, this is not always the case. Because some companies fell victim to the &quot;Capital effect&quot; (&#39;Capital&#39; is a popular magazine program on the French TV channel, M6). According to social networks, some of them often acknowledged several minutes of unavailability during the program.</p>
<p>However, the Nous Citoyens website, hosted on Clever Cloud, remained perfectly stable throughout Denis Payre&#39;s interview on France 2, and that despite the increase in traffic due to the millions of television viewers.</p>
<p>Clever Cloud, therefore, managed the increased load without problem, thanks to an automatic attribution of resources to the infrastructure of NousCitoyens.fr.</p>
<hr id="french">
<p><em>Version française</em></p>
<p>Samedi 11 janvier, Denis Payre le président de <a href="http://www.nouscitoyens.fr">Nous Citoyens</a>, un nouveau mouvement politique, a été reçu dans l&#39;émission de Laurent Ruquier &quot;<a href="http://www.france2.fr/emissions/on-n-est-pas-couche/videos/94952658">On n’est pas couché</a>&quot;.</p>
<p>Lancé officiellement le jeudi 10 octobre et déjà fort de plusieurs milliers d&#39;adhérents, Nous Citoyens propose à tous de devenir acteur du mouvement, notamment grâce à sa plateforme web collaborative conçue par l&#39;agence parisienne <a href="http://www.sooyoos.com/">Sooyoos</a>.</p>
<p>Développée en PHP, celle-ci repose sur Clever Cloud pour son hébergement. Avec quelques réglages simples, l&#39;agence Sooyoos a pu être en mesure de préaprer le site de Nous Citoyens à l&#39;émission de France 2, où était invité Denis Payre.</p>
<p>En temps normal, la plateforme repose sur une scaler (équivalent d&#39;instances chez Clever Cloud) de taille &quot;Large&quot;, soit 2Go de RAM et 2 vCPU dédiés. Mais face à la forte médiatisation, 2 grands pics d&#39;audience ont été enregistrés.</p>
<p>À partir de minuit, l&#39;application a migrée d&#39;une instance de taille &#39;L&#39; jusqu&#39;à &#39;XXXL&#39; (8 CPU, 16Go de RAM), en passant par les tailles intermédiaires, puis est redescendue petit à petit vers sa taille d&#39;instance habituelle.</p>
<p><center></p>
<figure>
    <img decoding="async" height="180" src="https://www2.cleverapps.io/app/uploads/2021/08/traffic-peak.png"><figcaption>Le pic de trafic rencontré à 0h15 pour NousCitoyens.fr</figcaption></figure>
<p></center></p>
<p>Dans la plupart des cas, une telle exposition médiatique (ici plus de 45 minutes pour Nous Citoyens) entraîne une charge momumentale sur les serveurs des sites web concernés causant des ralentissments, et dans le pire des cas, une indisponibilité.</p>
<p>En revanche, hébergé sur Clever Cloud, le site de Nous Citoyens est resté parfaitement stable tout au long de l&#39;interview de Denis Payre sur France 2, et ce malgré la montée conséquente du trafic due aux millions de téléspectateurs.</p>
<p>Malheuresement, il n&#39;en va pas de même pour tout le monde, certaines entreprises étant victimes de “l&#39;Effet Capital” par exemple sur M6, résultant en ralentissments ou indisponibilité de quelques minutes au cours de l&#39;émission. Pour ceux qui ont la chance de prévoir une telle charge, la solution est de prépaprer une migration du site sur une infrastructure adaptée.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Introducing Databases as a Service on Clever Cloud</title>
		<link>https://stagingv6.cleverapps.io/blog/features/2013/05/02/external-db/</link>
		
		<dc:creator><![CDATA[Adrien Cretté]]></dc:creator>
		<pubDate>Thu, 02 May 2013 00:00:00 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[feature]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[workflow]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2013/05/02/external-db/</guid>

					<description><![CDATA[French version below Another kind of &#8216;external&#8217; DBs Until now, databases hosted on Clever Cloud were only available from within the hosted apps. Since it was impossible to use external DB management software, it was a bit cumbersome to import or export data. This era is over: right now, the services are available from outside! [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><em>French version below</em></p>
<div class="pull-right" style="margin-bottom:20px;margin-left:5px; width:200px">
  <img decoding="async" alt="server" src="https://www2.cleverapps.io/app/uploads/2021/08/headquarters.jpg"/></p>
<div style="text-align:center;font-style:italic">Another kind of &#8216;external&#8217; DBs</div>
</div>
<p>Until now, databases hosted on Clever Cloud were only available from within the hosted apps. Since it was impossible to use external DB management software, it was a bit cumbersome to import or export data.</p>
<p><span id="more-2844"></span></p>
<p>This era is over: right now, the services are available from outside!</p>
<p>Indeed, it means you will be able to use your favorite DB management tool. If you want to use our platform simply for host a database or if you have to access to your db for initial setup or migration, you can.<br />It also means you can use Clever Cloud as a pure <strong>Database as a Service</strong> (DBaaS) provider.</p>
<p>The current form (only available from within Clever Cloud apps) is<br />&quot;<em>dbname.engine</em>.internal&quot; (eg &quot;<em>customers.my</em>.internal&quot;).</p>
<p>The new domain names will follow this pattern:<br />&quot;<em>dbname.engine</em>.clvrcld.net&quot; (eg &quot;<em>customers.mysql</em>.clvrcld.net&quot;).</p>
<p>As for the ports, they stay the same (3306 for MySQL, 5432 for PostgreSQL).</p>
<p>Old domain names remain active for now (no sunset date is planned yet), but we strongly encourage you to make the switch.</p>
<p>We will indicate a date for the end of the internal databases services later.</p>
<p>The support remains at your service to help you tomigrate from .internal to clvrcld.net in your code.</p>
<p>Don&#39;t hesitate ton contact the <a href="mailto:support@clever-cloud.com">support</a> for more precisions <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<hr id="french">
<p><em>Version française</em></p>
<h2 id="lancement-des-databases-as-a-service-sur-clever-cloud">Lancement des <em>Databases as a Service</em> sur Clever Cloud</h2>
<p>Jusqu&#39;ici les bases de données hébergées dans Clever Cloud n&#39;étaient utilisables que depuis l&#39;application hébergée. Il était alors impossible d&#39;utiliser un outil de gestion de base de données externe, ce qui était fastidieux notamment pour les imports/exports.</p>
<p>Cette ère est révolue: désormais, les services sont accessible depuis l&#39;extérieur !</p>
<p>Concrètement, cela signifie qu&#39;il sera possible d&#39;utiliser l&#39;outil de management de votre choix. Si vous souhaitez utiliser notre plateforme uniquement pour héberger une base de données ou si vous devez accéder à votre base depuis l’extérieur pour l&#39;amorçage ou la migration de vos données, c&#39;est désormais possible.<br />Clever Cloud devient donc aussi fournisseur <strong>Database as a Service</strong> (DBaaS) !</p>
<p>La forme actuelle (seulement accessible depuis les applications Clever Cloud) est:<br />&quot;<em>dbname.engine</em>.internal&quot; (ex &quot;<em>clients.my</em>.internal&quot;).</p>
<p>Les nouveaux noms de domaine adopteront désormais cette forme:<br />&quot;<em>dbname.engine</em>.clvrcld.net&quot; (ex &quot;<em>clients.mysql</em>.clvrcld.net&quot;).</p>
<p>En ce qui concerne les ports, ils restent les même (3306 for MySQL, 5432 for PostgreSQL).</p>
<p>Nous préciserons une date de fin des services des bases de données internes ultérieurement.</p>
<p>Le support reste à votre service pour vous aider à migrer de .internal vers le clvrcld.net dans votre code.</p>
<p>N&#39;hésitez pas à contacter le <a href="mailto:support@clever-cloud.com">support</a> pour plus de précisions <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
