sábado, 12 de junio de 2021

Ballerina en ejemplos

Ballerina es un lenguaje de programación de código abierto para la nube que facilita el uso, la combinación y la creación de servicios de red. A primera vista recuerda a lenguajes como Java y o Typescript. Ballerinta maneja tipos básicos como in, float, string, boolean, etc. La síntaxis de estructuras de control secuencial e iterativa son similares a Java. La extensión de un programa es *.bal
En post anteriores hemos hablado sobre Docker. En este post usaremos una imagen de Ballerina y la descargaremos con Docker.
$ docker pull ballerina/ballerina
$ docker images

Para compilar y ejecutar un programa escribimos este script bash:
ejecuta.sh
#!/bin/bash

# Mostramos el nombre del programa a compilar y ejecutar
echo "Ejecutamos $1"
docker run -v `pwd`:/home/ballerina -it ballerina/ballerina:1.0.2 ballerina build $1
docker run -v `pwd`:/home/ballerina -it ballerina/ballerina:1.0.2 ballerina run $1
Para usar el script es necesario darle permiso de ejecución y pasar el nombre del programa como argumento de entrada:
$ sudo chmod +x ejecuta.sh
$ ./ejecuta.sh programa.bal

Comencemos con algunos ejemplos.

Ejemplo. El clásico programa de "Hola, mundo".
holamundo.bal
import ballerina/io;

public function main(string... args) {
    io:println("Hola en Ballerina!!");
 
}
Compilamos y ejecutamos:
$ ./ejecuta.sh holamundo.bal
Ejemplo. Obtener el mayor de tres número enteros.
mayor_tres_numeros.bal
import ballerina/io;

public function main(string... args) {
	int a = 4;
	int b = -32;
	int c = 1;
	int mayor = a; 
        io:println("Numeros:\na:",a,",b:",b,",c:",c);
	if(mayor < b){
	  mayor = b;
	}
	if(mayor < c){
	  mayor = c;
	}
	io:println("mayor:",mayor);
}
    

Compilamos y ejecutamos:
$ ./ejecuta.sh mayor_tres_numeros.bal

Ejemplo. Crear dos funciones, una para sumar y otra para multiplicar dos números enteros.
funciones.bal
import ballerina/io;

public function sumar(int a, int b) returns int {
    return a + b;
}

public function multiplicar(int a, int b) returns int {
    return a * b;
}

public function main(string... args) {
        int a=7;
	int b=5;
	io:println("Suma de 5 y 7 es: ",sumar(a,b));
	io:println("Producto de 5 y 7 es: ",multiplicar(a,b));   
}

Compilamos y ejecutamos:
$ ./ejecuta.sh funciones.bal

¿Qué podemos analizar con estos ejemplos?
io:println("Hola en Ballerina!!");
Con esta instrucción imprimimos a pantalla.
int entero = 34;
io:println("Entero: ",entero);

Las instrucciones deben terminar con ;
Además se debe respetar el tipo de dato (esto no es Javasript u otro lenguaje de tipado dinámico).  Las funciones pueden o no devolver valores, si devuelven deben llevar la palabra returns en la cabecera indicando el tipo a devolver y return para devolver el valor calculado.
 

Ejemplo. Crear un programa que haga uso de sentencias iterativas con for y while.
bucles.bal

import ballerina/io;

public function main(string... args) {
        io:println("Elemento 0: ",numeros[0]);//1
	io:println("Elemento 5: ",numeros[5]);//6
        io:println("Tamaño: ",numeros.length());//8
	foreach var num in numeros{
		io:println("Elemento: ",num);
	}
	io:println("======================================");
	foreach var i in 0...9 {
        io:println("Numero: ",i);    
    }  
	io:println("======================================");
	int cont=0;
	while (cont < 10) {
        io:println("Cont: ",cont);
        cont = cont + 1;
    }

}

Compilamos y ejecutamos:
$ ./ejecuta bucles.bal

Como se puede ver la síntaxis es casi idéntica a la de Java y/o C#. Para quienes tienen cierta experiencia programando en lenguajes similares se les facilitará aprenderlo.
En próximos post veremos más ejemplos.
Enlaces:
https://alquimistadecodigo.blogspot.com/2020/09/docker-instalando-ballerina.html
https://ballerina.io/

martes, 8 de junio de 2021

100 días de código Javascript... 7ma parte


Ejemplo. Validar datos con Javascript.
main.js
document.addEventListener("DOMContentLoaded", function(event) {
    
    console.log('Se ha ejecutado código JS');
    const btnActivar = document.getElementById("btnActivar");

    function activarEnvio(){
         alert("Enviando los datos...");
    }


    var tabla1Fila1 = false;
    var tabla1Fila2 = false;
    var tabla1Fila3 = false;

    var tabla2Fila1 = false;
    var tabla2Fila2 = false;
    var tabla2Fila3 = false;
   

    function validarFormulario(){
    var nomProd1 = "";
    var monto1 = "";
    var numContrato1 = "";
    
    if(nomProd1!=""){
      if(nomProd1!=""&&monto1!=""&&numContrato1!=""){
         document.getElementById("infoError1").style.display="none";tabla1Fila1=true;
      }else{
        document.getElementById("prrfError1").style.color="red";
        document.getElementById("prrfError1").innerText="Error: Debe completar todos los datos de la tabla 1 fila 1.";
        document.getElementById("infoError1").style.display="block";
      }
    }else{
        if(monto1!=""&&numContrato1!=""){
           document.getElementById("prrfError1").style.color="red";
           document.getElementById("prrfError1").innerText="Error: Debe completar todos los datos de la tabla 1 fila 1.";
           document.getElementById("infoError1").style.display="block";
        }else{
           document.getElementById("infoError1").style.display="none";tabla1Fila1=true;
        }
    }

    var nomProd2 = "";
    var monto2 = "";
    var numContrato2 = "";

    if(nomProd2!=""){
      if(nomProd2!=""&&monto2!=""&&numContrato2!=""){
         document.getElementById("infoError2").style.display="none";tabla1Fila2=true;
      }else{
        document.getElementById("prrfError2").style.color="red";
        document.getElementById("prrfError2").innerText="Error: Debe completar todos los datos de la tabla 1 fila 2.";
        document.getElementById("infoError2").style.display="block";
      }
    }else{
        if(monto2!=""&&numContrato2!=""){
           document.getElementById("prrfError2").style.color="red";
           document.getElementById("prrfError2").innerText="Error: Debe completar todos los datos de la tabla1 fila 2.";
           document.getElementById("infoError2").style.display="block";
        }else{
           document.getElementById("infoError2").style.display="none";tabla1Fila2=true;
        }
    }

    var nomProd3 = "";
    var monto3 = "";
    var numContrato3 = "";

    if(nomProd3!=""){
      if(nomProd3!=""&&monto3!=""&&numContrato3!=""){
         document.getElementById("infoError3").style.display="none";tabla1Fila3=true;
      }else{
        document.getElementById("prrfError3").style.color="red";
        document.getElementById("prrfError3").innerText="Error: Debe completar todos los datos de la tabla 1 fila 3.";
        document.getElementById("infoError3").style.display="block";
      }
    }else{
        if(monto3!=""&&numContrato3!=""){
           document.getElementById("prrfError3").style.color="red";
           document.getElementById("prrfError3").innerText="Error: Debe completar todos los datos de la tabla 1  fila 3.";
           document.getElementById("infoError3").style.display="block";
        }else{
           document.getElementById("infoError3").style.display="none";tabla1Fila3=true;
        }
    }



   var tv1 = "9";
   var nb1 = "4";
   var nt1 = "7";
   var cp1 = "12";
   var s1 = "1234";
   var pt1 = "1200";

   if(tv1!=""){
      if(tv1!=""&&nb1!=""&&nt1!=""&&cp1!=""&&s1!=""&&pt1!=""){
         document.getElementById("infoError4").style.display="none";tabla2Fila1=true;
      }else{
        document.getElementById("prrfError4").style.color="red";
        document.getElementById("prrfError4").innerText="Error: Debe completar todos los datos de la tabla 2  fila 1.";
        document.getElementById("infoError4").style.display="block";
      }
    }else{
        if(nb1!=""&&nt1!=""&&cp1!=""&&s1!=""&&pt1!=""){
           document.getElementById("prrfError4").style.color="red";
           document.getElementById("prrfError4").innerText="Error: Debe completar todos los datos de la tabla 2 fila 1.";
           document.getElementById("infoError4").style.display="block";
        }else{
           document.getElementById("infoError4").style.display="none";tabla2Fila1=true;
        }
    }


   var tv2 = "B";
   var nb2 = "y";
   var nt2 = "6";
   var cp2 = "99";
   var s2 = "1204";
   var pt2 = "1900";

    if(tv2!=""){
      if(tv2!=""&&nb2!=""&&nt2!=""&&cp2!=""&&s2!=""&&pt2!=""){
         document.getElementById("infoError5").style.display="none";tabla2Fila2=true;
      }else{
        document.getElementById("prrfError5").style.color="red";
        document.getElementById("prrfError5").innerText="Error: Debe completar todos los datos de la tabla 2 fila 2.";
        document.getElementById("infoError5").style.display="block";
      }
    }else{
        if(nb2!=""&&nt2!=""&&cp2!=""&&s2!=""&&pt2!=""){
           document.getElementById("prrfError5").style.color="red";
           document.getElementById("prrfError5").innerText="Error: Debe completar todos los datos de la tabla 2 fila 2.";
           document.getElementById("infoError5").style.display="block";
        }else{
           document.getElementById("infoError5").style.display="none";tabla2Fila2=true;
        }
    }



   var tv3 = "G";
   var nb3 = "8";
   var nt3 = "87";
   var cp3 = "4";
   var s3 = "8";
   var pt3 = "88";


    if(tv3!=""){
      if(tv3!=""&&nb3!=""&&nt3!=""&&cp3!=""&&s3!=""&&pt3!=""){
         document.getElementById("infoError6").style.display="none";tabla2Fila3=true;
      }else{
        document.getElementById("prrfError6").style.color="red";
        document.getElementById("prrfError6").innerText="Error: Debe completar todos los datos de la tabla 2 fila 3.";
        document.getElementById("infoError6").style.display="block";
      }
    }else{
        if(nb3!=""&&nt3!=""&&cp3!=""&&s3!=""&&pt3!=""){
           document.getElementById("prrfError6").style.color="red";
           document.getElementById("prrfError6").innerText="Error: Debe completar todos los datos de la tabla 2 fila 3.";
           document.getElementById("infoError6").style.display="block";
        }else{
           document.getElementById("infoError6").style.display="none";tabla2Fila3=true;
        }
    }
   }



    btnActivar.addEventListener("click", ()=>{
        console.log("Verificar datos");
        validarFormulario();
        if(tabla1Fila1 && tabla1Fila2 && tabla1Fila3 && tabla2Fila1 && tabla2Fila2 && tabla2Fila3){
           document.getElementById("infoFinal").style.display="block";
           document.getElementById("prrfFinal").innerText="Ya no hay errores, listo para enviar datos.";
           document.getElementById("prrfFinal").style.color="blue";
           activarEnvio();
        }else{
           document.getElementById("infoFinal").style.display="block";
           document.getElementById("prrfFinal").innerText="Hay errores, corrigalos por favor";
           document.getElementById("prrfFinal").style.color="red";
        }

    });



});

index.html
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
  <title>Ejemplos en JS</title>
</head>
<script type="text/javascript" src="main.js">
</script>

<style type="text/css">
#infoError1{
  display: none;
}
#prrfError1{
  text-align: center;
}

#infoError2{
  display: none;
}
#prrfError2{
  text-align: center;
}

#infoError3{
  display: none;
}
#prrfError3{
  text-align: center;
}

#infoError4{
  display: none;
}
#prrfError4{
  text-align: center;
}

#infoError5{
  display: none;
}
#prrfError5{
  text-align: center;
}

#infoError6{
  display: none;
}
#prrfError6{
  text-align: center;
}


#infoFinal{
  display: none;
}
#prrfFinal{
  text-align: center;
}




</style>
<body>
  <h1>Programando en JS</h1>
  
  <div id="infoError1">
    <p id="prrfError1"></p>
  </div><br/>
  <div id="infoError2">
    <p id="prrfError2"></p>
  </div><br/>
  <div id="infoError3">
    <p id="prrfError3"></p>
  </div><br/>
  <div id="infoError4">
    <p id="prrfError4"></p>
  </div><br/>
  <div id="infoError5">
    <p id="prrfError5"></p>
  </div><br/>
  <div id="infoError6">
    <p id="prrfError6"></p>
  </div>
   <br/>
   <div id="infoFinal">
    <p id="prrfFinal"></p>
  </div>

  <div id="btnDiv">
  <button id="btnActivar">Verfificar</button>
  </div>
</body>
<html>

Continuaremos con más post sobre Javascript.

viernes, 28 de mayo de 2021

Erlang en ejemplos 2

Para quienes han tenido que documentar su código saben que es un proceso que puede llevar más tiempo que el necesario. En lenguajes como Java contamos con el famoso Javadoc, una herramienta que permite la documentación de nuestro código.
package ejemplos;

/**
* <h1>Main.java</h1>
* @author Codemonkey Junior
* @version 1.0.0
* @see http://codemonkeyjunior.blogspot.com
*
*/ import static java.lang.System.out; public class Main{ /** * *@param args * */ public static void main(String[] args){ out.println("Hola, mundo en Java"); } }

En este ejemplo podemos ver el uso de etiquetas especiales que nos ayudan describir partes del código que pudieran ser importantes. Como dice una regla no escrita en el mundo de la programación:
Pasamos más tiempo viendo el código de otros, que escribiendo nuevo código

Y que mejor si este código está documentado. En Erlang también existen etiquetas similares al Javadoc de Java. En este ejemplo podemos ver el uso de estás etiquetas.
%%% @doc Programa para conversion de temperaturas
%%% @copyright Inforhomex 2021
-module(conversion).
-author("Codemonkey Junior").
-version("1.0.0").
-export([fahr/1, cels/1]).

%% @doc De Celsius a Fahrenheit
-spec fahr(number()) -> number().
fahr(C) -> (C-32)/1.8.


%% @doc De Fahrenheit a Celsius
-spec cels(number()) -> number().
cels(F) -> (F*1.8)+32.

%% @end
%% erl %% > c(conversion). %% > conversion:fahr(-32.8). %% > conversion:cels(22.9).

Hay un post en Stackoverflow que podría ser muy útil para saber más sobre la documentación de código en Erlang: https://stackoverflow.com/questions/9378765/specifications-for-functions-spec-efficiently-usage En próximos post hablaremos más de este lenguaje.

Enlaces:
http://codemonkeyjunior.blogspot.com/2021/05/erlang-en-ejemplos.html
https://codemonkeyjunior.blogspot.com/2021/05/erlang-modulos.html
https://zxq9.com/projects/zomp/
https://zxq9.com/archives/1650 https://learnyousomeerlang.com/

miércoles, 19 de mayo de 2021

Erlang en ejemplos

En pasados post vimos como instalar una imagen de Erlang usando Docker. También vimos como instalar Erlang en nuestra máquina. Una diferencia entre la ejecución de un programa Erlang usando la imagen instalada con docker es que debe haber un metódo main con un argumento:
holamundo.erl
% Hola mundo en Erlang
-module(holamundo).
-import(io, [format/1]).
-export([main/1]).

main(_Args) ->
    format("Hola, mundo con Erlang!!~n").

Ejecutando con Docker:
$ docker run -it --rm --name erlang-inst1 -v "$PWD":/usr/src/myapp -w /usr/src/myapp erlang escript holamundo.erl

Teniendo instalado Erlang en nuestras máquinas el código cambia un poco. No es necesario contar con un método main con un argumento.
holamundo2.erl
% Hola mundo en Erlang
-module(holamundo).
-import(io, [format/1]).
-export([start/0]).

start() ->
    format("Hola, mundo con Erlang!!~n").

Ejecutando sin Docker:
$ erl
> c(holamundo2).
> holamundo2:start().

Es importante recordar que toda variable en Erlang debe comenzar con una mayúscula y toda instrucción termina con un punto. Tampoco puedes reasignar un valor a una variable con valor asignado previamente.
$ erl

Erlang/OTP 24 [erts-12.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Eshell V12.0  (abort with ^G)
1> E=0.
0
2> 0=E.
0
3> E=8.
** exception error: no match of right hand side value 8
4> E=4.
** exception error: no match of right hand side value 4
5> 
BREAK: (a)bort (A)bort with dump (c)ontinue (p)roc info (i)nfo
       (l)oaded (v)ersion (k)ill (D)b-tables (d)istribution

Ejemplo. Crear una función que sume dos número enteros.
suma.erl
-module(suma).
-author("Codemonkey Junior").
-version("1.0.0").
-export([suma/2, main/1]).
-import(io, [format/1]).
-import(io, [format/2]). main(_Args)-> format("Sumar dos numeros en Erlang~n"), A = 2, B = 3, suma(A,B). suma(A, B)-> format("A=~p~n",[A]), format("B=~p~n",[B]), RESULT = A+B, format("Suma=~p~n",[RESULT]). % erl % c(suma). % suma:main(1). % q().
Ejecutamos...
$ erl
> c(suma).
> suma:main(1).
> q().

En próximos post veremos más ejemplos.
Enlaces:
https://codemonkeyjunior.blogspot.com/2020/09/docker-instalando-erlang.html
https://erlang-otp.es/
https://learnyousomeerlang.com/

lunes, 10 de mayo de 2021

Elixir: cadenas

 

En cualquier lenguaje de programación existen funciones para el tratamiento de cadenas (String).

$ iex
> String.upcase("abc")
"ABC"
> String.downcase("ABC")
"abc"

Estas funciones convertirán una cadena en minúsculas a mayúsculas. La otra String.downcase("STR") de mayúscula a minúscula.

> String.length("abc")
3
> String.capitalize("elixir")
"Elixir"

Estás dos funciones obtendrán la longitud de la cadena y la otra mostrará el primer carácter en mayúscula. 

> "abc" == "abc"
true
> "abc == "ab1"
false
> String.trim(" Elixir y Erlang ")
"Elixir y Erlang"
No existe una función como equals, pero se puede usar el operador == para comparar dos cadenas. La función String.trim(" cadena con espacios "), quitará los espacios de una cadena.
> String.to_integer("233")
233
> String.to_float("23.9")
23.9
> String.to_atom("hello")
:hello
Existen funciones para convertir cadenas a tipos entero (Int) o tipo (Float). Además de convertir la cadena a atoms, las cuales son constantes cuyos valores tienen su propio nombre. Próximamente más ejemplos en Elixir.
Enlaces:
https://hexdocs.pm/elixir/String.html