Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Un DRP (por sus siglas en inglés, Disaster Recovery Plan o Plan de Recuperación ante Desastres) es un documento y conjunto de procedimientos técnicos que define cómo debe responder una organización para restaurar su infraestructura de tecnología de la información (TI), datos y sistemas críticos después de una interrupción grave.


¿Para qué sirve?
  • Restaurar la tecnología: Se enfoca en levantar servidores, bases de datos, aplicaciones, redes y respaldos en el menor tiempo posible.
  • Minimizar pérdidas: Reduce el tiempo de inactividad (downtime) y el impacto financiero o reputacional que causa un paro de sistemas.
  • Definir responsables: Asigna roles claros sobre quién hace qué durante una crisis para evitar el pánico y la confusión.
Elementos clave de un DRP
  • RTO (Recovery Time Objective): El tiempo máximo tolerable en el que un sistema puede estar caído.
  • RPO (Recovery Point Objective): La cantidad máxima de datos que la empresa se puede permitir perder (por ejemplo, los últimos 15 minutos de transacciones).
  • Estrategias de respaldo: Copias de seguridad locales, en la nube y replicación de datos.
  • Pruebas y simulacros: Ensayos periódicos para comprobar que los procedimientos realmente funcionan.
DRP vs. BCP (¿Son lo mismo?)
No son exactamente lo mismo, aunque trabajan juntos:
  • DRP (Disaster Recovery Plan): Se centra específicamente en recuperar la tecnología y la infraestructura informática.
  • BCP (Business Continuity Plan o Plan de Continuidad del Negocio): Es más amplio; abarca toda la operación general de la empresa para que el negocio pueda seguir funcionando de alguna manera durante la crisis.
La Concurrencia en programación es la capacidad de un programa para dividir una tarea en varias partes que se ejecutan de forma independiente y en periodos de tiempo superpuestos.


Conceptos Clave
  • Estructura vs. Ejecución: No significa necesariamente correr todo al mismo tiempo exacto. Consiste en diseñar el programa para que varias tareas avancen de manera intercalada.
  • Hilos (Threads): Son pequeñas unidades de ejecución dentro de un proceso que permiten manejar varias acciones a la vez compartiendo recursos.
  • Diferencia con Paralelismo: La concurrencia trata sobre la gestión y organización de múltiples tareas (el procesador cambia rápidamente entre ellas). El paralelismo requiere múltiples núcleos físicos para ejecutar acciones de forma simultánea y real al mismo tiempo.
¿Para qué sirve?
  • Optimizar tiempos muertos: Permite que el sistema haga otras cosas mientras espera una respuesta (como una consulta a una base de datos o una API externa).
  • Mejorar la interfaz: Evita que una aplicación se "congele" al realizar un proceso pesado, manteniendo la pantalla fluida para el usuario.
Alguna vez se han preguntado o les han preguntado que es Performance en programación o sistemas?
Les explico fácilmente:

El Performance es la eficiencia con la que un programa o aplicación ejecuta sus tareas. Mide qué tan rápido responde un sistema y cuántos recursos del computador (como memoria RAM, procesador o batería) utiliza para funcionar.


Pero, funcionalmente, es importante porque:
  • Mejor experiencia: Los usuarios prefieren aplicaciones rápidas que no se congelen.
  • Ahorro de recursos: Un código optimizado gasta menos energía en dispositivos móviles.
  • Escalatibilidad: Permite que el sistema soporte más tareas o usuarios sin fallar.
Métricas clave
  1. Tiempo de respuesta: El tiempo que tarda una aplicación en reaccionar a una acción del usuario.
  2. Uso de recursos: Cuánta memoria y capacidad de procesamiento (CPU) consume el programa.
  3. Velocidad de carga: Lo que tarda una página web o app en mostrar contenido útil en pantalla.

Hola,
La programación orientada a objetos es un paradigma de programación que organiza el diseño de software en torno a "objetos" que combinan datos y comportamientos; sus 4 pilares son:


🔒 Encapsulamiento
Oculta los detalles internos de un objeto y controla cómo se accede a ellos.
Se logra principalmente con private, public, protected, getters y setters.
Ejemplo: una cuenta bancaria no permite modificar directamente su saldo.

🧬 Herencia
Permite que una clase herede atributos y comportamientos de otra.
Favorece la reutilización de código.
Ejemplo: Perro puede heredar de Animal.

🎭 Polimorfismo
Un mismo método o interfaz puede tener diferentes comportamientos dependiendo del objeto.
Ejemplo: hacerSonido() puede comportarse diferente en Perro, Gato, etc.

🧩 Abstracción
Permite mostrar únicamente lo necesario y ocultar la complejidad interna.
Se implementa mediante interfaces y clases abstractas.
Ejemplo: llamas a pagar() sin necesitar conocer todo el proceso interno del pago.
Una alucinación en la inteligencia artificial es un error en el que un sistema responde con información falsa, inventada o sin base real, pero la presenta con total seguridad y tono convincente.


¿Por qué ocurren?
  • Predicción estadística: Los modelos no "piensan" ni comprenden la realidad; calculan cuál es la siguiente palabra más probable según los patrones del texto.
  • Vacíos de datos: Si la IA no posee la información exacta, intenta completar el espacio con datos que "suenan lógicos" en lugar de admitir que no lo sabe.
Ejemplos comunes
  • Inventar citas, libros o artículos que jamás han existido.
  • Dar datos numéricos o fechas completamente erróneas asegurando que son exactos.
  • Generar imágenes o videos con deformaciones físicas o elementos que desafían la lógica.
¿Cómo evitarlas o detectarlas?
  • Verifica las fuentes: Contrasta siempre los datos importantes con páginas oficiales o fuentes confiables.
  • Da más contexto: Entre más específica sea tu instrucción y los datos que le aportes al sistema, menor será la probabilidad de errores.
  • Consulta a varias herramientas: Compara la respuesta en diferentes plataformas de IA para ver si coinciden.
Solución "sencilla":
Se soluciona con skills para no dar margen de error.
Un skill es una especie de guión, es un promt pero mas robusto.
Konga es una herramienta de administración de código abierto que actúa como una interfaz gráfica (GUI) para gestionar el API Gateway de Kong. Su funcionamiento principal es proporcionar un panel de control centralizado y fácil de usar para administrar APIs, microservicios, complementos, consumidores y nodos de Kong, eliminando la necesidad de usar comandos como curl o herramientas como Postman. A través de Konga, los usuarios pueden monitorizar el estado en tiempo real, configurar upstream (servicios que Kong proxy), gestionar la seguridad y balancear la carga, todo desde una interfaz web.


¿Qué es Konga?
  • Interfaz de usuario para Kong: Konga es una aplicación que ofrece una interfaz gráfica de usuario (GUI) intuitiva para interactuar con la API de administración de Kong Gateway.
  • Gestión centralizada de APIs: Permite administrar Kong, que es una plataforma de código abierto para la gestión de APIs y microservicios.
  • Función de proxy: Kong (y por extensión, Konga) funciona como un proxy que dirige las peticiones a los servicios de backend, añadiendo funcionalidades como seguridad, logs y limitación de peticiones.

¿Cómo funciona?
  • Conexión a Kong: Konga se conecta a la API de administración de Kong para obtener la información y permitir su gestión. Esto se hace creando una conexión dentro de la aplicación y activándola.
  • Visualización y monitoreo: Proporciona monitoreo en tiempo real del estado de los nodos de Kong, información detallada de los mismos y un entorno multiusuario.
  • Administración de recursos: Permite gestionar elementos clave del ecosistema Kong, como:APIs: Crear y configurar servicios que el gateway debe exponer.
  • Plugins: Añadir y configurar complementos para extender la funcionalidad del gateway (ej. seguridad).
  • Consumidores: Administrar los clientes que utilizan las APIs.
  • Credenciales: Gestionar la autenticación de los consumidores.
  • Gestión avanzada de upstream y targets: Permite configurar grupos de servicios (Upstreams) y sus destinos individuales (Targets). Esto incluye la configuración de health checks (comprobaciones de salud) y balanceo de carga para distribuir el tráfico entre los Targets disponibles.

Un clúster es un grupo de servidores que funcionan juntos como un único sistema para procesar cargas de trabajo y mejorar la disponibilidad y escalabilidad. La integración con API funciona a través de la API del clúster, que es la interfaz para interactuar con él, permitiendo definir el estado deseado y que el clúster administre automáticamente los nodos y aplicaciones que lo componen para alcanzar ese estado.


¿Qué es un clúster?
  • Grupo de servidores: Un clúster es un conjunto de nodos o computadoras conectados que trabajan de forma cohesionada como un solo sistema.
  • Objetivo: Su propósito principal es gestionar y distribuir cargas de trabajo, logrando alta disponibilidad y escalabilidad.
  • Alta disponibilidad: Si un nodo falla, otro puede asumir su carga de trabajo, un proceso conocido como conmutación por error o failover.
  • Ejemplo de uso: En un clúster de Kubernetes, los nodos (máquinas físicas o virtuales) ejecutan aplicaciones en contenedores. El clúster se encarga de orquestar estos contenedores a escala.
¿Cómo funciona con integración de API?
  • API como interfaz: La API (Interfaz de Programación de Aplicaciones) del clúster es la forma en que los usuarios y otros sistemas interactúan con él.
  • Estado deseado: Un usuario o sistema define el estado deseado del clúster (ej. qué aplicaciones deben ejecutarse, cuántos recursos necesitan) a través de la API.
  • Gestión automática: El clúster, a través de su sistema de control, monitorea constantemente el estado real y trabaja para que coincida con el estado deseado definido por el usuario.
  • Herramienta declarativa: Es un sistema declarativo porque se le dice al clúster qué hacer (el estado deseado), y este se encarga de los detalles de cómo lograrlo automáticamente.
  • Ejemplo con Kubernetes: Se puede usar la herramienta de línea de comandos kubectl o la API directamente para enviar peticiones. Por ejemplo, se puede usar la API para solicitar el estado actual de los nodos o para desplegar una nueva aplicación. Las peticiones se dirigen a la API de Kubernetes, que luego las procesa y actualiza el clúster para que cumpla con la petición.


¿Cuál se debe elegir?
El sistema de mensajería adecuado depende de la arquitectura a utilizar y el uso requerido, es decir, cada proyecto es diferente al igual que sus necesidades y no hay un broker de mensajería definitivo.


Primero definamos rápidamente que es cada uno.

Apache Kafka:
Es una plataforma de streaming de eventos de código abierto que se utiliza para publicar, almacenar y procesar flujos de datos en tiempo real de forma escalable y confiable. Funciona como un sistema de mensajería distribuido en el que se pueden publicar mensajes (eventos) y suscribirse a ellos para procesarlos a medida que ocurren, con la capacidad de almacenar de manera duradera los flujos de datos.

Apache RabbitMQ:
Es un broker de mensajería de código abierto y de nivel empresarial que facilita la comunicación entre aplicaciones y sistemas distribuidos, actuando como un intermediario para enviar y recibir mensajes de manera fiable. Su funcionamiento se basa en un sistema de "intercambios" que enrutan mensajes a "colas" basándose en reglas, similar a una oficina de correos para datos.

Ahora les compartó una comparación eficaz de ambas:

Kafka:
  • Oleoducto de datos de alta velocidad
  • Maneja transmisiones de eventos continuos
  • Un rendimiento muy alto para aplicaciones en tiempo real
  • Conserva datos para repetición y análisis
  • Ideal para publicar/suscribir patrones

RabbitMQ :
  • El centro de mensajes confiable
  • Garantía de entrega de mensajes
  • Perfecto para colas de tareas y procesamiento de trabajadores
  • Soporta enrutamiento flexible para flujos de trabajo complejos
  • Adecuado para comunicación punto a punto

En resumen:
Kafka: Lo mejor para eventos a gran escala en streaming y análisis.
RabbitMQ: Lo mejor para entrega confiable, procesamiento de tareas y flujos de trabajo complejos.
La Normalización:
Es un proceso de diseño de bases de datos relacionales que aplica un conjunto de reglas para organizar los datos y reducir la redundancia. 
Su objetivo principal es evitar la duplicación de información, prevenir anomalías de inserción, actualización y eliminación, y garantizar la integridad de los datos mediante la creación de tablas más pequeñas y la definición de relaciones entre ellas. Se logra aplicando diferentes formas normales (como la Primera, Segunda y Tercera Forma Normal), que son etapas secuenciales para refinar la estructura de la base de datos.


Objetivos clave de la normalización
  • Reducir la redundancia de datos: Se evita almacenar la misma información en múltiples lugares, lo que simplifica las actualizaciones y el mantenimiento.
  • Prevenir anomalías: Se minimizan errores al insertar nuevos datos, actualizar registros existentes o eliminar información, ya que los datos relacionados se encuentran en un solo lugar.
  • Garantizar la integridad de los datos: Asegura la consistencia y exactitud de la información al relacionarla a través de claves.
Proceso y formas normales
La normalización se realiza a través de un proceso iterativo, aplicando reglas de forma secuencial. Las formas normales más comunes son: 
  1. Primera Forma Normal (1NF): Asegura que cada columna contenga valores atómicos (indivisibles) y que no haya grupos de columnas repetidos en una misma tabla.
  2. Segunda Forma Normal (2NF): Requiere que la tabla esté en 1NF y que todos los atributos no-clave dependan completamente de la clave primaria.
  3. Tercera Forma Normal (3NF): Requiere que la tabla esté en 2NF y que los atributos no-clave no dependan de forma transitiva de la clave primaria (es decir, un atributo no debe depender de otro atributo que no sea clave).
  4. Cuarta Forma Normal (4NF): La normalización a la cuarta forma normal (4FN) se enfoca en eliminar las dependencias multivalor no triviales, asegurando que cada tabla contenga una sola relación independiente entre sus atributos. Para lograr esto, si una tabla tiene múltiples relaciones independientes (como habilidades y lenguajes de un empleado), se divide la tabla en tablas separadas, manteniendo la integridad de los datos y reduciendo la redundancia.
¿Qué es una dependencia multivalor?
Una dependencia multivalor ocurre cuando una clave tiene valores múltiples para atributos que no están relacionados entre sí, pero que dependen de la misma clave.

Ejemplo: 
Una tabla de Empleado con las columnas ID_Empleado, Habilidad y Idioma. Un empleado puede tener múltiples habilidades y múltiples idiomas, pero las habilidades y los idiomas no están interrelacionados (por ejemplo, el hecho de que un empleado hable francés no afecta a su habilidad de programar en Python).

¿Cómo normalizar a 4FN?
  • Verificar la 3FN: Asegúrate de que la base de datos ya cumpla con la tercera forma normal (3FN).
  • Identificar dependencias multivalor: Busca tablas que representen más de una relación independiente. En el ejemplo anterior, la tabla Empleado tiene dos relaciones independientes: una entre empleado y habilidad, y otra entre empleado e idioma.
  • Crear tablas separadas: Si se detecta una dependencia multivalor, se deben crear tablas nuevas para cada relación independiente.La tabla original Empleado con ID_Empleado y Habilidad.
  • Una nueva tabla Empleado_Idioma con ID_Empleado e Idioma.
  • Nota: Esto solo aplica si no hay una interdependencia entre las columnas. Si una habilidad solo puede realizarse en un idioma específico, la relación no es independiente y la tabla original no violaría la 4FN.
  • Garantizar que cada tabla tenga una sola relación: El objetivo es que cada tabla represente un único tipo de relación independiente.
Beneficios de la 4FN
  • Elimina la redundancia: Evita repetir datos innecesariamente.
  • Previene anomalías: Reduce los problemas de inserción, actualización y eliminación de datos.
  • Mejora la integridad de los datos: Al tener menos redundancia, la probabilidad de inconsistencias disminuye.
Hola,
Sabian que en Postman existen funciones para diferentes temas, hoy les hablare de la función: $guid

En Postman, la función $guid se utiliza para generar automáticamente un identificador único universal (UUID). Para usarlo, simplemente escribe {{$guid}} en cualquier campo de la solicitud (URL, cuerpo, encabezados) para que Postman genere un nuevo UUID cada vez que se ejecute la solicitud.
Grafana es una plataforma de análisis y visualización de código abierto que permite a los usuarios monitorear y analizar métricas de diversas fuentes de datos a través de paneles interactivos y personalizables. Funciona conectándose a diferentes fuentes de datos (como bases de datos, servicios en la nube y sistemas de monitoreo), extrayendo información y transformándola en gráficos, paneles y alertas para facilitar la comprensión de tendencias y el rendimiento de aplicaciones e infraestructuras en tiempo real.


Cómo funciona:
  1. Conexión a fuentes de datos: Grafana se conecta a sus fuentes de datos existentes, como bases de datos de series temporales (ej: Prometheus, InfluxDB), servicios en la nube (ej: Azure, DynamoDB) o sistemas de registro (ej: Loki).
  2. Consulta y procesamiento de datos: Una vez conectado, Grafana puede consultar los datos. Utiliza plugins para interactuar con estas fuentes, y ofrece herramientas de transformación para manipular y combinar datos directamente en la plataforma.
  3. Visualización en paneles: Los datos se transforman en visualizaciones como histogramas, gráficos, mapas geográficos, etc. y se organizan en "paneles de control" interactivos y dinámicos.
  4. Generación de alertas: Se pueden configurar alertas para ser notificadas cuando una métrica supere un umbral definido. Las notificaciones pueden enviarse por correo electrónico, Slack u otros servicios.
  5. Análisis y colaboración: Los usuarios pueden explorar los datos para identificar tendencias, solucionar problemas o tomar decisiones informadas. Los paneles se pueden compartir fácilmente con otros miembros del equipo a través de enlaces o instantáneas.
Como buscar el log de un servicio en Grafana con loki?
Ingresar a Grafana -> Home -> Explore -> loki, en "Label filters" en el primer filtro se debe seleccionar la opción: 'namespace' y ahí colocar el namespace del servicio a buscar; luego agregar otro filtro y seleccionar la opción: 'app' y ahí colocar el nombre del servicio a buscar. Posteriormente, presionar el botón de buscar y listo.

Como buscar el log por rango de fecha y tiempo en un servicio?
Buscar la opción: 'Local browser time' la del icono del reloj, en la opción de: "Absolute time rage" en From (Fecha y hora de inicio) y To (Fecha y hora de finalización), luego presionar el botón: Apply time range y listo, el sistema buscar en el log del servicio en ese rango de fecha y hora.

Puedo exportar un log de un POD en Grafana?
Sí, puedes exportar logs de un POD en Grafana, pero para eso necesitas usar una integración con un sistema de gestión de logs como Loki. Grafana en sí mismo no maneja los logs, sino que los visualiza desde fuentes de datos como Loki, que está diseñado para almacenar y consultar logs.

Como hacerlo?
Despues de buscar el log del servicio, oprimir el botón: 'Query inspector' -> 'Data' y luego seleccionar, si se descarga en CSV o el txt: listo.


Un "servicio pass-through" es un servicio o función que permite la transferencia directa de datos, señales o materiales entre un sistema y otro, sin procesarlos ni modificarlos en el medio.


Este concepto se aplica en diversos ámbitos, desde la tecnología de diagnóstico automotriz (Pass-Thru) que conecta a talleres con servidores de fabricantes para actualizar software, hasta sistemas de transferencia de materiales en salas limpias (pass box), pasando por la funcionalidad de audio/video en equipos electrónicos y el impacto del tipo de cambio en la economía (efecto pass-through).

Ejemplos comunes de "servicio pass-through":
  • Diagnóstico automotriz (Pass-Thru): Las herramientas de diagnóstico permiten a los talleres descargar software y datos directamente de los fabricantes de vehículos para actualizar módulos, realizar diagnósticos precisos y programar componentes.
  • Sistemas de transferencia en salas limpias (Pass Box): Permiten el paso de materiales entre diferentes áreas controladas sin comprometer la esterilidad del ambiente, utilizando un sistema de puertas y enclavamientos para evitar la contaminación.
  • Audio y vídeo: Un procesador de audio o video puede tener una función pass-through que envía señales HDMI IN directamente al televisor conectado a HDMI OUT, incluso cuando el procesador está apagado.
  • Redes y finanzas: En el ámbito financiero, el efecto pass-through describe cómo las variaciones en el tipo de cambio (como el del dólar) se trasladan a los precios internos de la economía. En redes, un router puede usar el modo IP Pass Through para asignar directamente la dirección IP pública del proveedor a un dispositivo cliente.
  • Tecnología de Realidad Virtual (VR Pass-through): Las gafas de realidad virtual permiten ver el entorno físico exterior a través de sus cámaras, permitiendo al usuario interactuar con el mundo real sin quitarse el casco.
Hola,
Alguna vez se han preguntado cual es la diferencia entre API Gateway y Transit Gateway en AWS, pues yo si y aquí te explico:


API Gateway
  • Función: Es un servicio que actúa como puerta de entrada para exponer y gestionar APIs (REST, HTTP, WebSocket).
  • Uso: Se usa cuando querés que clientes (apps web, móviles, servicios externos) consuman tus APIs de forma segura y controlada.
Características:
  1. Maneja autenticación, autorización y seguridad (OAuth, IAM, API Keys).
  2. Hace rate limiting, throttling, logging, CORS.
  3. Se integra con Lambda, ECS, EC2, S3, DynamoDB, etc.
  4. Ideal para microservicios y arquitecturas serverless.
Ejemplo: 
Una app móvil que consume servicios de backend mediante un endpoint expuesto con API Gateway.

Transit Gateway
  • Función: Es un hub de red para interconectar VPCs y on-premises (via VPN o Direct Connect).
  • Uso: Se usa cuando tenés múltiples VPCs (en la misma región o distintas) y querés gestionarlas como una sola red centralizada.
Características:
  1. Simplifica la conectividad entre muchas VPCs (sin necesidad de hacer peering entre todas).
  2. Escalable y con mayor rendimiento que el peering clásico.
  3. Compatible con multicuenta y multirregión.
  4. Maneja el enrutamiento centralizado.
Ejemplo: 
Una empresa con varias VPCs (producción, pruebas, seguridad, analítica) que necesita conectarlas entre sí y también con el datacenter físico.

Resumen corto:
API Gateway → maneja tráfico de usuarios hacia tus APIs.
Transit Gateway → maneja tráfico de red entre tus VPCs/on-premises.
Hola,
En una cola de tipo topic en RabbitMQ, la routing key (clave de enrutamiento) es una cadena que se utiliza para determinar a qué colas se debe enrutar un mensaje. Esta cadena, compuesta por palabras separadas por puntos, permite definir patrones de enrutamiento complejos utilizando comodines como * (para una palabra) y # (para cero o más palabras).


Elaboración:

Intercambios (Exchanges) tipo Topic:
Los intercambios tipo topic son un tipo de exchange en RabbitMQ que permite un enrutamiento flexible basado en patrones de palabras clave en la routing key.

Clave de Enrutamiento (Routing Key):
El productor incluye una routing key en el mensaje, que actúa como una dirección para el intercambio.

Vinculaciones (Bindings):
Las colas se vinculan al exchange con patrones de vinculación (binding patterns) que pueden coincidir con la routing key del mensaje.

Comodines en las Vinculaciones:
Los patrones de vinculación pueden usar * (asterisco) para coincidir con una sola palabra y # (almohadilla) para coincidir con cero o más palabras, permitiendo un enrutamiento más flexible.

Ejemplo:
Si un mensaje tiene la routing key "news.sport.2024", y una cola tiene una vinculación con el patrón "news.#", el mensaje se enrutará a esa cola porque la vinculación coincide con la routing key.

En resumen:
La routing key y las vinculaciones con patrones en un exchange tipo topic permiten un control preciso de a qué colas se envían los mensajes, basándose en la estructura y el contenido de la routing key.


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,
Conocen en Java que es HashMap y que es Hashtable y saben sus principales diferencias?

La definición rápida es que son estructuras de datos que almacenan elementos en pares clave-valor, permitiendo acceder a los valores de manera rápida mediante sus claves.

¿Cuándo usar cada uno?
  • Usa HashMap en la mayoría de los casos, especialmente si no necesitas sincronización o prefieres sincronizar de forma explícita con Collections.synchronizedMap() o usando otras herramientas (ConcurrentHashMap).
  • Usa Hashtable solo si necesitas un mapa sincronizado y no quieres manejar sincronización manualmente, aunque hoy en día se recomienda usar ConcurrentHashMap para concurrencia en lugar de Hashtable.
HashMap
Parte de: java.util (desde Java 1.2) Es una implementación de la interfaz Map en Java.
Permite claves y valores nulos: Sí, permite una clave nula y múltiples valores nulos.
No es sincronizado: No es thread-safe; si varios hilos acceden y modifican el mapa, debe sincronizarse externamente.
Rendimiento: Generalmente más rápido que Hashtable por no tener sincronización interna.
Iteradores: Son fail-fast — si el mapa se modifica mientras se itera, lanzan ConcurrentModificationException.

Nota:
Fail-fast es un comportamiento en Java donde una colección (como ArrayList, HashMap, etc.) lanza una excepción si es modificada estructuralmente mientras se la recorre (por ejemplo, con un Iterator), fuera del propio iterador.

Hashtable
  • Parte de: java.util (desde Java 1.0) Es una implementación de la interfaz Map en Java.
  • No permite claves o valores nulos: Lanzará NullPointerException si intentas insertar clave o valor null.
  • Es sincronizado: Todos sus métodos están sincronizados (thread-safe para accesos concurrentes).
  • Rendimiento: Más lento que HashMap por la sincronización interna.
  • Iteradores: No son fail-fast.

Hola,
Si han escuchado este concepto y no tienen claro que es, les explico facilmente.
Un API de experiencia es una capa de APIs diseñadas para facilitar la integración entre servicios backend y las interfaces de usuario (web, móvil, terceros). Se enfocan en adaptar los datos y funcionalidades de los sistemas internos para que sean más eficientes y fáciles de consumir desde el frontend.


¿Cómo funciona a nivel de desarrollador?
Como desarrollador, trabajar con un API de experiencia implica:

1. Diseñar una API adaptada a la necesidad del frontend:
  • Agregar o transformar datos desde varias fuentes (bases de datos, microservicios, APIs externas).
  • Simplificar la respuesta para que el frontend reciba solo lo necesario.
2. Usar principios de diseño como:
  • GraphQL o REST optimizado: Para evitar múltiples llamadas al backend.
  • Agregación de datos: Combinar respuestas de varias APIs internas en una sola.
  • Normalización y caching: Para mejorar rendimiento y evitar carga innecesaria en los servicios backend.
3. Implementarlo en una arquitectura de 3 capas:
  • API de Experiencia (Frontend-facing API)
  • API de Procesos (Orquestación de lógica de negocio)
  • API de Sistema (Acceso a datos y sistemas internos)
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.