Entradas

Programa Líderes de LACNIC - 2025

En 2025 fui seleccionado en el Programa Líderes de LACNIC, con el proyecto "Tecnologías innovadoras para dar conectividad en lugares apartados con usuarios dispersos". Líderes es un programa que apoya investigaciones cortas sobre temas de Gobernanza de Internet en América Latina y el Caribe. Durante la investigación revisé alternativas existentes para llevar comunicaciones básicas a territorios apartados donde las soluciones tradicionales no siempre son viables, ni técnica ni económicamente. El trabajo explora el uso de la banda HF para comunicaciones digitales básicas, revisa aspectos tecnológicos y regulatorios, y pone especial atención en escenarios como comunidades aisladas y pescadores artesanales. La HF no aparece como reemplazo de la banda ancha, sino como una herramienta complementaria. Puede servir para mensajería, correo electrónico básico, procesos educativos y seguridad en contextos donde todavía no hay alternativas más robustas. Deja claro que siguen existiendo r...

Ampliar el sistema de archivos de una máquina virtual Ubuntu

Tomado de este blog post http://linguist.is/2020/08/12/expand-ubuntu-disk-after-hyper-v-quick-create/ Proceso para ampliar el sistema de archivos de un disco virtual cuando cambiamos su tamaño máximo. Es necesario cuando usamos la opción Quick Create de Hyper-V, porque el disco queda con 13 GB solamente. sudo apt install cloud-guest-utils sudo growpart /dev/sda 1 sudo resize2fs /dev/sda1

C#: Registrar las dependencias de un módulo usando extensiones

Imagen
ASP.NET permite configurar la inyección de dependencias en el Startup.cs . En UBIK , por ejemplo, registramos nuestras dependencias en el método Configure : Esta es la forma estándar y la que se aprende primero, pero tiene varias desventajas: Quien vaya a usar el módulo debe conocer todas sus dependencias y registrarlas en el Startup.cs . Todas las interfaces y las implementaciones deben ser públicas. Alguien podría solicitar una instancia de ICubeStore , cuando lo correcto es acceder a través de ICubeService . Crear nuevos servicios implica modificar el Startup.cs para registrar las dependencias. Por eso en AnniQ intentamos algo distinto y creamos una extensión para IServiceCollection dentro de cada módulo, que le permite "registrarse a sí mismo".   Esta estrategia cubre las desventajas de la implementación anterior: Quien vaya a usar el módulo sólo debe importar y utilizar la extensión IServiceCollection.RegisterUploadModule en Startup.cs . Sólo las interfaces de cierto...

Carga de muchos datos hacia SQL Server, desde C#

Este mes me enfrenté a la carga de grandes volúmenes de datos desde C# hacia SQL Server. Millones de registros de un solo envión y en una sola transacción. Primero intenté usar Bulk Insert , pero resultó muy lento para el requerimiento. Luego intenté con Data Tables y SQL Bulk Copy , pero se reventó por memoria. Encontré la solución en una herramienta que nunca había utilizado: yield . Esta es la versión simplificada de un método que lee archivos por bloques de 1000 registros y genera Data Tables "bajo demanda" usando yield : protected   IEnumerable < DataTable >  BuildDataTableByBatches ( StreamReader   reader ,  DataColumn []  columns ) {      var   dt  =  new   DataTable ();      foreach  ( var   col   in   columns )     {          dt . Columns . Add ( col . ColumnName ,  col . DataType );   ...

Adviento C# 2020: Diario de ASP.NET

Este año volví tiempo completo al desarrollo Web, primero con .NET Core y ahora con .NET 5. Quiero compartir 3 cosas que aprendí y me parecen relevantes. Si logro mostrarte al menos una que no conocías, habré cumplido con el propósito de este post. 1. Inyectar el usuario Seguramente tienes varios servicios que agregas a tus controladores usando inyección de dependencias y es probable que en ellos tengas métodos como: IEnumerable<Product> GetProducts(string userId); En donde userId lo pasas desde el controlador usando algo como: var userId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value; var products = _service.GetProducts(userId); Yo creé una extensión para usar: User.GetId(); Eso me funcionó en muchos proyectos, hasta que me topé con la implementación de un IEditableDashboardStorage para un control de DevExpress. En resumen, esa interfaz la implementas para almacenar la configuración de un dashboard que es editable por el usuario… Pero no tie...