Mostrando entradas con la etiqueta Solucionado. Mostrar todas las entradas
Mostrando entradas con la etiqueta Solucionado. Mostrar todas las entradas
Hola,
Como se pueden descartar los cambios de clases a las cuales ya se les hizo COMMIT en GIT, pero aún no se les ha realizo el PUSH?


Se realiza de la siguiente forma:

Resetear el commit (rehacerlo sin esa clase)

git reset --soft HEAD~1

Esto revierte el último commit pero deja los archivos como estaban en staging, osea, mantiene los cambios para poderlos versionar nuevamente.
Hola,
La respuesta a esta pregunta es la siguiente:

El cero (0) es un número par.

Se considera par porque es divisible por 2 sin dejar residuo (0 / 2 = 0) y porque se encuentra entre dos números impares (-1 y 1) en la secuencia numérica.



Hola,

Si están trabajando con Terraform y en su archivo de configuración inicial (extensión .tf), tienen el siguiente bloque:

provider "aws" { 
    region = "us-west-2" 
    access_key = "my-access-key" 
    secret_key = "my-secret-key"
}


No es recomendable tener las credenciales a vista de todo el mundo, lo que se debe hacer por buenas practicas es lo siguiente:
  1. Abrir consola del IDE.
  2. Escribir el comando: aws configure
  3. Ingresar los datos que ahí se piden de acces_key, secret_key, region y format
  4. Presionar la tecla: enter
Cuando el sistema termine exitosamente, ya estas credenciales quedaron creadas como variables de ambiente y Terraform puede utilizarlas en cualquier momento, sin necesidad de que queden visibles para el programador.
Y ya se puede eliminar el bloque: provider "aws" {} del archivo de configuración inicial (extensión .tf).
Quedando así, el seteo de dichas credenciales a través de la consola de AWS.

Hola,
VS Code ofrece un buen modo de vista previa para archivos .md.


Para abrir un archivo con este modo, se hace clic derecho en el archivo en el árbol de documentos de VS Code y presionar clic en "Abrir vista previa".

También se puede usar el atajo de teclado:

En windows: Ctrl + Shift + V

En MAC: command + Shift + V

Tomado de:

Hola, 

Sabían que pueden configurar variables de entorno de forma dinámica en Postman con Java?

Yo no, lo aprendí hace poco.

Pues para crear y configurar variables de entorno dinámicas en Postman, se deben de realizar los siguientes pasos:


1. Abrir el Postman.

2. Crear un request (Request#1) dentro de Postman (como un servicio).

3. Posteriormente, dentro de este request, ingresar en la pestaña: Scripts y escribir el siguiente código:

var jsonData = JSON.parse(pm.response.text());

pm.enviroment.set("myVariableDinamic", + jsonData.variableResponse);

console.log(jsonData.variableResponse); // Para ver el valor que llego, mediante la opción de console del postman


4. Después de esto, cualquier otro request que se inicie y requiera utilizar la variable dinámica, solamente se le debe de configurar en la pestaña: Headers, como Value de una Key, ejemplo:

Key                                    Value

Authorization                {{myVariableDinamic}}


5. Eso es todo, al ejecutar el (Request#1) y si su response es correcto (status 200) la variable de entorno que se configuro, se actualizara automáticamente al llegar en ese request exitoso.

Permitiendo así, que se ejecute desde cualquier otro Request creado en el Postman.



Hola,
Si saben cual es el Header o el Body de una petición HTTP, pero no saben como se llama la estructura completa de esta petición, aquí les soluciono esa inquietud:


En una petición HTTP, los headers y el body forman parte del mensaje HTTP.

El mensaje HTTP se divide en tres partes principales:
  1. Línea de inicio (Start Line): Contiene el método HTTP, la URL y la versión del protocolo (en una petición) o el código de estado (en una respuesta).
  2. Encabezados (Headers): Contienen metadatos sobre la petición o respuesta, como Content-Type, Authorization, User-Agent, etc.
  3. Cuerpo (Body): Contiene los datos de la petición o respuesta, generalmente en formatos como JSON, XML o texto plano.
Cuando hablamos de headers + body, simplemente nos referimos al Cuerpo del Mensaje HTTP (HTTP message body), pero en conjunto con la línea de inicio, forman el Mensaje HTTP Completo.

Hola,

Les comparto en una imagen sacada de Youtube el abecedario con su pronunciación exacta en inglés bajo cada letra:



Hola,
Si alguna vez se han preguntado o les han preguntado en algún punto: ¿Para que sirve que una organización tenga un Gobierno o Area de Ciberseguridad?


Aquí les comparto una breve respuesta:

Un Gobierno o Área de Ciberseguridad en una organización tiene como objetivo principal proteger los activos digitales y la información sensible. Sus funciones clave incluyen:
  1. Protección de la información: Garantiza la confidencialidad, integridad y disponibilidad de los datos.
  2. Gestión de riesgos: Identifica, evalúa y mitiga amenazas cibernéticas.
  3. Cumplimiento normativo: Asegura que la organización cumpla con regulaciones y estándares de seguridad.
  4. Respuesta a incidentes: Detecta, responde y recupera la operación tras ciberataques.
  5. Concienciación y formación: Educa al personal para prevenir ataques como phishing o malware.
  6. Seguridad en infraestructura y sistemas: Implementa controles para proteger redes, aplicaciones y dispositivos.
En resumen, su propósito es reducir vulnerabilidades, prevenir ataques y garantizar la continuidad del negocio.
Hola,
Si estan versionando por primera un repositorio en GitHub, utilizando el comando:

git push -u origin RAMA A VERSIONAR

Y les sale el error:

Enumerating objects: 102, done.
Counting objects: 100% (102/102), done.
Delta compression using up to 16 threads
Compressing objects: 100% (85/85), done.
error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
send-pack: unexpected disconnect while reading sideband packet
Writing objects: 100% (102/102), 4.10 MiB | 7.69 MiB/s, done.
Total 102 (delta 4), reused 0 (delta 0), pack-reused 0
fatal: the remote end hung up unexpectedly
Everything up-to-date


El error RPC failed; HTTP 400 indica un problema con la conexión al servidor remoto (GitHub), generalmente debido a: 
  • Tamaño del paquete de datos que estás intentando enviar.
  • Configuración de red.
  • Posibles problemas con las credenciales o la URL remota.
La solución más común y efectiva es:

1. Aumentar el tamaño del búfer de Git

Este error puede ocurrir si los objetos que estás enviando son grandes. Incrementa el tamaño del búfer:

git config --global http.postBuffer 524288000

Este comando aumenta el tamaño máximo permitido para las solicitudes HTTP a 500 MB.

Otras opciones pueden ser:

2. Verifica la URL remota

Asegúrate de que la URL remota está correctamente configurada. Verifícala con:

git remote -v

Si necesitas corregirla, usa:

git remote set-url origin https://github.com/tu-usuario/nombre-del-repo.git

O también:

3. Probar con SSH en lugar de HTTPS

Si el problema persiste, cambia la conexión a SSH para evitar problemas relacionados con HTTPS

4. Verificar tus credenciales

Si estás usando HTTPS y las credenciales no están almacenadas correctamente, toca forzar la actualización.

Con estas soluciones, el problema debería resolverse. Si persiste, verifica tu conexión a Internet o la configuración del repositorio remoto.



Hola,
Si alguna vez te has realizado la siguiente pregunta: Por qué usar Enum sobre Constantes en Java? o se les han realizado esa pregunta en el trabajo o en una entrevista, las ventajas son las siguientes:

¿Por qué enums?
  1. Constantes fácilmente relacionadas, más legibles y que expresan una clara intencionalidad.
  2. Ahorro en tiempo de ejecución y compilación, ya que typescript asigna sus valores como constantes declaradas por cada asignación.
  3. Fácilmente refactorizable.
Cuando no utilizar enums:
  • Cuando cualquiera de sus propiedades pueda ser reasignada en tiempo de ejecución.
  • Cuando se pretenda ampliar la cantidad de propiedades de forma indefinida. La naturaleza de un enum debe estar definida y constatada por la utilidad que se le vaya a dar.


Si se quiere profundizar más, tengan en cuenta lo siguiente:

Primero, en las versiones anteriores a la versión 1.5 o 5 de Java no existían los tipos de datos enum con lo que se debía usar constantes de la siguiente forma:

public static String COLOR_ROJO = "rojo";
public static String COLOR_VERDE = "verde";
public static String COLOR_AZUL = "azul";

A partir de la versión 5 de Java se incorporarón al lenguaje los tipos de datos enumerados con el objetivo de mejorar varios aspectos sobre el uso de las constantes.

Segundo, tener en cuenta sus definiciones:

const
Un dato que no va a ser modificador a lo largo de un programa, es una constante:

const DEFAULT_COLOR: string = 'red';

Esto es aplicable a un conjunto de datos también.

const DEFAULT_CONFIGURATION: any {
    APP_NAME: ‘Nombre de mi programa‘,
    AUTHOR: ‘Branko Fuenzalida’,
    BUILD: 34,
    VERSION: ‘1.0.0’
};

enum
Un conjunto de constantes relacionadas entre si por un factor común, es un Enum:

enum Colors { 
    enum Colors {
        Blue, // 0 Blue = 'BLUE',
        Green, // 1 Green = 'GREEN',
        Purple, // 2 Purple = 'PURPLE',
        Red // 3 Red = 'RED'
    }; 
};

Si no se indica un valor para cada propiedad, se le es asignado una consecución de números en incremento empezando por el cero.

Básicamente, un enum en Java es un conjunto fijo y relacionado de constantes como pueden ser los días de la semana y deberían usarse siempre que se necesite representar un conjunto de constantes con esas características. La característica de relacionado es importante, las constantes solo lo están por la convención que sigamos al darles un nombre. Los enums se definen de la siguiente forma:

public enum Dia { 
    LUNES, 
    MARTES, 
    MIERCOLES, 
    JUEVES, 
    VIERNES, 
    SABADO, 
    DOMINGO 
}

public enum Color { 

    ROJO("FF0000"), 
    VERDE("00FF00"), 
    AZUL("0000FF");

    private final String rgb; Color(String rgb) { this.rgb = rgb; } 

    public String getRGB() { return rgb; } 

}

Como son constantes por las convenciones del lenguaje se escriben en mayúscula. Pero los enum son algo más que constantes, la clase del tipo del enum puede definir métodos y otras propiedades, como el método getRGB del ejemplo anterior o en el siguiente caso que se usa el método values() y que se añade automáticamente a todos los enums.

for (Dia d : Dia.values()) {
    System.out.printf("El día de la semana %s", d);
}

for (Color c : Color.values()) {
    System.out.printf("El color %s tiene como RGB %s", c, c.getRGB());
}

Ventajas de usar Enum sobre Constantes:
  • Algunas cosas que hacen de los enum muy interesantes es que al definir las constantes de este modo se obtiene «type safety» (Seguridad de tipos para disminuir o prevenir los errores de tipos). Si decimos que un método de una clase recibe un enum el compilador comprobará en tiempo de compilación que cuando lo usamos le pasemos realmente un valor de ese enum, cosa que con constantes definidas como int o String el compilador solo comprueba que pasemos un int o String y por tanto podremos pasar cualquier valor aunque no sea una de las constantes esperadas por el método.
  • Otra de las ventajas que ya se ve en ejemplo anterior es que los enums pueden tener comportamiento a través de los métodos que defina.
  • También, específicamente diseñadas para los enums existen las clases EnumSet y EnumMap que trabajan con enums de forma más eficiente que con Set y Map.
  • Además, los enums pueden ser usados en expresiones switch cosa que con constantes de tipo String solo podemos hacer a partir de la versión 7 de Java.
  • Para comparar valores de enums podemos hacerlo con el operador == o con el método equals. Usar el operador == tiene la ventaja de evitar un posible NullPointerException y de que el compilador comprueba que se estén comparando dos valores del mismo enum.
== nunca lanza NullPointerException
Dia dia = null; if (dia == Dia.LUNES); // se ejecuta
if (dia.equals(Dia.LUNES)); // lanza NullPointerException

== comprueba compatibilidad de tipos en tiempo de compilación
if (Dia.LUNES.equals(COLOR.ROJO)); // compila bien
if (DIA.LUNES == COLOR.ROJO); // no compila, incompatibilidad de tipos

Tomado literalmente de:
Hola,
Los siguientes métodos, permiten recibir dos fechas en formato UnixTime y escriben en un System.out.println cual es la fecha mas antigua y retornan cual es la fecha mas reciente en formato UnixTime, en java.

Forma #1 con la clase Instant:

public static Long compareUnixTimesWithInstant(Long unixTime1, Long unixTime2) {

// Convertir los UnixTime a objetos de fecha y hora
Instant date1 = Instant.ofEpochSecond(unixTime1);
Instant date2 = Instant.ofEpochSecond(unixTime2);

// Formateador para mostrar las fechas de forma legible
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.withZone(ZoneId.systemDefault());

// Comparar las fechas y mostrar cual es la más antigua
if (date1.isBefore(date2)) {
System.out.println("La fecha mas antigua es: " + formatter.format(date1));
// retorna la fecha mas reciente
return unixTime2;
} else {
System.out.println("La fecha mas antigua es: " + formatter.format(date2));
// retorna la fecha mas reciente
return unixTime1;
}

}


Forma #2 con la clase Date:

public static Long compareUnixTimesDate(Long unixTime1, Long unixTime2) {

// Convertir los UnixTime a objetos Date
Date date1 = new Date(unixTime1 * 1000);
Date date2 = new Date(unixTime2 * 1000);

// Comparar las fechas y mostrar cual es la más antigua
if (date1.before(date2)) {
System.out.println("La fecha mas antigua es: " + date1);
// retorna la fecha mas reciente
return unixTime2;
} else {
System.out.println("La fecha mas antigua es: " + date2);
// retorna la fecha mas reciente
return unixTime1;
}

}
Hola,

El siguiente método en Java permite convertir una fecha de tipo Long en formato UnixTime a Date:

public static Date convertUnixTimeToDate(Long calendarUnixTime) {
    // Multiplicar por 1000 para convertir de segundos a milisegundos
    long timestamp = calendarUnixTime * 1000;
    return new Date(timestamp);
}

El valor de entrada es: 1724940994L

Y retorna lo siguiente: Thu Aug 29 09:16:34 COT 2024
Hola,


Para evitar que el SonarCloud cuando este escaneando un repositorio marque advertencia por: Duplications



Se debe implementar el siguiente comando:
sonar.cpd.exclusions=**/NombreClaseJava.java,**/NombreModulo/**

En la clase:
sonar-project.properties

Y listo, así, el SonarCloud omitirá revisar la duplicidad en las clases y módulos configurados en ese comando.
Hola,

Si requieren validar en una sola línea, si un JSONObject contiene un campo y sino, colocarle un valor por defecto a dicho campo en Java, pueden realizar lo siguiente:



import org.json.JSONObject;

JSONObject jsonData = new JSONObject("{\"nombre\":\"Juan\"}");

jsonData.put("edad", jsonData.optInt("edad", 30));


Explicación:

En este ejemplo, si el campo "edad" no está presente en jsonData, se añadirá con el valor por defecto de 30. Si "edad" ya existe, no se modificará, ni se agregara nuevamente.

Hola,

Query que permite obtener los atributos de una tabla en PostgreSQL:


SELECT

    column_name, -- nombre de columnas

    data_type, -- tipo de dato

    character_maximum_length, -- tamaño maximo dato

    numeric_precision, -- precision numerica

    numeric_scale, -- escala numerica

    is_nullable -- es nulo?

FROM

    information_schema.columns

WHERE

    table_schema = 'app_td_seguro_agricola' -- ESQUEMA DE LA TABLA

    AND table_name = 'parametros_ubicacion'; -- NOMBRE DE LA TABLA

Hola,

Si estas dentro del Terminal de un IDE de un repositorio gradle y tratas de ejecutar algún comando de gradlew, ejemplo:

./gradlew --version

Y te sale el error:

zsh: permission denied: ./gradlew

Esto se debe a que el script gradlew no tiene permisos de ejecución.

Para solucionarlo, se deben cambiar los permisos del archivo gradlew para hacerlo ejecutable, de la siguiente forma:

1. Ejecutar el siguiente comando para cambiar los permisos del archivo gradlew:

chmod +x gradlew

2. Ahora, vuelve a ejecutar el comando:

./gradlew --version

El sistema, ahora si ejecuta correctamente y muestra la información solicitada:


Listo, eso es todo.
Hola,
Si al mockear una clase estática con Java, les sale el siguiente error:

org.mockito.exceptions.base.MockitoException: For com.bolivar.proteccion.creditos.common.util.UtilitiesExecuteRule, static mocking is already registered in the current thread To create a new mock, the existing static mock registration must be deregistered

La clase estática esta definida así:

public static class UtilitiesExecuteRule;

La mockean de la siguiente manera:

private MockedStatic<UtilitiesExecuteRule> utilitiesExecuteRule;

Y crean un metodo @BeforeEach:

@BeforeEach 
void setUp() { 
utilitiesExecuteRule = mockStatic(UtilitiesExecuteRule.class); 
} 

Esto se debe a que ya se ha registrado un mock estático para la clase UtilitiesExecuteRule.java en el hilo de ejecución actual y estás intentando registrar otro. Esto puede suceder si estás utilizando @Mock o mockStatic() en diferentes partes de tu código y estas partes están siendo ejecutadas en el mismo hilo.

Para solucionar este problema, necesitan asegurarse de que solo se registre un mock estático para la clase UtilitiesExecuteRule.java

Esto se hace de la siguiente forma:

1. Dentro de la clase Test, se define la variable de la clase estática así:

private MockedStatic<UtilitiesExecuteRule> utilitiesExecuteRule;

2. Se crean dos métodos un @BeforeEach y un @AfterEach

@BeforeEach 
void setUp() { 
utilitiesExecuteRule = mockStatic(UtilitiesExecuteRule.class);
}

@AfterEach
void afterTest() {
utilitiesExecuteRule.close();
}

Esto con el fin de que cada instancia de la clase estática mockeada, viva y muera en la clase Test que la esta utilizando.

3. Finalmente, se mockea un método de dicha clase de la siguiente forma:

utilitiesExecuteRule.when(
() -> UtilitiesExecuteRule.metodoAMockear(anyString(), anyString(), anyString())
).thenReturn(responseMockeadoDelMetodo);

Listo, eso es todo.
Espero que les haya servido.
Hola,
Si tienen una variable con un valor configurado en un archivo application.yaml o en una infra y requieren mockear dicho valor en un test para una prueba unitaria hagan lo siguiente:


1. En el archivo: application.yaml:

titulo:
    valorFijo: MiValorFijo


2. En la clase: MiClaseDeNegocio.java que invoca este valor fijo: 

@Value("${titulo.valorFijo}")
private String VALOR_VARIABLE_FIJA;


3. En la clase: MiClaseDeNegocioTest.java que mockea este valor fijo:

@InjectMocks
private MiClaseDeNegocio miClaseDeNegocio;
  
private String VALOR_VARIABLE_FIJA = "MiVariableFija";


@BeforeEach
public void setUp() {

ReflectionTestUtils.setField(miClaseDeNegocio, "VALOR_VARIABLE_FIJA", VALOR_VARIABLE_FIJA);

}

Listo, al correr la prueba unitaria que estén realizando, esta variable ya se encontrara mockeado y no llegara como null.

Hola,


Si invoco desde el Postman un microservicio donde en el header vaya un dato con caracteres especiales, así:

AKIAQSKZIKLR46V4Z3ZP--AHSIgPbeEX2NFk4rlgT6y3HNVAdOma+owSKMRG1A

Al Postman invocar el MS, me lo envia así:

AKIAQSKZIKLR46V4Z3ZP--AHSIgPbeEX2NFk4rlgT6y3HNVAdOma owSKMRG1A

Eliminando el caracter + del dato, puesto que este quita los caracteres especiales, reemplazandolo por un espacio vacio.

Para solucionarlo, se puede implementar lo siguiente:

String acces = URLEncoder.encode(accessKeyId, StandardCharsets.UTF_8);

En donde el .encode, lo recibe y lo deja como se envia originalmente, sin reemplazar los caracteres especiales por espacios vacios.
Hola,
Si tienen su teclado en inglés como yo, pero escriben en español les comparto como hacerlo con la letra alt y el teclado numerico de su PC.


Vocales en minúsculas con tilde:
  • á = ALT + 160
  • é = ALT + 130
  • í = ALT + 161
  • ó = ALT + 162
  • ú = ALT + 163
Vocales en mayúsculas con tilde:
  • Á = ALT + 181
  • É = ALT + 144
  • Í = ALT + 214
  • Ó = ALT + 224
  • Ú = ALT + 233
Además, para escribir la letra ñ en minúscula y en mayúscula, y los símbolos de la interrogación y la exclamación al inicio de una frase se pueden usar estas combinaciones:
  • ñ = ALT + 164
  • Ñ = ALT + 165
  • ¿ = ALT + 173
  • ¡ = ALT + 168
Tomado de: