<?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>Scala Archives | Clever Cloud</title>
	<atom:link href="https://www.clever.cloud/blog/tag/scala/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.clever.cloud/blog/tag/scala/</link>
	<description>From Code to Product</description>
	<lastBuildDate>Thu, 27 Nov 2025 14:45:35 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://cdn.clever-cloud.com/uploads/2023/03/cropped-cropped-favicon-32x32.png</url>
	<title>Scala Archives | Clever Cloud</title>
	<link>https://www.clever.cloud/blog/tag/scala/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Deploy a Scala / Akka application with PostgreSQL integration</title>
		<link>https://www.clever.cloud/blog/engineering/2022/06/09/deploy-a-scala-akka-application-with-postgresql-integration/</link>
		
		<dc:creator><![CDATA[Geoffrey GUILBON]]></dc:creator>
		<pubDate>Thu, 09 Jun 2022 12:44:32 +0000</pubDate>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[Scala]]></category>
		<guid isPermaLink="false">https://www.clever-cloud.com/?p=6509</guid>

					<description><![CDATA[<p><img width="1400" height="540" src="https://cdn.clever-cloud.com/uploads/2022/06/akka.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="akka" decoding="async" fetchpriority="high" srcset="https://cdn.clever-cloud.com/uploads/2022/06/akka.png 1400w, https://cdn.clever-cloud.com/uploads/2022/06/akka-300x116.png 300w, https://cdn.clever-cloud.com/uploads/2022/06/akka-1024x395.png 1024w, https://cdn.clever-cloud.com/uploads/2022/06/akka-768x296.png 768w, https://cdn.clever-cloud.com/uploads/2022/06/akka-1368x528.png 1368w" sizes="(max-width: 1400px) 100vw, 1400px" /></p><!-- wp:media-text {"align":"wide","mediaId":6749,"mediaType":"image","mediaWidth":30} -->
<div class="wp-block-media-text alignwide is-stacked-on-mobile" style="grid-template-columns:30% auto"><figure class="wp-block-media-text__media"><img src="https://cdn.clever-cloud.com/uploads/2022/06/akkatoolkitlogo-2-318x131.png" alt="" class="wp-image-6749 size-full"/></figure><div class="wp-block-media-text__content"><!-- wp:paragraph -->
<p>When I started working at Clever Cloud, I spent some time messing around with the platform and its tooling. This blog post will present you how I managed to:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>create a simple Scala/Akka HTTP template application with PostgreSQL persistence</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>link the application to a managed PostgreSQL</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>deploy it</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>try it!</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list --></div></div>
<!-- /wp:media-text -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Create a Scala/Akka HTTP template 🔨</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Get the sources</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><a href="https://github.com/CleverCloud/scala-akka-http-postgres-example">Clone</a> the project generated from Akka Github <a href="https://github.com/akka/akka-http-quickstart-scala.g8" target="_blank" rel="noreferrer noopener">quick start template</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>This service provides the ability to manage a simple in-memory user registry exposing 4 routes:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>List all users</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Get a specific user</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Create a user</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Delete a user</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>A thorough description of available the cURL commands may be found <a href="https://developer.lightbend.com/guides/akka-http-quickstart-scala/#cURL-commands" target="_blank" rel="noreferrer noopener">here</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Add extra features</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>A few functionalities have been added on top of the original example:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>store the registry into a PostgreSQL database (instead of in memory)</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>read database parameters from <a href="https://www.clever.cloud/blog/fonctionnalites/2022/03/22/improving-our-environment-variables-editor/">environment variables</a></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>add a hardcoded basic authentication</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>All parameters may be specified in the <a href="https://github.com/CleverCloud/scala-akka-http-postgres-example/blob/master/src/main/resources/application.conf">application.conf</a> file:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>basic auth</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>database parameters</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Parameters are fetched from environment variables, or the specified default value if none is found</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">app {
  basic-auth {
    user = "foo"
    user = ${?BASIC_AUTH_USER}
    password = "bar"
    password = ${?BASIC_AUTH_PASSWORD}
  }
  routes {
    # If ask takes more time than this to complete the request is failed
    ask-timeout = 5s
  }

  db {
    host = "localhost"
    host = ${?POSTGRESQL_ADDON_HOST}
    port = "5432"
    port = ${?POSTGRESQL_ADDON_PORT}
    database = "postgres"
    database = ${?POSTGRESQL_ADDON_DB}
    user = "login"
    user = ${?POSTGRESQL_ADDON_USER}
    pass = "pass"
    pass = ${?POSTGRESQL_ADDON_PASSWORD}
  }
}</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Run the application using Clever Cloud CLI 🚀</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Create a Clever Cloud application</h3>
<!-- /wp:heading -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever create --type sbt myakka --region par --org testorg</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>This command creates a new application</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>of type sbt for <a href="https://www.clever.cloud/product/applications-scala/">Scala</a></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>named <em>myakka</em></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>in <em>Paris</em> region</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>inside my test organisation <em>testorg</em></li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Enable a dedicated build instance for faster build (optional pro tip)</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>By default a newly created application will run an XS instance which are quite small for building Scala applications fast. One way to build faster is to use a dedicated build Instance: In the Clever Cloud console, got to your application -&gt; options, and check the box <code>[] Enable dedicated build instance</code> This way you can keep your XS instance for running the application, but you can choose an XL for the build time. Or with the command line tool:</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever scale -a myakka --build-flavor XL</code></pre>
<!-- /wp:html -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Create a PostgreSQL database</h3>
<!-- /wp:heading -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever addon -l myakka create postgresql-addon myakkadb</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>This command orders a PostgreSQL add-on instance and link it to <code><em>myakka</em></code>, injecting the right environment variables into the application instance to contact the database.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Database creation and migration is performed using <a href="https://flywaydb.org/">flywaydb</a> tool. Those script may be found in the <a href="https://github.com/CleverCloud/scala-akka-http-postgres-example/tree/master/src/main/resources/db/migration">migration/db</a> directory of the application resources.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Migration will be automatically called once you specify the proper build hook in the environment variables</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><kbd>CC_POST_BUILD_HOOK</kbd> with value <kbd><kbd>sbt flywayMigrate</kbd></kbd></p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever env -a myakka set <kbd>CC_POST_BUILD_HOOK</kbd> "sbt flywayMigrate"</code></pre>
<!-- /wp:html -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Configure basic auth environment variables</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Basic authentication login and password can be specified as environment variables using the <kbd>clever env</kbd> command. If none is found, basic authentication will default to <em>application.conf</em> file values</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever env -a myakka set BASIC_AUTH_USER &lt;YOUR_AUTH_USER&gt;
clever env -a myakka set BASIC_AUTH_PASSWORD &lt;YOUR_AUTH_PASSWORD&gt;</code></pre>
<!-- /wp:html -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Link your local repo with your Clever Cloud application instance</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Retrieve your application id with</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever applications</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Then link the local repository to the application (creating a <em>.clever.json</em> file)</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever link app_&lt;UUID&gt;</code></pre>
<!-- /wp:html -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Deploy</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>You are now ready to deploy and run your code, just run</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever deploy</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>You are now able to follow the deployment process until it completes successfully</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Your application is running now!</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Try it</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>It's time to experiment with it using <kbd>curl</kbd> or your favorite GUI</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4 class="wp-block-heading">Add a user</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Adapt this command in order to insert a new user into the registry:</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">curl --request POST \
  --url https://app-&lt;UUID&gt;.cleverapps.io/users \
  --header 'Content-type: application/json' \
  -u '&lt;YOUR_AUTH_USER&gt;:&lt;YOUR_AUTH_PASSWORD&gt;' \
  --data '{
  "name": "Serge",
  "age": 42,
  "countryOfResidence": "Greenland"
}'

{
	"description": "User Serge created."
}</code></pre>
<!-- /wp:html -->

<!-- wp:heading {"level":4} -->
<h4 class="wp-block-heading">Get all users</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Check that the user has been properly created, by getting the list of users:</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">curl --request GET \
  --url https://app-&lt;UUID&gt;.cleverapps.io/users \
  -u '&lt;YOUR_AUTH_USER&gt;:&lt;YOUR_AUTH_PASSWORD&gt;'

{"users":[{"age":42,"countryOfResidence":"Greenland","name":"Serge"}]}</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>It works, Success! 🎉</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->]]></description>
										<content:encoded><![CDATA[<p><img width="1400" height="540" src="https://cdn.clever-cloud.com/uploads/2022/06/akka.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="akka" decoding="async" srcset="https://cdn.clever-cloud.com/uploads/2022/06/akka.png 1400w, https://cdn.clever-cloud.com/uploads/2022/06/akka-300x116.png 300w, https://cdn.clever-cloud.com/uploads/2022/06/akka-1024x395.png 1024w, https://cdn.clever-cloud.com/uploads/2022/06/akka-768x296.png 768w, https://cdn.clever-cloud.com/uploads/2022/06/akka-1368x528.png 1368w" sizes="(max-width: 1400px) 100vw, 1400px" /></p><!-- wp:media-text {"align":"wide","mediaId":6749,"mediaType":"image","mediaWidth":30} -->
<div class="wp-block-media-text alignwide is-stacked-on-mobile" style="grid-template-columns:30% auto"><figure class="wp-block-media-text__media"><img src="https://cdn.clever-cloud.com/uploads/2022/06/akkatoolkitlogo-2-318x131.png" alt="" class="wp-image-6749 size-full"/></figure><div class="wp-block-media-text__content"><!-- wp:paragraph -->
<p>When I started working at Clever Cloud, I spent some time messing around with the platform and its tooling. This blog post will present you how I managed to:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>create a simple Scala/Akka HTTP template application with PostgreSQL persistence</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>link the application to a managed PostgreSQL</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>deploy it</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>try it!</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list --></div></div>
<!-- /wp:media-text -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Create a Scala/Akka HTTP template 🔨</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Get the sources</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><a href="https://github.com/CleverCloud/scala-akka-http-postgres-example">Clone</a> the project generated from Akka Github <a href="https://github.com/akka/akka-http-quickstart-scala.g8" target="_blank" rel="noreferrer noopener">quick start template</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>This service provides the ability to manage a simple in-memory user registry exposing 4 routes:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>List all users</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Get a specific user</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Create a user</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Delete a user</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>A thorough description of available the cURL commands may be found <a href="https://developer.lightbend.com/guides/akka-http-quickstart-scala/#cURL-commands" target="_blank" rel="noreferrer noopener">here</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Add extra features</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>A few functionalities have been added on top of the original example:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>store the registry into a PostgreSQL database (instead of in memory)</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>read database parameters from <a href="https://www.clever.cloud/blog/fonctionnalites/2022/03/22/improving-our-environment-variables-editor/">environment variables</a></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>add a hardcoded basic authentication</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>All parameters may be specified in the <a href="https://github.com/CleverCloud/scala-akka-http-postgres-example/blob/master/src/main/resources/application.conf">application.conf</a> file:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>basic auth</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>database parameters</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Parameters are fetched from environment variables, or the specified default value if none is found</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">app {
  basic-auth {
    user = "foo"
    user = ${?BASIC_AUTH_USER}
    password = "bar"
    password = ${?BASIC_AUTH_PASSWORD}
  }
  routes {
    # If ask takes more time than this to complete the request is failed
    ask-timeout = 5s
  }

  db {
    host = "localhost"
    host = ${?POSTGRESQL_ADDON_HOST}
    port = "5432"
    port = ${?POSTGRESQL_ADDON_PORT}
    database = "postgres"
    database = ${?POSTGRESQL_ADDON_DB}
    user = "login"
    user = ${?POSTGRESQL_ADDON_USER}
    pass = "pass"
    pass = ${?POSTGRESQL_ADDON_PASSWORD}
  }
}</code></pre>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Run the application using Clever Cloud CLI 🚀</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Create a Clever Cloud application</h3>
<!-- /wp:heading -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever create --type sbt myakka --region par --org testorg</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>This command creates a new application</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>of type sbt for <a href="https://www.clever.cloud/product/applications-scala/">Scala</a></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>named <em>myakka</em></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>in <em>Paris</em> region</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>inside my test organisation <em>testorg</em></li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Enable a dedicated build instance for faster build (optional pro tip)</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>By default a newly created application will run an XS instance which are quite small for building Scala applications fast. One way to build faster is to use a dedicated build Instance: In the Clever Cloud console, got to your application -&gt; options, and check the box <code>[] Enable dedicated build instance</code> This way you can keep your XS instance for running the application, but you can choose an XL for the build time. Or with the command line tool:</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever scale -a myakka --build-flavor XL</code></pre>
<!-- /wp:html -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Create a PostgreSQL database</h3>
<!-- /wp:heading -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever addon -l myakka create postgresql-addon myakkadb</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>This command orders a PostgreSQL add-on instance and link it to <code><em>myakka</em></code>, injecting the right environment variables into the application instance to contact the database.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Database creation and migration is performed using <a href="https://flywaydb.org/">flywaydb</a> tool. Those script may be found in the <a href="https://github.com/CleverCloud/scala-akka-http-postgres-example/tree/master/src/main/resources/db/migration">migration/db</a> directory of the application resources.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Migration will be automatically called once you specify the proper build hook in the environment variables</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><kbd>CC_POST_BUILD_HOOK</kbd> with value <kbd><kbd>sbt flywayMigrate</kbd></kbd></p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever env -a myakka set <kbd>CC_POST_BUILD_HOOK</kbd> "sbt flywayMigrate"</code></pre>
<!-- /wp:html -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Configure basic auth environment variables</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Basic authentication login and password can be specified as environment variables using the <kbd>clever env</kbd> command. If none is found, basic authentication will default to <em>application.conf</em> file values</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever env -a myakka set BASIC_AUTH_USER &lt;YOUR_AUTH_USER&gt;
clever env -a myakka set BASIC_AUTH_PASSWORD &lt;YOUR_AUTH_PASSWORD&gt;</code></pre>
<!-- /wp:html -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Link your local repo with your Clever Cloud application instance</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Retrieve your application id with</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever applications</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Then link the local repository to the application (creating a <em>.clever.json</em> file)</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever link app_&lt;UUID&gt;</code></pre>
<!-- /wp:html -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Deploy</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>You are now ready to deploy and run your code, just run</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">clever deploy</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>You are now able to follow the deployment process until it completes successfully</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Your application is running now!</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Try it</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>It's time to experiment with it using <kbd>curl</kbd> or your favorite GUI</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4 class="wp-block-heading">Add a user</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Adapt this command in order to insert a new user into the registry:</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">curl --request POST \
  --url https://app-&lt;UUID&gt;.cleverapps.io/users \
  --header 'Content-type: application/json' \
  -u '&lt;YOUR_AUTH_USER&gt;:&lt;YOUR_AUTH_PASSWORD&gt;' \
  --data '{
  "name": "Serge",
  "age": 42,
  "countryOfResidence": "Greenland"
}'

{
	"description": "User Serge created."
}</code></pre>
<!-- /wp:html -->

<!-- wp:heading {"level":4} -->
<h4 class="wp-block-heading">Get all users</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Check that the user has been properly created, by getting the list of users:</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<pre class="wp-block-code"><code class="lang-bash">curl --request GET \
  --url https://app-&lt;UUID&gt;.cleverapps.io/users \
  -u '&lt;YOUR_AUTH_USER&gt;:&lt;YOUR_AUTH_PASSWORD&gt;'

{"users":[{"age":42,"countryOfResidence":"Greenland","name":"Serge"}]}</code></pre>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>It works, Success! 🎉</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>#48 &#8211; Néo Arrête Freenode Pour Se Mettre Aux NFT</title>
		<link>https://www.clever.cloud/podcast/48-neo-arrete-freenode-pour-se-mettre-aux-nft/</link>
					<comments>https://www.clever.cloud/podcast/48-neo-arrete-freenode-pour-se-mettre-aux-nft/#respond</comments>
		
		<dc:creator><![CDATA[Clément Nivolle]]></dc:creator>
		<pubDate>Thu, 17 Jun 2021 09:17:37 +0000</pubDate>
				<category><![CDATA[Scala]]></category>
		<guid isPermaLink="false">https://assets.clever-cloud.com/podcast/fr/Message_a_caractere_informatique_48.mp3</guid>

					<description><![CDATA[Avec par ordre d’apparition : @judu @aurrel @geal @brendan 00:01:40 &#8211; Suicide de Freenode ? https://www.devever.net/~hl/freenode_suicide https://isfreenodedeadyet.com/ Letter to freenode &#8211; Post Mortem of May 25, 2021 https://freenode.org/news/post-mortem-may21 https://freenode.org/news/taking-irc-further 00:12:00 &#8211; How governments and spies text each other https://www.wired.co.uk/article/matrix-encrypted-messaging-app-governments Spaces: the next frontier https://element.io/blog/spaces-the-next-frontier/ https://evolved.systems/hosting-a-blog-on-matrix/ https://cactus.chat/ 00:32:06 Huawei investit dans Qwant https://www.maddyness.com/2021/06/14/huawei-qwant-8-millions-euros/ 00:36:13 &#8211; Adoption [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Avec par ordre d’apparition : @judu @aurrel @geal @brendan</p>
<p>00:01:40 &#8211; Suicide de Freenode ?<br />
<a href="https://www.devever.net/~hl/freenode_suicide">https://www.devever.net/~hl/freenode_suicide</a><br />
<a href="https://isfreenodedeadyet.com/">https://isfreenodedeadyet.com/</a></p>
<p>Letter to freenode &#8211; Post Mortem of May 25, 2021<br />
<a href="https://freenode.org/news/post-mortem-may21">https://freenode.org/news/post-mortem-may21</a><br />
<a href="https://freenode.org/news/taking-irc-further">https://freenode.org/news/taking-irc-further</a></p>
<p>00:12:00 &#8211; How governments and spies text each other<br />
<a href="https://www.wired.co.uk/article/matrix-encrypted-messaging-app-governments">https://www.wired.co.uk/article/matrix-encrypted-messaging-app-governments</a></p>
<p>Spaces: the next frontier<br />
<a href="https://element.io/blog/spaces-the-next-frontier/">https://element.io/blog/spaces-the-next-frontier/</a><br />
<a href="https://evolved.systems/hosting-a-blog-on-matrix/">https://evolved.systems/hosting-a-blog-on-matrix/</a><br />
<a href="https://cactus.chat/">https://cactus.chat/</a></p>
<p>00:32:06 Huawei investit dans Qwant<br />
<a href="https://www.maddyness.com/2021/06/14/huawei-qwant-8-millions-euros/">https://www.maddyness.com/2021/06/14/huawei-qwant-8-millions-euros/</a></p>
<p>00:36:13 &#8211; Adoption d’IPv6 dans le monde, vu par Google et Akamai:<br />
<a href="https://www.google.com/intl/en/ipv6/statistics.html">https://www.google.com/intl/en/ipv6/statistics.html</a><br />
<a href="https://www.akamai.com/fr/fr/resources/our-thinking/state-of-the-internet-report/state-of-the-internet-ipv6-adoption-visualization.jsp">https://www.akamai.com/fr/fr/resources/our-thinking/state-of-the-internet-report/state-of-the-internet-ipv6-adoption-visualization.jsp</a></p>
<p>00:39:00 &#8211; Tim Berners Lee fait une NFT de son code<br />
<a href="https://twitter.com/FinancialTimes/status/1404781711137951746?s=19">https://twitter.com/FinancialTimes/status/1404781711137951746?s=19</a></p>
<p>00:41:05 &#8211; Hack de voiture autonome<br />
<a href="https://spqrlab1.github.io/papers/ji-poltergeist-oakland21.pdf">https://spqrlab1.github.io/papers/ji-poltergeist-oakland21.pdf</a><br />
( <a href="https://twitter.com/bfmbusiness/status/1390384624866676740">https://twitter.com/bfmbusiness/status/1390384624866676740</a> )</p>
<p>00:45:40 &#8211; Sortie de Scala 3.0.0<br />
<a href="https://github.com/lampepfl/dotty/releases/tag/3.0.0">https://github.com/lampepfl/dotty/releases/tag/3.0.0</a><br />
<a href="https://dotty.epfl.ch/">https://dotty.epfl.ch/</a><br />
<a href="https://docs.scala-lang.org/scala3/guides/migration/compatibility-intro.html">https://docs.scala-lang.org/scala3/guides/migration/compatibility-intro.html</a></p>
<p>00:55:40 &#8211; Grafana 8.0<br />
<a href="https://grafana.com/blog/2021/06/08/grafana-8.0-unified-grafana-and-prometheus-alerts-live-streaming-new-visualizations-and-more/">https://grafana.com/blog/2021/06/08/grafana-8.0-unified-grafana-and-prometheus-alerts-live-streaming-new-visualizations-and-more/</a><br />
<a href="https://grafana.com/blog/2021/06/14/the-new-unified-alerting-system-for-grafana-everything-you-need-to-know/">https://grafana.com/blog/2021/06/14/the-new-unified-alerting-system-for-grafana-everything-you-need-to-know/</a></p>
<p>01:01:40 &#8211; Grafana OSS projects, Cortex and Tempo<br />
<a href="https://grafana.com/blog/2021/06/10/grafanaconline-day-2-recap-grafana-8-deep-dive-prometheus-innovation-a-billion-time-series-at-robinhood-and-more/">https://grafana.com/blog/2021/06/10/grafanaconline-day-2-recap-grafana-8-deep-dive-prometheus-innovation-a-billion-time-series-at-robinhood-and-more/</a><br />
<a href="https://grafana.com/blog/2021/06/09/grafana-tempo-is-now-ga-with-the-release-of-v1.0/">https://grafana.com/blog/2021/06/09/grafana-tempo-is-now-ga-with-the-release-of-v1.0/</a></p>
<p>01:13:00 &#8211; Java 17<br />
<a href="https://www.infoworld.com/article/3606833/jdk-17-the-new-features-in-java-17.html#tk.rss_all">https://www.infoworld.com/article/3606833/jdk-17-the-new-features-in-java-17.html#tk.rss_all</a></p>
<p>01:17:50 &#8211; Google utilise du machine learning pour concevoir le routage de ses CPUs<br />
<a href="https://www.theverge.com/2021/6/10/22527476/google-machine-learning-chip-design-tpu-floorplanning">https://www.theverge.com/2021/6/10/22527476/google-machine-learning-chip-design-tpu-floorplanning</a></p>
<p>01:19:25 &#8211; la gate length des transistors n’est plus un bon indicateur pour les comparer<br />
<a href="https://www.eejournal.com/article/no-more-nanometers/">https://www.eejournal.com/article/no-more-nanometers/</a></p>
<p>01:22:00 &#8211; charger une cassette à bande magnétique Acorn ou BBC micro, par WebAudio, et l’exécuter dans le navigateur<br />
<a href="https://twitter.com/DominicPajak/status/1404121118017949703?s=19">https://twitter.com/DominicPajak/status/1404121118017949703?s=19</a></p>
<p>Le lien musical: “Never Really Get There” par CRi <a href="https://www.youtube.com/watch?v=Pfwi1Ervk-8">https://www.youtube.com/watch?v=Pfwi1Ervk-8</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.clever.cloud/podcast/48-neo-arrete-freenode-pour-se-mettre-aux-nft/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tools, not rules: why I&#8217;ve built issues-helper</title>
		<link>https://www.clever.cloud/blog/features/2018/02/13/issues-helper/</link>
		
		<dc:creator><![CDATA[Clement Delafargue]]></dc:creator>
		<pubDate>Tue, 13 Feb 2018 09:00:00 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[play]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[Scala]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2018/02/13/issues-helper/</guid>

					<description><![CDATA[<p><img width="1400" height="540" src="https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="tools not rules 1" decoding="async" srcset="https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1.jpg 1400w, https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1-300x116.jpg 300w, https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1-1024x395.jpg 1024w, https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1-768x296.jpg 768w, https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1-1368x528.jpg 1368w" sizes="(max-width: 1400px) 100vw, 1400px" /></p><p>A few weeks ago I&#39;ve open sourced <a href="https://github.com/CleverCloud/issues-helper">issues-helper</a>. It allows you to easily interact with issues on GitHub and GitLab, from the command line.</p>
<pre><code class="language-bash">gli o --assignee clementd --label improvement &quot;Degauss the frobulator fluxfield&quot;
</code></pre>
<p>Let&#39;s see why and how it&#39;s done.</p>
<span id="more-2928"></span>

<h2 id="tldr">TL;DR</h2>
<p>Issues are a good way to keep track of decisions in a project. Opening issues should be easy so people don&#39;t forget to write down why they&#39;ve done things. Opening issues from the command line with minimal fuss is a good thing:</p>
<pre><code class="language-bash">gli init # generate initial configuration
gli o &quot;Issue title&quot; &quot;Optional issue text&quot;
  # add --open to open the issue in the browser once created
  # add --assignee to assign issue
  # add --label to add labels to the issue
gli l # list issues
gli b # open the project homepage in your browser
</code></pre>
<h2 id="issues-use-them">Issues. Use them.</h2>
<p>At Clever Cloud, we use git (and GitLab) a lot. In addition to just using git for code, we also rely a lot on issues. Many discussions end with &quot;please open an issue and sum up what we&#39;ve just said&quot;.</p>
<p>Issues are not just for bugs, we use it as a way to track decisions. Some projects don&#39;t even have code and are just there to track discussions and decisions.</p>
<p>My goal, as a CTO, is to make sure we keep track of all of our decisions. So I need people to open issues, to open them often, and to open them early.</p>
<h2 id="processes-make-em-easy">Processes. Make &#39;em easy.</h2>
<p>I work with people, not with robots. While I trust them and I know they&#39;re good at what they do, I just can&#39;t expect them not to make mistakes, or in that case follow processes with no clear incentive. So I needed to remove friction when opening issues. When we interact with code, it&#39;s from the command line: we craft commits, we deploy to production, we even close issues from the command line (while crafting commits). So we should also open issues from the terminal.</p>
<p>My first try was to use the ruby gitlab CLI, but it had several issues:</p>
<ul>
<li>configuration was done with environment variables</li>
<li>it&#39;s written in ruby and can be complicated to install</li>
<li>the output is more or less database rows in ascii tables</li>
<li>you have to specify which project you&#39;re talking about</li>
</ul>
<p>Even though I&#39;ve written documentation and showed people how to use it, it was not used a lot. When a tool feels like a hack, nobody wants to use it.</p>
<h3 id="what-i-wanted">What I wanted</h3>
<p>I needed two things to get a tool people would use:</p>
<ul>
<li>automatically know which project we&#39;re talking about</li>
<li>config files to avoid having to mess with env variables (and leak GitLab tokens)</li>
</ul>
<p>To avoid ruby installation issues, I&#39;ve decided to use <a href="https://www.rust-lang.org/">Rust</a>. There&#39;s a lot of available libraries, the build system works well, it&#39;s sufficiently expressive to let me express what I want, and in the end I get a nice binary.</p>
<h4 id="xdg-basedir-respect-it">XDG basedir. Respect it.</h4>
<p>Reading GitLab credentials from a file is not really hard. One common mistake is to put config files directly in <code>~</code> like some kind of animal. Instead of cluttering users&#39; home directories, I followed the <a href="https://specifications.freedesktop.org/basedir-spec/basedir-spec-0.6.html">XDG basedir spec</a>. Most languages have a library which handles it for you, so it really is a no-brainer (and it works out of the box on Windows as well).</p>
<h4 id="infer-information-from-context">Infer information from context</h4>
<p>To know where the issues should be opened, <code>issues-helper</code> looks at the <code>origin</code> remote of the current git repo. From that, it knows what to do. Even if you&#39;re not currently in the right repo,</p>
<pre><code class="language-bash">j my-project # autojump is great
gli o &quot;My issue&quot; # that&#39;s it
</code></pre>
<h2 id="tools-open-source-them">Tools. Open Source them.</h2>
<p>Once I had this working, not only people started using this tool, but people improved it: <a href="https://twitter.com/keruspe">@keruspe</a> fixed a lot of issues quite quickly. So the next step was to un-hardcode every Clever Cloud specific things in the codebase (then rebase everything, fun afternoon).</p>
<p>Once it was on GitHub, I got more contributions (from inside and outside). Also, it made me add GitHub support: not being able to use issues-helper to manage its own issues quickly got very frustrating.</p>
<p>Supporting GitHub also made me contribute on the GitHub crate, thus closing a vertuous circle.</p>
<p>There are <a href="https://github.com/CleverCloud/issues-helper/issues">a few issues left</a>. Feel free to chime in, I&#39;ll help you get started. It&#39;s a good way to start working on a Rust project!</p>
<h2 id="how-its-done">How it&#39;s done</h2>
<p>The tool itself doesn&#39;t hold a lot of business logic. It parses a project location from a git remote, reads config from a file, sends a few HTTP requests and displays useful information.</p>
<h3 id="cli-arguments-parsing">CLI arguments parsing</h3>
<p>It&#39;s one of the most important parts of a program, since it&#39;s the UI. The Rust ecosystem has <a href="https://clap.rs/">clap</a> which handles everything: parsing, help and even autocompletion.</p>
<p>Unfortunately, the parsed values are exposed through a <code>Map&lt;String,String&gt;</code>, so even though parsing checks structure, you have to recreate the structure yourself. In practice, you end up with a bunch of <code>value.unwrap(); // this should never fail</code>.</p>
<p>Fortunately, there&#39;s <a href="https://crates.io/crates/structopt">Structopt</a>, which generates clap config from Rust data structures: all the dirty stuff is handled for you, and you get nice structs and enums. Yay!</p>
<h3 id="config-files">Config files</h3>
<p>Config is in a toml file, config file location is handled by the <a href="https://crates.io/crates/xdg">xdg crate</a>. Remember: every time you add files to <code>~</code>, a cute puppy dies.</p>
<h2 id="so">So</h2>
<p>Having processes in a team is a good thing, but if you don&#39;t document them, you can&#39;t expect people to respect them. If processes don&#39;t make everyone&#39;s life easier, you can&#39;t expect people to respect them. One simple way to make processes stick is to provide tooling to make them the easiest path. A bash script is cool, but mainly for its author. A stable CLI tool with a good UI, written in a robust language is not a lot of work and will age <em>way</em> better.</p>
<p><em>Post illustration: The Sorcerer&#39;s Apprentice, Disney Movies. Friden calculating machine. Credits: Disney</em></p>
]]></description>
										<content:encoded><![CDATA[<p><img width="1400" height="540" src="https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="tools not rules 1" decoding="async" loading="lazy" srcset="https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1.jpg 1400w, https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1-300x116.jpg 300w, https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1-1024x395.jpg 1024w, https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1-768x296.jpg 768w, https://cdn.clever-cloud.com/uploads/2021/08/tools-not-rules-1-1368x528.jpg 1368w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p><p>A few weeks ago I&#39;ve open sourced <a href="https://github.com/CleverCloud/issues-helper">issues-helper</a>. It allows you to easily interact with issues on GitHub and GitLab, from the command line.</p>
<pre><code class="language-bash">gli o --assignee clementd --label improvement &quot;Degauss the frobulator fluxfield&quot;
</code></pre>
<p>Let&#39;s see why and how it&#39;s done.</p>
<span id="more-2928"></span>

<h2 id="tldr">TL;DR</h2>
<p>Issues are a good way to keep track of decisions in a project. Opening issues should be easy so people don&#39;t forget to write down why they&#39;ve done things. Opening issues from the command line with minimal fuss is a good thing:</p>
<pre><code class="language-bash">gli init # generate initial configuration
gli o &quot;Issue title&quot; &quot;Optional issue text&quot;
  # add --open to open the issue in the browser once created
  # add --assignee to assign issue
  # add --label to add labels to the issue
gli l # list issues
gli b # open the project homepage in your browser
</code></pre>
<h2 id="issues-use-them">Issues. Use them.</h2>
<p>At Clever Cloud, we use git (and GitLab) a lot. In addition to just using git for code, we also rely a lot on issues. Many discussions end with &quot;please open an issue and sum up what we&#39;ve just said&quot;.</p>
<p>Issues are not just for bugs, we use it as a way to track decisions. Some projects don&#39;t even have code and are just there to track discussions and decisions.</p>
<p>My goal, as a CTO, is to make sure we keep track of all of our decisions. So I need people to open issues, to open them often, and to open them early.</p>
<h2 id="processes-make-em-easy">Processes. Make &#39;em easy.</h2>
<p>I work with people, not with robots. While I trust them and I know they&#39;re good at what they do, I just can&#39;t expect them not to make mistakes, or in that case follow processes with no clear incentive. So I needed to remove friction when opening issues. When we interact with code, it&#39;s from the command line: we craft commits, we deploy to production, we even close issues from the command line (while crafting commits). So we should also open issues from the terminal.</p>
<p>My first try was to use the ruby gitlab CLI, but it had several issues:</p>
<ul>
<li>configuration was done with environment variables</li>
<li>it&#39;s written in ruby and can be complicated to install</li>
<li>the output is more or less database rows in ascii tables</li>
<li>you have to specify which project you&#39;re talking about</li>
</ul>
<p>Even though I&#39;ve written documentation and showed people how to use it, it was not used a lot. When a tool feels like a hack, nobody wants to use it.</p>
<h3 id="what-i-wanted">What I wanted</h3>
<p>I needed two things to get a tool people would use:</p>
<ul>
<li>automatically know which project we&#39;re talking about</li>
<li>config files to avoid having to mess with env variables (and leak GitLab tokens)</li>
</ul>
<p>To avoid ruby installation issues, I&#39;ve decided to use <a href="https://www.rust-lang.org/">Rust</a>. There&#39;s a lot of available libraries, the build system works well, it&#39;s sufficiently expressive to let me express what I want, and in the end I get a nice binary.</p>
<h4 id="xdg-basedir-respect-it">XDG basedir. Respect it.</h4>
<p>Reading GitLab credentials from a file is not really hard. One common mistake is to put config files directly in <code>~</code> like some kind of animal. Instead of cluttering users&#39; home directories, I followed the <a href="https://specifications.freedesktop.org/basedir-spec/basedir-spec-0.6.html">XDG basedir spec</a>. Most languages have a library which handles it for you, so it really is a no-brainer (and it works out of the box on Windows as well).</p>
<h4 id="infer-information-from-context">Infer information from context</h4>
<p>To know where the issues should be opened, <code>issues-helper</code> looks at the <code>origin</code> remote of the current git repo. From that, it knows what to do. Even if you&#39;re not currently in the right repo,</p>
<pre><code class="language-bash">j my-project # autojump is great
gli o &quot;My issue&quot; # that&#39;s it
</code></pre>
<h2 id="tools-open-source-them">Tools. Open Source them.</h2>
<p>Once I had this working, not only people started using this tool, but people improved it: <a href="https://twitter.com/keruspe">@keruspe</a> fixed a lot of issues quite quickly. So the next step was to un-hardcode every Clever Cloud specific things in the codebase (then rebase everything, fun afternoon).</p>
<p>Once it was on GitHub, I got more contributions (from inside and outside). Also, it made me add GitHub support: not being able to use issues-helper to manage its own issues quickly got very frustrating.</p>
<p>Supporting GitHub also made me contribute on the GitHub crate, thus closing a vertuous circle.</p>
<p>There are <a href="https://github.com/CleverCloud/issues-helper/issues">a few issues left</a>. Feel free to chime in, I&#39;ll help you get started. It&#39;s a good way to start working on a Rust project!</p>
<h2 id="how-its-done">How it&#39;s done</h2>
<p>The tool itself doesn&#39;t hold a lot of business logic. It parses a project location from a git remote, reads config from a file, sends a few HTTP requests and displays useful information.</p>
<h3 id="cli-arguments-parsing">CLI arguments parsing</h3>
<p>It&#39;s one of the most important parts of a program, since it&#39;s the UI. The Rust ecosystem has <a href="https://clap.rs/">clap</a> which handles everything: parsing, help and even autocompletion.</p>
<p>Unfortunately, the parsed values are exposed through a <code>Map&lt;String,String&gt;</code>, so even though parsing checks structure, you have to recreate the structure yourself. In practice, you end up with a bunch of <code>value.unwrap(); // this should never fail</code>.</p>
<p>Fortunately, there&#39;s <a href="https://crates.io/crates/structopt">Structopt</a>, which generates clap config from Rust data structures: all the dirty stuff is handled for you, and you get nice structs and enums. Yay!</p>
<h3 id="config-files">Config files</h3>
<p>Config is in a toml file, config file location is handled by the <a href="https://crates.io/crates/xdg">xdg crate</a>. Remember: every time you add files to <code>~</code>, a cute puppy dies.</p>
<h2 id="so">So</h2>
<p>Having processes in a team is a good thing, but if you don&#39;t document them, you can&#39;t expect people to respect them. If processes don&#39;t make everyone&#39;s life easier, you can&#39;t expect people to respect them. One simple way to make processes stick is to provide tooling to make them the easiest path. A bash script is cool, but mainly for its author. A stable CLI tool with a good UI, written in a robust language is not a lot of work and will age <em>way</em> better.</p>
<p><em>Post illustration: The Sorcerer&#39;s Apprentice, Disney Movies. Friden calculating machine. Credits: Disney</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Manage your Conference CFP</title>
		<link>https://www.clever.cloud/blog/features/2018/01/30/manage-cfp/</link>
		
		<dc:creator><![CDATA[Laurent Doguin]]></dc:creator>
		<pubDate>Tue, 30 Jan 2018 11:11:00 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[play]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[Scala]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2018/01/30/manage-cfp/</guid>

					<description><![CDATA[<p><img width="1400" height="540" src="https://cdn.clever-cloud.com/uploads/2021/08/cfps-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="cfps 1" decoding="async" loading="lazy" srcset="https://cdn.clever-cloud.com/uploads/2021/08/cfps-1.jpg 1400w, https://cdn.clever-cloud.com/uploads/2021/08/cfps-1-300x116.jpg 300w, https://cdn.clever-cloud.com/uploads/2021/08/cfps-1-1024x395.jpg 1024w, https://cdn.clever-cloud.com/uploads/2021/08/cfps-1-768x296.jpg 768w, https://cdn.clever-cloud.com/uploads/2021/08/cfps-1-1368x528.jpg 1368w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p><p>At Clever Cloud we often go to conferences, we answer many CFPs and some of us are even organising conferences from time to time. As such, we understand the amount of work required to manage these.</p>
<span id="more-2927"></span>

<p>Just like organizing a conference, managing a CFP can become cumbersome. That&#39;s why people started writing new applications from scratch to handle it. Some of them chose Clever Cloud to host them of course. Among those, you will find <a href="http://www.cfp.io/">cfp.io</a> and the <a href="https://cfp.devoxx.fr/">Devoxx family</a>.</p>
<p>Some of you asked us if it was possible to run the one used by Devoxx. In this post I will show you how to deploy it on Clever Cloud.</p>
<h2 id="setup">Setup</h2>
<p>The application is written in Scala and is based on Play Framework:</p>
<blockquote>
Play Framework makes it easy to build web applications with Java & Scala. Play is based on a lightweight, stateless, web-friendly architecture. Built on Akka, Play provides predictable and minimal resource consumption (CPU, memory, threads) for highly-scalable applications.
</blockquote>

<p>You will find the code on our good friend <a href="https://github.com/nicmarti/cfp-devoxx">Nicolas Martignole&#39;s Github account</a>. Take a look at the Readme if you want to run the application locally first. You will see that it needs to write on disk, to store data on Redis, and can optionally benefit from fulltext search with Elastic and accounts on several external services. Don&#39;t worry, you don&#39;t need everything from the start.</p>
<p>If you want to tag along, make sure you have Git, a Clever Cloud account and that you have installed our CLI <a href="https://www.clever.cloud/developers/clever-tools/getting_started/">Clever-Tools</a>. Let&#39;s start:</p>
<ul>
<li>Clone the project: <code>git clone https://github.com/nicmarti/cfp-devoxx</code></li>
<li>Get in the project: <code>cd cfp-devoxx</code></li>
<li>Create the Redis add-on: <code>clever addon create redis-addon --plan s --region eu redisCFP</code></li>
<li>Create the FS Bucket add-on: <code>clever addon create fs-bucket --plan s --region eu fsCFP</code></li>
<li>Create the application: <code>clever create --type sbt MyCFP </code></li>
<li>Link the Redis add-on: <code>clever service link-addon redisCFP</code></li>
<li>Link the FS Bucket add-on: <code>clever service link-addon fsCFP</code></li>
<li>Define where to mount our FS Bucket: <code>clever env set CC_FS_BUCKET /devoxx-content:`clever env | awk  -F = &#39;/BUCKET_HOST/ { print $2}&#39;` </code></li>
<li>Remove the old FSBucket configuration: <code>git rm clevercloud/buckets.json &amp;&amp; git commit -m&quot;remove old bucket configuration&quot;</code></li>
<li>Copy the production configuration sample: <code>cp conf/redis-sample-prod.conf application.conf </code></li>
<li>Add your changes and commit them: <code>git add application.conf;git commit -m&quot;add default conf&quot;</code></li>
</ul>
<p>We now have to configure the application using environment variables, here is my dummy test configuration:</p>
<pre><code class="language-bash">ACTIVATE_FAVORITES=true
ACTIVATE_GOLDEN_TICKET=false
ACTIVATE_HTTPS=true
ACTIVATE_VOTE=true
APP_SECRET=1f0bc136-5c99-1e6-bee8-60f81dae2bbc
BITBUCKET_PASSWORD=foobar
BITBUCKET_URL=https://bitbucket.org/api/1.0/repositories/foo/bar/issues
BITBUCKET_USERNAME=foobar
BUCKET_ROOTFOLDER=/app
CC_FS_BUCKET=/devoxx-content:bucket-35ca2d97-ff0e-42fb-ba37-abb815fb90a1-fsbucket.services.clever-cloud.com
CFP_HOSTNAME=app_a6dcb49e-1e16-4e06-8f45-dc9e0e838959.cleverapps.io
CFP_IS_OPEN=false
CFP_LANG=en
CRON_DAYS=2
CRON_UPDATER=false
DIGEST_DAILY=08:00
DIGEST_WEEKLY=1
ENABLE_METRICS=true
ES_ADDON_PASSWORD=foobar
ES_ADDON_URI=http://elasticsearch:9200
ES_ADDON_USER=foobar
GITHUB_ID=foobar
GITHUB_SECRET=foobar
GOOGLE_ID=foobar.apps.googleusercontent.com
GOOGLE_SECRET=foobar
JAVA_VERSION=8
LINKEDIN_CLIEND_ID=foobar
LINKEDIN_SECRET=foobar
MAIL_BCC=foobar@devoxx.fr
MAIL_BUG_REPORT=foobar@devoxx.fr
MAIL_COMMITTEE=foobar@devoxx.fr
MAIL_FROM=foobar@devoxx.fr
OPSGENIE_API=TOD
OPSGENIE_NAME=foobar
PORT=8080
SMTP_HOST=in-v3.mailjet.com
SMTP_MOCK=true
SMTP_PASSWORD=foobar
SMTP_PORT=587
SMTP_SSL=false
SMTP_USER=foobar
</code></pre>
<p>You can copy/paste this in the <em>Environment variables</em> tab of your application using the <em>Expert Mode</em>. Make sure you set the value of <em>CFP_HOSTNAME</em> to your domain name; Clever Cloud will assign one by default: take a look at the <em>Domain Names</em> tab in our web console to see it or change it (or use <code>clever domain</code>).</p>
<p>And that&#39;s it, your configuration is done. The next step is to deploy your application by running <code>clever deploy</code>.</p>
<h2 id="whats-next">What&#39;s next?</h2>
<p>Your application should be running now. You can run <code>clever open</code> to make sure it is. It will open it in your default browser.</p>
<img alt="Default CFP homepage" src="https://www2.cleverapps.io/app/uploads/2021/08/cfp_devoxx.png"/>

<p>Now, you can start tweaking the configuration of your application. You can start by looking at all those environment variables if you have not already. There is one point where you will probably ask yourself how to get SMTP crendentials or an Elasticsearch instance from Clever Cloud. While we currently don&#39;t have any partnership with e-mails providers, you can ping our support team for the Elastic instance. It&#39;s currently in private beta and should soon be open to the public.</p>
<p>If you are looking for more documentation, I invite you to check out the Github repository issues and to give a good look at the production configuration file <a href="https://github.com/nicmarti/cfp-devoxx/blob/dev/conf/application.conf.prod">conf/application.conf.prod</a>. I believe some of them are not mandatory. It would be great to have a documentation update just for the environment variables.</p>
<p>If you are going to use this for your conference, remember to activate autoscaling: <code>clever scale --min-instances 1 --max-instances 2</code>. And if you dread the weekend before your CFP closes, increase the number of minimum instances with <code>clever scale --instances 2</code>.</p>
<p><em>Post illustration: Computer at her work with microscope and the Friden calculating machine. Credits: NASA</em></p>
]]></description>
										<content:encoded><![CDATA[<p><img width="1400" height="540" src="https://cdn.clever-cloud.com/uploads/2021/08/cfps-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="cfps 1" decoding="async" loading="lazy" srcset="https://cdn.clever-cloud.com/uploads/2021/08/cfps-1.jpg 1400w, https://cdn.clever-cloud.com/uploads/2021/08/cfps-1-300x116.jpg 300w, https://cdn.clever-cloud.com/uploads/2021/08/cfps-1-1024x395.jpg 1024w, https://cdn.clever-cloud.com/uploads/2021/08/cfps-1-768x296.jpg 768w, https://cdn.clever-cloud.com/uploads/2021/08/cfps-1-1368x528.jpg 1368w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p><p>At Clever Cloud we often go to conferences, we answer many CFPs and some of us are even organising conferences from time to time. As such, we understand the amount of work required to manage these.</p>
<span id="more-2927"></span>

<p>Just like organizing a conference, managing a CFP can become cumbersome. That&#39;s why people started writing new applications from scratch to handle it. Some of them chose Clever Cloud to host them of course. Among those, you will find <a href="http://www.cfp.io/">cfp.io</a> and the <a href="https://cfp.devoxx.fr/">Devoxx family</a>.</p>
<p>Some of you asked us if it was possible to run the one used by Devoxx. In this post I will show you how to deploy it on Clever Cloud.</p>
<h2 id="setup">Setup</h2>
<p>The application is written in Scala and is based on Play Framework:</p>
<blockquote>
Play Framework makes it easy to build web applications with Java & Scala. Play is based on a lightweight, stateless, web-friendly architecture. Built on Akka, Play provides predictable and minimal resource consumption (CPU, memory, threads) for highly-scalable applications.
</blockquote>

<p>You will find the code on our good friend <a href="https://github.com/nicmarti/cfp-devoxx">Nicolas Martignole&#39;s Github account</a>. Take a look at the Readme if you want to run the application locally first. You will see that it needs to write on disk, to store data on Redis, and can optionally benefit from fulltext search with Elastic and accounts on several external services. Don&#39;t worry, you don&#39;t need everything from the start.</p>
<p>If you want to tag along, make sure you have Git, a Clever Cloud account and that you have installed our CLI <a href="https://www.clever.cloud/developers/clever-tools/getting_started/">Clever-Tools</a>. Let&#39;s start:</p>
<ul>
<li>Clone the project: <code>git clone https://github.com/nicmarti/cfp-devoxx</code></li>
<li>Get in the project: <code>cd cfp-devoxx</code></li>
<li>Create the Redis add-on: <code>clever addon create redis-addon --plan s --region eu redisCFP</code></li>
<li>Create the FS Bucket add-on: <code>clever addon create fs-bucket --plan s --region eu fsCFP</code></li>
<li>Create the application: <code>clever create --type sbt MyCFP </code></li>
<li>Link the Redis add-on: <code>clever service link-addon redisCFP</code></li>
<li>Link the FS Bucket add-on: <code>clever service link-addon fsCFP</code></li>
<li>Define where to mount our FS Bucket: <code>clever env set CC_FS_BUCKET /devoxx-content:`clever env | awk  -F = &#39;/BUCKET_HOST/ { print $2}&#39;` </code></li>
<li>Remove the old FSBucket configuration: <code>git rm clevercloud/buckets.json &amp;&amp; git commit -m&quot;remove old bucket configuration&quot;</code></li>
<li>Copy the production configuration sample: <code>cp conf/redis-sample-prod.conf application.conf </code></li>
<li>Add your changes and commit them: <code>git add application.conf;git commit -m&quot;add default conf&quot;</code></li>
</ul>
<p>We now have to configure the application using environment variables, here is my dummy test configuration:</p>
<pre><code class="language-bash">ACTIVATE_FAVORITES=true
ACTIVATE_GOLDEN_TICKET=false
ACTIVATE_HTTPS=true
ACTIVATE_VOTE=true
APP_SECRET=1f0bc136-5c99-1e6-bee8-60f81dae2bbc
BITBUCKET_PASSWORD=foobar
BITBUCKET_URL=https://bitbucket.org/api/1.0/repositories/foo/bar/issues
BITBUCKET_USERNAME=foobar
BUCKET_ROOTFOLDER=/app
CC_FS_BUCKET=/devoxx-content:bucket-35ca2d97-ff0e-42fb-ba37-abb815fb90a1-fsbucket.services.clever-cloud.com
CFP_HOSTNAME=app_a6dcb49e-1e16-4e06-8f45-dc9e0e838959.cleverapps.io
CFP_IS_OPEN=false
CFP_LANG=en
CRON_DAYS=2
CRON_UPDATER=false
DIGEST_DAILY=08:00
DIGEST_WEEKLY=1
ENABLE_METRICS=true
ES_ADDON_PASSWORD=foobar
ES_ADDON_URI=http://elasticsearch:9200
ES_ADDON_USER=foobar
GITHUB_ID=foobar
GITHUB_SECRET=foobar
GOOGLE_ID=foobar.apps.googleusercontent.com
GOOGLE_SECRET=foobar
JAVA_VERSION=8
LINKEDIN_CLIEND_ID=foobar
LINKEDIN_SECRET=foobar
MAIL_BCC=foobar@devoxx.fr
MAIL_BUG_REPORT=foobar@devoxx.fr
MAIL_COMMITTEE=foobar@devoxx.fr
MAIL_FROM=foobar@devoxx.fr
OPSGENIE_API=TOD
OPSGENIE_NAME=foobar
PORT=8080
SMTP_HOST=in-v3.mailjet.com
SMTP_MOCK=true
SMTP_PASSWORD=foobar
SMTP_PORT=587
SMTP_SSL=false
SMTP_USER=foobar
</code></pre>
<p>You can copy/paste this in the <em>Environment variables</em> tab of your application using the <em>Expert Mode</em>. Make sure you set the value of <em>CFP_HOSTNAME</em> to your domain name; Clever Cloud will assign one by default: take a look at the <em>Domain Names</em> tab in our web console to see it or change it (or use <code>clever domain</code>).</p>
<p>And that&#39;s it, your configuration is done. The next step is to deploy your application by running <code>clever deploy</code>.</p>
<h2 id="whats-next">What&#39;s next?</h2>
<p>Your application should be running now. You can run <code>clever open</code> to make sure it is. It will open it in your default browser.</p>
<img alt="Default CFP homepage" src="https://www2.cleverapps.io/app/uploads/2021/08/cfp_devoxx.png"/>

<p>Now, you can start tweaking the configuration of your application. You can start by looking at all those environment variables if you have not already. There is one point where you will probably ask yourself how to get SMTP crendentials or an Elasticsearch instance from Clever Cloud. While we currently don&#39;t have any partnership with e-mails providers, you can ping our support team for the Elastic instance. It&#39;s currently in private beta and should soon be open to the public.</p>
<p>If you are looking for more documentation, I invite you to check out the Github repository issues and to give a good look at the production configuration file <a href="https://github.com/nicmarti/cfp-devoxx/blob/dev/conf/application.conf.prod">conf/application.conf.prod</a>. I believe some of them are not mandatory. It would be great to have a documentation update just for the environment variables.</p>
<p>If you are going to use this for your conference, remember to activate autoscaling: <code>clever scale --min-instances 1 --max-instances 2</code>. And if you dread the weekend before your CFP closes, increase the number of minimum instances with <code>clever scale --instances 2</code>.</p>
<p><em>Post illustration: Computer at her work with microscope and the Friden calculating machine. Credits: NASA</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Lambdacon 2015</title>
		<link>https://www.clever.cloud/blog/company/2015/04/07/lambdacon/</link>
		
		<dc:creator><![CDATA[Clement Delafargue]]></dc:creator>
		<pubDate>Tue, 07 Apr 2015 14:12:00 +0000</pubDate>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[fp]]></category>
		<category><![CDATA[Scala]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2015/04/07/lambdacon/</guid>

					<description><![CDATA[<p><img width="1400" height="540" src="https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="lambdacon 1" decoding="async" loading="lazy" srcset="https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1.jpg 1400w, https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1-300x116.jpg 300w, https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1-1024x395.jpg 1024w, https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1-768x296.jpg 768w, https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1-1368x528.jpg 1368w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p><p>Here at Clever Cloud, we&#39;re enthusiastic users of functional programming. It helps us a lot when it comes to have clean and maintainable code.</p>
<p>That&#39;s why we were delighted to fly to Bologna for the LambdaCon, to meet the Italian FP community as well as some twitter friends.</p>
<span id="more-2742"></span>

<p>After a stop at Yoox offices where Quentin and I got the opportunity to have a chat with developers and the other speakers, it was time for the actual conference.</p>
<h2 id="fun-with-categories">Fun with Categories</h2>
<p>Many interesting functional programming concepts come directly from a branch of mathematics called Category Theory. The keynote speaker <a href="https://twitter.com/bartoszmilewski">Bartosz Milewski</a> went as far as saying that CT is the next revolution after mainstream FP adoption.</p>
<p>I was surprised to witness that &quot;Kleisli Category&quot; frightened people less than the dreaded M-word.</p>
<p>Category Theory is a vast field and can be intimidating for newcomers due to its extremely high level of abstraction, but the good news is that Bartosz is writing an introduction book aimed at developers.</p>
<h2 id="dissecting-the-rabbit">Dissecting the rabbit</h2>
<p>Since we use RabbitMQ a lot at Clever Cloud, we were happy to be able to attend <a href="https://twitter.com/old_sound">Alvaro Videla</a>&#39;s talk about RabbitMQ&#39;s internals, especially the actor hierarchy in place inside RabbitMQ.</p>
<h2 id="streams-on-top-of-scala">Streams on top of Scala</h2>
<p>We&#39;re big users of Scala and we deal with a lot of streamed data. That&#39;s why we&#39;ve been using Scala&#39;s streaming libraries a lot, first with Play&#39;s iteratees, then with scalaz-streams and akka-streams.</p>
<p>Quentin did a nice round-up of what&#39;s available and the different use cases for streaming libs in Scala.</p>
<p>The slides are available on slideshare: 
<a href="http://www.slideshare.net/quentinadam/streams-on-top-of-scala-lambdacon">Streams on top of Scala</a></p>
<h2 id="tdd-as-in-type-directed-development">TDD as in Type-Directed Development</h2>
<p>Even though I&#39;ve started my career with dynamicallly typed languages, I&#39;ve been very happy with static, expressive type systems these last years. In this talk I showed how to use types not only for safety, but as a very powerful design and communication tool.</p>
<p>You can have a look at the slides: <a href="https://clementd-files.cellar.services.clever-cloud.com/blog/typedd-lambdacon.html">TDD, as in Type-Directed Development</a></p>
<h2 id="the-european-fp-community-is-great">The european FP community is great</h2>
<p>The people from CodersTug did a great job for their first conference. And it&#39;s great to see such forward-thinking events take place in Europe.</p>
<p><a href="https://twitter.com/Dorvaryn/status/581873184909238273"><img src="https://www2.cleverapps.io/app/uploads/2021/08/lambdacon-speakers.jpg" alt=""></a></p>
]]></description>
										<content:encoded><![CDATA[<p><img width="1400" height="540" src="https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="lambdacon 1" decoding="async" loading="lazy" srcset="https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1.jpg 1400w, https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1-300x116.jpg 300w, https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1-1024x395.jpg 1024w, https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1-768x296.jpg 768w, https://cdn.clever-cloud.com/uploads/2021/08/lambdacon-1-1368x528.jpg 1368w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p><p>Here at Clever Cloud, we&#39;re enthusiastic users of functional programming. It helps us a lot when it comes to have clean and maintainable code.</p>
<p>That&#39;s why we were delighted to fly to Bologna for the LambdaCon, to meet the Italian FP community as well as some twitter friends.</p>
<span id="more-2742"></span>

<p>After a stop at Yoox offices where Quentin and I got the opportunity to have a chat with developers and the other speakers, it was time for the actual conference.</p>
<h2 id="fun-with-categories">Fun with Categories</h2>
<p>Many interesting functional programming concepts come directly from a branch of mathematics called Category Theory. The keynote speaker <a href="https://twitter.com/bartoszmilewski">Bartosz Milewski</a> went as far as saying that CT is the next revolution after mainstream FP adoption.</p>
<p>I was surprised to witness that &quot;Kleisli Category&quot; frightened people less than the dreaded M-word.</p>
<p>Category Theory is a vast field and can be intimidating for newcomers due to its extremely high level of abstraction, but the good news is that Bartosz is writing an introduction book aimed at developers.</p>
<h2 id="dissecting-the-rabbit">Dissecting the rabbit</h2>
<p>Since we use RabbitMQ a lot at Clever Cloud, we were happy to be able to attend <a href="https://twitter.com/old_sound">Alvaro Videla</a>&#39;s talk about RabbitMQ&#39;s internals, especially the actor hierarchy in place inside RabbitMQ.</p>
<h2 id="streams-on-top-of-scala">Streams on top of Scala</h2>
<p>We&#39;re big users of Scala and we deal with a lot of streamed data. That&#39;s why we&#39;ve been using Scala&#39;s streaming libraries a lot, first with Play&#39;s iteratees, then with scalaz-streams and akka-streams.</p>
<p>Quentin did a nice round-up of what&#39;s available and the different use cases for streaming libs in Scala.</p>
<p>The slides are available on slideshare: 
<a href="http://www.slideshare.net/quentinadam/streams-on-top-of-scala-lambdacon">Streams on top of Scala</a></p>
<h2 id="tdd-as-in-type-directed-development">TDD as in Type-Directed Development</h2>
<p>Even though I&#39;ve started my career with dynamicallly typed languages, I&#39;ve been very happy with static, expressive type systems these last years. In this talk I showed how to use types not only for safety, but as a very powerful design and communication tool.</p>
<p>You can have a look at the slides: <a href="https://clementd-files.cellar.services.clever-cloud.com/blog/typedd-lambdacon.html">TDD, as in Type-Directed Development</a></p>
<h2 id="the-european-fp-community-is-great">The european FP community is great</h2>
<p>The people from CodersTug did a great job for their first conference. And it&#39;s great to see such forward-thinking events take place in Europe.</p>
<p><a href="https://twitter.com/Dorvaryn/status/581873184909238273"><img src="https://www2.cleverapps.io/app/uploads/2021/08/lambdacon-speakers.jpg" alt=""></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How I learned Scala in one month</title>
		<link>https://www.clever.cloud/blog/engineering/2015/03/20/getting-started-with-scala/</link>
		
		<dc:creator><![CDATA[Leonard Imbert]]></dc:creator>
		<pubDate>Fri, 20 Mar 2015 15:32:00 +0000</pubDate>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2015/03/20/getting-started-with-scala/</guid>

					<description><![CDATA[<p><img width="1400" height="540" src="https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="getting started scala 1" decoding="async" loading="lazy" srcset="https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1.png 1400w, https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1-300x116.png 300w, https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1-1024x395.png 1024w, https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1-768x296.png 768w, https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1-1368x528.png 1368w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p>Hi, I’m Leonard. I have been an intern developer at Clever Cloud for one month now. When I came in, the CEO put me on a <a href="https://www.clever.cloud/product/scala-applications/">Scala</a> project the first day. As a software engineer, there’s often a pressure to know everything, and I had never done scala before. My only experience in programming was html, php, javascript, and a little bit of java. So I had to dive into this new language quite quickly.

<span id="more-2795"></span>

The thing is, Scala is a functional programming language. And the most brutal change was to learn this new paradigm. If you don't know what functional programming is, there is something you need to understand. In FP, the trick is to do everything only with functions (as in math function). Define the purest function that you can.

But you'll ask me, what is the interest of a pure function? A pure function is very useful because it can be tested separately, and especially because it's very reusable!
<figure><img src="https://www2.cleverapps.io/app/uploads/2021/08/skyrim-vahala.gif" />
<figcaption>First steps towards the infinite beauty of pure functions</figcaption></figure>
<h3 id="whats-a-pure-function">What’s a pure function?</h3>
A pure function takes a value, returns an other value and does nothing else. For a given argument, it always returns the same result. You don't want any side effect like database calls, etc. But there’s some help from the compiler: Scala has a strong static type system. Be sure the compiler will yell at you if you try to bypass it.

At first sight, Scala can look like an awful programming language, especially if you only code in javascript or php. But after a couple of weeks, by trying hard and being bashed a lot by the compiler, your code gets more and more structured. You finally get used to pure functions, and employ less and less side effects and mutating values.

After one month, I did not become a professional in Scala, but I’m now more and more comfortable with it and I find pleasure in coding. I began to integrate the abilities of FP principles and their great potential. Think about all the possibilities it can offer: it is almost endless.
<h3 id="getting-started-with-scala">Getting started with Scala</h3>
To learn scala, it’s useful to have some tooling in order to evaluate your code. Check the <a href="http://scala-lang.org">download page</a> to get typesafe activator. If you have a favorite IDE, I recommend to keep it. Else I personally use vim or sublime text, where Scala syntax highlighting works out of the box.

First, there is more than one way to learn scala. A good way is to look at concrete exercises. Try to rewrite a basic mathematical function or some exercises like this one.

"I have x employees in my office. I want to have the sum of the salary of all Senior employees"

First we need to create the <code>Employee</code> class
<pre><code class="language-scala">case class Employee(name: String, title: String, salary: Int)
</code></pre>
Then we create a list of these salary
<pre><code class="language-scala">val employees: List[Employee] = List(
  Employee("Smith", "Junior Developer", 1250),
  Employee("George", "Senior Analyst", 2000),
  Employee("David", "Cadet Developer", 1000),
  Employee("Bernard", "Senior Developer", 2100),
  Employee("Clement", "Senior Developer", 1850)
)
</code></pre>
I then define a function which takes an <code>Employee</code> as a parameter, and returns true if the employee title begins with "Senior".
<pre><code class="language-scala">def isSenior(employee: Employee) = employee.title.startsWith("Senior")
</code></pre>
Finally, we just apply <code>isSenior</code> on the list of employees to keep the senior employees, and then sum their salaries.
<pre><code class="language-scala">val seniorSalaries =
   employees
     .filter(isSenior _)
     .map(_.salary)
     .sum
</code></pre>
To explain, we apply the <code>filter</code> method to our list. <code>filter</code> is a native function which selects all elements which satisfy a predicate (here the <code>isSenior</code> function). Then we map over it. <code>map</code> transforms a list of elements of type A into a list of elements of type B, by applying a function from A to B to all its elements. Here, we transform a <code>List[Employee]</code> into a <code>List[Int]</code> by getting the salary of each employee. Finally, we do a sum on the list of salaries.

As you can see, we solved the problem with small pure functions. They are reusable regardless of the context and we were able to compose them with functions provided by the scala standard library.

If you want to dig deeper into Scala, check this <a href="http://manning.com/bjarnason/">book</a>

If you have any questions, don’t hesitate to send me an email at <a href="mailto:leonard.imbert@clever-cloud.com">leonard.imbert@clever-cloud.com</a>]]></description>
										<content:encoded><![CDATA[<p><img width="1400" height="540" src="https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="getting started scala 1" decoding="async" loading="lazy" srcset="https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1.png 1400w, https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1-300x116.png 300w, https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1-1024x395.png 1024w, https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1-768x296.png 768w, https://cdn.clever-cloud.com/uploads/2021/08/getting-started-scala-1-1368x528.png 1368w" sizes="auto, (max-width: 1400px) 100vw, 1400px" /></p>Hi, I’m Leonard. I have been an intern developer at Clever Cloud for one month now. When I came in, the CEO put me on a <a href="https://www.clever.cloud/product/scala-applications/">Scala</a> project the first day. As a software engineer, there’s often a pressure to know everything, and I had never done scala before. My only experience in programming was html, php, javascript, and a little bit of java. So I had to dive into this new language quite quickly.

<span id="more-2795"></span>

The thing is, Scala is a functional programming language. And the most brutal change was to learn this new paradigm. If you don't know what functional programming is, there is something you need to understand. In FP, the trick is to do everything only with functions (as in math function). Define the purest function that you can.

But you'll ask me, what is the interest of a pure function? A pure function is very useful because it can be tested separately, and especially because it's very reusable!
<figure><img src="https://www2.cleverapps.io/app/uploads/2021/08/skyrim-vahala.gif" />
<figcaption>First steps towards the infinite beauty of pure functions</figcaption></figure>
<h3 id="whats-a-pure-function">What’s a pure function?</h3>
A pure function takes a value, returns an other value and does nothing else. For a given argument, it always returns the same result. You don't want any side effect like database calls, etc. But there’s some help from the compiler: Scala has a strong static type system. Be sure the compiler will yell at you if you try to bypass it.

At first sight, Scala can look like an awful programming language, especially if you only code in javascript or php. But after a couple of weeks, by trying hard and being bashed a lot by the compiler, your code gets more and more structured. You finally get used to pure functions, and employ less and less side effects and mutating values.

After one month, I did not become a professional in Scala, but I’m now more and more comfortable with it and I find pleasure in coding. I began to integrate the abilities of FP principles and their great potential. Think about all the possibilities it can offer: it is almost endless.
<h3 id="getting-started-with-scala">Getting started with Scala</h3>
To learn scala, it’s useful to have some tooling in order to evaluate your code. Check the <a href="http://scala-lang.org">download page</a> to get typesafe activator. If you have a favorite IDE, I recommend to keep it. Else I personally use vim or sublime text, where Scala syntax highlighting works out of the box.

First, there is more than one way to learn scala. A good way is to look at concrete exercises. Try to rewrite a basic mathematical function or some exercises like this one.

"I have x employees in my office. I want to have the sum of the salary of all Senior employees"

First we need to create the <code>Employee</code> class
<pre><code class="language-scala">case class Employee(name: String, title: String, salary: Int)
</code></pre>
Then we create a list of these salary
<pre><code class="language-scala">val employees: List[Employee] = List(
  Employee("Smith", "Junior Developer", 1250),
  Employee("George", "Senior Analyst", 2000),
  Employee("David", "Cadet Developer", 1000),
  Employee("Bernard", "Senior Developer", 2100),
  Employee("Clement", "Senior Developer", 1850)
)
</code></pre>
I then define a function which takes an <code>Employee</code> as a parameter, and returns true if the employee title begins with "Senior".
<pre><code class="language-scala">def isSenior(employee: Employee) = employee.title.startsWith("Senior")
</code></pre>
Finally, we just apply <code>isSenior</code> on the list of employees to keep the senior employees, and then sum their salaries.
<pre><code class="language-scala">val seniorSalaries =
   employees
     .filter(isSenior _)
     .map(_.salary)
     .sum
</code></pre>
To explain, we apply the <code>filter</code> method to our list. <code>filter</code> is a native function which selects all elements which satisfy a predicate (here the <code>isSenior</code> function). Then we map over it. <code>map</code> transforms a list of elements of type A into a list of elements of type B, by applying a function from A to B to all its elements. Here, we transform a <code>List[Employee]</code> into a <code>List[Int]</code> by getting the salary of each employee. Finally, we do a sum on the list of salaries.

As you can see, we solved the problem with small pure functions. They are reusable regardless of the context and we were able to compose them with functions provided by the scala standard library.

If you want to dig deeper into Scala, check this <a href="http://manning.com/bjarnason/">book</a>

If you have any questions, don’t hesitate to send me an email at <a href="mailto:leonard.imbert@clever-cloud.com">leonard.imbert@clever-cloud.com</a>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Java &#038; Scala support released</title>
		<link>https://www.clever.cloud/blog/company/2013/04/11/sbt-and-java-war-on-clever-cloud/</link>
		
		<dc:creator><![CDATA[Adrien Cretté]]></dc:creator>
		<pubDate>Thu, 11 Apr 2013 00:00:00 +0000</pubDate>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[Scala]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2013/04/11/sbt-and-java-war-on-clever-cloud/</guid>

					<description><![CDATA[French version below A new feature for Scala users + Simple Built Tool (SBT), the build tool for Scala projects, is now available on Clever Cloud, in open beta. Follow this link to our documentation for more informations. And also for Java users We also take the opportunity to make available WAR deployment for Java [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><em>French version below</em></p>
<h2 id="a-new-feature-for-scala-users">A new feature for Scala users</h2>
<div class="pull-right" style="margin-left: 20px;"><img decoding="async" style="padding-bottom: 16px;" title="War containers available!" src="https://www2.cleverapps.io/app/uploads/2021/08/round128px-java.png" alt="Java" width="64px" /><br />
<span style="font-size: 26px;">+</span><br />
<img decoding="async" style="padding-bottom: 16px;" title="SBT available!" src="https://www2.cleverapps.io/app/uploads/2021/08/round128px-scala.png" alt="Scala" width="64px" /></div>
<p>Simple Built Tool (SBT), the build tool for Scala projects, is now available on Clever Cloud, in open beta. Follow this link to our <a href="https://www.clever.cloud/developers/deploy/application/scala/scala/" target="_blank" rel="noopener noreferrer">documentation</a> for more informations.</p>
<p><span id="more-2717"></span></p>
<h2 id="and-also-for-java-users">And also for Java users</h2>
<p>We also take the opportunity to make available WAR deployment for Java projects on our PaaS. Clever Cloud provides many WAR containers including Jetty, Tomcat and GlassFish. You can find a table with each of them on our <a href="https://www.clever.cloud/developers/deploy/application/java/java-war/" target="_blank" rel="noopener noreferrer">documentation</a>.</p>
<h2 id="last-week-review">Last week review</h2>
<p>The new graphs of our console are more beautiful, more complete and in addition they give more informations.</p>
<div class="center" style="margin: 0 auto 20px; width: 600px;"><a href="https://www2.cleverapps.io/app/uploads/2021/08/graph2.png" target="_blank" rel="noopener noreferrer"><br />
<img decoding="async" src="https://www2.cleverapps.io/app/uploads/2021/08/graph2.png" alt="postgresql" /><br />
</a></div>
<p>Now, you can check app by app the evolution of your consumption while having a global vision of all your apps.</p>
<p>By the way, we want to come back on the huge success of our website dedicated to Node.JS in the Cloud. As a reminder, this is the first auto-scaling Node.JS PaaS hosting. It was also the opportunity to see the great japaneses community supporting Node.JS!</p>
<hr />
<p><em>Version française</em></p>
<h2 id="une-nouvelle-fonctionnalité-pour-les-utilisateurs-de-scala">Une nouvelle fonctionnalité pour les utilisateurs de Scala</h2>
<p>L&#8217;outil de build pour les projets Scala, SBT, est maintenant disponible sur Clever Cloud en open beta. Rendez-vous sur <a href="https://www.clever.cloud/developers/deploy/application/scala/scala/" target="_blank" rel="noopener noreferrer">la documentation</a> pour plus d&#8217;informations.</p>
<h2 id="et-aussi-pour-les-utilisateurs-java">Et aussi pour les utilisateurs Java</h2>
<p>Nous en avons profité pour rendre également disponible le déploiement des projets Java WAR sur notre PaaS. Clever Cloud propose un grand nombre de conteneurs dont Jetty, Tomcat et GlassFish. Vous les retrouverez dans le tableau de notre <a href="https://www.clever.cloud/developers/deploy/application/java/java-war/" target="_blank" rel="noopener noreferrer">page de documentation dédiée</a> .</p>
<h2 id="la-semaine-dernière">La semaine dernière</h2>
<p>Les nouveaux graphs de notre console sont plus jolis, plus complets et en plus ils délivrent plus d&#8217;informations (voir photo ci-dessus).</p>
<p>Désormais, il est possible de voir application par application l&#8217;évolution de la consommation en drops mais aussi d&#8217;obtenir une vision globale de l&#8217;ensemble de vos aplications.</p>
<p>Aussi nous souhaitions revenir sur l&#8217;énorme succès de notre site dédié à Node.JS sur Clever Cloud.<br />
Rappelons qu&#8217;il sagit du premier hébergement cloud Node.JS <em>auto-scalable</em>. Ce fut aussi l&#8217;occasion de voir l&#8217;importante communauté japonaise soutenant Node.JS.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Kickstart your scala API client by turning JSON into case classes.</title>
		<link>https://www.clever.cloud/blog/engineering/2013/02/21/json2caseclass-kickstart-your-scala-api-client-by-turning-json-into-case-classes/</link>
		
		<dc:creator><![CDATA[Quentin Adam]]></dc:creator>
		<pubDate>Thu, 21 Feb 2013 00:00:00 +0000</pubDate>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Scala]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2013/02/21/json2caseclass-kickstart-your-scala-api-client-by-turning-json-into-case-classes/</guid>

					<description><![CDATA[Why code generation? When interacting with 3rd party json-based APIs from scala, modelling the API&#39;s responses with case classes can come in handy. If the JSON exhibits some properties (homogenous lists, for instance), it&#39;s easy to create a case class with the same structure. With some deserialization magic it&#39;s easier to deal with the API&#39;s [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2 id="why-code-generation">Why code generation?</h2>
<p>When interacting with 3rd party json-based APIs from scala, modelling the API&#39;s responses with case classes can come in handy. If the JSON exhibits some properties (homogenous lists, for instance), it&#39;s easy to create a case class with the same structure. With some deserialization magic it&#39;s easier to deal with the API&#39;s responses.</p>
<p><span id="more-2792"></span></p>
<p>So basically is borring to write the case class, and the tool is doing it for you. The target was not to be perfect, but just to allow you quickly generate some case class.</p>
<p>You can test it here : <a href="http://json2caseclass.cleverapps.io/">http://json2caseclass.cleverapps.io/</a></p>
<p>So here is the repo :</p>
<div class="github-widget" data-repo="CleverCloud/json2caseclass"></div>
<h2 id="features">Features</h2>
<p>json 2 case class can generate</p>
<ul>
<li>nested case classes from JSON objects</li>
<li>lists from JSON arrays</li>
<li>scala base types from JSON primitives</li>
<li>Option[T] for optional values</li>
</ul>
<h2 id="example">Example</h2>
<p>Here is an example with some github issues API data</p>
<p>json from github :</p>
<pre><code class="language-json">[
  {
    &quot;url&quot;: &quot;https://api.github.com/repos/octocat/Hello-World/issues/1347&quot;,
    &quot;html_url&quot;: &quot;https://github.com/octocat/Hello-World/issues/1347&quot;,
    &quot;number&quot;: 1347,
    &quot;state&quot;: &quot;open&quot;,
    &quot;title&quot;: &quot;Found a bug&quot;,
    &quot;body&quot;: &quot;I&#39;m having a problem with this.&quot;,
    &quot;user&quot;: {
      &quot;login&quot;: &quot;octocat&quot;,
      &quot;id&quot;: 1,
      &quot;avatar_url&quot;: &quot;https://github.com/images/error/octocat_happy.gif&quot;,
      &quot;gravatar_id&quot;: &quot;somehexcode&quot;,
      &quot;url&quot;: &quot;https://api.github.com/users/octocat&quot;
    },
    &quot;labels&quot;: [
      {
        &quot;url&quot;: &quot;https://api.github.com/repos/octocat/Hello-World/labels/bug&quot;,
        &quot;name&quot;: &quot;bug&quot;,
        &quot;color&quot;: &quot;f29513&quot;
      }
    ],
    &quot;assignee&quot;: {
      &quot;login&quot;: &quot;octocat&quot;,
      &quot;id&quot;: 1,
      &quot;avatar_url&quot;: &quot;https://github.com/images/error/octocat_happy.gif&quot;,
      &quot;gravatar_id&quot;: &quot;somehexcode&quot;,
      &quot;url&quot;: &quot;https://api.github.com/users/octocat&quot;
    },
    &quot;milestone&quot;: {
      &quot;url&quot;: &quot;https://api.github.com/repos/octocat/Hello-World/milestones/1&quot;,
      &quot;number&quot;: 1,
      &quot;state&quot;: &quot;open&quot;,
      &quot;title&quot;: &quot;v1.0&quot;,
      &quot;description&quot;: &quot;&quot;,
      &quot;creator&quot;: {
        &quot;login&quot;: &quot;octocat&quot;,
        &quot;id&quot;: 1,
        &quot;avatar_url&quot;: &quot;https://github.com/images/error/octocat_happy.gif&quot;,
        &quot;gravatar_id&quot;: &quot;somehexcode&quot;,
        &quot;url&quot;: &quot;https://api.github.com/users/octocat&quot;
      },
      &quot;open_issues&quot;: 4,
      &quot;closed_issues&quot;: 8,
      &quot;created_at&quot;: &quot;2011-04-10T20:09:31Z&quot;,
      &quot;due_on&quot;: null
    },
    &quot;comments&quot;: 0,
    &quot;pull_request&quot;: {
      &quot;html_url&quot;: &quot;https://github.com/octocat/Hello-World/issues/1347&quot;,
      &quot;diff_url&quot;: &quot;https://github.com/octocat/Hello-World/issues/1347.diff&quot;,
      &quot;patch_url&quot;: &quot;https://github.com/octocat/Hello-World/issues/1347.patch&quot;
    },
    &quot;closed_at&quot;: null,
    &quot;created_at&quot;: &quot;2011-04-22T13:33:48Z&quot;,
    &quot;updated_at&quot;: &quot;2011-04-22T13:33:48Z&quot;
  }
]
</code></pre>
<p>generated Scala:</p>
<pre><code class="language-scala">case class User(login:String, id:Double, avatar_url:String, gravatar_id:String, url:String)
case class Labels(url:String, name:String, color:String)
case class Milestone(url:String, number:Double, state:String, title:String, description:String, creator:User, open_issues:Double, closed_issues:Double, created_at:String, due_on:String)
case class Pull_request(html_url:String, diff_url:String, patch_url:String)
case class Issue(url:String, html_url:String, number:Double, state:String, title:String, body:String, user:User, labels:List[Labels], assignee:User, milestone:Milestone, comments:Double, pull_request:Option[Pull_request], closed_at:Option[String], created_at:String, updated_at:String)
</code></pre>
<p>I hope you&#39;ll enjoy it. Feel free to propose new features and/or to contribute !</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Run your PlayFramework apps on the Clever Cloud!</title>
		<link>https://www.clever.cloud/blog/features/2013/02/01/playframework-available-on-clever-cloud/</link>
		
		<dc:creator><![CDATA[Clément Nivolle]]></dc:creator>
		<pubDate>Fri, 01 Feb 2013 00:00:00 +0000</pubDate>
				<category><![CDATA[Features]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Typesafe]]></category>
		<category><![CDATA[Zenexity]]></category>
		<guid isPermaLink="false">https://www2.cleverapps.io/wp/blog/technology/2013/02/01/playframework-available-on-clever-cloud/</guid>

					<description><![CDATA[The Java language was orignally used in complex and costly &#8220;enterprise projects&#8221;. It was considered hard and tortuous to build simple server-side applications with all of heavy frameworks and tools like Java EE, servlets, application servers and massive IDEs. But in 2007, a nice project came along: Play!Framework. Easy to build, productivity-oriented and stateless, Play! [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="pull-right"><img decoding="async" class="span2" src="https://www2.cleverapps.io/app/uploads/2021/08/playframework_clever_cloud.png" alt="PlayFramework logo" /></div>
<p>The Java language was orignally used in complex and costly &#8220;enterprise projects&#8221;. It was considered hard and tortuous to build simple server-side applications with all of heavy frameworks and tools like Java EE, servlets, application servers and massive IDEs.</p>
<p><span id="more-2837"></span></p>
<p>But in 2007, a nice project came along: <a href="http://www.playframework.org" target="_blank" rel="noopener noreferrer">Play!Framework</a>. Easy to build, productivity-oriented and stateless, Play! is one of the most accessible Java framework.<br />
Thus, the success of this new framework emerged, with a growing up community, Play! 2 with Scala, etc.</p>
<p>That&#8217;s why we&#8217;re thrilled to announce that <strong>you can now deploy your existing Play! apps on Clever Cloud</strong>, with these features included:</p>
<ul>
<li>Auto scalability</li>
<li>Pay as You Go</li>
<li>Zero sysadmin and server management</li>
<li>All Play! versions are supported</li>
<li>Java and Scala ready.</li>
</ul>
<p>Please be sure to read carefully our <a href="https://www.clever.cloud/developers/doc/applications/scala/play-framework-2" target="_blank" rel="noopener noreferrer">documentation</a> for an effective deployment experience <a href="https://api.clever-cloud.com/v2/sessions/login/" target="_blank" rel="noopener noreferrer">after signing up</a>. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
