Facundo Batista: Películas (y series) de fin de año


No todo son películas en la vida, también sigo con series... Estoy terminando la quinta temporada de Person of Interest (bastante repetitiva, pero sigue interesante) y me quedan la terceras temporadas de Halt and Catch Fire (pensé que me iba a aburrir un toque pero está muy bien) y Bron/Broen (muy muy buena, con unos personajes bárbaros).

Pregunta, ¿por qué Wikipedia en inglés no mantiene el nombre original de esta última serie, sino que usa la traducción yanqui de la misma? Guarda, che, no les vayan a tocar la dominación cultural de jolivud... Por otro lado, para Wikipedia en danés y en sueco parecen llamarse sólo "el puente", perdiendo también la dualidad que se ve en el título de la serie (y que es tan importante para la misma).

Con los chicos vemos (mezclado con cosas de Encuentro y Paka Paka) al Superagente 86 y Doctor Who (la de este siglo). Con Moni vamos por la segunda de Merlí, Y yo voy mechando por ahí la novena de The Big Bang Theory y la séptima (y última) de Star Trek TNG.

En fin, las películas:

  • 10 Cloverfield Lane: +0. Parece de esas películas previsibles, pero no. Sorprende.
  • 400 Days: -0. Lleva bien la tensión, pero las actuaciones no son buenas... y el desenlace menos.
  • Al final del túnel: +1. Muy buena! Te mantiene agarrado de la silla hasta el final, está muy bien hecha.
  • Amnesiac: -0. Lenta, y aunque da un par de giros interesantes, es más de lo mismo y aburre.
  • Arrival: +1. Hermosa. No, no es una de extraterrestres y militares. Es tanto, tanto más que eso...
  • Blade Runner 2049: +1. La historia no es demasiado densa y no termina de aportar demasiado, pero la fotografía, la música y todo lo conceptual está genial
  • Creative Control: -1. Ni la terminé de ver. La dinámica de los lentes de realidad aumentada y su interfaz no me interesó lo suficiente como para contrarrestar lo soso del resto de la película.
  • Criminal: +0. Tiene momentos interesantes, bastantes, pero le resta que atrasa 20 años con lo de que el malo es tan malo que al final es más bueno que los buenos...
  • Hail, Caesar!: -0. Bizarra, pero no tanto como para ser lo suficientemente entretenida.
  • Hush: +0. La típica de "un loco malo que mata un montón" pero con una vuelta de tuerca que la vuelve interesante
  • Kill Command: -0. iene sus momentos con respecto a la inteligencia artificial y como los robots podrían tomar control, pero le resta mucho que sea tanto de guerra, que tenga demasiados momentos "terminator 1", y encima un final abierto, como si la quisieran continuar...
  • La belle saison: +1. Una hermosa historia de amor y feminismo.
  • Precious Cargo: -1. Tan llena de clichés la primer media hora que la saqué, no había *nada* nuevo.
  • Rock the Kasbah: +0. Una historia divertida y simpática. Para pasar el rato.
  • Snowden: +1. Me gustó mucho, incluso habiendo visto (o quizás eso actuó en favor?) Citizenfour
  • The Face of an Angel: -0. Tiene buenos movimientos, pero no va a ningún lado.
  • The Girl on the Train: +0. La historia está buena, enroscada pero bien... eso sí, la peli es demasiado lenta...
  • The Hunger Games: Catching Fire, The Hunger Games: Mockingjay - Part 1, y The Hunger Games: Mockingjay - Part 2: +0. Lo más interesante de estas tres (dos) continuaciones es todo el relato de lo que sucede a nivel social con la gente, y el rol de la chica con eso y con sus propios temores y lo que la mueve... pero si querés sólo una prelícula de acción también paga, pero para eso solamente es un poco larga.
  • The Huntsman: Winter's War: +0. Es linda, mantiene ritmo, mezcla todo muy bien, pero no deja de ser una de fantasía para adolescentes.
  • The Man Who Knew Infinity: +1. Una película maravillosa, no sólo para los que nos gusta matemática, sino apta para el resto también (y de paso se llevan un poquito sobre lo que es la matemática...).
  • Valerian and the City of a Thousand Planets: +0. Es divertida y tiene muchos conceptos para pensar. A nivel gráfico y/o diseño de aliens y "mundos", es impecable. Un poco infantil, algo sexista también. Demasiado romántica.
  • Youth: -1. Tan lenta y sin dirección clara o interesante que me aburrió y la corté a la mitad.

Un buen paquete de peliculas anotadas para ver:

  • A Scanner Darkly (2006; Animation, Crime, Drama, Mystery, Sci-Fi, Thriller) In a totalitarian society in a near future, the undercover detective Bob Archor is working with a small time group of drug users trying to reach the big distributors of a brain-damaging drug called Substance D. His assignment is promoted by the recovery center New Path Corporation, and when Bob begins to lose his own identity and have schizophrenic behavior, he is submitted to tests to check his mental conditions.::Claudio Carvalho, Rio de Janeiro, Brazil [D: Richard Linklater; A: Rory Cochrane, Robert Downey Jr., Mitch Baker]
  • Counterpart (2018; Drama, Sci-Fi, Thriller) A UN employee discovers the agency he works for is hiding a gateway to a parallel dimension.::KalanKeis [D: Alik Sakharov, Morten Tyldum; A: Harry Lloyd, Nazanin Boniadi, J.K. Simmons]
  • Dunkirk (2017; Action, Drama, History, Thriller, War) Evacuation of Allied soldiers from Belgium, the British Empire, and France, who were cut off and surrounded by the German army from the beaches and harbor of Dunkirk, France, between May 26- June 04, 1940, during Battle of France in World War II.::Harvey [D: Christopher Nolan; A: Fionn Whitehead, Damien Bonnard, Aneurin Barnard]
  • Gerald's Game (2017; Drama, Horror, Thriller) When a harmless game between a married couple in a remote retreat suddenly becomes a harrowing fight for survival, wife Jessie must confront long-buried demons within her own mind - and possibly lurking in the shadows of her seemingly empty house.::Intrepid Pictures [D: Mike Flanagan; A: Carla Gugino, Bruce Greenwood, Chiara Aurelia]
  • It (2017; Horror, Thriller) In the Town of Derry, the local kids are disappearing one by one, leaving behind bloody remains. In a place known as 'The Barrens', a group of seven kids are united by their horrifying and strange encounters with an evil clown and their determination to kill It.::Emma Chapman [D: Andy Muschietti; A: Jaeden Lieberher, Jeremy Ray Taylor, Sophia Lillis]
  • La Cordillera (2017; Drama, Mystery, Thriller) The president of Argentina, Hernán Blanco, is facing a very important decision. He is participating in a meeting between different state leaders, which takes place in La Cordillera. From there, in the middle of the Summit of Latin American presidents, he will have to be able to solve a very complicated personal matter that can affect both his private and public life.::Binquin_Black [D: Santiago Mitre; A: Walter Andrade, Ricardo Darín, Dolores Fonzi]
  • Los decentes (2016; Drama) A housemaid, working in an exclusive gated community in the outskirts of Buenos Aires, embarks on a journey of sexual and mental liberation in a nudist swinger-club boarding the high security walls.::morroviolet [D: Lukas Valenta Rinner; A: Iride Mockert, Ivanna Colona Olsen, Mariano Sayavedra]
  • Bright (2017; Action, Crime, Fantasy, Sci-Fi, Thriller) Set in a world where mystical creatures live side by side with humans. A human cop is forced to work with an Orc to find a weapon everyone is prepared to kill for. [D: David Ayer; A: Will Smith, Noomi Rapace, Joel Edgerton]
  • El Aprendiz (2016; Crime, Drama) A young chef's apprentice finds himself at a crucial crossroads: love, family, friends, or career. Only one path can be followed and the choice will change his life forever. [D: Tomás De Leone; A: Germán de Silva, Nahuel Viale, Malena Sánchez]
  • Future Man (2017; Comedy, Sci-Fi) Josh Futturman, a janitor by day and a gamer by night, is recruited by mysterious visitors to travel through time to prevent the extinction of humanity.::Anonymous [D: Nisha Ganatra, Evan Goldberg, Seth Rogen, Brandon Trost; A: Josh Hutcherson, Derek Wilson, Eliza Coupe]
  • Gun Shy (2017; Action, Adventure, Comedy, Crime, Thriller) The story follows Turk Henry (Antonio Banderas); a mega platinum rock star who's married to a supermodel (Olga Kurylenko) and rich beyond his wildest dreams. Whilst on holiday, his wife is mysteriously abducted by a group of renegade, ship-less pirates. With little assistance from local authorities Turk is forced to embark on a mission to rescue his wife. With life skills better suited to playing bass, playing the field, and partying he is forced to navigate through deadly jungles and take on ruthless bandits in this truly hilarious, action-packed romp.::Teaser-Trailer.com [D: Simon West; A: Antonio Banderas, Olga Kurylenko, Ben Cura]
  • Incredibles 2 (2018; Animation, Action, Adventure, Family) Bob Parr (Mr. Incredible) is left to care for Jack-Jack while Helen (Elastigirl) is out saving the world. [D: Brad Bird; A: Samuel L. Jackson, Holly Hunter, Catherine Keener]
  • Infancia clandestina (2011; Drama) Juan lives in clandestinity. Just like his mum, his dad and his adored uncle Beto, outside his home he has another name. At school, Juan is known as Ernesto. And he meets María, who only has one name. Based on true facts, set in the Argentina of 1979, this film is "one about love".::Historias Cinematográficas [D: Benjamín Ávila; A: Ernesto Alterio, Natalia Oreiro, César Troncoso]
  • Marjorie Prime (2017; Comedy, Drama, Mystery, Sci-Fi) In the near future, a time of artificial intelligence: 86-year-old Marjorie has a handsome new companion who looks like her deceased husband and is programmed to feed the story of her life back to her. What would we remember, and what would we forget, if given the chance? [D: Michael Almereyda; A: Hannah Gross, Jon Hamm, Geena Davis]
  • Mother! (2017; Drama, Horror, Mystery) Amidst a wild flat meadow encircled by an Edenic lush forest, a couple has cocooned itself in a secluded grand mansion that was not so long ago burned to the ground, devotedly restored by the supportive wife. Within this safe environment, the once famous middle-aged poet husband is desirous of creating his magnum opus, however, he seems unable to break out of the persistent creative rut that haunts him. And then, unexpectedly, a knock at the door and the sudden arrival of a cryptic late-night visitor and his intrusive wife will stimulate the writer's stagnant imagination, and much to the perplexed wife's surprise, the more chaos he lets in their haven, the better for his punctured male ego. In the end, will this incremental mess blemish irreparably the couple's inviolable sanctuary?::Nick Riganas [D: Darren Aronofsky; A: Jennifer Lawrence, Javier Bardem, Ed Harris]
  • Ready Player One (2018; Action, Adventure, Sci-Fi, Thriller) Film centers on a young outcast named Wade Watts. In the near future, Watts escapes from his daily drudgery by logging onto an MMO game called 'The Oasis'. When the game's billionaire founder dies, he offers players his fortune as the prize in an easter egg hunt within The Oasis. Watts gets in on the action then after five years finds himself facing off against corporate foes who will go to any lengths to get the money -- in both the real world and in The Oasis.::Anonymous [D: Steven Spielberg; A: Olivia Cooke, Hannah John-Kamen, Ben Mendelsohn]
  • Replicas (2018; Crime, Mystery, Sci-Fi, Thriller) A daring synthetic biologist who, after a car accident kills his family, will stop at nothing to bring them back, even if it means pitting himself against a government-controlled laboratory, a police task force and the physical laws of science. [D: Jeffrey Nachmanoff; A: Keanu Reeves, Alice Eve, Emily Alyn Lind]
  • Suburbicon (2017; Crime, Drama, Mystery, Thriller) In the bosom of Suburbicon, a family-centred, all-white utopia of manicured lawns and friendly locals, a simmering tension is brewing, as the first African-American family moves in the idyllic community, in the hot summer of 1959. However, as the patriarch Gardner Lodge and his family start catching a few disturbing glimpses of the once welcoming neighbourhood's dark underbelly, acts of unprecedented violence paired with a gruesome death will inevitably blemish Suburbicon's picture-perfect facade. Who would have thought that darkness resides even in Paradise?::Nick Riganas [D: George Clooney; A: Steve Monroe, Gavin Wilde, Landon Gordon]
  • The Current War (2017; Biography, Drama, History) Starring Benedict Cumberbatch as Thomas Edison and Michael Shannon as George Westinghouse, THE CURRENT WAR is the epic story of the cutthroat competition between the greatest inventors of the industrial age over whose electrical system would power the new century. Backed by J.P. Morgan, Edison dazzles the world by lighting Manhattan. But Westinghouse, aided by Nikola Tesla, has seen fatal flaws in Edison's direct current design. Igniting a war of currents, Westinghouse and Tesla bet everything on risky and dangerous alternating current. Directed by Alfonso Gomez-Rejon (Me and Earl and the Dying Girl) and written by playwright Michael Mitnick (Sex Lives of our Parents), THE CURRENT WAR also stars Katherine Waterston, Nicholas Hoult, Tom Holland, Matthew Macfadyen, and Tuppence Middleton. [D: Alfonso Gomez-Rejon; A: Tom Holland, Katherine Waterston, Benedict Cumberbatch]

Finalmente, el conteo de pendientes por fecha:

(Ene-2012)    3
(Jul-2012)   11
(Nov-2012)   11   6
(Feb-2013)   14   8   2
(Jun-2013)   15  15  11   2
(Sep-2013)   18  17  16   8
(Dic-2013)   12  12  12  12   4
(Abr-2014)    9   8   8   8   3
(Jul-2014)   10  10  10  10  10   5   1
(Nov-2014)       24  22  22  22  22   7
(Feb-2015)           13  13  13  13  10
(Jun-2015)               16  16  15  13  11   1
(Dic-2015)                   21  19  19  18   6   1
(May-2016)                       26  25  23  21   9
(Sep-2016)                           19  19  18  14
(Feb-2017)                               26  25  23
(Jun-2017)                                   23  23
(Dic-2017)                                       19
Total:      103 100  94  91  89 100  94  97  94  89

Mariano Guerra: rebar3 partisan template

I created a rebar3 template to start a partisan project, the template is here:

rebar3 partisan template

What is partisan? from the docs:

Partisan is the technology that provides Lasp's scalable cluster
membership. Partisan bypasses the use of Distributed Erlang for manual
connection management via TCP, and has several pluggable backends for
different deployment scenarios.

To use:

mkdir -p ~/.config/rebar3/templates
git clone https://github.com/marianoguerra/rebar3_template_partisan.git ~/.config/rebar3/templates/rebar3_template_partisan
rebar3 new rebar3_template_partisan name=party
cd party
make release
make console

Clustering:

make devrel

# on 3 different shells
make dev1-console
make dev2-console
make dev3-console

# join all nodes:
make devrel-join

# check node members
make devrel-status

# join node1 to node2 manually:
./_build/dev1/rel/party/bin/party-admin cluster join party2@127.0.0.1

# check node1 members
./_build/dev1/rel/party/bin/party-admin cluster members

# check node1 connections
./_build/dev1/rel/party/bin/party-admin cluster connections

A video to show how to use:

Facundo Batista: PyCon Argentina 2017


Este fin de semana se realizó una nueva PyCon en Argentina, esta vez (y es la primera vez que repetimos ciudad) en Córdoba.

Yo di dos charlas "formales"... bah, una charla ("Emulando paralelismo de forma asincrónica") y un taller ("Introducción a Python"). También di una mini-plenaria de 20 minutos donde hablé sobre la Asociación Civil Python Argentina.

Grupal

Hubieron un montón de charlas interesantes! Estas son las que más me gustaron:

  • "Distribuyendo código de py a PyPI", donde Matías Bordese nos contó todo el proceso de empaquetamiento y publicación de un programa o biblioteca en Python.
  • "Robótica educativa con software y hardware libre... y Python!", de Valentín Basel, que mostró cómo armaron el proyecto Icaro de forma que los niños puedan hacer cosas con componentes baratos o reciclado y aprender a programar en el camino.
  • "Magicicada: el fork open-source de Ubuntu One Filesync" donde Naty Bidart contó un poco la historia del servicio de sincronización de archivos en el que trabajamos en Canonical, su evolución luego de que fue liberado a Magicicada, y mostró la arquitectura del sistema y sus complejidades.
  • "Django Channeled", de Jonatas Baldin, que mostró como el concepto de "conexión permanente del cliente al servidor usado para que el servidor le pueda mandar mensajes al cliente en cualquier momento" se implementa en Django de manera elegante, integrándose correctamente con el resto del framework.
  • "Me están espiando! Cómo saber con Python si el imperialismo te persigue o te pasaste de Focusyn", de Nicolás Demarchi, donde aprendimos cómo calcular la posición de todos los satélites alrededor de la tierra, y darnos cuenta que si en un momento en particular podemos ver a determinado satélite (lo cual significa que ese satélite también nos puede ver).
  • "De la Rabbit, Pascal y Stored Procedures a la Beaglebone Black, Flask y PyZMQ", de Leandro Colombo Viña, la historia de la evolución de un hardware determinado, donde con conceptos modernos de comunicación y Python se lograron revolucionar las especificaciones del producto.
  • "Python en el browser, mil intentos y un invento", de Roberto Alsina, que nos contó un poco de historia y un poco de realidad por si queremos programar "en el browser, del lado del cliente" en Python, y no en javascript.

Las plenarias también estuvieron buenas. Aleksandra Sendecka nos contó en "Anatomy of a Code Review" el por qué y para qué de las revisiones de código por parte del equipo de trabajo, y especialmente el cómo, con un montón de consejos interesantes. Por otro lado Lucio Torre en "No hay tal cosa como un almuerzo gratis en temas de software" nos habló sobre cómo en desarrollo siempre las acciones que nos dan algo de beneficio por un lado, nos traen algo de perjuicio por otro, y que muchas veces entender dónde uno está parado (y saber leer eso, especialmente cuando uno no tiene toda la información y se basa en prejuicios) es fundamental para la evolución del desarrollo del sistema.

A nivel social, la comunidad de Python Argentina sigue mostrándose ejemplar. No sólo en lo personal (donde es una excusa para reencontrarse con amiga/os y charlar, charlar, charlar) sino también en la inclusión de nuevas personas en el grupo. El ejemplo que más me resuena a este respecto es esta serie de tuits:

Inclusión

Hasta donde sé se grabaron todas las charlas, así que avisaré cuando estén subidas. Y acá tienen fotos mías y las que sacó Yami (incluyendo la grupal que reproduzco arriba).

Mariano Guerra: Let's build a key value store in erlang

The code for this post is at https://github.com/marianoguerra/akvs

We first need to have erlang installed, I will show you how to setup any version you want to use, and a way to have the version I will use for this without affecting any other installation you may have.

Setting up kerl

For this we will use kerl, from it's github README:

Easy building and installing of Erlang/OTP instances.

Kerl aims to be shell agnostic and its only dependencies, excluding what's
required to actually build Erlang/OTP, are curl and git.

So, first we need to fetch kerl:

# create bin folder in our home directory if it's not already there
mkdir -p ~/bin

# cd to it
cd ~/bin

# download kerl script
curl -O https://raw.githubusercontent.com/kerl/kerl/master/kerl

# set execution permitions for our user
chmod u+x kerl

You will need to add ~/bin to your PATH variable so your shell can find the kerl script, you can do it like this in your shell:

# set the PATH environment variable to the value it had before plus a colon
# (path separator) and a new path which points to the bin folder we just
# created
PATH=$PATH:$HOME/bin

If you want to make this work every time you start a shell you need to put it it the rc file of your shell of choice, for bash it's ~/.bashrc, for zsh it's .zshrc, check your shell's docs for other shells, you will have to add a line like this:

export PATH=$PATH:$HOME/bin

After this, start a new shell or source your rc file so that it picks up your new PATH variable, you can check that it's set correctly by running:

echo $PATH

Building an Erlang release with kerl

We have kerl installed and available in our shell, now we need to build an Erlang release of our choice, for this we will need a compiler and other tools and libraries needed to compile it:

This are instructions on ubuntu 17.10, check the names for those packages on your distribution.

# required: basic tools and libraries needed
# (compiler, curses for the shell, ssl for crypto)
sudo apt-get -y install build-essential m4 libncurses5-dev libssl-dev

# optonal: if you want odbc support (database connectivity)
sudo apt-get install unixodbc-dev

# optonal: if you want pdf docs you need apache fop and xslt tools and java (fop is a java project)
sudo apt-get install -y fop xsltproc default-jdk

# optional: if you want to build jinterface you need a JDK
sudo apt-get install -y default-jdk

# optional: if you want wx (desktop GUI modules)
sudo apt-get install -y libwxgtk3.0-dev

Now that we have everything we need we can finally build our erlang release.

First we fetch an updated list of releases:

kerl update releases

The output in my case:

The available releases are:

R10B-0 R10B-10 R10B-1a R10B-2 R10B-3 R10B-4 R10B-5 R10B-6 R10B-7 R10B-8
R10B-9 R11B-0 R11B-1 R11B-2 R11B-3 R11B-4 R11B-5 R12B-0 R12B-1 R12B-2 R12B-3
R12B-4 R12B-5 R13A R13B01 R13B02-1 R13B02 R13B03 R13B04 R13B R14A R14B01
R14B02 R14B03 R14B04 R14B_erts-5.8.1.1 R14B R15B01 R15B02
R15B02_with_MSVCR100_installer_fix R15B03-1 R15B03 R15B
R16A_RELEASE_CANDIDATE R16B01 R16B02 R16B03-1 R16B03 R16B 17.0-rc1 17.0-rc2
17.0 17.1 17.3 17.4 17.5 18.0 18.1 18.2.1 18.2 18.3 19.0 19.1 19.2 19.3
20.0 20.1

Let's build the 20.1 version:

# this will take a while
kerl build 20.1 20.1

And install it:

kerl install 20.1 ~/bin/erl-20.1

Now everytime we want to use this version of erlang we need to run:

. $HOME/bin/erl-20.1/activate

Setting up rebar3

Now we have erlang, we need a build tool, we are going to use rebar3:

# download rebar3 to our bin directory
wget https://s3.amazonaws.com/rebar3/rebar3 -O $HOME/bin/rebar3

# set execution permissions for our user
chmod u+x rebar3

Just in case you have problems running the rebar3 commands with a different version, here's the version I'm using:

rebar3 version

Output:

rebar 3.4.7 on Erlang/OTP 20 Erts 9.1

Setting up our project

We are ready to start our project, go to a folder where you keep your code and if you haven't done it yet, add $HOME/bin to your path and activate erlang 20.1 as shown above, then run:

rebar3 new release name=akvs

The output should be something like this:

===> Writing akvs/apps/akvs/src/akvs_app.erl
===> Writing akvs/apps/akvs/src/akvs_sup.erl
===> Writing akvs/apps/akvs/src/akvs.app.src
===> Writing akvs/rebar.config
===> Writing akvs/config/sys.config
===> Writing akvs/config/vm.args
===> Writing akvs/.gitignore
===> Writing akvs/LICENSE
===> Writing akvs/README.md

Let's see what each file does:

First of all, we created a release, which is a kind of project that can have more than one application (a common way to structure a project is into applications and libraries)

Under the apps folder are all the applications we mantain for this release, in our case we only have one application, named akvc.

Under the akvs application folder we have a src folder where all the source code for that application will live, we can add other folders there, for tests, header files, private files etc.

apps/akvs/src/akvs_app.erl

The $APPNAME_app module is called when starting and stopping the app to do the setup and tear down of the application.

Check Erlang's manual for application or the user's guide entry for application for more information.

apps/akvs/src/akvs_sup.erl

The $APPNAME_sup module defines the root supervisor for the application, it implements the supervisor behavior and will be "hooked" into the supervisor hierarchy of this release when initialized.

Check Erlang's manual for supervisor or the user's guide entry for supervisor for more information.

apps/akvs/src/akvs.app.src

The $APPNANE.app.src is a file that contains metadata about this app.

Check ERlang's manual for application resource file for more information.

rebar.config

Contains information about the project, dependencies, how to build it, test it, and how to build a release.

Check rebar3 docs for details.

config/sys.config

Configuration parameters for the application.

Check sys.config's manual page for more information.

config/vm.args

Configuration parameters for the Erlang VM.

.gitignore

Git specific, files to ignore.

LICENSE

The license for this project, you should change it if the Apache License 2.0 isn't the one you want.

README.md

Project's readme.

Starting it for the first time

First we need to build a release:

cd akvs

# build a release, the result will be at _build/default/rel/akvs
rebar3 release

# start the release and attach to the console
./_build/default/rel/akvs/bin/akvs console

The output in my case is (redacted for clarity):

Exec: bin/erl-20.1/erts-9.1/bin/erlexec
         -boot src/erl/akvs/_build/default/rel/akvs/releases/0.1.0/akvs
         -mode embedded -boot_var ERTS_LIB_DIR bin/erl-20.1/lib
         -config src/erl/akvs/_build/default/rel/akvs/releases/0.1.0/sys.config
         -args_file src/erl/akvs/_build/default/rel/akvs/releases/0.1.0/vm.args
         -pa -- console

Root: src/erl/akvs/_build/default/rel/akvs
src/erl/akvs/_build/default/rel/akvs

Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:4:4] [ds:4:4:10]
                          [async-threads:30] [kernel-poll:true]


=PROGRESS REPORT==== 25-Nov-2017::22:28:34 ===
                  supervisor: {local,sasl_safe_sup}
                         started: [{pid,<0.225.0>},
                                           {id,alarm_handler},
                                           {mfargs,{alarm_handler,start_link,[]}},
                                           {restart_type,permanent},
                                           {shutdown,2000},
                                           {child_type,worker}]

=PROGRESS REPORT==== 25-Nov-2017::22:28:34 ===
                  supervisor: {local,sasl_sup}
                         started: [{pid,<0.224.0>},
                                           {id,sasl_safe_sup},
                                           {mfargs,
                                                   {supervisor,start_link,
                                                           [{local,sasl_safe_sup},sasl,safe]}},
                                           {restart_type,permanent},
                                           {shutdown,infinity},
                                           {child_type,supervisor}]

=PROGRESS REPORT==== 25-Nov-2017::22:28:34 ===
                  supervisor: {local,sasl_sup}
                         started: [{pid,<0.226.0>},
                                           {id,release_handler},
                                           {mfargs,{release_handler,start_link,[]}},
                                           {restart_type,permanent},
                                           {shutdown,2000},
                                           {child_type,worker}]

=PROGRESS REPORT==== 25-Nov-2017::22:28:34 ===
                 application: sasl
                  started_at: akvs@ganesha
Eshell V9.1  (abort with ^G)
(akvs@ganesha)1>

There's not much we can do with our project at this stage, so we will just stop it and exit by running the q(). function in the shell:

(akvs@ganesha)1> q().
ok

Coding (and testing) the Key Value store modules

The way I usually code in erlang is to first build a stateless module that has an init function that returns some state, all other functions expect that state as first parameter, then those functions do something and return the state and the result.

This modules are really easy to use in the shell and test.

This will be our first module, we will call it akvs_kv and it will have the following API:

%% types:

-type error() :: {error, {atom(), iolist(), map()}}.
-type key()   :: binary().
-type value() :: any().

% we don't want other modules to know/care about the internal structure of
% the state type
-opaque state() :: map().

%% functions:

%% @doc create a new instance of a key value store
-spec new(map()) -> {ok, state()} | error().

%% @doc dispose resources associated with a previously created kv store
-spec dispose(state()) -> ok | error().

%% @doc set a value for a key in a kv store
-spec set(state(), key(), value()) -> {ok, state()} | error().

%% @doc get a value for a key or an error if not found
-spec get(state(), key()) -> {ok, value()} | error().

%% @doc get a value for a key or a default value if not found
-spec get(state(), key(), value()) -> {ok, value()} | error().

%% @doc remove a value for a key, if not found do nothing
-spec del(state(), key()) -> {ok, state()} | error().

Notice that to specify the API I used a specification of the types and functions, this is called spec, read more about it at the Types and Function Specifications sectio in the erlang reference manual.

Also for documentation comments I'm using the edoc format, read more about it at the edoc user's guide section.

You can see the full code of this module here: akvs_kv

But how do we know if it works?

At this point there are two ways: testing it in the shell, or writing tests for it, let's do the right thing and write some tests.

We are going to use Common Test for our tests.

First we need to create the test folder for our tests:

mkdir apps/akvs/test

Inside it we will create a module called akvs_kv_SUITE that will contain the tests for the akvs_kv module.

You can see the full code of this module here: akvs_kv_SUITE

To run the tests:

rebar3 ct

We can also use the type specs we defined to check our code using dialyzer:

rebar3 dialyzer

Everything seems to be right, let's move on to the next step.

But before that, in case you want to generate API docs for our code taking advantage of the edoc annotations, you can do so by running:

rebar3 edoc

And opening apps/akvs/doc/index.html with a browser.

Wrapping the state

Stateless modules are a good start and are really easy to test and use, but we don't want to pass the burden of threading the state to the users of our code, also we want to centralize the state management so that more than one process can call our module and see the state changes of other callers.

In this case we are using ETS to make it simpler but if our kv was backed by a map, or if we had some kind of cache, then state management would become really important to get right, otherwise the results seen by each caller would diverge.

To manage the state of our module we are going to wrap it in a process, a gen_server in this case.

The module will be called akvs_kv_s (_s for server, don't know if there's a convention for it).

The module is a basic gen_server that exposes a couple functions to call the kv API from the akvs_kv module, you can read the code here: akvs_kv_s.

We write tests for this module too, you can read the test's code here: akvs_kv_s_SUITE.

Run the tests:

rebar3 ct

An API for our key value stores

Now we can spawn a key value store in a gen_server and apply operations to it, but like with the stateless module, someone has to keep a reference to the process and provide a nicer way to find and operate on our key value stores, if it was only one it's easy to just start it as a registered process with a name and send messages to it by it's name, but in our case, we want to provide namespaces where each namespace holds a key value store of its own.

The abstract API or this module should be like this:

-type ns() :: binary().
-type key() :: akvs_kv:key().
-type value() :: akvs_kv:value().
-type error() :: akvs_kv:value().

%% @doc set Key to Value in namespace Ns
-spec set(ns(), key(), value()) -> ok | error().

%% @doc get Key from namespace Ns
-spec get(ns(), key()) -> {ok, value()} | error().

%% @doc get Key from namespace Ns or DefaultValue if Key not found
-spec get(ns(), key(), value()) -> {ok, value()} | error().

%% @doc delete  Key in namespace Ns
-spec del(ns(), key()) -> ok | error().

Right now we are going to solve the problem of who keeps the namespace to process mapping really simple so we can continue, we are going to setup a public ETS table at application startup and lookup the processes by namespace there, if not found we are going to start the process and register it under that namespace.

This solution is not recommendable at all but it will allow us to continue and since the API doesn't know a thing about the way we register/lookup namespaces we can explore different alternatives later.

You can view the source code for akvs module here: akvs and the tests here akvs_SUITE.

An HTTP API for our key value stores

We are at the point where we can expose our APIs to the world, we are going to do it by exposing a really basic HTTP API for it.

The API will look like this:

# set key in namespace to the binary value sent in body
# return status: 201
POST /kv/<namespace>/<key>
<body>

# get key in namespace
# return status:
#  200: if found
#  404: if not found
GET /kv/<namespace>/<key>

# delete key from namespace
# return status: 200
DELETE /kv/<namespace>/<key>

To create an HTTP API we need an HTTP server, in this case we will use Cowboy 2.

First we need to add it as a dependency in our rebar.config file in the deps section and in the release dependencies section.

Then we need to setup the routes in our application initialization code.

We are going to have only one route and handler, we are going to use a basic HTTP to keep it simple, you can read the handler's code here: akvs_h_kv.

Now we can test it by building a release, starting it and playing with the API using curl:

rebar3 release
_build/default/rel/akvs/bin/akvs console

In another shell:

curl http://localhost:8080/kv/foo/bar
Not Found

curl -X POST http://localhost:8080/kv/foo/bar -d "hello world"
Created

curl http://localhost:8080/kv/foo/bar
hello world

curl -X DELETE http://localhost:8080/kv/foo/bar
OK

curl http://localhost:8080/kv/foo/bar
Not Found

curl -X PUT http://localhost:8080/kv/foo/bar -d "hello world"
Method Not Allowed

Seems to work fine.

Now we can build a production release and try it:

rebar3 as prod release
cd _build/prod/rel
tar -czf akvs.tar.gz akvs
cd -
mv _build/prod/rel/akvs.tar.gz /tmp
cd /tmp
tar -xzf akvs.tar.gz
cd akvs
./bin/akvs start

The application is started, you can check it's running by pinging it:

./bin/akvs ping

In case you need, you can attach to it (you should exit with Ctrl+D, using q() won't only detach your console but also stop the system!):

./bin/akvs attach

You can try it again:

curl http://localhost:8080/kv/foo/bar
curl -X POST http://localhost:8080/kv/foo/bar -d "hello world"
curl http://localhost:8080/kv/foo/bar
curl -X DELETE http://localhost:8080/kv/foo/bar
curl http://localhost:8080/kv/foo/bar
curl -X PUT http://localhost:8080/kv/foo/bar -d "hello world"

When you are finished, you can stop it:

./bin/akvs stop

Now you can upload akvs.tar.gz to any bare server and start akvs there, as long as the operating system is similar (better if the same) as the one where you built the release, this is because when building the release we bundle the erlang runtime for simplicity, this assumes specific versions of libraries like libssl which may not be available on the target system if it's too different.

Another way is to build the release without bundling the erlang runtime and having it available on the target system, just make sure that the erlang runtime in the target system has the same version you used to build it, otherwise you may experience errors due to modules/functions not being available or bytecode incompatibility if the target runtime is older than the one used for the release.

Marcos Dione: sandboxing-whatsapp

I never wanted this. Whatsapp and its parent company are some of the things I most hate about what tech has become, showing the utter lack of ethics in a industry that has too much impact on the rest of the planet. Just go and read all the reports about groups abusing these platforms (and them allowing them to) to change politics all over the world, or all the shitty security a lot of IoT stuff has, and how they're used to attack services on the Internet.

But reality is more complex than that. In my home country, Facebook and Whatsapp specifically are very popular, to the point that, due to our lack of net-neutrality laws, phone companies offer cheap contracts where those two application's data usage do not count as such, becoming completely free. This means people almost stopped using the phone or SMSs, but instead send text, pictures and voice messages via these platforms. That includes my whole family, which also almost stopped using email.

So for the moment I left my principles aside and installed the app. My last attempt at this had failed because you can't install it on a tablet; the device has to have phone capabilities. Even more, when you try to register it, it forces you to use a cellular phone number; Signal at least has the decency to let you register it to a land line too (if it can't send you an SMS, it gives you the option of being called and the registering code is spelled to you). Luckily I had a spare number from a throwaway line I bought in my last trip to homeland, so I used that number instead of the real one. I know it's a useless step, it's equivalent to giving the finger to someone's back.

Once installed, I tried to send a message to my wife. The app denies you to do so if you don't give it in exchange access to your contacts. Again luckily for me, this phone was mostly empty, but I still took steps to avoid giving it all my contacts. The few I had were already sync'ed to my owncloud instance back home.

First, I exported all my contacts locally and deleted them all. I reimported them after I got the app running. Then I created a new, empty owncloud account, so when Whatsapp asked me which 'account' to use to get/sync the contacts, I gave it that one. This way, when you add contacs, they go to this 'honeypot' and it doesn't have access to your real Contacts. If you don't have a owncloud or similar service you control, you can simply create a bogus Google account and use that instead. The only downside is that you will get dupe'd contacts, but once you sent them a message, you can safely delete the contact and even completely disable sync'ing the account. You can also revoque the permission to access Contacts, but that means you're back to square one, except for the conversations you already have started.

I'm sorry can't give you the exact steps I did, I was on the bus, and with all the failing attempts I lost track. Of course, removing all the contacts means that you only see phone numbers and their photos, but after a while you can recognize them by that. Right now I only have my wife and my family's group, and I hope I can keep it like that for a long, long time.

One last thing: Whatsapp asks you for your contacts, but you can't nicely ask them back: the phone numbers of new contacts are very difficult to extract. You either export them to the Contacts Account if you still have around (I didn't) or you copy them by hand (which I did). Last but not least, I still have the nagging sensation that Whatsapp would have been able to read the contacts; I really whish that Android would gives us more fine grained firewall capabilities. Also, remember that Whatsapp has no option to store media in an SD card, only the phone's internal storage (WTF, people, seriously!), and it's a pain in the ass to clean up the stuff you don't want. So for the moment I haven't gave it access to Photos, Media and Files.


misc rant

Facundo Batista: Eddie el entusiasta y la señorita Moneypenny


Vengo a comentarles sobre una serie que vi parcialmente hace mucho tiempo, y que volví a ver recientemente para verla completa, porque recordaba me había gustado bastante.

Y confirmé, la serie me gusta mucho. Así y todo es bastante desconocida, y tuvo sólo una (corta) temporada. Se llama Keen Eddie.

La serie me gusta en varios planos, aunque más allá del ritmo que tiene y de ciertos trucos visuales que son interesantes para contar la historia, lo mejor son las relaciones interpersonales, de las cuales está plagada.

A Eddie (estereotipo de policía/detective yanqui desastre) lo mandan a trabajar a Londres por una temporada, y hay todo un choque cultural, que a mí me gusta bastante. Y toda la dinámica entre Eddie y su "compañera forzada de casa", Eddie y su perro, su perro y su compañera de casa, Eddie y su pareja-detective, Eddie y su jefe, ...

... y Eddie y la señorita Moneypenny.

Y acá hago un aparte, porque más allá de cierta tensión subrepticia entre Eddie y Moneypenny (que cabe aclarar, no se llama realmente así, sino que Eddie la llama así en homenaje al conocido personaje de ficción) durante la serie hay algunos segundos en la mayoría de los capítulos donde la interacción entre ambos se escapa de los parámetros normales, pero todo en la imaginación de Eddie, aunque eso a él no le queda tan claro... y a veces tampoco nos queda tan claro a nosotros :)

En esta lista de YouTube están separadas estas partes, pero con demasiado contexto (un tiempo antes y un tiempo después de los detalles en cuestión).

Yo me permití hacer una recopilación (con video de mejor calidad), y más enfocada en lo que quería mostrar (e incluso dejé en la secuencia la parte correspondiente al capítulo donde esta interacción rara NO pasa, ya que en ese capítulo todo sale al reves).

Eddie y la señorita Moneypenny

Damián Avila: RISE 5.1.0 is out!

We're pleased to announce the release of RISE 5.1.0!

RISE allows you show your Jupyter notebooks rendered as an executable Reveal.js-based slideshow. It is your very same notebook but presented in a slidy way!

What are the new goodies for this release?

Read more… (1 min remaining to read)

Facundo Batista: Distribución de teclado


Arranquemos la historia a principios de siglo, porque en algún momento hay que arrancarla.

Mi computadora principal hogareña tenía un teclado con distribución "en español" (lo que normalmente se consigue en las casas de computación), pero en el laburo que arranqué en el 2000 (Unifón) todas las computadoras tenían distribución "latinoamericana" (que es lo que venden las marcas grandes, como IBM, Dell, etc, en toda latinoamérica).

Los teclados eran diferentes, sí, pero no tanto. Encima alrededor del 2004 decidí comprarme un teclado de buena calidad, y elegí uno marca IBM, como los de la oficina, que me gustaban mucho. Obviamente, era distribución latinoamericana.

Desde ese momento usé esa distribución exclusivamente.

La laptop que usaba los últimos meses de Movistar, la que me dieron en Cyclelogic (una Dell Inspiron), y la que me dieron en Ericsson (creo que una HP) todas eran compradas acá así que eran todas con teclado latinoamericano.

Cuando entré en Canonical, me compré una laptop yo. En ese momento compré en Argentina una Dell XPS m1330, muy linda máquina. Al momento de renovarla busqué mucho y terminé en una Samsung que nunca me convenció mucho, también comprada acá. En ambos casos, teclado latinoamericano.

Y mientras tanto, seguía usando en la desktop el excelente teclado IBM que me había comprado hace tanto tiempo.

El año pasado volvía a renovar la laptop, y luego de buscar varios meses algo que me convenciera acá en Argentina, en Chile o en Uruguay, terminé tomando la decisión de comprarla en USA (una Lenovo Thinkpad). Claro, con teclado en inglés, pero mi idea era luego comprar el teclado acá y cambiárselo.

Muchas personas (desde hace mucho tiempo) me preguntaban por qué no usaba teclado en inglés y listo. Puedo agrupar toda esa gente en dos grandes grupos:

  • los que usan el teclado en inglés configurado como "inglés", sin acentos ni eñe, pero escriben todo el tiempo con faltas de ortografía; esto es llanamente inaceptable para mí.
  • los que usan el teclado en inglés configurado como "internacional con teclas muertas" (que era como yo tenía la laptop nueva), donde para poner un acento hay que teclear el tilde y luego la vocal; el problema de esto es que para escribir el tilde sólo, hay que teclear el tilde y luego espacio (y como es la misma tecla, para comillas hay que hacer shift+tilde y luego espacio). Funciona, pero es tremendamente ineficiente y molesto.

El 2017 me encontró con el mismatch de teclado entre el desktop y la laptop, algo que me molestaba bastante. Y en Agosto pasaron dos cosas.

Por un lado ya me había cansado de esperar que Lenovo Argentina me vendiera un teclado en latinoamericano para la laptop. Nunca lo importaron, siempre me lo patearon para adelante, ¡durante un año!

Por otro lado, Joac me mostró que hay una configuración "internacional con teclas muertas por AltGr", que lo que hace es evitar el "doble tecleo": para poner una á, sólo hay que hacer AltGr+a. Y listo. Tilde es tilde, comilla es comilla, etc. Hay casos donde necesitamos componer caracteres con varias teclas, pero no es frecuente (por ejemplo, si queremos escribir una ü, donde ahí si tenemos que teclear AltGr+shift+tilde, y luego la u).

Esta configuración me resultó bastante funcional (aunque no ideal), así que lo que tenía que hacer también era solucionar el mismatch con la desktop, por lo que me compré en el último viaje un teclado Lenovo que es igualito al IBM que tenía... pero en inglés.

Así que acá me ven, a la vejez viruela, etc, etc.

Mariano Guerra: State of the BEAM 2017: Survey Results

Intro

You can't improve what you don't measure, and since I think there are areas in the BEAM community (Erlang, Elixir, LFE, Efene, Alpaca, Clojerl et al.) to improve we need to have a better picture of it.

That's why some months ago I decided to create this survey, I told to some people and started researching other "State of the X Community" yearly surveys, I wrote some draft questions and published to some people for feedback, after a couple of rounds I made a Form and ran a test survey for more feedback, after a couple dozen answers I cleared the results and announced it publicly with a weakly reminder on multiple channels.

Result Analysis

We got 423 Responses up to this point.

I present the results of the State of the BEAM Survey 2017 here in two ways:

  • Bar charts sorted by most answers to less
    • On questions with many answers I make a cut at some point
  • Raw data tables sorted by most answers to less
    • Here I did some consolidation of answers to avoid making them too large

I was thinking on doing a deep analysis on the answers but later I realized that if I did an analysis many people would read mine and avoid analyzing it themselves in detail.

Instead I decided to open an analysis thread in some forum and later maybe summarize the most interesting comments.

To ease the discussion I will do some light observations where I see it makes sense and make some questions to open the discussion.

Before diving into the result I want to make explicit two things that may make the results less representative than they should:

1. The "Elixir Effect"

I think the Elixir community is bigger or at least more active than the rest of the BEAM community, because of that and the fact that Elixir already has its own survey, I decided not to promote this survey there, to avoid the number of Elixir specific answers to skew the results and make this survey just be yet another Elixir survey with some BEAMers also replying.

With this clarification, and looking at the answers, I can identify some answers that are from Elixir-only developers, you can see that when some Elixir specific tools appear in the answers (Mix, ExUnit, Distillery, deploy to Heroku etc.), just keep that in mind when analyzing the results.

2. The "Survivorship Bias Effect"

From the wikipedia article on Survivorship bias

Survivorship bias or survival bias is the logical error of concentrating on the people or things that made it past some selection process and overlooking those that did not, typically because of their lack of visibility. This can lead to false conclusions in several different ways. It is a form of selection bias.

Survivorship bias can lead to overly optimistic beliefs because failures are ignored, such as when companies that no longer exist are excluded from analyses of financial performance.

/galleries/state-of-beam-2017/Survivorship-bias.png

The damaged portions of returning planes show locations where they can take a hit and still return home safely; those hit in other places do not survive.

This survey is done on people that wanted to learn Erlang, learned it, and are still active enough on the community to see the survey announcement.

This means that the answers are from the ones that "survived", which makes it really hard to get good feedback on the bad parts of the language, tooling and community since the most affected by it aren't going to stay around to fill this survey.

How to reach those? I don't know, propose solutions on the discussion.

I forgot to ask if I could make public the name of the companies so I won't, but I can say that I got 202 responses and most of them are not duplicates.

Things to improve for next year

  • Ask users if they want their answers available to be distributed in raw form for others to analyze
  • Ask users if I can share publicly the name of the company where they use Erlang
  • Decide what to do about Elixir-only replies, maybe make a question about it
  • Make specific questions regarding better tooling
  • I forgot Russia and Central America options, maybe next time do Latin America?

Let's see the results!

Which languages of the BEAM do you use?

/galleries/state-of-beam-2017/lang.png

Clearly Erlang is the most used language, ignoring the Elixir Effect, I'm kind of disappointed by the lack of users trying alternative languages. More so given the fact that many of the complaints or requests in other questions are already solved by other languages in the ecosystem, for example "better macros" or lisp inspired features being solved by LFE, static/stronger typing or better static analysis being solved by Alpaca, Elixir's pipe operator and a more mainstream syntax being solved by Efene.

My advice to the community, try the other languages, blog/tweet about it and share feedback with their creators, there's a language for each taste!

Erlang 326 54.42%
Elixir 231 38.56%
LFE 14 2.34%
Luerl 12 2.00%
Alpaca 9 1.50%
Clojerl 4 0.67%
Erlog 1 0.17%
Efene 1 0.17%
PHP 1 0.17%

How would you characterize your use of BEAM Languages today?

/galleries/state-of-beam-2017/use.png

Many people using it for serious stuff, the Open Source answer is really low here but is contradicted by another answer below.

I think I should add another option for something like "experiments", "try new ideas".

I use it at work 327 48.66%
I use it for serious "hobby" projects 245 36.46%
I'm just tinkering 62 9.23%
I use it for my studies 35 5.21%
Learning 1 0.15%
katas 1 0.15%
Open Source Software 1 0.15%

In which domains are you applying it?

/galleries/state-of-beam-2017/domains.png
Distributed Systems 225 15.20%
Web development 214 14.46%
Building and delivering commercial services 172 11.62%
Open source projects 149 10.07%
Network programming 136 9.19%
Enterprise apps 92 6.22%
Databases 80 5.41%
IoT / home automation / physical computing 75 5.07%
System administration / dev ops 60 4.05%
Big Data 51 3.45%
Mobile app development (non-web) 46 3.11%
Research 33 2.23%
AI / NLP / machine learning 28 1.89%
Games 28 1.89%
Math / data analysis 23 1.55%
Scientific computing / simulations / data visualization 21 1.42%
Desktop apps 14 0.95%
Graphics / Art 4 0.27%
Music 3 0.20%
Industrial Automation 2 0.14%
log system 1 0.07%
videostreaming 1 0.07%
soft real time analytics 1 0.07%
Security Event Processing 1 0.07%
Media encoding and distribution 1 0.07%
Ad delivery 1 0.07%
Telecom Apps 1 0.07%
telecom and chat 1 0.07%
video 1 0.07%
Developer Tooling 1 0.07%
Telecommunications 1 0.07%
embedded systems 1 0.07%
Advertising/RTB 1 0.07%
Prototyping network apps 1 0.07%
Real time systems 1 0.07%
Real-Time Bidding 1 0.07%
Instant messaging / VoIP / Communications 1 0.07%
ad traffic management 1 0.07%
REST/GraphQL API 1 0.07%
Test systems 1 0.07%
Learning 1 0.07%
telecommunications 1 0.07%
VoIP 1 0.07%
Code static analysis 1 0.07%

What industry or industries do you develop for?

/galleries/state-of-beam-2017/industries.png
Enterprise software 117 15.04%
Communications / Networking 103 13.24%
Consumer software 85 10.93%
IT / Cloud Provider 83 10.67%
Financial services / FinTech 69 8.87%
Telecom 67 8.61%
Media / Advertising 46 5.91%
Retail / ecommerce 41 5.27%
Academic 29 3.73%
Healthcare 28 3.60%
Education 26 3.34%
Government / Military 22 2.83%
Scientific 16 2.06%
Legal Tech 6 0.77%
Energy 5 0.64%
Gaming 2 0.26%
HR 2 0.26%
Security 2 0.26%
Logistics 2 0.26%
sports/fitness 1 0.13%
Retired 1 0.13%
Sport 1 0.13%
Business Intelligence 1 0.13%
Telematics / Car industry 1 0.13%
Manufacturing / Automotive 1 0.13%
Cultural/Museum 1 0.13%
Utilities 1 0.13%
Open source 1 0.13%
Travel 1 0.13%
Sport analysis 1 0.13%
Fitness 1 0.13%
Online Games 1 0.13%
Automotive 1 0.13%
Marketing 1 0.13%
Real estate 1 0.13%
Consumer electronics 1 0.13%
Non profit 1 0.13%
Client driven 1 0.13%
Industrial IoT 1 0.13%
Electric utility 1 0.13%
SaaS 1 0.13%
Automobile 1 0.13%
energy sector 1 0.13%
utilities 1 0.13%
Recruitment 1 0.13%
Energetics 1 0.13%

How long have you been using Erlang?

/galleries/state-of-beam-2017/howlong.png

The entrants (1 year or less) being less than 2 and 3 years may be discouraging or maybe as a sign that this survey didn't reach as many newcomers as it should.

> 6 Years 116 27.62%
2 Years 76 18.10%
3 Years 58 13.81%
1 Year 52 12.38%
Less than a year 45 10.71%
5 Years 36 8.57%
4 Years 34 8.10%
I've stopped using it 3 0.71%

What's your age

/galleries/state-of-beam-2017/age.png

Similar to the previous one, the survey shows that we are not interesting to young programmers (or this survey is not interesting to them :)

30-40 179 42.42%
20-30 112 26.54%
40-50 93 22.04%
> 50 31 7.35%
< 20 7 1.66%

What's your gender

/galleries/state-of-beam-2017/gender.png

One I was expecting, but bad nonetheless.

Male 401 95.02%
Prefer not to say 15 3.55%
Female 5 1.18%
attack helicopter 1 0.24%

Where are you located?

/galleries/state-of-beam-2017/location.png
North America 127 30.09%
Western Europe 117 27.73%
Eastern Europe 42 9.95%
Northern Europe 39 9.24%
South America 30 7.11%
Asia 25 5.92%
Oceania 11 2.61%
Russia 7 1.66%
India 6 1.42%
China 6 1.42%
South Saharan Afica 3 0.71%
Middle East 2 0.47%
Europe 1 0.24%
Iran 1 0.24%
Central America 1 0.24%
Australia 1 0.24%
Thailand 1 0.24%
East Africa 1 0.24%
Central Europe 1 0.24%

What is your level of experience with functional programming?

/galleries/state-of-beam-2017/fpexp.png

7 answers got the joke or are really awesome programmers :)

/galleries/state-of-beam-2017/profunctor.jpg
Intermediate 202 48.44%
Advanced 148 35.49%
Beginner 57 13.67%
Profunctor Optics Level 7 1.68%
None 3 0.72%

Prior to using Erlang, which were your primary development languages?

/galleries/state-of-beam-2017/prevlang.png
C or C++ 163 14.75%
Python 145 13.12%
Javascript 144 13.03%
Ruby 138 12.49%
Java 135 12.22%
PHP 72 6.52%
C# 56 5.07%
Perl 46 4.16%
Go 26 2.35%
Haskell 25 2.26%
Swift or Objective-C 24 2.17%
Common Lisp 20 1.81%
Scala 20 1.81%
Scheme or Racket 14 1.27%
Visual Basic 11 1.00%
Clojure 8 0.72%
R 8 0.72%
Rust 7 0.63%
None 6 0.54%
OCaml 3 0.27%
F# 3 0.27%
Kotlin 2 0.18%
Standard ML 2 0.18%
Fortran 2 0.18%
Pascal 1 0.09%
Ocaml 1 0.09%
KDB 1 0.09%
so "primary" here for me is "what was most used at work" 1 0.09%
TypeScript 1 0.09%
Microsoft Access 1 0.09%
Groovy 1 0.09%
but I am a self-proclaimed polyglot 1 0.09%
Shell 1 0.09%
Tcl/Tk 1 0.09%
Limbo 1 0.09%
Smalltalk 1 0.09%
clojure 1 0.09%
ActionScript 1 0.09%
Actionscript 1 0.09%
Prolog 1 0.09%
Racket 1 0.09%
Bash 1 0.09%
ML 1 0.09%
TCL 1 0.09%
Elixir 1 0.09%
C ANSI POSIX 1 0.09%
D 1 0.09%
ocaml 1 0.09%
Assembly 1 0.09%

Which client-side language are you using with Erlang?

/galleries/state-of-beam-2017/clientlang.png
Javascript 257 44.93%
None 90 15.73%
Elm 69 12.06%
Java 36 6.29%
Swift/Objective-C 36 6.29%
Clojurescript 13 2.27%
ReasonML/Ocaml 10 1.75%
Kotlin 8 1.40%
Typescript 7 1.22%
Scala 7 1.22%
Purescript 6 1.05%
C++ 4 0.70%
TypeScript 3 0.52%
Go 2 0.35%
typescript 2 0.35%
Python 2 0.35%
Erlang 2 0.35%
Flow + Javascript 1 0.17%
HTML-CSS 1 0.17%
Haskell 1 0.17%
What do you mean by "client-side language"? 1 0.17%
other 1 0.17%
Action Script 3 1 0.17%
Coffeescript 1 0.17%
d3.js 1 0.17%
lua 1 0.17%
Python/PyQt 1 0.17%
Dart 1 0.17%
Golang 1 0.17%
Ruby 1 0.17%
M$ C# 1 0.17%
Python (interface to legacy system - not web based) 1 0.17%
clojure 1 0.17%
C# 1 0.17%
Tcl/Tk 1 0.17%

In your Erlang projects, do you interoperate with other languages? if so, which ones?

/galleries/state-of-beam-2017/interop.png
C or C++ 156 24.19%
None 92 14.26%
Python 87 13.49%
Javascript 72 11.16%
Java 51 7.91%
Ruby 37 5.74%
Rust 27 4.19%
Go 27 4.19%
Swift or Objective-C 14 2.17%
C# 12 1.86%
Scala 11 1.71%
PHP 9 1.40%
Perl 8 1.24%
R 8 1.24%
Haskell 6 0.93%
Common Lisp 4 0.62%
Clojure 3 0.47%
OCaml 3 0.47%
Elixir 2 0.31%
Scheme or Racket 2 0.31%
Bash 2 0.31%
Kotlin 1 0.16%
KDB 1 0.16%
I use Erlang from Elixir 1 0.16%
lua 1 0.16%
SQL 1 0.16%
java 1 0.16%
Ocaml 1 0.16%
go 1 0.16%
Not directly via NIFs/ports but via HTTP/rabbit with ruby 1 0.16%
Tcl/Tk 1 0.16%
Lua 1 0.16%
python 1 0.16%

Which is your primary development environment?

/galleries/state-of-beam-2017/editor.png

I thought Emacs would win here by the fact that the Erlang creators use Emacs.

Vim 116 27.49%
Emacs 114 27.01%
IntelliJ 47 11.14%
Visual Studio Code 47 11.14%
Sublime Text 39 9.24%
Atom 32 7.58%
Eclipse 6 1.42%
spacemacs 2 0.47%
nano 2 0.47%
linux with vim as my text editor 1 0.24%
Kate 1 0.24%
textmate 1 0.24%
TextPad 1 0.24%
Simple text editor 1 0.24%
Notepad++ 1 0.24%
Also nvi. 1 0.24%
mcedit 1 0.24%
PSPad 1 0.24%
geany with erlang syntax support 1 0.24%
Kakoune 1 0.24%
Neovim 1 0.24%
Acme 1 0.24%
Spacemacs 1 0.24%
Atom and Emacs both very equally 1 0.24%
ed 1 0.24%
elvis 1 0.24%

Where do you go for Erlang news and discussions?

/galleries/state-of-beam-2017/news.png
Twitter 204 20.20%
Mailing List 188 18.61%
Slack 116 11.49%
Reddit 111 10.99%
Stack Overflow 103 10.20%
IRC 62 6.14%
Erlang Central 60 5.94%
Newsletters 50 4.95%
Podcasts 33 3.27%
Planet Erlang 31 3.07%
ElixirForum 31 3.07%
Elixir Community 1 0.10%
lobste.rs 1 0.10%
EUC 1 0.10%
Reddit and ElixirForum 1 0.10%
This week in Erlang 1 0.10%
Gitter 1 0.10%
Awesome Elixir 1 0.10%
OTP's github for PRs and commit log 1 0.10%
elixirstatus.com 1 0.10%
Google Plus 1 0.10%
youtube 1 0.10%
Search on github 1 0.10%
Erlang solutions 1 0.10%
not interesting 1 0.10%
Medium 1 0.10%
None 1 0.10%
Watch talks 1 0.10%
Conference Videos 1 0.10%
Elixir Sips 1 0.10%
https://medium.com/@gootik 1 0.10%
https://lobste.rs/t/erlang 1 0.10%

Which versions of the Erlang VM do you currently use for development?

/galleries/state-of-beam-2017/versiondev.png

We are really up to date, we are near a point where we can assume maps on our libraries :)

20 305 46.71%
19 213 32.62%
18 84 12.86%
17 30 4.59%
16 16 2.45%
<= 15 5 0.77%

Which versions of the Erlang VM do you currently use in production?

/galleries/state-of-beam-2017/versiondeploy.png

Of course production is a little more conservative

19 215 37.65%
20 183 32.05%
18 94 16.46%
17 43 7.53%
16 26 4.55%
<= 15 10 1.75%

Which build tool do you use?

/galleries/state-of-beam-2017/buildtool.png

Nice to see Rebar3 picking up momentum, Mix being mainly the Elixir Effect, next year I should add an option for "Mix for erlang or mixed projects".

Rebar3 220 32.59%
Mix 177 26.22%
Makefile 111 16.44%
Rebar 71 10.52%
erlang.mk 46 6.81%
Custom build scripts 44 6.52%
Distillery 1 0.15%
maven 1 0.15%
redo 1 0.15%
mix 1 0.15%
synrc/mad 1 0.15%
MBU 1 0.15%

How do you test your code?

/galleries/state-of-beam-2017/howtest.png

Surprised by EUnit being on top, why do people prefer it over Common Test?

EUnit 216 34.67%
Common Test 158 25.36%
ExUnit 74 11.88%
PropEr 69 11.08%
I don't write tests 45 7.22%
QuickCheck 33 5.30%
Custom 4 0.64%
Triq 4 0.64%
ESpec 3 0.48%
CutEr 3 0.48%
StreamData 2 0.32%
Lux 2 0.32%
py.test 2 0.32%
Functional tests 1 0.16%
Don't have time to write tests 1 0.16%
katana-test 1 0.16%
riak_test 1 0.16%
Dialyzer 1 0.16%
Integration tests 1 0.16%
Elixir tests. 1 0.16%
Concuerror 1 0.16%

How do you deploy your application?

/galleries/state-of-beam-2017/howdeploy.png

Lot of custom deploy scripts and docker/kubernetes here, maybe we should have better deploy support in our tools?

Custom deploy scripts 186 32.75%
Docker 128 22.54%
Kubernetes 50 8.80%
Ansible 44 7.75%
I don't deploy in other servers 40 7.04%
Chef 39 6.87%
Puppet 11 1.94%
SaltStack 11 1.94%
Heroku 11 1.94%
Edeliver 8 1.41%
deb 7 1.23%
Distillery 7 1.23%
Zones 5 0.88%
AWS CodeDeploy 3 0.53%
Rancher 1 0.18%
VM image 1 0.18%
boot from flash 1 0.18%
https://github.com/labzero/bootleg2 1 0.18%
Not my job 1 0.18%
copy paste 1 0.18%
mad 1 0.18%
CD 1 0.18%
Exrm 1 0.18%
rpm 1 0.18%
Nomad 1 0.18%
AWS ECS 1 0.18%
FreeBSD Jails 1 0.18%
lxc 1 0.18%
WIX 1 0.18%
os packages 1 0.18%
nanobox 1 0.18%
cloudfoundry 1 0.18%

What is your organization's size?

/galleries/state-of-beam-2017/orgsize.png

Can we say that Erlang works on organizations of any size?

11-50 109 26.20%
2-10 93 22.36%
Just me 75 18.03%
500+ 65 15.62%
101-500 45 10.82%
51-100 29 6.97%

Which operating system(s) you use for development?

/galleries/state-of-beam-2017/osdev.png

Almost same amount of Windows and FreeBSD, is it because Windows support is bad? or is this a reflection of the usual developer OS choice in any programming language?

Linux 307 47.01%
MacOS 253 38.74%
Windows 38 5.82%
FreeBSD 34 5.21%
Illumos 8 1.23%
OpenBSD 7 1.07%
Solaris 3 0.46%
NetBSD 1 0.15%
GRiSP 1 0.15%
ChromeOS 1 0.15%

Which operating system(s) you use for deployment?

/galleries/state-of-beam-2017/osdeploy.png
Linux 378 75.15%
FreeBSD 43 8.55%
MacOS 25 4.97%
Windows 22 4.37%
I don't deploy in other servers 11 2.19%
Solaris 9 1.79%
Illumos 8 1.59%
OpenBSD 3 0.60%
RTEMS 1 0.20%
GRiSP 1 0.20%
OSv 1 0.20%
NetBSD 1 0.20%

Where do you deploy your applications?

/galleries/state-of-beam-2017/wheredeploy.png

I don't think this question provides useful information, maybe I should add options?

Public Cloud 188 27.85%
Use on local machine(s) 162 24.00%
Traditional Infrastructure 157 23.26%
Private Cloud (or hybrid) 156 23.11%
Distillery 1 0.15%
VMs on ESXi 1 0.15%
embedded systems 1 0.15%
Rented physical server 1 0.15%
Vagrant vms 1 0.15%
Embedded appliances 1 0.15%
Heroku 1 0.15%
VPS 1 0.15%
hyper.sh 1 0.15%
Containers (Docker) 1 0.15%
Edeliver 1 0.15%
GitHub 1 0.15%

Which events have you attended in the last year?

/galleries/state-of-beam-2017/events.png

Local Meetups at the top is a nice one, we can work to promote more of these.

Local Meetup 124 46.97%
Erlang Factory 39 14.77%
Erlang User Conference 38 14.39%
Erlang Factory Light 20 7.58%
ElixirConf 12 4.55%
ElixirConfEU 9 3.41%
None 6 2.27%
Lonestar Elixir 3 1.14%
Code Mesh 2 0.76%
Lambda Days 1 0.38%
ElixirConfEU + ElixirLDN 1 0.38%
ElixirConf USA 2017 1 0.38%
Elixir London 1 0.38%
ElixirConf 2017 1 0.38%
Elixir meetup in Leeds UK 1 0.38%
ElixirLive Conference in Warsaw 1 0.38%
J on the Beach 1 0.38%
Peer gatherings in region 1 0.38%
Empex 1 0.38%
Elixir Camp 1 0.38%

Do you use HiPE?

No 301 74.32%
Yes 104 25.68%

Do you use dialyzer?

Yes 280 66.99%
No 138 33.01%

How important have each of these aspects of Erlang been to you and your projects?

Remember that charts and tables are sorted by most to less answers to compare correctly in the following set of questions.

Community

/galleries/state-of-beam-2017/ocommunity.png
Very Important 157 37.74%
Fairly Important 112 26.92%
Important 79 18.99%
Slightly Important 52 12.50%
No Opinion 8 1.92%
Not Important at All 8 1.92%

Concurrency facilities

/galleries/state-of-beam-2017/oconcurrency.png
Very Important 306 73.73%
Fairly Important 58 13.98%
Important 36 8.67%
No Opinion 7 1.69%
Slightly Important 7 1.69%
Not Important at All 1 0.24%

Ease of development

/galleries/state-of-beam-2017/oeasedev.png
Very Important 205 49.52%
Fairly Important 98 23.67%
Important 72 17.39%
Slightly Important 27 6.52%
No Opinion 10 2.42%
Not Important at All 2 0.48%

Functional Programming

/galleries/state-of-beam-2017/ofp.png
Very Important 207 49.88%
Fairly Important 105 25.30%
Important 53 12.77%
Slightly Important 33 7.95%
No Opinion 9 2.17%
Not Important at All 8 1.93%

Immutability

/galleries/state-of-beam-2017/oimmutability.png
Very Important 222 53.62%
Fairly Important 90 21.74%
Important 60 14.49%
Slightly Important 30 7.25%
No Opinion 8 1.93%
Not Important at All 4 0.97%

Runtime performance

/galleries/state-of-beam-2017/operf.png
Very Important 148 35.75%
Fairly Important 122 29.47%
Important 95 22.95%
Slightly Important 36 8.70%
Not Important at All 7 1.69%
No Opinion 6 1.45%

The REPL

/galleries/state-of-beam-2017/orepl.png
Very Important 145 35.02%
Fairly Important 106 25.60%
Important 74 17.87%
Slightly Important 61 14.73%
No Opinion 19 4.59%
Not Important at All 9 2.17%

Tracing

/galleries/state-of-beam-2017/otracing.png
Slightly Important 96 23.02%
Very Important 95 22.78%
Fairly Important 90 21.58%
Important 82 19.66%
Not Important at All 29 6.95%
No Opinion 25 6.00%

What has been most frustrating or has prevented you from using Erlang more than you do now?

App deployment

/galleries/state-of-beam-2017/fappdev.png
Not Frustrating at All 120 30.08%
Slightly Frustrating 93 23.31%
Frustrating 54 13.53%
Fairly Frustrating 41 10.28%
Quite the contrary: I love this feature 38 9.52%
No Opinion 29 7.27%
Very Frustrating 24 6.02%

Error messages

/galleries/state-of-beam-2017/ferrormsgs.png
Slightly Frustrating 119 29.82%
Not Frustrating at All 89 22.31%
Frustrating 48 12.03%
Fairly Frustrating 43 10.78%
Quite the contrary: I love this feature 39 9.77%
Very Frustrating 38 9.52%
No Opinion 23 5.76%

Finding libraries

/galleries/state-of-beam-2017/flibs.png
Slightly Frustrating 137 34.08%
Not Frustrating at All 121 30.10%
Frustrating 64 15.92%
Fairly Frustrating 31 7.71%
Quite the contrary: I love this feature 21 5.22%
Very Frustrating 15 3.73%
No Opinion 13 3.23%

Hard to Learn it

/galleries/state-of-beam-2017/fhardlearn.png
Not Frustrating at All 204 51.13%
Slightly Frustrating 77 19.30%
Quite the contrary: I love this feature 48 12.03%
Frustrating 29 7.27%
No Opinion 21 5.26%
Fairly Frustrating 14 3.51%
Very Frustrating 6 1.50%

Hiring and staffing

/galleries/state-of-beam-2017/fhiring.png
No Opinion 124 31.47%
Slightly Frustrating 78 19.80%
Not Frustrating at All 71 18.02%
Fairly Frustrating 43 10.91%
Frustrating 41 10.41%
Very Frustrating 25 6.35%
Quite the contrary: I love this feature 12 3.05%

Installation process

/galleries/state-of-beam-2017/finstallation.png
Not Frustrating at All 218 55.05%
Slightly Frustrating 67 16.92%
Quite the contrary: I love this feature 54 13.64%
Frustrating 23 5.81%
Fairly Frustrating 16 4.04%
No Opinion 14 3.54%
Very Frustrating 4 1.01%

Long term viability

/galleries/state-of-beam-2017/fviability.png
Not Frustrating at All 194 48.87%
Quite the contrary: I love this feature 74 18.64%
Slightly Frustrating 46 11.59%
No Opinion 41 10.33%
Frustrating 28 7.05%
Fairly Frustrating 9 2.27%
Very Frustrating 5 1.26%

Need more docs/tutorials

/galleries/state-of-beam-2017/fdocs.png
Not Frustrating at All 127 32.32%
Slightly Frustrating 124 31.55%
Frustrating 44 11.20%
Fairly Frustrating 37 9.41%
Quite the contrary: I love this feature 22 5.60%
No Opinion 22 5.60%
Very Frustrating 17 4.33%

Need more text editor support/IDEs

/galleries/state-of-beam-2017/fides.png
Not Frustrating at All 168 42.00%
Slightly Frustrating 93 23.25%
Frustrating 39 9.75%
Quite the contrary: I love this feature 32 8.00%
Fairly Frustrating 28 7.00%
Very Frustrating 22 5.50%
No Opinion 18 4.50%

Need more tools

/galleries/state-of-beam-2017/ftools.png
Slightly Frustrating 128 32.16%
Not Frustrating at All 99 24.87%
Frustrating 58 14.57%
Fairly Frustrating 40 10.05%
Very Frustrating 34 8.54%
No Opinion 26 6.53%
Quite the contrary: I love this feature 13 3.27%

No static typing

/galleries/state-of-beam-2017/ftyping.png
Not Frustrating at All 113 28.18%
Slightly Frustrating 105 26.18%
Quite the contrary: I love this feature 63 15.71%
Frustrating 40 9.98%
Fairly Frustrating 34 8.48%
Very Frustrating 25 6.23%
No Opinion 21 5.24%

Release schedule

/galleries/state-of-beam-2017/freleasesched.png
Not Frustrating at All 258 64.99%
Quite the contrary: I love this feature 57 14.36%
No Opinion 43 10.83%
Slightly Frustrating 26 6.55%
Frustrating 9 2.27%
Very Frustrating 2 0.50%
Fairly Frustrating 2 0.50%

Runtime performance

/galleries/state-of-beam-2017/fperformance.png
Not Frustrating at All 185 46.25%
Slightly Frustrating 72 18.00%
Quite the contrary: I love this feature 57 14.25%
Frustrating 32 8.00%
No Opinion 25 6.25%
Fairly Frustrating 17 4.25%
Very Frustrating 12 3.00%

Unpleasant community

/galleries/state-of-beam-2017/fcommunity.png
Not Frustrating at All 224 56.14%
Quite the contrary: I love this feature 79 19.80%
No Opinion 45 11.28%
Slightly Frustrating 26 6.52%
Frustrating 14 3.51%
Very Frustrating 7 1.75%
Fairly Frustrating 4 1.00%

Version incompatibility

/galleries/state-of-beam-2017/fversioncompat.png
Not Frustrating at All 212 53.13%
Slightly Frustrating 84 21.05%
No Opinion 40 10.03%
Quite the contrary: I love this feature 29 7.27%
Frustrating 19 4.76%
Fairly Frustrating 11 2.76%
Very Frustrating 4 1.00%

Any feature you would like to see added to the language?

This was an open ended question, I'm summarizing similar answers here in groups

Static Typing 20
Performance 7
Pipe operator 7
JIT 6
Currying 6
Better GUI lib 5
Better macros 4
Docs in shell 4
Better language interop 4
JSON in stdlib 3
Compile to single binary 3
Namespaces 3
Rebind variables 2
Numeric performance 2
Elixir protocols 2
Language server protocol 2
Non full mesh disterl 2
Consensus implementations in stdlib 2
More than 2 version of same module 2
Atom GC 2

Other answers with one vote:

  • Backward compatibility
  • BEAM on browsers
  • Better binary syntax
  • Better container support
  • Better datetime support
  • Better documentation
  • Better errors
  • Better global registry
  • Better if expression
  • Better map support in mnesia
  • Better ML integration
  • Better module system
  • Better proc_lib
  • Better profiler
  • Better site
  • Better string module
  • Better unicode support
  • Bigger standard library
  • Bring back parameterized modules
  • Cleanup standard library
  • Code change watcher and loader
  • Consistent error return
  • CRDTs
  • Curses version of observer
  • Database drivers/support
  • Early return statement
  • Encrypted inter node communication
  • Erlang leveldb/rocksdb (better DETS)
  • First class records (not as tuples)
  • Function composition
  • IPv6
  • Laziness
  • LLVM based Hipe
  • Map comprehensions
  • Monads
  • More behaviors
  • More Lispy
  • More robust on_load
  • Multi-poll sets
  • Native compilation
  • New logo
  • Numerical/GPU support
  • Orleans
  • Package manager
  • Rational numbers
  • Remove stuff
  • Short circuit folding a list
  • Single file distribution
  • String performance
  • Top-like tool
  • Type checking as you type
  • Type inference
  • WebRTC
  • With expression like Elixir

Any advise on how we can make Erlang more welcoming and easy to use?

This was an open ended question, I'm summarizing similar answers here in groups

Better guides 20
Better documentation 18
Better error messages 13
Better tooling 9
Central/better landing page 4
Better REPL 3
Translated documentation 2
Better libraries 2
Friendlier community 2
Better learning curve 2
Learn from Elixir community 3
IDE support 3
Marketing 2
Searchable docs 2
Throw away legacy 2
Simpler release process 2

Other answers with one vote:

  • A killer app
  • Better tracing tools
  • Better Windows experience
  • Embrace BEAM languages
  • Erlang forum
  • Introductory workshops
  • More conferences
  • More welcoming mailing list
  • Nicer syntax
  • Performance
  • Templates

Would you like to share any frustrating experience?

This was an open ended question, I'm summarizing similar answers here in groups

Bad tooling 6
Lack of libraries, immaturity, not maintained 5
Lack of guides 5
Unwelcome community 4
Lack of strong/static typing 4
Syntax 4
No examples on documentation/in general 3
Bad documentation 3
Mnesia 3
Bad debugging experience 3
Ignoring other languages/communities/feedback 3
Niche language 2
Bad shell 2
No jobs 2
Learning curve 2
Difficulty contributing to the BEAM and OTP 2
Confusing errors 2
Performance 2
Package management 2

Other answers with one vote:

  • Atoms not garbage collected
  • Elitism
  • Flat namespace
  • Hard to hire
  • Lack of features in standard library
  • Lack of language features
  • Not a clear overview of the ecosystem
  • People complaining about syntax
  • String vs binary
  • Upgrades break code