lunes, 20 de diciembre de 2021

Erlang: construir aplicaciones Erlang con Rebar3

Rebar3 es una herramienta que permite crear aplicaciones Erlang. Para instalarlo puedes seguir este link: http://rebar3.org/docs/getting-started/

Abrimos una terminal y tecleamos:

$ rebar3 new app auditor
===> Writing auditor/src/auditor_app.erl
===> Writing auditor/src/auditor_sup.erl
===> Writing auditor/src/auditor.app.src
===> Writing auditor/rebar.config
===> Writing auditor/.gitignore
===> Writing auditor/LICENSE
===> Writing auditor/README.md

Nos ubicamos en el directorio:

$ cd auditor
$ tree
.
├── LICENSE
├── README.md
├── rebar.config
└── src
    ├── auditor.app.src
    ├── auditor_app.erl
    └── auditor_sup.erl

Con esto tendremos nuestra primera aplicación creada con Rebar3.

exit()->
   io:fwrite("Hasta la próxima!!!\n").

Enlaces:
https://medium.com/erlang-central/building-your-first-erlang-app-using-rebar3-25f40b109aad
https://rebar3.readme.io/
https://adoptingerlang.org/docs/development/otp_applications/

domingo, 5 de diciembre de 2021

100 días de código javascript ... 9na parte



Ejemplo 1.Las expresiones regulares son un mecanismo para encontrar patrones en cadenas de texto. Recorrer un arreglo y mostrar solo la fecha que cumpla el patrón (regex).
let fechas = ["12-09-1990","24:05:2000","25-JUN-2001","08-AGO-1987"];

for(let c in fechas){
  if(/\d\d-\w\w\w-\d\d\d\d/.test(fechas[c])){
     console.log('Cumple:',fechas[c]);
  }
}

Ejemplo 2. Exportar e importar archivos JS.
titulo_export.js
const titulo = "El retrato de una odisea sin nombre.";

export {titulo};
titulo_import.js
"use strict";

// 1. Primer forma
import {titulo} from './titulo_export.js';

console.log(`Titulo: ${titulo}`);

// 2. Segunda forma
import * as libro from './titulo_export.js';

console.log(`Titulo: ${libro.titulo}`);
Tweets #100daysofcode :

Enlaces:
https://dmitripavlutin.com/javascript-string-trim/
https://vanshsharma.hashnode.dev/difference-bw-forin-and-forof

lunes, 15 de noviembre de 2021

PHP: expresiones regulares y otras cosas

PHP es un lenguaje bastante vilipendiado. No lo neguemos, tú, yo, tus colegas han tenido debates sobre "lo malo" que es el lenguaje. Sin embargo, con la madurez reconocemos que hemos estado equivocados, bastante equivocados. PHP es un lenguaje que ha salido avante a pesar del advenimiento de otros lenguajes de programación modernos. Con este lenguaje puedes crear servicios web, aplicaciones web dinámicas, etc. Tiene centenares o/y miles de Frameworks que facilitan (o complican) la vida del programador. Node JS, Angular... son lo de hoy, pero siempre habrá desarrollos que requieran algún programador que sepa PHP.
Antes de comenzar... instalaremos PHP Cli.
$ sudo apt-get update
$ sudo apt-get install php-cli -y
$ php --version

Las expresiones regulares son mecanismos par hacer coincidir patrones y/o cadenas. Para trabajar con expresiones regulares debemos:
  1. Definir qué patrón se quiere buscar
  2. Cadena donde se quiere buscar ese patrón

Ejemplo. Programa que verifique si las cadenas cumplen un patrón definido.

regex.php
<?php

  // Si empieza con F o f
  $expr1 = "/^F|f/";
  $cadena = "Fernando";
  if(preg_match($expr1, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si son dígitos
  $expr2 ="/[0-9]/";
  $cadena = "123456";
  if(preg_match($expr2, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si no son caracteres normales 
  $expr3 ="/\W/";
  $cadena = "%&@#!?{}[=";
  if(preg_match($expr3, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si tiene espacios
  $expr4 ="/\s/";
  $cadena = "a b c ";
  if(preg_match($expr4, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si no tiene espacios vacíos
  $expr5 ="/\S/";
  $cadena = "abcdef";
  if(preg_match($expr5, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si es un dígito 
  $expr6 ="/\d/";
  $cadena = "12087";
  if(preg_match($expr6, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si no es un dígito 
  $expr7 ="/\D/";
  $cadena = "TRES MIL UNO";
  if(preg_match($expr7, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si es un caracter 
  $expr7 ="/\w/";
  $cadena = "El gato tiene 3 patas.";
  if(preg_match($expr7, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si no son dígitos 
  $expr8 ="/[^0-9]/";
  $cadena = "Whisky";
  if(preg_match($expr8, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

  // Si no son dígitos 
  $expr9 ="/[^a-z]/";
  $cadena = "anita lava la tina";
  if(preg_match($expr9, $cadena)){
  	echo "$cadena : concuerda con el patron\n";
  }

?>
Ejecutando:
$ php -S 127.0.0.1:8080 regex.php
¡Feliz código!
Enlaces:
https://symfony.es/
https://codeigniter.com/
https://cakephp.org/
https://laravel.com/
https://miguelgomezsa.com/blog/laravel-vs-codeigniter
https://carlos-herrera.com/laravel-vs-codeigniter/
https://codemonkeyjunior.wordpress.com/2020/09/06/docker-instalando-imagen-de-php/

lunes, 18 de octubre de 2021

100 días de código javascript ...8va parte

Algunos twitts sobre #100Daysofcode








Enlaces:
https://javascript.info/
https://jsisweird.com/

jueves, 2 de septiembre de 2021

Gradle: creando un proyecto C++

Gradle ha evolucionado de ser una alternativa a Maven a ser algo más. Ahora se puede crear y administrar proyectos Kotlin, Swift y hasta C++. en este post veremos:
  1. Crear una carpeta para un proyecto C++
  2. Generar un proyecto C++ con Gradle
  3. Editar archivo principal
  4. Construir y ejecutar
1. Crear carpeta del proyecto:
$ mkdir pruebasCpp && cd pruebasCpp
2. Generar proyecto C++ con Gradle:
$ gradle init


Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2
Elegimos la opción 2, porque queremos crear una aplicación.
Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 1
Elegimos la opción 1, porque queremos usar C++.
Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1
Elegimos la opción 2, porque... solo para variar un poco.
Listemos el el contenido del directorio:
$ tree

.
├── app
 ├── build
  ├── exe
   └── main
       └── debug
           └── app
  ├── install
   └── main
       └── debug
           ├── app
           └── lib
               └── app
  ├── obj
   ├── for-test
    └── main
        └── debug
            └── app.o
   └── main
       └── debug
           └── c0rn65lkroj8p4fvz0qgmzzjr
               └── app.o
  ├── test-results
   └── test
  └── tmp
      ├── compileDebugCpp
       ├── options.txt
       └── output.txt
      ├── compileTestCpp
       ├── options.txt
       └── output.txt
      ├── linkDebug
       ├── options.txt
       └── output.txt
      └── linkTest
          ├── options.txt
          └── output.txt
 ├── build.gradle.kts
 └── src
     └── main
         ├── cpp
          └── app.cpp
         └── headers
             └── app.h
├── gradle
 └── wrapper
     ├── gradle-wrapper.jar
     └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts

Observemos nuestro archivo "build" generado.
build.gradle.kts
/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample C++ project to get you started.
 * For more details take a look at the Building C++ applications and libraries chapter in the Gradle
 * User Manual available at https://docs.gradle.org/7.2/userguide/building_cpp_projects.html
 */

plugins {
    // Apply the cpp-application plugin to add support for building C++ executables
    `cpp-application`

    // Apply the cpp-unit-test plugin to add support for building and running C++ test executables
    `cpp-unit-test`
}

// Set the target operating system and architecture for this application
application {
    targetMachines.add(machines.linux.x86_64)
}
3. Vamos a la carpeta donde esta el archivo principal y lo editamos:
app.cpp
/*
 * This C++ source file was generated by the Gradle 'init' task.
 */

#include <iostream>
#include <stdlib.h>
#include "app.h"

std::string demo::Greeter::greeting() {
    return std::string("Hola mundo desde Codemonkey Junior!!");
}

int main () {
    demo::Greeter greeter;
    std::cout << greeter.greeting() << std::endl;
    return 0;
}
4. Contruimos y ejecutamos:
$ ./gradlew build

$ ./app/build/exe/main/debug/app

Hola mundo desde Codemonkey Junior!!
En próximos post veremos más ejemplos.

Enlaces:
https://gradle.org/

domingo, 15 de agosto de 2021

¿Vale la pena aprender C y o C++?


En lenguaje C tuvo su época de gloria en en los años 70's. Con el advenimiento de lenguajes de programación como Visual Basic, Java, PHP y otros más es bueno recordarlo. C es un lenguaje que aún vale la pena darle un vistazo.

En este post usaremos el compilador GCC:
$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

holamundo.c
#include<stdio.h>
#define FIN 0

int main(int argc, char *argv[]){
  puts("Hola, mundo en C");
  return FIN;
}
Compilar:
$ gcc holamundo.c -o ejecutable
Ejecutar:
$ ./ejecutable

La evolución directa del lenguaje no fue ni Java o C#, fue C++. Si con C la curva de aprendizaje era alta, con C++ aumento de manera considerable. Podíamos hacer exactamente los mismo pero ahora tenia otras cosas más por aplicar como lo es: la programación orientada a objetos. Objetos, clases, herencia, polimorfismo era conceptos difíciles de aprender a quienes solo conocían los paradigmas funcional o estruturado. La primera diferencia es: la extensión de un programa en C++. Ya que se añade dos "pp" a la extensión clásica, quedando ".cpp" en vez de solo ".c". Otra diferencia es que introduce el concepto de manejo de excepciones, plantillas y ,como se mencionó antes, la programación orientada a objetos.
holamundo.cpp
#include<iostream>
using namespace std;

int main(int argc, char *argv[]){
  cout << "Hola, mundo en C++"<<endl;
  return 0;
}
En este caso usaremos el compilador G++:
$ g++ --version
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compilamos:
$ g++ holamundo.cpp -o ejecutable
Ejecutamos:
$ ./ejecutable

Con C comprenderemos algunos conceptos como:

  • Punteros
  • Asignación dinámica de memoria
  • Tipos definidos y estructuras
Punteros y asignación dinámica de memoria
// Puntero, variable que almacena la memoria de otra variable
int entero = 33;
int *puntero_entero = NULL;

// Asignación dinámica de memoria
puntero_entero = (int *)malloc(1*sizeof(int));

*puntero_entero = &entero;
printf("entero:%d\n",entero);
printf("puntero:%p\n",puntero_entero);
Estructuras y tipos definidos
// Creamos un tipo definido
typedef struct Nodo Nodo;

// Creamos una estructura
struct Nodo{
  long item;
  int valor;
  Nodo *izq;
  Nodo *der;
};

Nodo *raiz = NULL;
// asignamos memoria
raiz = (Nodo *)malloc(sizeof(Nodo));

raiz->item=(long)(12000);
raiz->valor=123;
raiz->izq = raiz->der = NULL;
printf("%10ld : %10d\n", raiz->item, raiz->valor);

// ... 

Con C++ conoceremos:

  • Clases y objetos
  • Manejo de excepciones
  • Plantilas
Clases y objetos
#include<iostream>
using namespace std;

class X{
   public:
    X();
    virtual ~X();
};

X::X(){
  cout << "Objeto X creado"<<endl;
}

X::~X(){
  cout << "Objeto X destruido"<<endl;
}

int main(){
  X myObj;
  return 0;
}

Un pequeño consejo:

Para quienes quieran aprender a programar sería bueno que le dieran un vistazo al lenguaje C (en lugar de Python o cualquier otro "más sencillo").

Muchos juran y perjuran que Python es el mejor lenguaje de programación para principiantes, pero creo que no es así. Existen aspectos de la programación que en el lenguaje C te enseñará para después pasar a otros lenguajes. Si sabes lo que es un puntero y para qué se usa, si sabes lo que es la asignación dinámica de memoria y para qué se usa y si sabes para qué y cómo usar las estructuras de datos entonces ya estarás listo para pasar a Java, Python o cualquier otro lenguaje compilado o interpretado. 

Entendemos que es más fácil y entendible escribir un hola mundo de esta forma:

print("Hola, mundo en Python")

que en la forma de arriba. Pero cuando enfrentes proyectos hechos en lenguajes como Java, C++ y/o C# será más difícil entender la lógica y la complejidad del código.

Enlaces:
http://conclase.net/c

domingo, 18 de julio de 2021

Elixir: Creando un proyecto con Mix

En este post veremos cómo crear un proyecto Elixir usando Mix. Pero, ¿qué es Mix? Mix es una herramienta similar a Maven o Gradle (para quienes usan Java) que nos permite crear, cmpilar, ejecutar y administrar las aplicaciones Elixir.

Tan simple como abrir una terminal y teclear:
$ mix new proyecto
$ cd proyecto
$ mix help 

Esto nos creará un proyecto con el nombre 'proyecto'. Nos ubicamos en la carpeta principal y obtenemos la ayuda.

Alejecutar el comando nos mostrará una lista de los archivos creados:

* creating README.md
* creating .gitignore
* creating .formatter.exs
* creating mix.exs
* creating lib
* creating lib/proyecto.ex
* creating test
* creating test/test_helper.exs
* creating test/example_test.exs

El archivo principal es 'proyecto.ex':
$ ls
$ cat lib/proyecto.ex

Modificamos el archivo principal y creamos un método llamado 'hola' con el clásico programa "Hola, mundo"

proyecto.ex
defmodule Proyecto do
  def hola do 
    "Hola, mundo desde proyecto Elixir"
  end
end

Nota:Es importante saber que los archivos Elixir con la extensión *.exs son interpretados y los archivos con la extensión *.ex son compilados.

Para ejecutar debemos teclear (debemos estar en la misma carpeta del proyecto):
$ iex -S mix
> Proyecto
> Proyecto.hola()
"Hola, mundo desde proyecto Elixir"
Si se edita el archivo se deberá recompilar, para eso usamos 'recompile' y volverá a acompilar el archivo:
$ iex -S mix
> Proyecto
> Proyecto.nuevo_metodo()
"AQUI SALDRIA UN ERROR"
> recompile
> Proyecto.nuevo_metodo()
"Soy un nuevo método"
En próximos post veremos más ejemplos.
Links:
https://elixirschool.com

viernes, 9 de julio de 2021

Erlang: registros (record)


Un registro es un conjunto de campos que contienen los datos que pertenecen a una misma entidad. En base de datos representa una fila, una tupla. En Erlang podemos crear un registro de la siguiente manera:

%% Define un registro 'persona'
-define(persona,{nombre, edad, edo_civil = soltero}).

%% Define un registro 'producto'
-define(producto,{nombre, precio, marca, disponibilidad=true}).

En este ejemplo hemos creado dos registros:

  1. persona
  2. producto

Un registro en Erlang es similar a una estructura en C. Suele utilizarse para almacenar un número fijo de elementos. 

typedef struct{
  char nombre[30];
  char marca[30];
  double precio;
}Producto;

Las expresiones de registro se traducen a expresiones de tupla durante la compilación.

Ejemplo. Crear un registro 'producto' con cuatro atributos: nombre, marca, precio, disponibilidad

modelo.erl
%% @doc Registros en Erlang
-module(modelo).
-author("Code Monkey Jr").
-compile(export_all).
-compile(nowarn_export_all).
-record(producto, {nombre, marca, precio, disponibilidad=true}).


inicio()->
    MyProd = #producto{nombre="Jamon de Viena", marca="El chuletón", precio=86.99},
    io:format("Producto disponible? : ~p~n",[MyProd#producto.disponibilidad]),
    io:format("Nombre: ~p~n",[MyProd#producto.nombre]),
    io:format("Marca: ~p~n",[MyProd#producto.marca]),
    io:format("Precio: ~p~n",[MyProd#producto.precio]).

%% erl
%% c(modelo).
%% modelo:inicio().
En lenguajes más "modernos" como Groovy tendríamos el siguiente resultado:
class Producto{
   String nombre
   String marca
   double precio
   boolean disponibilidad
}
Links:
https://erlangbyexample.org/records

miércoles, 7 de julio de 2021

Elixir: listas y mapas


Las listas son una secuencia ordenada de elementos del mismo tipo. Estos tipos pueden ser numéricos, strings, objetos, etc.

# Lista vacía
lista = []

# Lista llena de números
lista = [1,2,3,4,5]

Las listas son colecciones de datos enlazados. Una lista puede estar vacía, o contener una cabeza head y una cola tail. Es decir que una lista no vacía, estará compuesta por el primer elemento de la lista (head) y el resto de elementos de la lista (tail). 

[head|tail] = [1,2,3,4,5,6]
IO.puts "Head: #{head}"
IO.puts "Tail: #{tail}"

Tuplas

Las tuplas son colecciones valores que pueden ser de distinto tipo. Normalmente tienen entre dos y cuatro valores, ya que hay otros tipos de colecciones mejor preparadas para trabajar con más datos. Las tuplas se definen entre llaves {} .

tupla = {1,:ok,:hello,true, 65,[1,2,3],false,"ABC"}

Listas clave-valor

Básicamente una variante de la lista, solo que con llave-valor.

# listas clave-valor
lista_llave_valor = [nombre: "John Erlang", blog: "alquimista", url: "alquimistadecodigo.com"]

¿Qué pasa con los Mapas?

Los mapas son también colecciones de elementos clave-valor, pero se definen de forma diferente.

# Mapa en Elixir
mapa = %{:ok => 1, :hello => 2, :a => 3}
IO.puts mapa.ok # 1
IO.puts mapa.a # 3

Links:
http://agrega.juntadeandalucia.es/repositorio/02122016/a5/es-an_2016120212_9131705/33_listas.html
https://charlascylon.com/2016-03-21-tipos-colecciones-Elixir

sábado, 3 de julio de 2021

Elixir: sitios para aprender


En posts pasados hemos estado hablando del lenguaje Elixir y su relación con Erlang, pues ambos lenguajes corren sobre la máquina virtual BEAM. Elixir podría ser una extraña combinación entre Erlang y Ruby, pero con lo mejor de ambas partes. En esta ocasión veremos una lista de sitios sobre Elixir que me parecen importantes.


The Inquisitive Developer

Un sitio creado por Kevin Peter, un desarrollador web que ha tenido el interés por mostrar su paso en este lenguaje. El contenido de su sitio es muy interesante. Imperdible para quienes quieren aprender Elixir.

https://inquisitivedeveloper.com/

Sitio oficial de Elixir

El sitio oficial del lenguaje Elixir. Donde podrás descargar el lenguaje y ver los pasos de instalación, guías, documentación y ejemplos.

https://elixir-lang.org/

Sitio oficial de Joy of Elixir

El sitio oficial del libro Joy of Elixir. Donde podrás acceder al contenido del libro de manera online. Además de la opción de poder adquirir el libro.

https://joyofelixir.com/

Sitio oficial de Phoenix Framework

El sitio oficial de Phoenix Framework. Si quieres usar Elixir para tus desarrollos web este sitio es el ideal para comenzar.

https://www.phoenixframework.org/

Alias Crespo Blogspot

Blog creado por Emmanuel Goette, Alias Crespo. Un blog sobre muchas cosas, muchas. Donde podrás encontrar muchos recursos, ejemplos, etc. sobre Elixir, Erlang, etc. Imperdible para todos los desarrolladores.

https://emanuelpeg.blogspot.com/

Elixir School

Sitio para aprender sobre el lenguaje Elixir. Ideal para principiantes.

https://elixirschool.com/es/

Elixir School

Sitio para aprender sobre el lenguaje Elixir. Ideal para principiantes.

https://elixirschool.com/es/