Páginas

domingo, 12 de julio de 2026

Guía para empezar a hacer SEO: Estrategias, Factores Clave y Herramientas Esenciales

El posicionamiento en motores de búsqueda (SEO Search Engine Optimization) es el conjunto de técnicas que se aplican a una página web para mejorar su visibilidad en los resultados de buscadores como Google u otros. Entender cómo funciona es la diferencia entre tener un sitio invisible o una web exitosa.


1. Posicionamiento gratuito vs. Posicionamiento de pago

Para diseñar una estrategia digital, primero debes entender las dos formas principales de aparecer en Google:

  • SEO (Posicionamiento gratuito / Orgánico): Consiste en optimizar tu web de forma natural para que los algoritmos de Google la consideren la mejor respuesta. No pagas por cada clic recibido, requiere tiempo, esfuerzo y constancia para ver resultados duraderos.
  • SEM (Posicionamiento de pago / PPC): Consiste en pagar directamente a plataformas como Google Ads para aparecer de inmediato en las secciones de anuncios (parte superior o inferior de la página). Consigues tráfico instantáneo, pero este desaparece en el momento en que dejas de pagar por los clics.

2. Tipos de SEO: Relevancia (On-Page) y Autoridad (Off-Page)

El algoritmo de Google evalúa cientos de factores que se dividen principalmente en dos grandes pilares:

  • SEO On-Page (Relevancia): Todo lo que haces dentro de tu propia página web para demostrarle a Google que tu contenido responde perfectamente a la intención de búsqueda del usuario.
  • SEO Off-Page (Autoridad): Todo lo que ocurre fuera de tu página web para demostrarle a Google que tu sitio es confiable y de prestigio, principalmente a través de enlaces desde otras webs.

3. SEO On-Page: Los 8 factores críticos que debes cuidar

Para que tu web sea atractiva tanto para los usuarios como para los motores de búsqueda, debes optimizar los siguientes elementos internos:

  1. URL bien estructurada y descriptiva: Facilita la navegación de los usuarios y permite a los motores de búsqueda entender de qué trata la página desde el primer vistazo. Una URL amigable es clave para la usabilidad y el SEO.
  2. Elección del dominio: Elegir un dominio relevante y fácil de recordar es importante para la marca y la visibilidad en línea. Un dominio relacionado con las palabras clave de tu nicho puede mejorar el SEO.
  3. Velocidad de carga de las páginas: Es un factor crucial para estar bien posicionado en el buscador de Google. Para garantizar rapidez, comprender las diferencias entre los posibles tipos de hosting es fundamental.
  4. Estructura del sitio web: Influye directamente en la navegación, la usabilidad y la indexación por parte de los motores de búsqueda. Una estructura clara, jerárquica y organizada es fundamental.
  5. Usabilidad web: Es clave para retener visitantes y convertirlos en clientes. Los motores de búsqueda también premian la usabilidad, ya que proporciona una mejor experiencia al usuario.
  6. Optimización de imágenes: Las imágenes son esenciales en un sitio web, pero deben estar optimizadas para no ralentizar la carga de la página. Esto es importante para la experiencia del usuario y el SEO.
  7. Etiquetas Meta Title y Meta Description: Estas etiquetas son cruciales para dar una breve descripción y un título atractivo a cada página. Influyen directamente en la decisión de los usuarios de hacer clic en los resultados de búsqueda (CTR Click-Through Rate).
  8. Uso adecuado de encabezados (H1, H2, H3...): No solo mejora la legibilidad del contenido para el usuario, sino que también ayuda a los motores de búsqueda a entender la jerarquía y estructura del contenido.

4. SEO Off-Page y Aspectos Técnicos Avanzados

El SEO va más allá del contenido visible. Para consolidar la autoridad y salud técnica de tu sitio, debes gestionar estos aspectos:

El alojamiento web (Hosting)

Para garantizar el rendimiento y la estabilidad de tu sitio, debes buscar el alojamiento adecuado según tus necesidades:

  • Compartido: Económico, ideal para proyectos nuevos o pequeños, pero compartes recursos con otras webs.
  • VPS (Servidor Privado Virtual): Un entorno aislado con recursos garantizados, ideal para proyectos en crecimiento.
  • Dedicado: Un servidor completo en exclusiva para tu web, para proyectos grandes con alto tráfico.
  • Cloud Hosting: Escalable y flexible, utiliza una red de servidores para garantizar que tu web nunca se caiga.

Control de rastreo e indexación

  • Robots.txt y Sitemap.xml: Estas herramientas te permiten guiar el rastreo de los bots. Te permiten controlar qué partes de tu sitio web deben o no deben ser indexadas por los motores de búsqueda, afectando directamente a tu visibilidad en los resultados.

Cuidado con las penalizaciones de Google

Debes mantener prácticas limpias para evitar que los algoritmos históricos de Google arruinen tu posicionamiento:

  • Google Panda: El algoritmo encargado de penalizar el contenido duplicado, de baja calidad o escaso (thin content).
  • Google Penguin: El algoritmo diseñado para detectar y penalizar el spam de enlaces artificiales, la compra de enlaces masivos y las técnicas poco éticas de linkbuilding.

5. El ecosistema de Herramientas SEO esenciales

Para monitorizar todo lo anterior con éxito, estas son herramientas en el momento de publicación de este artículo gratuitas y sus funciones principales:

  • Google Search Console: Permite supervisar cómo ve Google tu web y solucionar problemas de indexación o aparición en los resultados de búsqueda.
  • Google Analytics: Mide el comportamiento de los usuarios dentro de tu web, rastreando de dónde vienen y qué acciones realizan.
  • Answer the Public: Ayuda a descubrir las preguntas y frases que los usuarios buscan habitualmente en internet para crear contenidos que respondan a sus dudas.
  • Ahrefs: Excelente para analizar los enlaces entrantes (backlinks) a una web y estudiar las estrategias de la competencia.
  • LinkMiner: Permite encontrar y verificar la fuerza de los enlaces externos hacia un sitio web para mejorar tus campañas de linkbuilding.
  • Ubersuggest: Sirve para sugerir ideas de palabras clave y analizar el volumen de tráfico de cualquier página web.
  • Keyword Tool: Genera cientos de palabras clave alternativas usando el autocompletado de los principales buscadores del mercado.
  • Barra Moz: Extensión que mide la autoridad y relevancia de cualquier página web directamente desde el navegador mientras navegas por internet.

Conclusión: El SEO es una carrera de fondo

En resumen, dominar el SEO requiere un equilibrio constante entre la optimización técnica interna (On-Page), la construcción de una reputación sólida externa (Off-Page) y el análisis inteligente de los datos. Aunque herramientas como Google Analytics o Ahrefs facilitan enormemente el camino, la clave del éxito radica en la constancia y en poner siempre la experiencia del usuario en el centro de tu estrategia. El posicionamiento orgánico no da frutos de la noche a la mañana, pero es la inversión más rentable y duradera para consolidar la presencia digital.

Gran parte de los conceptos y estrategias que he compartido en este artículo los he aprendido gracias a un curso de Ir a Curso de SEO de Edutin Academye. Soy consciente de que esta plataforma tiene sus detractores y genera opiniones divididas en internet, pero en mi experiencia personal, el contenido me ha resultado sumamente útil, práctico y me ha dado las bases necesarias para entender este mundo. Al final, lo importante es aprovechar el conocimiento y ponerlo en práctica.

Ahora es tu turno: de todos los factores que hemos repasado, ¿cuál vas a empezar a optimizar en tu web hoy mismo o qué herramienta de la lista tienes más ganas de probar? ¡Déjame tu respuesta en los comentarios y compartamos ideas!

domingo, 5 de julio de 2026

Guía SEO para Blogger: Configuración esencial paso a paso

Si acabas de crear tu blog en Blogger, publicar contenido no es suficiente para recibir visitas. Necesitas que Google entienda tu sitio y confíe en él. Esta guía te enseña a configurar los pilares técnicos esenciales del SEO en Blogger desde cero.

1. Conecta Google Analytics para medir tu tráfico

No puedes mejorar lo que no mides. Google Analytics te dice cuántas personas te visitan y qué páginas leen.

Cómo crear una cuenta en Google Analitycs

  1. Entra a Google Analytics con tu cuenta de Gmail.
  2. Haz clic en "Empezar a medir".
  3. Asigna un nombre a tu cuenta (puede ser tu nombre o el de tu negocio).
  4. Configura tu primera propiedad introduciendo el nombre y la URL de tu blog.
  5. Ve a administrar (icono de la rueda) y añade un flujo de datos con la URL de tu blog para obtener tu ID de medición (un código que empieza por "G-").

Vincula el ID de medición en Blogger

  1. Copia tu ID de medición desde Google Analytics.
  2. Ve al panel de control de Blogger y haz clic en Configuración.
  3. Busca la opción ID de la propiedad de Google Analytics.
  4. Pega tu código y guarda los cambios.

2. Activa la disponibilidad HTTPS

El protocolo HTTPS activa un certificado SSL gratuito en tu blog. Esto cambia tu dirección de http:// a https:// y muestra un candado de seguridad en el navegador.

Por qué es obligatorio activarlo

  • Seguridad y confianza: Protege los datos de tus lectores. Evita que navegadores como Chrome marquen tu web con el aviso de "No segura".
  • Posicionamiento SEO: Google prioriza los sitios seguros. No tenerlo perjudica seriamente tu visibilidad.

Cómo activarlo en Blogger

  1. Entra a Configuración en tu panel de Blogger.
  2. Baja hasta la sección Privacidad / HTTPS
  3. Activa la pestaña Disponibilidad de HTTPS.
  4. Activa también Redirección de HTTPS para que todo el tráfico antiguo se dirija a la versión segura.

3. Habilita las etiquetas Meta (Meta Tags)

Las etiquetas meta sirven para indicarle a los motores de búsqueda de qué trata tu blog de forma resumida. Su función clave es generar descripciones atractivas (snippets) en los resultados de búsqueda de Google. Una buena descripción aumenta el porcentaje de clics (CTR) de los usuarios.

Su función clave es generar descripciones atractivas (snippets) en los resultados de búsqueda de Google. Una buena descripción aumenta el porcentaje de clics (CTR) de los usuarios.

Cómo habilitarlas

  1. En Blooger ve a Configuración > Etiquetas meta.
  2. Activa la opción Habilitar descripción de búsqueda.
  3. Escribe una descripción general de tu blog de menos de 150 caracteres. Usa tus palabras clave principales.

4. Configura el archivo Robots.txt personalizado

El archivo robots.txt le dice a los rastreadores de Google qué partes de tu blog deben revisar y cuáles deben ignorar. Esto optimiza tu presupuesto de rastreo.

Esto solo es útil si tu blog tiene miles de páginas en caso contrario no merece la pena. Tu blog ya tiene de forma automática un fichero sitemap.xml que le indica la buscador los artículos que has publicado. Si quieres consultarlo escribe en el buscador www.tublog.com/sitemap.xml y lo tendrás en descargas. Allí lo puedes consultar.

Cómo activarlo

  1. En Configuración, busca la sección Rastreadores e indexación.
  2. Activa la opción Habilitar contenido de robots.txt personalizado.
  3. Añade el código estándar de Blogger (asegúrate de que incluya la ruta de tu sitemap.xml para que Google encuentre tus artículos fácilmente).

Para terminar: Contenido y autoridad

Una vez que tu blog es técnicamente seguro y rastreable, empieza el verdadero trabajo de posicionamiento:

  • Publicación periódica: Escribe artículos de forma constante. A Google le gustan los sitios activos y actualizados.
  • Estrategia de enlaces (Backlinks): Consigue que otras webs de tu misma temática enlacen a tu blog. Esto transfiere autoridad y le demuestra a Google que tu contenido es de calidad.

domingo, 21 de septiembre de 2025

La IA es útil pero no inteligente

He leído el libro “We, programmers: A Chronicle of coders from Ada to AI” de Robert C. Martin. A mi cómo vieja programadora me ha resultado muy interesante toda la evolución histórica de la construcción de software. Puedo entender que a los programadores más jóvenes les resulte ajena, pero…

La historia de cualquier disciplina es importante en su trayectoria y muchas veces sirve para comprender el porqué de las cosas. Las personas aprendemos de nuestros propios éxitos y fracasos, pero la historia nos cuenta los éxitos y fracasos de otros y de estos también podemos aprender.

El libro tiene una primera parte dedicada a los pioneros de la programación. Son personas a las que se les ocurrió hacer máquinas que dependiendo de las ordenes que les dieran, harían unas cosas u otras. Hasta entonces una máquina hacía una única cosa para la que había sido construida, ellos la llamaron a esta máquina de propósito general puesto que podía hacer diversas cosas.

La primera idea de máquina programable la tuvo Charles Babbage que nació el 26 de diciembre de 1791. Él pensó que el tedioso trabajo de hacer cálculos se podía relegar a que lo hicieran las máquinas.

Según Robert C. Martin. "La necesidad de tablas matemáticas era omnipresente. Los matemáticos las necesitaban. Los navegantes las necesitaban. Los astrónomos, ingenieros y topógrafos las necesitaban. Los tipos de tablas que necesitaban eran tablas de logaritmos, tablas de trigonometría, tablas de balística, tablas de mareas. La lista era interminable. Además, necesitaban exactitud y precisión. Cada entrada de la tabla debía ser exacta, con una precisión de varios dígitos decimales."

Fue Ada Lovelace la que entendió la máquina que proponía Babbage y escribió el primer programa para el cálculo de una secuencia de números de Bernouilli. Se puede ver el programa aquí

Después de contar las historias de los precursores de la programación, el libro detalla todos los caminos que siguió en su vida profesional. Robert C. Martin ha programado en muy diversos lenguajes: ensamblador de varias máquinas, C, C++, java, Clojure y otros. Además ha sido un gran impulsor del diseño Orientado a Objetos siendo el promotor de un estilo de programación llamado Clean Code que enseña a través principios de diseño cómo escribir código más legible con la intención de que su mantenimiento sea más sencillo. Ya sabéis que el mantenimiento de código es la parte más tediosa de un programador.

Robert termina su libro haciendo una exposición de lo que él piensa sobre cómo va a ser la programación a unos 50 años vista. Y aquí es donde trata el tema del título de este artículo. Este autor opina que la programación no va a cambiar mucho en los próximos años. Lo que él espera es que se unifiquen los lenguajes de programación y se tienda hacia los lenguajes funcionales.

En cuanto a la IA, opina que siendo bastante útil, no es inteligente. Es decir, es un gran recopilador de datos, opiniones, soluciones, cálculos, historias, etc. Cuando se hace una pregunta a la IA, ella busca la respuesta a la misma pregunta entre millones de respuestas que esta pregunta ya ha tenido y han sido de utilidad.

Me hace gracia su forma de contar lo que la gente se cree de la IA y que no es.

"Todos los futuristas nos dicen que estamos al borde de una revolución de la IA. Predicen cambios y disrupciones, y lanzan advertencias alarmantes sobre la pérdida de empleos, la pérdida de libertad y la destrucción definitiva de la humanidad. Es como si hubieran visto demasiado Terminator de jóvenes. No, Skynet no va a despertar y bombardearnos a todos con armas nucleares. Estamos lejos de producir una máquina que 'despierte'."

Yo estoy totalmente de acuerdo con este punto de vista. ¿Qué os parece a vosotros que desarrolláis software?

miércoles, 24 de julio de 2024

¿Qué pasó con Windows y Crowdstrike el 19 de julio de 2024?

Después de indagar y olisquear por ahí voy a describir lo que yo creo que pasó y causó tantos problemas en aeropuertos, hospitales, oficinas gubernamentales y otras organizaciones. También voy a reflexionar sobre cómo se puede hacer para que esto no vuelva a pasar.

Descripción de los hechos

Los equipos que tenían instalado el sistema operativo Windows y la plataforma Falcon, el 19 de julio recibieron una actualización automática desde la plataforma Cloud de Crowdstrike.

Según la web de CrowdStrike, Falcon es: “Falcon es la plataforma de CrowdStrike diseñada específicamente para detener las infracciones a través de un conjunto unificado de tecnologías entregadas desde la nube que previenen todo tipo de ataques, incluido el malware y mucho más. CrowdStrike Falcon responde a esos desafíos con una solución poderosa pero liviana que unifica el antivirus de próxima generación (NGAV), la detección y respuesta de endpoints (EDR) y la detección inteligente de amenazas cibernéticas, todo contenido en un dispositivo pequeño y único, un Sensor liviano."

Gráficamente se puede organizar de esta forma:

La actualización afectó sólo a sistemas que estaban conectados a internet, tenían instalados Windows y Falcon y aceptaron la actualización automática. Estás actualizaciones forman parte del proceder habitual de Crodstrike y se suelen producir varias veces al día.

Esta actualización provocó, por un fallo software, que Falcon Agent detectase que se estaba intentando acceder a una dirección de memoria que está reservada para el sistema operativo. Esto es una violación que se interpretó como un cyberataque y causó que el sistema se intentase reiniciar para evitar males mayores.

La actualización incluía un fichero llamado C-00000291*.SYS que tenía un contenido erróneo. Falcon Agent utilizaba dicho fichero durante el pre-arranque del sistema y esto provocaba que no se pudiese llegar al arranque. Entonces Windows mostraba la pantalla azul (BSoD – Blue Screen of Dead). Por muchas veces que se intentase rearrancar, el proceso se repetía y se volvía a obtener la pantalla azul, es decir no era posible arrancar.

La solución era ir al directorio de Windows donde esta el fichero y borrarlo, después de haber arrancado en modo seguro para evitar el uso del fichero C-00000291*.SYS y no caer en el bucle de BSoD. Normalmente el fichero se aloja en el directorio C:/windows/System32/drivers.

Reflexión

Me parece muy oportuno como Freddy Vega

explica lo ocurrido e indica que, aunque alguien escribió el contenido de ese fichero y alguien escribió las lineas de código que manejan ese contenido, no es un error de una persona es un error del proceso que Crowdstrike emplea para desplegar las actualizaciones. Alguien se equivocó y el proceso de despliegue establecido por la organización no le ayudó a que se diese cuenta de su error.

A su vez es un error de los procesos de despliegue de los clientes de Crowdstrike que confían en actualizaciones automáticas de un tercero que ellos mismos no han probado ni verificado.

Existen múltiples técnicas ideadas y puestas en marcha por los departamentos de T.I. del mundo entero para evitar que pasen estas cosas. Por ejemplo los despliegues blue-green, métodos de pruebas automatizadas y no automatizadas para verificar que todo está bien antes del despliegue, sistemas de automatización del despliegue (canales DevOps) con puntos de verificación múltiples tanto de calidad del software como de verificación de funcionalidad , etc.

A pesar de todos los mecanismos que una organización emplee para evitar estos problemas el error se puede producir, pero mediante diferentes técnicas muchas organizaciones han conseguido minimizar este riesgo.

La experiencia ha demostrado que emplear recursos en organizar los procesos de los departamentos TI para mejorar el servicio a los usuarios del software y los beneficios a la organización propietaria de ese software, FUNCIONA.

Creo que es importante que los ingenieros de software sean conscientes de esto y creen procesos robustos que eviten se produzcan esto apagones que tantos problemas causan. Además que sean capaces de buscar promotores de su buen hacer en las organizaciones.

El software no es intangible, sólo su interior para los no profesionales. Seguro que a nadie le gustaría comprar una casa nueva que aparentemente es muy confortable, pero que en cuanto se habitase todo se fuese abajo: cimientos, cableados, desagües, circuito de calefacción, etc. Pues eso es lo que desde fuera no se ve pero es fundamental.

Epìlogo

A continuación enumero los lugares en los que he leído la información que aquí he sintetizado. Puede que los detalles técnicos de la Plataforma Falcon no sean exactos pero la conclusión sería la misma.

Si alguien me puede proporcionar más detalles del fallo, estaré muy agradecida y disculpas por las imprecisiones.

Plataforma Crowdstrike Para ver pulse aquí

Technical details of the Windows BSOD disaster due to CrowdStrike por B Shyam Sundar Para ver pulse aquí

Blue Screens to Blackouts: The Story Behind the CrowdStrike Outage por Animesh Gaitonde Para ver pulse aquí

lunes, 25 de septiembre de 2023

Un ejemplo de Mock Service Worker con React

Cuando se trata de hacer una aplicación web muy a menudo se utiliza un API Rest que suministra datos desde el backend. No siempre está disponible el backend en el momento en que se empieza a desarrollar el frontend o incluso a veces es deseable no depender de los vaivenes del desarrollo del backend.

Para aislar al frontend del backend es útil la librería Mock Service Worker. Mediante esta librería podemos simular el backend cómo si ya estuviese disponible aunque no lo esté. Vamos a ver un ejemplo.

Para acceder a los recursos del backend se utilizan métodos HTTP. En este ejemplo vamos a simular un get que devuelve frases famosas. El get se simula con:

Es decir, cuando desde el frontend se ejecuta el fetch que envía el get, si estamos en el entorno de desarrollo se ejecuta un get que devuelve un fichero json con estas 2 citas. Para distinguir el entorno de desarrollo del de producción se usa una variable de entorno de la siguiente manera:

https://thesimpsonsquoteapi.glitch.me/" es la url del backend real, la que se utilizará en producción cuando todo esté funcionando.

Entonces lo que es necesario para que todo esto funciones es instalar la librería Mock Service Worker con npm install msw --save-dev Y utilizar la función setupWorker con el workersetup.js con el siguiente contenido:

Bueno pongo todo en orden para que se entienda:

Main-page.js es un componente React que determina cual es la URL que se utilizará para el get como hemos visto anteriormente. El objetivo de este componente es mostrar todas las citas que devuelve el blackend. El contenido de Main-page.js es:

En este ejemplo cuando se está realizando la ejecución en el entorno de desarrollo el get se efectúa a /quotes y cuando es otro entorno, en este caso producción el get se efectúa a https://thesimpsonsquoteapi.glitch.me/quotes. Son workerSetup.js y handlers.js los que se encargan de simular la respuesta del get cuando la petición se lanza a /quotes.

Entonces lo que vemos en la pantalla cuando ejecutamos este componente en el entorno de desarrollo es:

Coincidiendo las citas que se muestran en pantalla con las que se crean en el objeto handlers.js cuyo contenido se mostró en la primera imagen de código.

Conclusión

Esta librería nos puede ayudar cuando durante el desarrollo queremos independizar el frontend del backend. Es decir podemos ir avanzando el frontend aunque el backend no esté disponible.

sábado, 12 de agosto de 2023

Un ejemplo de Cucumber para hacer BDD (Behavior driven development)

BDD tiende un puente para que los expertos del negocio y los informáticos se entiendan sin fisuras. BDD alienta la colaboración, construye compresión compartida sobre el comportamiento esperado del sistema, produce documentación que guía el desarrollo y permite validar el comportamiento del sistema de forma automática.

Trabajando en rápidos y pequeños ciclos mejora la retroalimentación y el flujo de valor. Hacer BDD es hacer tres cosas una y otra vez: se toma una pequeña funcionalidad y se conversa sobre los detalles de cómo se espera que el sistema se comporte usando ejemplos concretos, luego se documentan esos ejemplos en una forma en la cual se pueden automatizar y se corrobora que hay acuerdo, para terminar se codifica con lenguaje Guerkin el comportamiento descrito en cada ejemplo. A estas tres actividades se las llama: Descubrir, formular y automatizar.

La idea es hacer cada nueva funcionalidad en partes muy pequeñas (ejemplos) e iterar rápidamente. Cada vez que se implementa un ejemplo se añade algo valioso al sistema y se está en disposición de responder a posibles cambios como resultado de la retroalimentación recogida de los expertos en el negocio. Los ejemplos documentados guían el desarrollo y permiten al equipo tener confianza y progresar en la construcción del sistema. A la documentación que se va construyendo se le llama “documentación viva” porque el código representa la documentación y la documentación refleja el conocimiento compartido del equipo sobre lo que el código hace. Cucumber es una herramienta que sirve para hacer BDD y se va a usar a continuación para mostrar un ejemplo de lo explicado hasta aquí.

El ejemplo está basado en el curso online que suministran en Escuela Cucumber de forma gratuita, sólo hay que registrarse. El ejemplo tiene la siguiente estructura.

El contenido de Belly.feature es la codificación del ejemplo en Guerkin. La idea expresada es que si comes menos de 42 galletas y pasa más de una hora vas a estar hambriento y tu estómago va a gruñir, pero si has tomado más de 42 galletas no gruñirá.

La implementación del ejemplo para que la librería de Cucumber pueda ejecutar la prueba escrita en Guerkin en Belly.feature está en StepsBelly.java.

La funcionalidad del negocio está en Belly.java, esta aplicación determina si la barriga(belly) está llena o no después de haber transcurrido una hora y haber consumido una determinada cantidad de galletas.

Resumen

Estos tres ficheros son una pequeña muestra de lo que BDD, Guerkin y Cucumber pueden hacer para mejorar el desarrollo de software.

  • Belly.Feature está escrito en un lenguaje entendible por el usuario y expresa lo que él espera que el sistema haga.
  • StepsBelly.java es la implementación en java de Belly.Feature, cuando se ejecuta valida lo que se espera que haga la aplicación. Hay que tener en cuenta que lo que se espera que haga la aplicación lo ha escrito el experto en el negocio.
  • Belly.java es la aplicación cuya funcionalidad se comprueba automáticamente con StepsBelly.java que se ejecuta con Cucumber.

No hay fisuras posibles entre lo que quiere el experto en el negocio y lo que codifica el desarrollador. Bueno hay que estudiar cómo usar todo esto en el mundo real, pero eso es otra historia…..

viernes, 16 de junio de 2023

JavaScript: Como asegurarse de que es una Shallow copy.

La forma de asegurarnos que estamos haciendo una shallow copy es:

const myShallowCopy = JSON.parse(JSON.stringify(myObj));

con JSON.Stringify se convierte el objeto a copiar en una cadena de caracteres y con JSON.parse se vuelve a convertir en objeto. De esta manera estamos creando un nuevo objeto situado en otra referencia de memoria, es decir una shallow copy.

¿Por qué todo este jaleo? Depende de las necesidades del algoritmo a programar, nos interesa realizar deep copy (copia profunda) o shalow copy(copia superficial). Normalmente nos interesa copia superficial, de esta manera tenemos dos objetos independientes.

Diferencias entre deep y shallow copy.

Shallow copy copia un objeto en otra parte de la memoria (referencia). Entonces disponemos de dos objetos iguales que son independientes.

Deep copy copia la referencia al objeto copiado. Realmente es como si se tienen dos nombres para un mismo objeto, si se cambia algo en uno de ellos cambia automáticamente en el otro. Los dos objetos están apuntando a la misma referencia de memoria.

Ejemplo.

let obj = {a:1};
let shallowObj = {...obj};
shallowObj.a = 2;
console.log ("Shallow copy: obj "+JSON.stringify(obj)+" shallowObj "+ JSON.stringify(shallowObj));
// Shallow copy: obj {"a":1} shallowObj {"a":2}

let deepObj = obj;
deepObj.a = 3;
console.log (" Deep copy: obj "+JSON.stringify(obj)+" deepObj "+ JSON.stringify(deepObj));
// Deep copy: obj {"a":3} deepObj {"a":3}

La imagen muestra el comportamiento de shallow y deep copy. Cuando se modifica la shallow copy el objeto original no cambia, sin embargo sí cambia si se modifica la deep copy.

Otro Ejemplo más complejo.

Cuando un objeto contiene otro objeto en sus propiedades se produce una particularidad.

let obj = {a:1, b: {a:1}};
let shallowObj = {...obj};
shallowObj.a = 2;
shallowObj.b.a = 2;
console.log ("Shallow copy: obj "+JSON.stringify(obj) +" shallowObj "+ JSON.stringify(shallowObj));
// Shallow copy: obj {"a":1,"b":{"a":2}} shallowObj {"a":2,"b":{"a":2}}

obj = {a:1, b: {a:1}};
let deepObj = obj;
deepObj.a = 2;
deepObj.b.a = 2;
console.log (" Deep copy: obj "+JSON.stringify(obj)+" deepObj "+ JSON.stringify(deepObj));
// Deep copy: obj {"a":2,"b":{"a":2}} deepObj {"a":2,"b":{"a":2}}

La particularidad se produce en la Shallow copy, cuando se cambia el valor de la propiedad a del objeto almacenado en la propiedad b, es decir shallowObj1.b.a. Resulta que este objeto se ha copiado por referencia, o sea es una deep copy.

En este caso el problema es que el objeto b que está dentro del shallowObj en vez de copiarse como un nuevo objeto se ha copiado como una referencia al objeto dentro de la propiedad b de obj. Por eso cuando se cambia shallow.b.a resulta que estamos cambiando también obj.b.a.

Solución.

Esto puede ser inesperado para el programador que cuando cambia el valor en la copia también está cambiando el valor en el original. Una solución a esto es utilizar la sentencia mostrada al principio del artículo. Con stringify y parse nos aseguramos de que la shallow copy es total independientemente de los objetos contenidos en propiedades y los posibles anidamientos. Al hacer el parse se crean nuevos objetos, nunca copias por referencia. Por lo tanto los objetos son independientes y se pueden manejar sin interferir los valores de uno en los valores del otro.

Si quieres ver un video en el que explico los ejemplos, lo puedes hacer aqui

viernes, 17 de marzo de 2023

La economía del software según J. B. Rainsberger

Este artículo está basado en una conferencia de 2019 titulada “The economics of software design” de J.B. Rainsberger y que está disponible en Youtube en ver conferencia .

Lo que aquí relato es mi libre interpretación de lo que cuenta Rainsberger, lo digo porque puedo estar equivocada y tergiversar sus palabras. O sea son mis palabras, no las suyas, por si acaso. Es para que no me pase lo mismo que al tipo de la cola del cine en la película “Annie Hall” cuando habla sobre el trabajo de Marshall MacLujan ver escena.

El objetivo de la conferencia es explicar porque son necesarias prácticas ágiles a la hora de desarrollar software. Rainsberger con mucho talento sigue un hilo sólido que explica a desarrolladores y no desarrolladores porqué usar practicas ágiles va a mejorar los sistemas de información.

Rainsberger dice que hay tres asuntos importantes en los que hay que centrar la atención cuando se desarrolla software:

  • Las funcionalidades desarrolladas (Features)
  • El diseño del software (Design)
  • La retroalimentación (Feedback)

Funcionalidades desarrolladas

La refactorización es la piedra angular del desarrollo de código. Esta refactorización facilita mejorar el coste marginal. El coste marginal es un término financiero que se puede definir como el incremento de coste al producir N+1 unidades de determinado producto, respecto al coste de producción de N unidades. Llevando esto al mundo software, se puede traducir en el coste de añadir una nueva funcionalidad o cambiar una funcionalidad ya existente. Es menor de añadir o modificar funcionalidades si el sistema está bien diseñada, es decir no es un galimatías. Los patrocinadores del software (financiero de la empresa u organismo) entienden de costes marginales, los desarrolladores de diseño del software. Entonces, si para tener un mejor coste marginal es necesario refactorizar los promotores entienden que refactorizar es necesario, los desarrolladores ya lo saben. La forma de refactorizar constantemente es utilizar TDD (Test Driven Development).

Diseño del software

Para su exposición Rainsberger utiliza el siguiente gráfico.

Aquí la curva representada por g representa el aumento del coste de seguir modificando un sistema que no se desarrolla con “Diseño Evolutivo”. Inicialmente desarrollar el sistema es menos costoso, pero con el tiempo el coste de mantenerlo se eleva exponencialmente, según Rainsberger siguiendo el comportamiento del interés compuesto según Bernoulli, de hay la formula (1+1/n)ⁿ -> e. Sin embargo la curva representada por f corresponde a los sistemas que se desarrollan con “Diseño Evolutivo” (básicamente empleando TDD), en estos el diseño está mejorando constantemente y eso contribuye a que aunque cada vez el sistema sea más complejo el crecimiento de costes sea mucho más moderado. En términos más vulgares que el galimatías sea menor, aunque la complejidad sea mayor.

También dice Rainsberger que el punto t₀ en el caso de los sistemas que no se desarrollan con "Diseño Evolutivo" es el momento en que económicamente es más rentable tirar el sistema y hacerlo de nuevo. Cómo según él nadie sabe calcular cuando llega ese momento, es mejor trabajar con “diseño evolutivo” para evitar el desastre.

Retroalimentación

En cuanto a la producción del software existe un modelo clásico llamado “En cascada” que implica las fases:

Requisitos -> Análisis-> Diseño-> Codificación -> Pruebas -> Puesta en marcha

En este modelo la retroalimentación se ejecuta demasiado tarde. Esto provoca que la cantidad de re-trabajo suela ser ingente porque cuando algo no se ajusta a lo esperado ya hay mucho que cambiar.

En “XP (eXtreme Programming de 1999)” se expuso que era mejor realizar un ciclo de desarrollo y pruebas constante que pusiera en evidencia si lo que se estaba desarrollando era lo que se necesitaba. XP y a continuación Agile aconsejan prácticas que mejoran la retroalimentación: pequeños ciclos de desarrollo, pruebas unitarias para conocer el estado interno del sistema y pruebas de aceptación para saber si el sistema está de acuerdo con las necesidades del usuario.

Rainsberger expone que las técnicas para llevar esto a cabo son TDD y BDD. También las prácticas de DevOps ayudan a la retroalimentación y facilitan la labor coordinada de los equipos de desarrollo y operaciones.

Conclusiones

Esta conferencia apoya de forma empírica y heurística el desarrollo basado en técnicas ágiles.

No hay fórmulas mágicas, pero desarrollar software no es fácil y yo también estoy convencida de que todas las prácticas ágiles contribuyen a que el mundo del desarrollo de software mejore.

Buenas noticias, eso nos beneficia a todos a los informáticos y a los no informáticos.

lunes, 20 de febrero de 2023

Expresiones regulares en JavaScript

Qué es una expresión regular y como se crea en JavaScript.

Una expresión regular es una secuencia de caracteres que conforma un patrón de búsqueda. Este patrón se utiliza para buscar dentro conjuntos de caracteres contenidos en: literales, variables, ficheros, etc. y comprobar si hay coincidencia o no en la búsqueda.

Las búsquedas con patrones tienen muchas utilidades. Por ejemplo:

  • Buscar una subcadena dentro de una cadena de caracteres.
  • Reemplazar partes de una cadena por otras subcadenas.
  • Validar el formato de un dato.
  • Formatear datos.
  • Filtrar información y extraer datos que cumplan ciertas condiciones.
Las expresiones regulares no son complicadas, pero en una primera aproximación pueden intimidar. Cuando se comprenden y se saben manejar la perspectiva cambia y se convierten en grandes aliados de los programadores.

Un patrón es un objeto RegExp de JavaScript que se crea escribiendo caracteres entre dos barras oblicuas. Luego se puede utilizar de distintas formas, por ejemplo con el método test() que es uno de los métodos del objeto patrón. Un ejemplo:


   let patron = /verde/;
   console.log (patron.test("¡Qué verde era mi valle!")); // true

Este patrón /verde/ busca el conjunto de caracteres verde en la cadena "¡Qué verde era mi valle!" y como hay coincidencia devuelve true.

Hay más métodos de los objetos JavaScript que manejan los patrones. Por ejemplo el método search() del objeto String. Este método devuelve -1 si no encuentra coincidencia y un número positivo que indica la posición donde encuentra el patrón. Por ejemplo:


   "!Qué verde era mi valle¡".search(patr);

devuelve un 5 que es la posición de la cadena donde empieza la palabra verde si se cuenta de izquierda a derecha en la cadena empezando por 0.

Metacaracteres en las expresiones regulares.

En los patrones se usan caracteres que tienen significados especiales y es lo que se llama metacaracteres. Por ejemplo el caracter . en un patrón significa coincidencia con cualquier caracter. Un ejemplo:


   let patr = /r..a/; // Busca una r, 2 caracteres cualesquiera y una a.
   let cadena = "La casa roja";
   console.log (patr.test(cadena)); // true
   cadena = "La casa rosa";
   console.log (patr.test(cadena)); // true
   cadena = "El ron era bueno"; 
   console.log (patr.test(cadena)); // false
   cadena = "El remo se rompió";
   console.log (patr.test(cadena)); // false

Hay muchos metacaracteres para crear expresiones regulares y conseguir con los patrones realizar busquedas complejas. Estos patrones evitan muchas veces tener que crear largos algoritmos de programación. Por ejemplo:


/[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*@[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,5}/

este patrón sirve para comprobar si una dirección de correo electrónico tiene un formato correcto. De esta forma con esta sola línea se consigue evitar tener que idear y codificar un algoritmo que lo compruebe y cuantas menos líneas de código escritas, menos líneas de código a mantener.

Ejemplo de dos metacaracteres usados normalmente.

Metacaracter.

Significado ➝ Cualquier caracter.

Ejemplo:


   let patr = /a..a./; 
   let cadena = "ambar";
   console.log (patr.test(cadena)); // true
   cadena = "amigo";
   console.log (patr.test(cadena)); // false

Metacaracter\d

Significado ➝ Cualquier caracter que sea un número arábigo, es decir 0, 1 ,2 ,3 ,4 ,5 ,6 , 7 ,8 o 9

Ejemplo:


   let patr = /\d/; 
   let cadena = "Juan tiene 18 años";
   console.log (patr.test(cadena)); // true
   cadena = "Juan tiene dieciocho años";
   console.log (patr.test(cadena)); // false

Si necesitas más información sobre expresiones regulares y más ejemplos puedes consultar el libro Uso de expresiones regulares en JavaScript

O si lo prefieres puedes inscribirte en este curso Expresiones regulares en JavaScript

martes, 10 de enero de 2023

JavaScript: Guia rápida de expresiones regulares

Aquí hay un resumen de los meta-caracteres y otras estructuras más empleados en las expresiones regulares. Si necesitas una explicación mas detallada y ver algunos ejemplos puedes consultar el libro Uso de expresiones regulares en JavaScript


Metacaracteres generales


Metacaracter Significado
\d Cualquier caracter que sea un número arábigo, es decir 0, 1 ,2 ,3 ,4 ,5 ,6 , 7 ,8 o 9
\D Cualquier que no sea un número arábigo, es decir 0, 1, 2, 3, 4, 5, 6, 7, 8 o 9
\w Cualquier caracter del alfabeto latino básico es decir letras minúsculas, letras mayúsculas y guión de subrayado
\W Cualquier caracter que no sea del alfabeto latino básico es decir letras minúsculas, letras mayúsculas, números arábigos y guión de subrayado
\s Encuentra coincidencia cuando hay un espacio u otros caracteres no imprimibles
\^ Comprueba el principio de la cadena
\$ Comprueba el final de la cadena
\ Indica que el siguiente caracter, tiene que ser tratado de forma especial. Es útil para tratar meta-caracteres como caracteres especiales y para tratar caracteres normales como meta-caracteres
\b Comprueba límites de palabra. Un límite de palabra es la posición donde un caracter de palabra no es seguido o precedido por otro caracter de palabra. Los caracteres de palabra son: letras del alfabeto latino en mayúsculas o minúsculas, números arábigos o sea los caracteres del 0 al 9 y el caracter de subrayado
\B Comprueba límites de no palabra. Un límite de no palabra es la posición donde un caracter de palabra es seguido o precedido por otro caracter de palabra. Los caracteres de palabra son: letras del alfabeto latino en mayúsculas o minúsculas, números arábigos o sea los caracteres del 0 al 9 y el caracter de subrayado. Es decir busca que un caracter esté seguido o precedido por otro del mismo tipo, de palabra o de no palabra
[abc] o [a-c] Encuentra coincidencia si hay alguno de los caracteres que aparecen entre corchetes en la cadena. También se pueden especificar rangos de caracteres mediante un guión, así [abc] es lo mismo que [a-c]
[^abc] o [^a-c] Encuentra coincidencia si encuentra algún caracter distinto de los que aparecen entre corchetes en la cadena. También se pueden especificar rangos de caracteres mediante un guión, así [^abc] es lo mismo que [^a-c]
\t Hay coincidencia si encuentra un tabulador horizontal en la cadena. Hay que tener en cuenta que este caracter es un Non Printable Character y los editores normalmente no lo muestran como tal sino que lo interpretan como una orden, en este caso que el caracter siguiente se muestre más a la derecha
\r \n \v \f Estos al igual que el anterior son Non Printable Characteres y los editores normalmente no lo muestran como tal sino que lo interpretan como una orden. Cada uno tiene un significado distinto: \r carriage return (junto a \n salto de línea), \n linefeed (salto de línea), \v vertical tab y \f form-feed (salto de página)
x|y Disyunción: coincide si hay x o y. Cada componente separado por | se llama alternativa

Metacaracteres cuantificadores


Metacaracter Significado
x* El item precedente 'x' se repite 0 o más veces
x+ El item precedente 'x' se repite 1 o más veces
x? El item precedente 'x' se repite 0 o 1 vez
x{n} El item precedente 'x' se repite exactamente n veces

Grupos


Grupo Significado
(abc) Busca la cadena abc
(/w/w) Busca 2 caracteres del alfabeto latino seguidos
(?<g>abc) El grupo se llama g. Luego se puede usar con \k<g>
(([0-9]){2}-){3} Los grupos se pueden anidar. En este caso el primer grupo es un numero que se tiene que repetir 2 veces seguido de un guión es el segundo grupo que anida al primero. Luego todo eso se repite 3 veces

Flags


Flag Significado
i Encuentra coincidencia sin distinguir mayúsculas de minúsculas
g Encuentra todas las coincidencias del patrón en la cadena
m Significa busqueda multilínea. Solo es aplicable a los metacarateres ^ y $ de principio y final de línea
s Es aplicable al metacaracter .. Cuando se usa el flag s el . encuentra coincidencia con salto de línea \n
u JavaScript utiliza la codificación Unicode, esto determina como se almacenan internamente los caracteres en memoria. Existen caracteres que se guardan de 2 bytes (16 bits de 0s y 1s) y otros que se guardan en 4 bytes. Hay que tener en cuenta que Unicode tiene combinaciones de 0s y 1s para representar los caracteres de cualquier idioma, una a sería 01000001 en binario o 41 en hexadecimal.
Para construir patrones para Unicode se usa el metacaracter \p junto con otros caracteres que se ponen entre {}, por ejemplo {Sc} significa symbol y currency (símbolo y moneda)
y Busca el patrón en una posición determinada dentro de la cadena. Para establecer la posición en la que buscar se usar la propiedad lastIndex de RegExp

Objetos para manejar patrones


Objeto.Método Uso
RegExp.text() El método test() ejecuta una busqueda del patrón dentro de una cadena de caracteres (string), devolviendo true si lo encuentra o false sino lo encuentra
RegExp.exec() El método exec() realiza una búsqueda para encontrar el patrón dentro de una cadena de caracteres (string) y devuelve un array con los resultados. Sino hay coincidencias devuelve null
String.match() Con la bandera g de global, este método devuelve un array con las coincidencias encontradas
String.matchAll() Debe llevar la bandera g y devuelve un iterador que contiene las coincidencias del patrón encontradas en la cadena
String.split() Separa la cadena por el patrón especificado y crea un array con las subcadenas obtenidas
String.search() Busca la primera coincidencia del patrón y devuelve la posición dentro de la cadena en la que lo encuentra
String.replace() Reemplaza una cadena o las coincidencias del patrón con la cadena especificada. El método replace tiene dos argumentos, uno para especificar la cadena o patrón a reemplazar y el segundo para especificar conqué hay que reemplazarlo

martes, 16 de agosto de 2022

Qué es Cloud Computing

Estoy asistiendo a un curso online en https://www.edx.org/es y la definición e introducción que hacen para explicar "La Nube" me ha parecido muy interesante y quiero compartirla con vosotros.

Cloud es la entrega de recursos para computación a demanda. En lugar de depender de un servicio físico instalado, se tiene acceso a una estructura donde el software y/o el hardware están virtualmente integrados.

NIST(National Institute of Standards and Technology) define Cloud como: Un modelo para proporcionar recursos compartidos que son fácilmente aprovisionados, configurados y entregados por parte de el proveedor del servicio.

Características esenciales de Cloud

  1. Autoservicio a demanda.- los recursos de Cloud se obtienen sin necesidad de intervención humana. Estos servicios pueden ser: potencia de procesamiento, capacidad de almacenamiento y capacidad de red.
  2. Acceso a la red.- A los recursos de Cloud se puede acceder vía red desde mecanismos y plataformas estándar cómo móviles, tabletas, portátiles o estaciones de trabajo.
  3. Zona común de recursos.- Esto permite a los proveedores de servicios Cloud optimizar el uso de dichos recursos, permitiendo ofrecer a sus clientes servicios a precios mejores que los que conseguirían si los recursos los adquirieran de forma privada.
  4. Elasticidad.- Se obtienen más recursos cuando se necesitan y se devuelven cuando no se usan.
  5. Servicios a medida.- Solo se paga por lo que se usa. El uso de recursos se monitoriza, se mide y se informa de forma trasparente sobre su utilización.

Modelos de despliegue de Cloud

  • Público.- Los servicios se suministran desde infraestructuras (hardware y software) propiedad del proveedor a las que se accede desde internet y estas infraestructuras se comparten entre varias compañías.
  • Privado.- Los servicios se suministran desde infraestructuras (hardware y software) propiedad del proveedor a las que se accede desde internet y estas infraestructuras son de uso privado de una compañía.
  • Híbrido.- Una mezcla de público y privado

Modelos de servicio de Cloud

  • Infraestructura como servicio.- Proporciona recursos físicos como servidores, redes, almacenamiento de datos sin necesidad de instalarlos ni mantenerlos. Esto se ve a menudo como IaaS por sus siglas en inglés Infraestructure as a service. Un ejemplo, es cuando se aloja una web en un servidor que se contrata de forma remota. El servidor podemos decir que es virtual puesto que no tenemos ninguna máquina real.
  • Plataforma como servicio.- Proporciona acceso a una plataforma que normalmente tiene hardware y software, generalmente lo que se necesita para desarrollar y desplegar aplicaciones a usuarios en internet. Esto se conoce a menudo como PaaS por sus siglas en inglés Platform as a Service. Un ejemplo de esto es si contratamos un servidor(hardware) con un servidor de aplicaciones(software) ya instalado en el que vamos a desplegar nuestra web.
  • Software como servicio.- Es un modelo de licenciado y entrega en el cual las aplicaciones están alojadas y licenciadas en forma de subscripción, algunas veces se conoce este modelo como “software a demanda”. Este modelo se conoce como SaaS por sus siglas en inglés Software as a Service. Un ejemplo es cuando contratamos una aplicación de cualquier tipo de la que vamos a hacer uso en remoto, normalmente se paga por usuario.

viernes, 29 de julio de 2022

JavaScript: Que es Node con un ejemplo.

JavaScript es un lenguaje de programación que inicialmente se diseñó para ser ejecutado en el buscador. Es decir, se construían páginas html que para poder contener código ejecutable se cargaban con scripts que no eran otra cosa que módulos con sentencias JavaScript que dotaban y dotan a las páginas html de interactividad con el usuario. Por ejemplo, si se clica un botón se abre una nueva ventana.

JavaScript es un lenguaje de programación que inicialmente se diseñó para ser ejecutado en el buscador. Es decir, se construían páginas html que para poder contener código ejecutable se cargaban con scripts que no eran otra cosa que módulos con sentencias JavaScript que dotaban y dotan a las páginas html de interactividad con el usuario. Por ejemplo, si se clica un botón se abre una nueva ventana.

Para ello lo primero es instalar Node que se puede hacer desde https://nodejs.org/en/download/

Después de la instalación podemos escribir en la consola del sistema el comando node y se recibe información de la versión que se ha instalado:

Welcome to Node.js v14.16.0.

Un ejemplo de uso de Node es el siguiente. Escribimos un módulo en lenguaje JavaScript con el siguiente contenido:

Se guarda este módulo con el nombre holamundo.js. Si se ejecuta en la consola del sistema el comando node holamundo, se arranca un servicio en 127.0.0.1:1234 y por ello en la consola del sistema se verá:

Servidor corriendo en http://127.0.0.1:1234

A continuación abriendo un buscador y escribiendo http://127.0.0.1:1234 veremos

Para terminar

Node permite que la programación de servidor se escriba en javascript al igual que la del cliente. Node ha tenido bastante éxito y actualmente muchos sistemas tiene su frontend e incluso su backend escritos con JavaScript haciendo uso de este software. Node permite escribir código asíncrono para mejorar la interacción con el usuario y no hacerle esperar cuando no es necesario, además esta orientado a eventos y basado en el motor V8 de Google. Pero eso es otra historia…

viernes, 15 de julio de 2022

Javascript: Ejemplo de CRUD con MariaDB y Node Express

Con carácter general para establecer la conexión


Leer todas las filas


Leer una fila por identificador


Crear una fila


Modificar una fila


Borrar una fila



Espero que sea de ayuda para algun abnegado programador

martes, 22 de marzo de 2022

Para qué sirve Kubernetes: un ejemplo

Para qué sirve Kubernetes.

El despliegue de aplicaciones está evolucionando para facilitar a los ingenieros del software la tarea. Parece una contradicción que los ingenieros no dispongan de los mejores productos software para suministrarles ayuda en su trabajo, pero haciendo honor al dicho “en casa de herrero, cuchillo de palo”.

En los orígenes, no hace demasiado tiempo, las aplicaciones eran monolíticas e incluían grandes áreas de funcionalidad. En estos momentos el despliegue era algo manual que no comportaba la misma problemática que actualmente, puesto que el despliegue de un sistema no interfería con otros. Cada sistema era estanco y auto-contenido y las dependencias entre sistemas eran mínimas.

Con el advenimiento del micro-servicio las cosas han cambiado. Ahora los sistemas no son obligatoriamente monolíticos, hay otras opciones. Un sistema se puede construir en numerosas pequeñas partes que tienen que colaborar para suministrar la funcionalidad completa. Esta forma de desarrollar sistemas contribuye a que los desarrolladores puedan ser más efectivos a la hora de incorporar nuevas funcionalidades a los programas y también para llevar a cabo su mantenimiento tanto de eliminación de errores como de incorporación de mejoras. No es aceptable hoy en día que un cambio en una aplicación sea largo y tedioso, las organizaciones necesitan que sus sistemas evolucionen al mismo ritmo que suceden los acontecimientos.

En este escenario, el despliegue de sistemas es el despliegue de sus pequeñas partes. Esas partes tienen que trabajar de forma orquestada como un equipo en el que cada parte hace lo que se espera de ella y de forma coordinada con el resto de las partes.

Entonces surge un problema que antes no existía, orquestar adecuadamente todas las partes o micro-servicios. Los micro-servicios tienen dependencias, en el mundo del desarrollo actual los programadores hacen uso de librerías para llevar a cabo funcionalidades ya resueltas y que han sido programadas por otros. Esto hace que normalmente un desarrollo dependa de las librerías en las cuales se apoya. Esto produce muchos quebraderos de cabeza a los ingenieros que tienen que desplegar software, porque si se despliegan dos sistemas que dependen de una misma librería esta librería tiene ser utilizada exactamente en la misma versión. En caso contrario surgen los problemas de incompatibilidades.

Para esto se ideó la tecnología de contenedores. En esta tecnología cada micro-servicio se empaqueta con sus librerías y hay automatismos (capas) que se encargan de controlar las versiones de las librerías comunes y otros elementos. En este ejemplo se va a utilizar Docker como tecnología de contenedores.

Con Docker no tenemos problemas dependencias, pero surgen problemas de gestión de los numerosos contenedores que tiene que manejar el equipo de operaciones. Cuantos contenedores están activos, que recursos consume cada uno, es necesario replicar alguno de ellos para que no se produzcan cuellos de botella, se ha caído alguno, están en la versión adecuada, es necesario dar marcha atrás en un despliegue, etc.

Para esta gestión viene al rescate Kubernetes.

Qué es Kubernetes.

Kubernetes también conocido como K8s es un sistema open-source para la automatización del despliegue, escalado y gestión de aplicaciones contenorizadas.

Un cluster Kubernetes está formado por componentes que sirven para gestionar un conjunto de máquinas llamadas nodos.

No se van a describir aquí todos los tipos de componentes que existen en Kubernetes. Solo se van a exponer aquellos componentes de los que hace uso el ejemplo que aquí se explica.

El componente de orden superior que se utiliza es el Deployment que representa un despliegue. En el ejemplo el Deployment tiene un Pod, un Service y varios ReplicaSet. Los Pod albergan contenedores, los ReplicaSet se encargan de mantener activas tantas copias de un pod como se hayan establecido. Los servicios exponen los pods, es decir los contenedores que incluyen como un servicio de red.

Para ilustrar los componentes que utiliza el ejemplo, se utiliza la siguiente figura:

Ejemplo de Uso de Kubernetes

Se crea un contenedor que incluye un servidor web nginx que muestra una página html. Para ello se realizan las siguientes acciones:

  1. Instalar Docker https://docs.docker.com/get-docker/
  2. Crear un contenedor Docker
    • Crear un contenedor Docker que incluye: un servidor web nginx, una página html, una hoja de estilos y dos imágenes. Para construir un contenedor hay que crear un fichero con nombre dockerfile que describe su contenido. En el caso del ejemplo:
      FROM nginx
      COPY pagina.html /usr/share/nginx/html
      COPY pagina.css /usr/share/nginx/html
      COPY LogoDocker.png /usr/share/nginx/html
      COPY LogoKubernetes.png /usr/share/nginx/html
    • En el directorio donde está el dockerfile se ejecuta el comando para crear el contenedorcon el comando:
      docker build -t containerprueba .
  3. Se publica en un registro de contenedores, para luego usarlo desde kubernetes. En este caso en: http://hub.docker.com con el nombre
    marisaafuera/containerprueba
  4. Instalar Minikube https://minikube.sigs.k8s.io/docs/start/ y arrancarlo. Minikube es una herramienta que administra maquinas virtuales en donde corre una instancia de Kubernetes en un solo nodo y es útil a efectos de aprendizaje y pruebas.
  5. Crear un deployment en kubernetes (se crean automáticamente el pod y el servicio) con el comando:
    kubectl create deployment containerprueba --image=marisaafuera/containerprueba
  6. Exponerlo en Kubernetes para que sea accesible con:
    kubectl expose deployment containerprueba --type=LoadBalancer --port=8090
  7. Ahora debería de funcionar http://localhost:8090/pagina.html, pero no funciona. Después de unas cuantas horas buscando por qué no funciona, al final con port forward funciona:
    kubectl port-forward pod/<nombre pod> 8091:80
  8. Para acceder a la aplicación contenorizada y kubernetizada:
  9. Minikube tiene un dashboard que da información sobre el entorno de ejecución y permite gestionarlo. Se arranca con minikube dashboard.

    Para terminar

    Este artículo explica en la práctica en qué consiste Kubernetes. La ventaja de utilizar una herramienta de este tipo es apoyar el despliegue de sistemas con software que ayude a los equipos de desarrollo y operaciones a dar mejor servicio a los usuarios. Automatizar el trabajo, si se hace correctamente ayuda a que las tareas repetitivas se hagan mejor y con menos errores.

domingo, 13 de febrero de 2022

¿Qué es LOW CODE?

Low Code es una corriente de desarrollo de software que ayuda a construir aplicaciones sin la necesidad de escribir código o escribiendo poco código.

Hay numerosas herramientas que se publicitan como “Low Code” y que prometen:

  • Construir aplicaciones sin necesidad de ingenieros del software o expertos que dominen algún lenguaje de programación
  • Desarrollar apps para móviles, cloud y/o web
  • Crear aplicaciones haciendo “arrastrar y soltar”
  • Usar APIs REST  sin necesidad de conocer los end-points o interfaz técnica
  • Conectar con bases de datos sin usar lenguajes técnicos: SQL o similares
  • Embellecer aplicaciones web o móviles sin saber html, css, ni javascript
  • Desarrollar flujos de trabajo adaptados a las necesidades del negocio
  • Utilizar plantillas preestablecidas como base de la creación de apps o flujos de trabajo


La corriente “Low Code” viene de antiguo. En 1968 en la universidad de Michigan se inició el proyecto ISDOS (Information System Design and Optimization System) que estaba enfocado en ayudar a los equipos de desarrollo durante las fases del desarrollo del software. Este proyecto iluminó a otros muchos que acabaron elaborando lo que se denominó herramientas CASE (Computer Aided Software Engineering). Estas herramientas ayudaban en el análisis y diseño permitiendo realizar gráficos del sistema a construir y documentar los elementos que lo componían. También basándose en distintos esqueletos, servían para generar código de forma automatizada.

En la década de los 90 surgió la corriente de los lenguajes de programación basados en el paradigma de orientación a objetos (OO). A finales de los 90 con el auge de internet, estos lenguajes se llevaban toda la cuota de los nuevos desarrollos. Alentados por el éxito de las herramientas CASE del pasado, los expertos idearon un lenguaje de modelado específico para el desarrollo con lenguajes OO. Este lenguaje llamado UML (Unified Modeling Languaje) es un compendio de especificaciones para representar gráficamente todo lo que se puede desarrollar con un lenguaje OO. Partiendo de esta representación gráfica se crearon herramientas que generaban el código de los programas.

Todas estas iniciativas se pueden considerar precursoras de Low Code puesto que finalmente conseguían que los programadores tuvieran que escribir menos código.

El desarrollo de sistemas software consiste en su creación y posterior mantenimiento. Las empresas grandes y pequeñas invierten bastante dinero en el software que utilizan. Las herramientas de Low Code pretenden conseguir que esta inversión se minimice.
 
Veamos un ejemplo. Un departamento de ventas necesita hacer un resumen de los productos que se han vendido durante el año, se requiere elaborar un informe de los productos se han vendido mejor y han supuesto más ingresos para la compañía. Es necesario un resumen anual y un resumen mensual. Esta labor, antes de que existiesen las herramientas para hacer hojas de cálculo, requería un análisis en el que colaboraban un experto en ventas y un experto en desarrollo. Después un diseño para dar solución a lo analizado y para terminar una programación en algún lenguaje. Tras la puesta en marcha del sistema, viene el mantenimiento. ¿Qué pasa si el resumen además de mensual se requiere que sea semanal? Con las hojas de cálculo (Excel como máximo exponente) alguna persona del departamento de ventas, aprendió a diseñar, hacer cálculos y gráficos que resolvieron la situación con menos recursos (menos personas y menos tiempo).

En este ejemplo la hoja de cálculo es una herramienta de Low Code. A los avezados empleados que aprendieron sin conocimientos de programación a construir estas hojas, en la terminología Low Code les llaman Citizen Developers. Yo lo traduciría como desarrolladores de a pie. Resuelven la papeleta sin conocimientos de lenguajes de programación, ni bases de datos, ni sistemas operativos.

Estos Citizen Developers se suben al carro de los desarrolladores de software. Low Code dice que de esta forma se democratiza la construcción de software no necesitando grandes gurús de las tecnologías para construir sistemas de información.

No obstante, no es oro todo lo que reluce. Hay que tener en cuenta que la gestión de los sistemas de información de una empresa no es algo sencillo. La complejidad es directamente proporcional al tamaño de la organización, pequeña poca complejidad, grande mucha. O sea, Low Code es una buena corriente que posibilita la creatividad software de más personas que no solo los expertos en tecnologías. Pero toda está creación de software debe estar orquestada de forma coherente y coordinada. De otra forma las empresas caminan hacia el caos. Le suena a alguien que un mismo dato que proviene de varias fuentes no sea igual. Por ejemplo las ventas en diciembre de un determinado producto, que tiene registradas Alberto y las que tiene registradas Ana.

Pues eso,  Low Code si pero con cabeza.

jueves, 27 de enero de 2022

¿Qué es Docker y para qué sirve?

En informática un contenedor es una unidad estándar de software que empaqueta código y todas sus dependencias de tal forma que una aplicación se despliega y ejecuta rápida y fiablemente entre diferentes entornos. Un contenedor Docker es una imagen ligera, aislada y ejecutable que incluye todo lo necesario para ejecutar un software: código, herramientas, librerías y configuración.

Las imágenes de Docker llegan a ser contenedores cuando se ejecutan bajo el motor de Docker. Este motor está disponible para Linux, Windows y Mac.

La tecnología Docker se lanzó en 2013 como código abierto, enfocada en las necesidades de los desarrolladores y administradores de sistemas para ayudarles a separar las dependencias de la infraestructura. Esta tecnología ayuda a eliminar los problemas de instalar un software en distintos entornos y que las diferencias en la infraestructura produzcan fallos. De todos los desarrolladores y administradores es conocido el problema de desplegar el software desde los entornos de desarrollo a los de pruebas y producción.

El éxito que cosechó Docker en Linux condujo a la asociación con Microsoft que creó contenedores Docker para Windows. La tecnología Docker también está muy implantada en centros de datos, proveedores de servicios en la nube y frameworks serverless.

En una misma máquina pueden ejecutarse múltiples contenedores compartiendo el núcleo del sistema operativo, pero cada uno ejecutando los procesos de forma aislada en su propio espacio de nombres.

Un ejemplo de uso de Docker

  1. Instalación de Docker
    En https://hub.docker.com/ se descarga el producto para el sistema operativo que se necesite: Linux, Windows o Mac, y se procede a su instalación. Normalmente tiene más que seguir las indicaciones (siguiente, siguiente, .. ya sabes)
  2. Descarga del container getting-started
    Tras la instalación se puede proceder a descargar y ejecutar el primer contenedor de muestra que proporciona Docker. Este contenedor incluye un servidor web Nginx y una web con la documentación de Docker. Para instalarlo en cada sistema operativo acceder al modo comando y escribir:
    docker run -d -p 80:80 docker/getting-started

    este comando comprueba si tenemos esta imagen en nuestro ordenador, sino la tenemos la descarga (es nuestro caso, que acabamos de llegar a docker) y lo arranca.
  3. Ejecución de la aplicación del contenedor
    Lo que tenemos que hacer ahora el ir al navegador y escribir localhost. Esto arranca la web de documentación de Docker, que se ha instalado en el puerto 80 como si esta aplicación web de documentación y el servido Nginx estuviesen en nuestro ordenador.
    Si miramos en detalle vemos la url escrita en el navegador y corresponde con nuestro ordenador.

Uso de Docker desktop

El Docker dektop se instaló con la instalación de docker y permite entre otras cosas gestionar las imágenes y contenedores.

Si miramos en detalle vemos que el contenedor que está arrancado es el getting-started que acabamos de instalar y usar, que se llama vigorous-hofstadter

Conclusión

La tecnología de contenedores está actualmente en boga y ayuda a desarrollar y desplegar software evitando los quebraderos de cabeza que producen las dependencias entre unos paquetes software y otros.

Referencia

Para saber lo que es Docker está muy bien el post https://www.luisllamas.es/que-es-docker-y-como-usarlo/

viernes, 7 de enero de 2022

Javascript: Para qué sirve AJAX (Asynchronous JavaScript And XML)

AJAX es el acrónimo de Asynchronous JavaScript And XML, y son un conjunto de técnicas ideadas alrededor de 2005 para mejorar el desarrollo de aplicaciones web. En ese momento las aplicaciones web eran mucho menos fléxibles que las aplicaciones de escritorio y con AJAX esta circunstancia cambió notablemente.

AJAX es un nombre para aglutinar varias tecnologías desarrolladas entorno a internet:


  • XHTML+CSS
  • DOM
  • XMLHTTPRequest
  • Javascript
  • XML+XSLT (Actualmente en muchos casos JSON)

De todas estas tecnologías el objeto JavaScript XMLHTTPRequest es el motor. Este objeto es capaz de hacer peticiones "no bloqueantes" al servidor. Esto mejora la experiencia de usuario, puesto que el navegador puede lanzar peticiones al servidor y mientras este realiza el proceso necesario para contestar a esa petición el navegador no ha de estar esperando. El navegador puede seguir recibiendo ordenes del usuario y encadenar peticiones que cuando van siendo respondidas incorporan datos que se actualizan en la página html ya cargada mediante funciones javascript que acceden a las etiquetas de la página con DOM.

Para explicar la diferencia de acceso al servidor con AJAX y sin AJAX se puede acceder a las siguientes grabaciones:

Sin AJAX

Con AJAX

Conclusión

AJAX ha permitido desarrollar numerosas aplicaciones web, que tan útiles nos resultan en nuestro día a día. Eso si, no sin entrañar dificultades al tratar con las asincronías de XMLHTTPRequest y por lo tanto del API FETCH que tantos quebraderos de cabeza nos producen a los programadores.

domingo, 26 de diciembre de 2021

La paradoja del circunnavegante

Académicos sirios y franceses en el siglo XIII desarrollaron la "Paradoja del Circunnavegante" de la siguiente manera: supongamos que tres personas se reúnen en un lugar fijo: una se dirige hacia el oeste, otra sale hacia el este y la tercera permanece donde está, esperando a que las otras dos completen su viaje alrededor del mundo. A su regreso, el que viajó al oeste habrá perdido un día, mientras que el que viajó al este lo ganará.

Se demostró que esto era cierto en el primer viaje alrededor del mundo. En 1519 partió de Sanlucar de Barrameda una flota con Fernando de Magallanes al frente, el objetivo era abrir una ruta comercial hacia la isla de las especias por occidente. En aquellos tiempos las especias eran vitales para la conservación de los alimentos, la elaboración de medicamentos y para mejorar y/o potenciar el sabor de los alimentos que no siempre se comían en el mejor estado de conservación. El mercadeo de especias fue un negocio muy próspero durante 9 siglos. Acceder a este próspero negocio fue el motivo que llevo a la corona de España a financiar el viaje que fue el primero en el que varios hombres consiguieron dar una vuelta completa al globo terráqueo.

De la tripulación formaba parte Antonio Pigafetta que ocupaba el puesto de Sobresaliente. Este era un hombre cultivado que escribió un diario durante el viaje que fue de vital importancia para saber lo que acaeció durante los 3 años que duró la travesía. Entre todas las cosas para las que sirvió tal diario, una fue obtener una demostración práctica de la paradoja del circunnavegante. Cuando llegarón a Cabo Verde habían completado la vuelta completa a la tierra. Para Pigaffeta según sus anotaciones era miércoles 8 de julio de 1522 pero en Cabo Verde era 9 de julio jueves. Esto no se debía a un error en las anotaciones del diario.

Cuando se avanza hacia el oeste el sol sale y se pone cada vez más tarde, es decir los días son más largos que si estás en un punto fijo de la tierra. Concretamente por cada 111,32 km de avance el día se alarga 4 minutos. Teniendo en cuenta que el diámetro de la tierra es de 40.075 km, cuando has recorrido todo el diámetro de la tierra el sol saldrá: 4 minutos * (40.075 km / 111,32 km) más tarde. Esto es igual a 1440 minutos más tarde, que son 24 horas. Si el sol sale 24 horas más tarde que cuando se comenzó el viaje, cuando se llega al destino se ha perdido 1 día completo.

Si se viaja hacia el este lo que ocurre es que se gana 1 día puesto que el sol sale 24 horas antes ya que en este caso los días son más cortos. Julio Verne utilizó esta paradoja para su novela La Vuelta al Mundo en 80 días.

Desde 1884 durante una conferencia se convino crear la Línea Internacional de Cambio de Fecha. Esta línea sirve para que al ser traspasada los viajantes cambien de día y así uniformar las fechas de toda la humanidad aunque unos estén viajando hacia el este y otros hacia oeste.

miércoles, 1 de diciembre de 2021

Javascript: Ejemplos de Template Literal

Los Template Literal son plantillas que permiten intercalar expresiones dentro de una cadena, lo cual hace posible escribir cadenas sin tener que recurrir a la concatenación con el uso del operador +. También permiten escribir cadenas que tengan más de una línea, de nuevo sin recurrir al +. Además con los Templates etiquetados podemos incorporar procesamiento ad hoc. 

Ejemplo simple

Un ejemplo muy simple de es:

let miPrimerTemplateLiteral = `Este es un template literal`;

aquí se está usando el caracter ` que es el que declara un template literal, pero no se está haciendo uso de ninguna de sus ventajas comparativas con las cadenas normales declaradas con ' o ".

Ejemplo de intercalado de expresiones

Un ejemplo que si saca partido a las posibilidades de un Template Literal sería:

let nombre = "Luis";
let cantidad = 23;
let precioUnitario= 105;
let iva = 1.21;
let plantilla= `Querido/a ${nombre},\nEspero que te encuentres bien.
Te recuerdo que el importe de la factura asciende a ${cantidad*precioUnitario*iva}`;
console.log(plantilla);
// Resultado:
// Querido/a Luis,
// Espero que te encuentres bien.
// Te recuerdo que el importe de la factura asciende a 2922.15

aquí el uso de ${} muestra como se pueden incluir expresiones dentro del literal que se sustituyen por su valor en tiempo de ejecución. También se puede observar cómo un Template Literal puede ocupar más de una línea y cómo puede incluir un salto de línea \n.

Ejemplo de anidación

Los template literal se pueden poner unos dentro de otros

let color = 'rojas';
let count = 3;
let message = `Tengo ${color ? `${count} manzanas ${color}` : `${count} manzanas`} `; // Noncompliant; nested template strings not easy to read
console.log('Mesagge ', message)
// Resultado: Mesagge  Tengo 3 manzanas rojas

No  obstante esta forma de codificación está desaconsejada por SonarQube, herramienta que vela por la calidad del código. El motivo es la poca legibilidad del mismo, aconsejando esta herramienta codificar de la siguiente manera

let apples = color ? `${count} manzanas ${color}` : `${count} manzanas`;
message = `Tengo ${apples}`;
console.log('Mesagge ', message)
// Resultado: Mesagge  Tengo 3 manzanas rojas
 

Ejemplo de templates etiquetados

Un tTmplate se puede etiquetar con el nombre de una función. Esta recibe los textos y expresiones del Template Literal pudiendo procesarlo como se requiera.

function templatetag(literales, ...expresiones){
  console.log('lit ', literales, 'exp ', expresiones)
}

templatetag`amigo ${2+2} mio`
// Resultado; lit  [ 'amigo ', ' mio' ] exp  [ 4 ]

Esta característica de los Template Literal permite procesar su contenido según se requiera, por ejemplo

function priceonSeason(literales, ...expresiones) {
  let precio = 100;
  if (literales[1] == ' diciembre')    
     return `Su reserva para temporada baja ha sido confirmada.
     ${expresiones[0]} personas por un importe de ${precio*0.90}`
  else
    return `Su reserva para temporada alta ha sido confirmada.
    ${expresiones[0]} personas por un importe de ${precio}`
}
let pax = 2;
let respond = priceonSeason`Reserva de plaza para ${pax} diciembre`;
console.log ('Ejemplo etiquetado', respond)
// Resultado
// Ejemplo etiquetado Su reserva para temporada baja ha sido confirmada.      
//      2 personas por un importe de 90
 

Conclusión

Los Template Literal son cadenas de caracteres con características avanzadas que proporcionan medios al programador para trabajar con cadenas de caracteres de una muy versatil.