Hola,

Si de pronto te has preguntado que significa aceptar las cookies en una página web, la respuesta es la siguiente:



Al aceptar las cookies se esta permitiendo que la página o sitio web tome datos como:

  • el idioma del navegador, 
  • los intereses en función de la ubicación, 
  • guardar o no el usuario, entre otros... 

En la actualidad las páginas están obligadas a mostrar un mensaje de advertencia, donde indican que el sitio web puede utilizar cookies para funcionar correctamente.

El objetivo principal de las cookies es recopilar datos de los visitantes para fines estadísticos, ofrecer determinados servicios y principalmente conocer mejor al usuario que ingresa en el sitio web.

Basado en:

https://www.redeszone.net/tutoriales/internet/que-es-aceptar-cookies-web/


Hola,

Si necesitan eliminar un ApiKey de un plan de uso mediante código (en este caso Java) y solo les aparece para hacerlo con CLI (interfaz de línea de comandos de AWS), pueden utilizar el siguiente código, eso sí, deben pasarle el ApiKey y el ID del plan de uso del cual desean obtener los datos.


A nivel del build.gradle va esto:

dependencies {

implementation 'com.amazonaws:aws-lambda-java-core:1.2.0'
/**
* AWS
*/
compile group: 'com.amazonaws', name: 'aws-java-sdk-dynamodb', version: '1.11.789'

compile group: 'software.amazon.awssdk', name: 'core', version: '2.0.0-preview-9'

compile group: 'software.amazon.awssdk', name: 'api-gateway', version: '2.0.0-preview-9'

compile group: 'software.amazon.awssdk', name: 'cognitoidp', version: '2.0.0-preview-9'

compile group: 'com.amazonaws', name: 'aws-java-sdk-ec2', version: '1.11.923'


compile group: 'com.amazonaws', name: 'aws-java-sdk-api-gateway', version: '1.11.923'
compile "org.slf4j:slf4j-simple:1.6.1"

}

A nivel de la clase propia del método, va esto:
import com.amazonaws.regions.Regions;
import com.amazonaws.services.apigateway.AmazonApiGateway;
import com.amazonaws.services.apigateway.AmazonApiGatewayClientBuilder;
import software.amazon.awssdk.core.AwsRequestOverrideConfig;
import software.amazon.awssdk.services.apigateway.APIGatewayClient;
import software.amazon.awssdk.services.apigateway.model.GetApiKeysRequest;
import software.amazon.awssdk.services.apigateway.model.GetApiKeysResponse;
import java.util.logging.Level;
import java.util.logging.Logger;

private static final java.util.logging.Logger log = Logger.getLogger("NombreClaseDelCodigo");

/**
* Metodo encargado de eliminar un ApiKey de un plan de uso.
*
* @param pStrApiKey Define el ApiKey a eliminar.
* @param pStrPlanID Define el Id del plan de uso que se va a eliminar.
*/
public boolean eliminarApiKeyDePlanUso(String pStrApiKey, String pStrPlanID) {

try {

/*
* instancia del cliente de Amazon
*/
AmazonApiGateway apiGateway = AmazonApiGatewayClientBuilder.standard().withRegion(Regions.US_EAST_1).build();

/*
* se consulta el apikeyid en DynamoDB
*/
String apiKeyId = this.obtenerApiKeyId(pStrApiKey);

com.amazonaws.services.apigateway.model.DeleteUsagePlanKeyRequest deleteRequest =
new com.amazonaws.services.apigateway.model.DeleteUsagePlanKeyRequest();
deleteRequest.setKeyId(apiKeyId);//ID del ApiKey del usuario que se va a eliminar del plan
deleteRequest.setUsagePlanId(pStrPlanID);//ID del UsagePlan que se va a eliminar

/*
* elimina el usuario del plan de uso
*/
apiGateway.deleteUsagePlanKey(deleteRequest);

log.log(Level.INFO, "id[{0}] Se elimino el ApiKey: {1} del plan de uso: {2} exitosamente.",
new Object[]{Thread.currentThread().getId(), pStrApiKey, pStrPlanID});

return true;

} catch (Exception exception) {
log.log(Level.WARNING, "id[{0}] Exception en el metodo eliminarApiKeyDePlanUso(), " +
"la advertencia es: {1} ",
new Object[]{Thread.currentThread().getId(), exception});
}

return false;

}


Hola,

Si necesitan consultar el id de un ApiKey mediante código (en este caso Java) y solo les aparece para hacerlo con CLI (interfaz de línea de comandos de AWS), pueden utilizar el siguiente código, eso sí, deben pasarle el ApiKey.


A nivel del build.gradle va esto:

dependencies {

implementation 'com.amazonaws:aws-lambda-java-core:1.2.0'
/**
* AWS
*/
compile group: 'com.amazonaws', name: 'aws-java-sdk-dynamodb', version: '1.11.789'

compile group: 'software.amazon.awssdk', name: 'core', version: '2.0.0-preview-9'

compile group: 'software.amazon.awssdk', name: 'api-gateway', version: '2.0.0-preview-9'

compile group: 'software.amazon.awssdk', name: 'cognitoidp', version: '2.0.0-preview-9'

compile group: 'com.amazonaws', name: 'aws-java-sdk-ec2', version: '1.11.923'


compile group: 'com.amazonaws', name: 'aws-java-sdk-api-gateway', version: '1.11.923'
compile "org.slf4j:slf4j-simple:1.6.1"

}

A nivel de la clase propia del método, va esto:
import com.amazonaws.regions.Regions;
import com.amazonaws.services.apigateway.AmazonApiGateway;
import com.amazonaws.services.apigateway.AmazonApiGatewayClientBuilder;
import software.amazon.awssdk.core.AwsRequestOverrideConfig;
import software.amazon.awssdk.services.apigateway.APIGatewayClient;
import software.amazon.awssdk.services.apigateway.model.GetApiKeysRequest;
import software.amazon.awssdk.services.apigateway.model.GetApiKeysResponse;
import java.util.logging.Level;
import java.util.logging.Logger;

private static final java.util.logging.Logger log = Logger.getLogger("NombreClaseDelCodigo");

 

/**

 * Metodo encargado de obtener los datos de un ApiKey, como el Id.
*
* @param pStrValorApiKey Define el valor del Apikey
* @return un String
*/
@Override
public String obtenerApiKeyId(String pStrValorApiKey) throws BusinessException {

try (APIGatewayClient apiGatewayClient = APIGatewayClient.create()) {

AwsRequestOverrideConfig awsRequestOverrideConfig = AwsRequestOverrideConfig.builder().build();
GetApiKeysRequest apiKeyRequest = GetApiKeysRequest.
builder().limit(1000000).includeValues(true).requestOverrideConfig(awsRequestOverrideConfig).build();

GetApiKeysResponse getApiKeyResponse = apiGatewayClient.getApiKeys(apiKeyRequest);

for (int i = 0; i < getApiKeyResponse.items().size(); i++) {
if (getApiKeyResponse.items().get(i).value().equals(pStrValorApiKey)) {
return getApiKeyResponse.items().get(i).id();
}
}

}

throw new BusinessException("Error consultando los datos del ApiKey: " + pStrValorApiKey);

}
Hola,

Este fin de semana estaba viendo la increíble película Tenet de Christopher Nolan, la cual acaba de salir y hablaron sobre la paradoja del abuelo, entonces decidí profundizar mas a fondo sobre ella y a continuación les comparto por aquí, lo que encontré:


¿Qué es la paradoja del abuelo?

Se parte del supuesto de que una persona realiza un viaje a través del tiempo y mata al padre biológico de su padre/madre biológico (abuelo del viajero), antes de que este conozca a la abuela del viajero y puedan concebir. Entonces, el padre/madre del viajero (y por extensión, ese viajero) nunca habrá sido concebido, de tal manera que no habrá podido viajar en el tiempo; al no viajar al pasado, su abuelo entonces no es asesinado, por lo que el hipotético viajero sí es concebido; entonces sí puede viajar al pasado y asesinar a su abuelo, pero no sería concebido, y así indefinidamente.

Una variante de la paradoja del abuelo es la paradoja de Hitler o la paradoja del asesinato de Hitler, un tropo bastante frecuente en la ciencia ficción, en el que el protagonista viaja en el tiempo para asesinar a Adolf Hitler antes de que este provoque la Segunda Guerra Mundial. Esto no impide necesariamente el mismo viaje en el tiempo pero dicho asesinato, al conseguir evitar la Segunda Guerra Mundial, elimina precisamente el motivo para dicho viaje y también elimina el conocimiento de la utilidad de dicho viaje. De no haber existido la Segunda Guerra Mundial, entonces no habría motivo para viajar al pasado para matar a Hitler. Además, las consecuencias de la existencia de Hitler son tan grandes y globales que, para cualquier persona nacida después de la guerra, es probable que su nacimiento haya sido influenciado de alguna manera por sus efectos, y, por lo tanto, la paradoja del abuelo se aplicaría directamente de alguna manera. 

Posible solución:

Para solucionar esta paradoja se parte de que la materia física viaja tanto en el espacio como en el tiempo. Pero en el caso probable que pudieras viajar a un tiempo superior a años, según el trabajo publicado en la revista Classical and Quantum Gravity, vio 36, Number 20, tu cuerpo físico que llamaremos yo 0, Y0, sometido al cambio de pasar desde un extremo al otro de mundo distintos ya te convierte en otro yo, Y1 y viajarías al pasado, qué llamaremos P0. Si en ese pasado P0, matas a tu abuelo, no significa que no vas a existir en el futuro que llamaremos F0. Existes porque vienes del futuro F0 y existes en ese futuro F0, con el Y0, hasta que vas al pasado P0. A continuación se cambia desde ese momento tanto el pasado al que viajas como el futuro de donde viniste. El futuro F0 sigue sin ti y se convierte en Futuro 1, F1 y tú eres tú pero con otra apariencia física Y1 y empiezas a crear un nuevo pasado P1 que desembocará en otro futuro distinto tanto del F0 como del F1 y llamémoslo F2. Tú no podrás coexistir en varios futuros ni te podrás encontrar con tu otro yo, pues sólo hay un original que irá cambiando físicamente que va de allí para allá creando vidas distintas. Si intentaras regresar al futuro F0, volverías a sufrir cambios en tu propio yo, serías un Yo 2, Y2 ,situado en el mismo momento donde lo dejaste, y el futuro ya no será ni F0, ni F1, ni F2, será F3, es otro distinto, y te encontrarás con una realidad diferente con un yo modificado a cuando viajaste por primera vez y no sabras cuál será porque nunca estuviste ahí. El futuro seguirá siendo futuro eternamente y no podrás saber qué pasará.

Fuente:

https://es.wikipedia.org/wiki/Paradoja_del_viaje_en_el_tiempo

Hola,

Si necesitan obtener los datos de un plan de uso mediante código (en este caso Java) y solo les aparece para hacerlo con CLI (interfaz de línea de comandos de AWS), pueden utilizar el siguiente código, eso sí, deben pasarle el ID del plan de uso del cual desean obtener los datos.


A nivel del build.gradle va esto:

dependencies {

implementation 'com.amazonaws:aws-lambda-java-core:1.2.0'
/**
* AWS
*/
compile group: 'com.amazonaws', name: 'aws-java-sdk-dynamodb', version: '1.11.789'

compile group: 'software.amazon.awssdk', name: 'core', version: '2.0.0-preview-9'

compile group: 'software.amazon.awssdk', name: 'api-gateway', version: '2.0.0-preview-9'

compile group: 'software.amazon.awssdk', name: 'cognitoidp', version: '2.0.0-preview-9'

compile group: 'com.amazonaws', name: 'aws-java-sdk-ec2', version: '1.11.923'


compile group: 'com.amazonaws', name: 'aws-java-sdk-api-gateway', version: '1.11.923'
compile "org.slf4j:slf4j-simple:1.6.1"

}

A nivel de la clase propia del método, va esto:
import com.amazonaws.regions.Regions;
import com.amazonaws.services.apigateway.AmazonApiGateway;
import com.amazonaws.services.apigateway.AmazonApiGatewayClientBuilder;
import software.amazon.awssdk.core.AwsRequestOverrideConfig;
import software.amazon.awssdk.services.apigateway.APIGatewayClient;
import software.amazon.awssdk.services.apigateway.model.GetApiKeysRequest;
import software.amazon.awssdk.services.apigateway.model.GetApiKeysResponse;
import java.util.logging.Level;
import java.util.logging.Logger;

private static final java.util.logging.Logger log = Logger.getLogger("NombreClaseDelCodigo");

/**
* Metodo encargado de obtener los datos de un plan de uso en especifico mediante el id del plan de uso.
*
* @param strPlanID Define el Id del plan de uso a consultar.
*/
public void obtenerDatosDelPlanDeUso(String strPlanID) {

try {

/*
* instancia del cliente de Amazon
*/
AmazonApiGateway apiGateway = AmazonApiGatewayClientBuilder.standard().withRegion(Regions.US_EAST_1).build();

/*
* obtener los datos del plan de uso
*/
com.amazonaws.services.apigateway.model.GetUsagePlanRequest getUsagePlanRequest = new com.amazonaws.services.apigateway.model.GetUsagePlanRequest();
getUsagePlanRequest.setUsagePlanId(strPlanID);

/*
* obtener el plan de uso del usuario actual
*/
com.amazonaws.services.apigateway.model.GetUsagePlanResult getUsagePlanResult = apiGateway.getUsagePlan(getUsagePlanRequest);

log.log(Level.INFO, "id[{0}] Metodo obtenerDatosDelPlanDeUso(), el nombre del plan de uso es: {1}",
new Object[]{Thread.currentThread().getId(), getUsagePlanResult.getName()});

} catch (Exception exception) {
log.log(Level.WARNING, "id[{0}] Exception en el metodo obtenerDatosDelPlanDeUso(), " +
"la advertencia es: {1} ",
new Object[]{Thread.currentThread().getId(), exception});
}

}
Hola,

La función de Oracle TO_DATE, es la función que se ejecuta en las bases de datos de Oracle para controlar, gestionar y modificar fechas.


Si al momento de insertar un registro en la base de datos con está función, utilizando el siguiente formato:

TO_DATE(SYSDATE, 'DD/MM/YYYY HH24:MI:SS')

Y aún así, Oracle solo muestra la fecha mas no la hora, se debe a que la mascara de formato predeterminada de la base de datos no muestra la hora, para alterar esta mascara predeterminada y almacenar correctamente el formato de fecha y hora, se debe utilizar el siguiente alter:

alter session set nls_date_format = 'DD/MM/YYYY hh24:mi:ss';

Con esto se almacenará la hora en formato de 24 horas y se solucionará el problema, quedando el dato insertado así: "20/06/2012 18:13:58" si se desea implementar este alter dentro de una función o procedimiento en Oracle, debe utilizarse de la siguiente forma:

EXECUTE IMMEDIATE 'alter session set nls_date_format = ''DD/MM/YYYY hh24:mi:ss''';

Dentro del begin inicial de un procedimiento.
Hola,

En Oracle el parámetro NLS_NUMERIC_CHARACTERS especifica los caracteres a utilizar como separador de grupo y carácter decimal. 


Si se necesita cambiar un delimitador en Oracle, para evitar errores de porcentajes, se debe utilizar el siguiente alter:

ALTER SESSION SET NLS_NUMERIC_CHARACTERS='.,';

Con esto se cambiara el delimitador punto (.) por el delimitador (,) si se desea implementar este alter dentro de una función o procedimiento en Oracle, debe utilizarse de la siguiente forma:

EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=''.,''';

Dentro del begin inicial de un procedimiento.

Si se desea utilizar este parámetro en un select, se puede utilizar así:

SELECT TO_CHAR(1000000000,'999G999G999G999D99','NLS_NUMERIC_CHARACTERS = ''.,''') FROM DUAL;

Y el resultado final es:

1,000,000,000.00

Puesto que se reemplaza el delimitador de punto (.) por el delimitador de coma (,).
Hola,

Por si en algún momento en que estén programando con la librería OkHttpClient, para crear instancias de conexión contra microservicios, al obtener el response mediante la clase Response, les sale el error:

java.lang.IllegalStateException: closed


Se debe a que se está llamando el cuerpo de respuesta 2 veces, es decir, la línea de comando: response.body().string(); se está invocando dos veces en el código y es la segunda vez de la invocación la que genera está excepción.
Para solucionar esto, se sugiere que se cree una variable de tipo String una sola vez y que sea está variable la que se utilice en el código, de esta manera:

String strResponseBody = response.body().string();

log.info("Response obtenido es: " + strResponseBody);

Listo, eso es todo.