Skip to main content
Category

Desarrollo de Software

Async/Await para código secuencial – NodeJs JavaScript

By Desarrollo de Software

¿Cómo utilizar de forma correcta el Async/Await para códigos de respuesta secuencial?

Async y await son características que nos permiten escribir código asíncrono de forma más sencilla y fácil de leer.

En esencia async/await es una forma de trabajar con funciones asíncronas de JavaScript que se introdujo en ECMAScript 2017. La principal ventaja de async/await es que nos permite escribir código asíncrono de una manera que se asemeja más a la forma en que escribimos código síncrono.

En lugar de anidar callbacks o utilizar Promises encadenadas, podemos simplemente marcar una función como asíncrona con la palabra clave «async» y luego utilizar la palabra clave «await» dentro de la función para esperar a que se resuelva una Promise antes de continuar.

const countUntil = (timeInMiliseconds) => {
    return new Promise((resolve, reject)=>{
        setTimeout(() => {
            resolve('Respuesta de consulta con valor en milisegundos: '+timeInMiliseconds);
        }, timeInMiliseconds);
    });
}

const init = async () => {
    console.log("Log 1")
    const response = await countUntil(1000);
    console.log(response);
    console.log("Log 2")
}

init();

Por ejemplo, en el código anterior se realiza la ejecución de una función donde se utiliza await para invocar una promesa, esto ocasiona que la respuesta se muestre de forma secuencial, es decir que en la consola se mostrará lo siguiente:

#Log 1
Respuesta de consulta con valor en milisegundos: 1000
#Log 2

En conclusión, await se puede utilizar para detener el procesamiento secuencial del código de una función hasta que se obtenga la resolución de otra y así tener una respuesta ordenada y sin necesidad de anidar funciones o utilizar callbacks para obtener la respuesta de un método asíncrono.

<solutionops-team> Happy Coding! </solutionops-team>

Estados de una promesa – NodeJs JavaScript

By Desarrollo de Software

Pendiente (Pending) / Resulta (Fulfilled) / Rechazada (Rejected)

En la programación asincrónica de JavaScript, las promesas son una función esencial. Su uso permite a los programadores escribir código que maneja eventos futuros sin bloquear el hilo principal de ejecución. En esencia, una promesa representa un valor que puede no estar disponible en el momento en que se crea. En este artículo, se abordarán los distintos estados que puede tener una promesa en JavaScript, así como la forma correcta de manejarlos.

Una promesa en JavaScript puede estar en uno de los siguientes tres estados:

1) Pendiente: esto ocurre cuando la promesa es creada y está a la espera de ser resuelta o rechazada.

2) Resuelta: una promesa se encuentra en este estado cuando la operación que realizó ha sido completada con éxito. En este caso, la promesa tendrá un valor asignado que es pasado como argumento a la función de resolución de la promesa.

3) Rechazada: una promesa se encuentra en este estado cuando la operación que realizó no ha sido completada con éxito. En este caso, la promesa tendrá un motivo asignado que es pasado como argumento a la función de rechazo de la promesa.

function init() {
    return new Promise(async (resolve, reject)=>{
        try {
            const request = axios.get('https://solutionops.cl').then((response)=>{
                console.log("Respuesta Resuelta: ", response.status);
                resolve("Respuesta Resuelta: " + response.status)
            });

            console.log("Respuesta Pending: ", request);

        } catch (error) {
            console.log("Respuesta de Reject: ", error);
            reject("Respuesta de Reject: " + error)
        }
    });
    
}

init();

Por ejemplo, en el código anterior se ejecuta un request HTTP hacia el home del sitio de solutionops.cl, el mismo debe retornar una respuesta de código 200, sin embargo por cómo se ejecuta el código de javascript primero termina imprimiendo el valor de la variable request, la cuál por no haber sido resuelta retorna como Pending, por otra parte al momento de obtener una respuesta se dirijirá al then y se imprimirá el resultado del código de respuesta satisfactoriamente generando la siguiente respuesta en la consola/terminal:

Respuesta Pending:  Promise {  }
Respuesta Resuelta:  200

En conclusión, las promesas son una característica clave de la programación asincrónica en JavaScript. Al comprender los diferentes estados de las promesas, podemos escribir un código más eficiente y manejar adecuadamente las respuestas de la API. Asegúrate de siempre manejar los estados de las promesas adecuadamente y capturar los errores de manera adecuada.

<solutionops-team> Happy Coding! </solutionops-team>

¿Cómo gestionar fechas en NodeJs JavaScript?

By Desarrollo de Software

Clase Date en Javascript/NodeJS

La clase Date en javascript nos permite gestionar fechas a través del formato ISO 8601 y diversos métodos para la manipulación de las diferentes partes de una fecha completa.

Ahora bien, el formato ISO 8601 es un estándar ampliamente utilizado para representar fechas y horas de una forma legible y bien definida.

En este formato específico:

«2023-05-20» representa la fecha en formato «año-mes-día».

«T» es simplemente un separador entre la parte de la fecha y la parte de la hora.

«13:28:57.477» representa la hora en formato «horas:minutos:segundos.milisegundos».

«Z» al final indica que la fecha y la hora están en el huso horario UTC.

A través de la clase Date podemos acceder a los diversos métodos:

const fecha = new Date();
const año = fecha.getFullYear(); // Obtiene el año (ejemplo: 2023)
const mes = fecha.getMonth(); // Obtiene el mes (0 para enero, 11 para diciembre)
const dia = fecha.getDate(); // Obtiene el día del mes (1-31)
const hora = fecha.getHours(); // Obtiene la hora (0-23)
const minutos = fecha.getMinutes(); // Obtiene los minutos (0-59)
const segundos = fecha.getSeconds(); // Obtiene los segundos (0-59)

Por lo que a continuación presentaremos un segmento de código que permita entender como generar un formato de tipo yyyy-mm-dd:

const formatDate = (d = null) => {
    const current_date = new Date(d);

    const year = current_date.getFullYear();
    const month = String(current_date.getMonth() + 1).padStart(2, '0');
    const day = String(current_date.getDate()).padStart(2, '0');

    const formatted_date = year+"-"+month+"-"+day;

    return formatted_date;
}

const resp = formatDate("2020-04-17T13:28:57.477Z");
console.log("Fecha formateada: ", resp);

En este ejemplo, getFullYear() devuelve el año actual, getMonth() devuelve el mes actual (teniendo en cuenta que los meses empiezan en 0) y getDate() devuelve el día del mes actual. Luego, utilizamos String() para convertir el mes y el día en cadenas y padStart() para asegurarnos de que tengan dos dígitos, agregando un cero inicial si es necesario. Por último, concatenamos los componentes de la fecha utilizando guiones para obtener el formato «yyyy-mm-dd».

Tipos de Joins en SQL (MYSQL)

By Desarrollo de Software

¿Cómo utilizar los diferentes tipos de JOINS y cuáles son sus casos de uso?

La sentencia JOIN nos permite combinar registros de diferentes tablas, mediante una condición de combinación que determinará cómo se relacionarán las tablas involucradas en la consulta. La posición que tiende a ocupar dentro de una consulta es después de la cláusula FROM, quedando algo como lo siguiente:

SELECT campo_1, campo_2, f… FROM tabla_a JOIN tabla_b ON tabla_a.campo = tabla_b.campo

En este caso, los registros de la tabla A se relacionarán con los registros de la tabla B, mediante el campo especificado en la cláusula ON de la consulta.

Existen diversos tipos de JOINS dependiendo del tipo de relación que se desea realizar. A continuación explicaremos tres de los más utilizados.

INNER JOIN

Un INNER JOIN devolverá sólo aquellos registros que cumplan con la condición especificada. Es decir, aquellas filas que tengan coincidencias en ambas tablas a través del campo utilizado para realizar la intersección.

A modo de ejemplo, situémonos en el caso en que tenemos dos tablas, una de personas y otra de vehículos, en donde una persona puede ser o no ser dueña de un vehículo. Además, la tabla vehículo contendrá una llave foránea para hacer referencia a la persona que es dueña de dicho vehículo. Si lo graficamos sería algo como esto:

Si realizamos una INNER JOIN mediante el campo id de la tabla personas, podremos encontrar dos coincidencias en ambas tablas, dejando a la persona con id 3 fuera de los resultados.

La consulta quedaría así:

SELECT p.id, p.nombre, p.apellido, v.marca, v.color FROM personas as p INNER JOIN vehiculos as v ON p.id = v.id_persona

Entregando el siguiente resultado:

LEFT JOIN

Un LEFT JOIN devolverá todos los registros presentes en la tabla declarada a la izquierda de la consulta y, de la tabla declarada a la derecha, solo devolverá aquellos registros en donde exista coincidencia mediante el campo utilizado para la unión.

Para graficar la consulta, utilizemos un ejemplo similar al presentado en el caso anterior :

SELECT p.id, p.nombre, p.apellido, v.marca, v.color FROM personas as p LEFT JOIN vehiculos as v ON p.id = v.id_persona

Al realizar la consulta, obtendríamos un resultado como este:

Dado que la tabla personas se encuentra a la izquierda de la consulta, se mostrarán todos los registros de esta tabla, sin importar si existe o no coincidencia dentro de la tabla vehículo. En los casos en que no exista coincidencia, los campos se mostraran como null.

RIGHT JOIN

El comportamiento de un RIGHT JOIN es muy similar al LEFT JOIN, pero invirtiendo la posición, es decir, devolverá todos los registros presentes en la tabla declarada a la derecha de la consulta y, de la tabla declarada a la izquierda, solo devolverá aquellos registros en donde exista coincidencia.

A modo de ejemplo, podemos utilizar el mismo caso aplicado anteriormente e invertir la posición de las tablas, es decir, la consulta quedaría así:

SELECT p.id, p.nombre, p.apellido, v.marca, v.color FROM vehiculos as v RIGHT JOIN personas as p ON p.id = v.id_persona

Su resultado sería idéntico al presentado anteriormente:

Dado que esta vez la tabla personas se encuentra derecha de la consulta, y la tabla vehículos a la izquierda, al aplicar el RIGHT JOIN, obtendríamos todos los registros de personas, y solo aquellos registros que coincidan con el campo utilizado para la intersección de la tabla vehículos.

¡Pruebalo tu mismo!

Te dejamos el código necesario para que realices los ejemplos presentes en este artículo*.

CREATE TABLE personas (
    id INT PRIMARY KEY,
    nombre VARCHAR(50),
    apellido VARCHAR(50),
    edad INT
  );
  
CREATE TABLE vehiculos (
    id INT PRIMARY KEY,
    marca VARCHAR(50),
    color VARCHAR(50),
    id_persona INT,
    FOREIGN KEY (id_persona) REFERENCES personas(id)
);
  
INSERT INTO personas (id, nombre, apellido, edad) VALUES
  (1, 'Julio', 'González', 38),
  (2, 'Roberto', 'Toro', 25),
  (3, 'Catalina', 'Perez', 19);
  
INSERT INTO vehiculos (id, marca, color, id_persona) VALUES
  (1, 'Chevrolet', 'Rojo', 1),
  (2, 'Kia', 'Blanco', 2);

* Los ejempos han sido probados con MySQL 8.0.33. Es posible que con otro motor de base de datos sea necesario una leve adaptación.

<solutionops-team> Autor: Jonathan Urrutia </solutionops-team>

Hooks Más Usados en React JS

By Desarrollo de Software

useEffect / useState / useRef

Los hooks de React son una herramienta fundamental para desarrollar aplicaciones modernas y eficientes. Entre ellos, destacan el useState(), que permite manejar estados en componentes funcionales, el useEffect(), que permite trabajar con efectos secundarios en la aplicación, y el useRef(), que permite hacer referencia a elementos del DOM. Juntos, estos hooks facilitan la creación de aplicaciones dinámicas y escalables en React.

useState

Supongamos que queremos mostrar un contador que aumente en uno cada vez que usuario hace click en un botón.

Podriamos hacer utilizar el hook useState() de la sigiente manera.

En este ejemplo, creamos un estado count y una función setCount para actualizar ese estado.Luego, en la función Contador, mostramos el valor actual de count en una etiqueta p y agregamos un botón que llama la función setCount cada vez que se hace click , aumentando asi el valor de count.

useEffect

En este ejemplo, useEffect se utiliza para actualizar el título del documento cada vez que el usuario hace clic en el botón. La función que se pasa como argumento a useEffect se ejecuta después de que se renderiza el componente. En este caso, la función actualiza el título del documento utilizando la plantilla de cadena de texto que incluye la cantidad de clics que ha realizado el usuario.

useReff

En este ejemplo, useRef se utiliza para obtener una referencia al elemento input en el DOM. Luego, se utiliza la referencia en la función handleClick para establecer el foco en el elemento input cuando el usuario hace clic en el botón. La función useRef devuelve un objeto con una propiedad current que se puede utilizar para almacenar cualquier valor mutable. En este caso, se almacena una referencia al elemento input en la propiedad current.

Exportar Certificado y Claves de un archivo .pfx con PHP

By Desarrollo de Software

PHP / PFX / OPENSSL

En PHP, OpenSSL se utiliza para manipular certificados digitales y proporcionar seguridad en aplicaciones web. Aquí te mostraremos cómo extraer certificados digitales usando OpenSSL en PHP.

Antes de empezar, asegúrate de tener habilitado OpenSSL en tu versión de PHP, solo tienes que cambiar en el archivo php.ini lo siguiente:

“;extension=openssl” a “extension=openssl”.

Una vez habilitado, puedes empezar a utilizar OpenSSL en PHP. Para extraer un certificado digital, debes seguir los siguientes pasos:

Paso 1: Cargar el certificado digital.

Puedes hacerlo utilizando la función openssl_x509_read(). Esta función lee el certificado digital desde un archivo o desde una cadena.

$certificate_content = file_get_contents('/path/to/certificate.pfx'); 

Paso 2: Extraer certificado y llave privada

Para esto utilizaremos la función openssl_pkcs12_read() el cual recibe como parámetro el contenido del archivo .pfx (que cargamos en el paso 1) y la contraseña del archivo.

if (openssl_pkcs12_read($certificate_content, $data, "password")) {
    echo "Información del certificado
";
    print_r($data);
} else {
    echo "Error: No se puede extraer datos.
";
    exit;
}

Paso 3: Obtener la clave pública del certificado

Además de la información del certificado, también puedes obtener la clave pública del mismo.

$details = openssl_pkey_get_details(openssl_pkey_get_private($data['pkey']));

$public_key = $details['key'];

Adicionalmente podemos extraer el Modulo y el Exponente:

$modulus = base64_encode($details['rsa']['n']);

$exponent = base64_encode($details['rsa']['e']);

<solutionops-team> Autor: Jojan Cardenas </solutionops-team>


Cardinalidades en bases de datos

By Desarrollo de Software

La cardinalidad es uno de los conceptos fundamentales al momento de explorar las relaciones almacenadas en una base de datos. Define la cantidad de filas relacionadas de una entidad A con una entidad B. Normalmente, estas relaciones se realizan utilizando las claves primarias y claves foráneas de cada tabla. Dentro de los tipos de cardinalidades, podemos identificar principalmente cuatro.

Uno a Uno (1:1)

Un registro de una entidad A, se relaciona de forma directa y exclusiva con un registro de una entidad B.

Por ejemplo, si nos situamos en un escenario hipotético de una empresa de transporte, diremos que a un chofer solo se le puede asignar un vehículo, y que el vehículo no podrá ser asignado a otro chofer de forma simultánea. En este caso estamos ante una relación de tipo 1:1, y la llave primaria de una de las entidades deberá pasar como llave foránea a la otra entidad. Se diagramaría de la siguiente forma

Uno a Muchos (1:N)

Un registro de una entidad B, se puede relacionar de forma simultánea con muchos registros de una entidad A.

Siguiendo con el ejemplo anterior, diremos que la empresa de transporte ha decidido implementar turnos fijos, por lo que los vehículos se asignarán a uno o más choferes para que puedan ser utilizados en diferentes turnos, sin embargo, los choferes solo podrán tener un vehículo asignado y será el que utilizarán en su turno. En este caso hablamos de una relación uno a muchos, es decir, un vehículo puede ser asignado a muchos choferes. A la entidad que representa el “muchos” de la relación se le deberá asignar la llave foránea de la entidad que representa el “uno”. Se diagramaría de la siguiente forma

Muchos a uno (N:1)

En un sentido práctico, la relación de muchos a uno difiere solo en la dirección desde donde se aprecia la relación de uno a muchos. Es decir, muchos registros de una entidad A se puede relacionar con un solo registro de una entidad B.

Utilizando el mismo ejemplo anterior, podemos decir que muchos choferes pueden ser asignados a un vehículo. Se diagramaría de la misma forma que el ejemplo graficado en la relación 1:N.

Muchos a muchos (N:M)

Muchos registros de una entidad A pueden relacionarse con muchos registros de una entidad B. Esta es, quizás, la relación que más confusión causa al momento de abordar las cardinalidades.

En este caso, y siguiendo con el contexto de una empresa de transporte, imaginemos que se ha decido que un vehículo no estará asignado a un solo chofer, sino que los vehículos se irán rotando dependiendo de la disponibilidad de estos, y los trayectos que se deban realizar. Dichos en otras palabras, un vehículo puede ser conducido por uno o más choferes, y un chofer conducirá uno o más vehículos dentro de su turno

En este caso tenemos las mismas dos entidades utilizadas hasta ahora, pero con un nuevo problema:

¿Cómo podemos relacionar ambas tablas, permitiendo que muchos registros de una se relacionen con muchos registros de la otra?

Si utilizamos la solución empleada hasta ahora con los otros casos (convertir la llave primaria de una entidad en llave foránea de la otra), veremos que no es factible, dado que cada uno de los registros en donde se incluya la llave foránea solo podrá estar relacionado al registro que hace referencia dicha llave.

Para solucionar lo anterior, es necesario hacer uso de una tercera tabla que nos ayude a relacionar ambas entidades, la que se suele denominar como “tabla asociativa”, y que mantendrá una relación de uno a muchos con cada una de las entidades involucradas en la relación. Esta tabla asociativa incluirá como llave foránea tanto la llave primaria de la entidad chofer, como la llave primaria de la entidad vehículo. Esta relación se diagramaría de la siguiente forma.

<solutionops-team> Autor: Jonathan Urrutia </solutionops-team>

Validaciones con Vuetify

By Desarrollo de Software

Valida tus formularios en VUE3 de manera correcta, fácil y rápida con Vuetify

La validación de formularios es una parte crucial en el desarrollo de aplicaciones web, ya que garantiza que los datos ingresados por los usuarios sean correctos y cumplan con los requisitos establecidos. Vuetify, una biblioteca de componentes para Vue.js, ofrece herramientas poderosas para facilitar la validación de formularios en tus proyectos. En este artículo, exploraremos cómo utilizar Vuetify y Vue 3 para validar formularios de manera sencilla y efectiva.

1. Ejecuta el siguiente comando para instalar Vuetify “npm install vuetify@next”

2. importa Vuetify en tu archivo main.js (o en el archivo principal de tu aplicación)

Asegúrate de importar los estilos de Vuetify en tu archivo App.vue (o en el componente raíz de tu aplicación). Puedes hacerlo añadiendo la siguiente línea al principio del archivo

Ahora, ya estás listo para utilizar los componentes de Vuetify en tu proyecto. A continuación, mostraremos un ejemplo básico de cómo se vería el código del formulario de contacto:

En este ejemplo, hemos utilizado los componentes de Vuetify como v-form, v-text-field y v-textarea para construir el formulario de contacto. Cada campo tiene una propiedad v-model que está enlazada a los datos del componente (por ejemplo, name, email y message).

Hemos definido reglas de validación para cada campo utilizando las propiedades: rules. Las reglas de validación son funciones que devuelven un mensaje de error si la validación no se cumple. Por ejemplo, v => !!v || ‘El nombre es requerido’ verifica que el campo del nombre no esté vacío.

En el método submitForm, utilizamos this.$refs.form.validate() para validar todos los campos del formulario. Si la validación es exitosa, se puede realizar la acción de envío del formulario (en este caso, simplemente mostramos un mensaje en la consola). De lo contrario, se mostrará un mensaje de error.

<solutionops-team> Autor: Ramón Durán </solutionops-team>

Inteligencia Artificial y su Tecnología

By Desarrollo de Software

La inteligencia artificial (IA) se refiere a la capacidad de las máquinas para realizar tareas que normalmente requieren inteligencia humana. Utilizando algoritmos y modelos matemáticos, la IA puede analizar datos, aprender patrones, tomar decisiones y resolver problemas de manera autónoma. La IA abarca una amplia gama de aplicaciones, desde asistentes virtuales y sistemas de recomendación hasta vehículos autónomos y diagnósticos médicos. Su objetivo principal es replicar y mejorar las capacidades cognitivas humanas, permitiendo a las máquinas procesar información, adaptarse al entorno y mejorar su rendimiento con el tiempo.

Una de las tecnologías clave utilizadas para crear la inteligencia artificial es el aprendizaje automático. El aprendizaje automático es un enfoque para la programación en el que un sistema de inteligencia artificial se entrena para realizar una tarea específica utilizando ejemplos en lugar de instrucciones explícitas. Por ejemplo, un sistema de aprendizaje automático podría ser entrenado para reconocer imágenes de perros mostrándole miles de imágenes de perros etiquetados previamente. A medida que el sistema ve más y más ejemplos, se vuelve cada vez más preciso en la identificación de imágenes de perros.

Otra tecnología importante utilizada en la inteligencia artificial es el procesamiento del lenguaje natural (PLN). El PLN se refiere a la capacidad de las computadoras para comprender y procesar el lenguaje humano. Esto puede incluir la traducción automática, la clasificación de texto y la generación de texto. El PLN se basa en técnicas como el análisis semántico y el análisis sintáctico para comprender el significado detrás del lenguaje.

En resumen, la inteligencia artificial es la capacidad de las computadoras y otros sistemas para realizar tareas que normalmente requerirían inteligencia humana. Las tecnologías utilizadas para crear la inteligencia artificial incluyen el aprendizaje automático, el procesamiento del lenguaje natural y las redes neuronales artificiales. Estas tecnologías están impulsando la revolución de la inteligencia artificial y están cambiando la forma en que interactuamos con la tecnología en nuestro día a día.

<solutionops-team> Autor: Jonathan Urrutia </solutionops-team>

Axios v/s Fetch

By Desarrollo de Software

Comparación entre Axios y Fetch: ¿Cuál es la mejor opción para tus solicitudes HTTP?

¿Qué es Axios y como realizar una petición?

Axios es una biblioteca de JavaScript que se utiliza para realizar solicitudes HTTP desde un navegador web o desde Node.js. Es una herramienta muy popular y ampliamente utilizada para interactuar con APIs y realizar operaciones de red en aplicaciones web. Axios proporciona una interfaz fácil de usar para realizar solicitudes HTTP, ya sea para enviar datos al servidor o para recibir datos del servidor. Admite tanto los métodos GET como POST, así como otros métodos HTTP, y permite personalizar y configurar las solicitudes según las necesidades específicas del proyecto.

¿Qué es Fetch y como realizar una petición?

Fetch es una API de JavaScript que proporciona una forma de realizar peticiones HTTP (solicitud y respuesta) desde un navegador web o desde un entorno Node.js. Es una forma moderna y más flexible de realizar solicitudes a servidores web en comparación con las técnicas tradicionales como XMLHttpRequest. Para realizar una petición con Fetch, puedes utilizar la siguiente estructura básica:

En última instancia, la elección entre Axios y Fetch dependerá de las necesidades específicas de tu proyecto y las preferencias personales del equipo de desarrollo. Si buscas una biblioteca con una API más intuitiva, manejo de errores avanzado y mayor compatibilidad con navegadores más antiguos, Axios puede ser una opción más adecuada. Por otro lado, si buscas una solución más liviana y no tienes que preocuparte por la compatibilidad con versiones antiguas de IE, Fetch podría ser una opción a considerar. En cualquier caso, ambas herramientas son capaces de realizar solicitudes HTTP eficientemente y son ampliamente utilizadas en la comunidad de desarrollo web.

<solutionops-team> Autor: Ramon Duran </solutionops-team>

× ¿En qué podemos ayudarte?