Monday, September 12, 2022

Manejo de Excepciones

Introducción


Técnicas de anejo centralizado de excepciones en ASP.NET

  • Definir un filtro que se ejecute después de que se haya generado una excepción en una acción.
  • Implementación de un Middleware que se integra al pipeline de peticiones de ASP.NET.


Links





Thursday, July 7, 2022

Containerize a .NET app

Pasos para "contenerizar" una aplicación NET. 

  1. Crear la aplicación NET
    • NET CLI
      • dotnet new console -o App -n DotNet.Docker
      • dotnet run
  2. Publicar aplicación NET. 
    • Antes de agregar la aplicación a una imagen Docker debemos tener la versión publicada de la aplicación.
    • NET CLI
      • dotnet publish -c Release
  3. Crear imagen con el archivo Dockerfile
    • Este archivo es usado por el comando "docker build" para crear la imagen Docker.
    • El archivo debe estar junto con el .csproj
    • Docker CLI
      • docker build -t counter-image -f Dockerfile .
      • docker images
  4. Crear contenedor
    • Docker CLI
      • docker create --name core-counter counter-image
      • docker ps -a
  5. Administrar contenedores
    • Docker CLI
      • docker start core-counter
      • docker attach --sig-proxy=false core-counter
      • docker stop core-counter
      • docker ps
      • docker ps -a
      • docker rm core-counter

Links:

  • Repositorio: https://github.com/javierguerrero/containerize-net-app
  • https://docs.microsoft.com/en-us/dotnet/core/docker/build-container



Friday, April 29, 2022

Aplicando TDD a la arquitectura

¿Qué es la arquitectura?

La arquitectura implica la toma de decisiones relevantes de diseño. 



Ahora la pregunta clave es ¿cómo nos ayuda TDD a tomar estas decisiones relevantes? Básicamente tenemos que plantear pruebas que nos ayuden en la definición de la arquitectura.

El proceso de construcción

Podemos plantear el proceso con un esquema de alto nivel:


Para cual consideramos algunas premisas y técnicas que nos ayudarán a definir nuestra arquitectura.
  • Premisas:
    • El resultado es consecuencia del proceso
    • El desarrollo es guiado por pruebas
    • El proceso es iterativo y los incrementos son pequeños
      • Al trabajar de forma iterativa hay desperdicios
    • Integración, verificación y entrega continua
    • Mantenerlo estúpidamente simple (KISS)
  • Técnicas:
    • BDD/TDD
    • Integración continua / Despliegue continuo
    • Walking Skeleton
    • Arquitectura Hexagonal
Arrancamos de forma temprana teniendo un pipeline de deployment y un ambiente en el cual desplegar. En la primera semana del proyecto se puede armar el esqueleto del proyecto, subirlo a un repositorio, que compile y despliegue.


Ciclo BDD/TDD


  • Arrancamos con una funcionalidad desde la perspectiva del usuario.
  • Para esta funcionalidad escribimos pruebas de aceptación (los tradicionales casos de prueba). Esto es una prueba a nivel de requerimiento.
  • Para satisfacer estas pruebas de aceptación voy a tener que crear un conjunto de objetos y es aquí donde entramos en el ciclo de TDD. Escribo pequeñas pruebas para cada uno de los objetos que van a intervenir en resolver esa transacción de negocio.
Si bien es cierto que escribimos una prueba de aceptación y de repente para que pase una sola prueba de aceptación voy a tener que dar varias vueltas al ciclo de TDD. Por ejemplo, puedo tener 1 prueba de aceptación y 10 pruebas unitarias.


---
Bibliografía

Friday, April 22, 2022

Crear sitio web multi-idioma con ASP.NET Core 6

Términos

Existen una serie de términos que vale la pena diferenciar:


  • Globalization (G11n): Es una convección creada por IBM y Sun Microsystem para cubrir tanto la Internationalization como la Localization.
  • Internationalization (I18n): Hacer que la aplicación soporte distintos idiomas y culturas/regiones.
  • Localization (L10n): Hacer que la aplicación soporte una cultura/región específica. Por ejemplo, no es lo mismo el español de Perú (es-PE) que de España (es-ES). 
  • Translation (T9n): Es el proceso de traducir texto de un lenguaje a otro.
Links interesantes:
  • https://www.linkedin.com/pulse/difference-between-g11n-i18n-t9n-l10n-satish-singh/

Implementar sitio web multi-idioma con ASP.NET 

Paso 1: Crear aplicación web
Paso 2: Crear modelos
Paso 3: Agregar archivos de recursos
Paso 4: Agrupar archivos de recursos 
Paso 5: Configurar Localization Service
Paso 6: Configurar Localization Middleware
Paso 7: Agregar CultureController
Paso 8: Agregar Partial View con lista de idiomas
Paso 9: Invocar Partial View desde Layout
Paso 10: Agregar CustomerController
Paso 11: Agregar Vista para Customer
Paso 12: Crear LocalizationService para acceder a los recursos desde la vista y Controlador
Paso 13: Uso de LocalizationService en el controlador
Paso 14: Uso de LocalizationService en la vista

Repositorio:
  • https://github.com/javierguerrero/globalization-and-localization-aspnetcore-6

Links:
  • https://tutexchange.com/how-to-implement-globalization-and-localization-in-asp-net-core/
  • https://mookiefumi.com/2017-01-04-internacionalizacion-net-core

Monday, March 28, 2022

Opinión: Por qué un desarrollador debe aprender DevOps

Es hora de aprender seriamente DevOps ¿Porqué? 

Así es. Es necesario empezar por el porqué. Descubrir el propósito, hallar la motivación que te mantenga firme en la meta por aprender los procesos, prácticas y herramientas que giran alrededor de DevOps. 



Básicamente es una cuestión de entrega rápida de valor. No olvides que los clientes pagan por el valor aportado a sus negocios y esto es prácticamente software funcionando en manos del usuario. Vale la pena revisar el manifiesto ágil para reforzar esta idea.

En este sentido, tu trabajo como desarrollador no termina cuando subes el código al repositorio, sino cuando lo despliegas a un ambiente productivo para que el usuario lo pueda usar. Con este criterio, como desarrolladores nos toca hacer tareas de desarrollo y tareas de operaciones (infraestructura) para lograr que el software esté disponible cuando el usuario lo necesite.

Por lo anterior, DevOps propone un conjunto de prácticas para reducir el tiempo entre un cambio que se realiza en el código y colocar dicho cambio en un ambiente productivo manteniendo altos estándares de calidad.

En el libro DevOps: A Software Architect’s Perspective (by Liming Zhu, Ingo Weber, Len Bass) se proponen 5 prácticas sobre los cuales se basa DevOps:

Práticas de procesos

  • Involucrar al área de operaciones desde el kickoff del proyecto
  • Hacer que el área de desarrollo asuma la responsabilidad por los incidentes de producción
  • Tener un proceso formal de despliegue utilizados por todos (desarrollo y operaciones)

Prácticas técnicas

  • Continuos Delivery para entregar el software cuando el negocio lo necesita.
  • Infrastructure as code para generar los ambientes de forma rápida y sencilla. Si podemos representar nuestra infraestructura como código, entonces tendremos todos los beneficios del código (versionar, ejecutar, probar, desplegar)

Requisitos para aplicar DevOps

Como desarrollador, es posible que estés tentado en aplicar inmediatamente las prácticas técnicas de DevOps para colocar software en producción de manera rápida. Pero cuidado, antes debemos estar cómodos con ciertas prácticas ágiles, porque sino corremos el riesgo de entregar rápidamente software de baja calidad. Entre las mencionadas prácticas ágiles tenemos:.

Prácticas técnicas
  • Versioning
  • Continuous Integration
  • Formal test cases
  • Automated unit tests
  • Automated acceptance tests
  • ...

Prácticas de gestión

  • Retrospectives
  • Backlog management
  • Time-boxing
  • On-site customer
  • ...

Para más información sobre las prácticas ágiles recomiendo el artículo Technical and Organizational Agile Practices: A Latin-American Survey.

¿Por dónde empiezo?

Vimos que las prácticas DevOps se pueden clasificar en dos grupos: prácticas de procesos y prácticas técnicas. Las prácticas de proceso dependen de la organización donde trabajes, pues implica un cambio en como opera esta. Por otro lado, las prácticas técnicas si están muy relacionados con tu trabajo como desarrollador. Mi sugerencia es que sigas el siguiente orden:
  • Infrastructure as code: aprender las herramientas (Docker, por ejemplo) para manejar nuestra infraestructura como código y poder levantar distintos ambientes.
  • Continuous Delivery: aprender las herramientas (Jenkins, por ejemplo) para hacer que nuestro código fluya los ambientes creados anteriormente. 


Links Interesantes

Cursos: