Entradas

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 );     }      int   n  =  0 ;      string   line ;      while  (( line  =  reader . ReadLine ()) !=  null )     {          n ++;          var   values  =  line . Split ( "|&q

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