Entradas

Cargar archivos locales desde Azure Functions

Lo primero: la forma ideal de trabajar con archivos en un entorno de nube es usando servicios de almacenamiento administrados, por ejemplo, Blob Storage.
Ahora si, vamos con el artículo.

Algunas veces debemos acceder a archivos que hacen parte del proyecto: un .json con valores estáticos, un formato de correo electrónico en .html, una plantilla de hoja de cálculo en .ods, una extensión, etc.
Eso es relativamente sencillo porque C# ofrece la propiedad Environment.CurrentDirectory:
public async Task<string> GetFileContent(string name) { string filePath = Path.Combine(Environment.CurrentDirectory, "Files", name); string content = await File.ReadAllTextAsync(filePath); return content; }
Pero este código no funciona en una Azure Function. Para las funciones debemos inyectar el ExecutionContext y después obtener el directorio base con la propiedad FunctionAppDirectory.

[FunctionName("QueueFunction")] public async Task Run( [QueueTrigger("myqueue&quo…

2 años de CaliSharp

¡El tiempo pasa muy rápido! CaliSharp cumple 2 años 🎉

Somos afortunados por encontrar personas interesadas en compartir su conocimiento. Son ellos, y los asistentes, quienes consolidan la comunidad a través de las charlas y discusiones que tienen lugar el penúltimo martes de cada mes.

Quiero invitarlos al evento de aniversario, el sábado 25 de julio a las 9:30am COT. Pueden separar un espacio aquí. Tendremos charlas sobre Neo4j, Git, LightGBM y Computer Vision.
Si están interesados en dar una charla, pueden inscribirla en este formulario. En CaliSharp hay espacio para diversos temas; aquí encuentran el listado completo de estos 2 años.

La extensión de Azure no mantiene la sesión iniciada

Si usas Visual Studio Code para programar Azure Functions, seguramente conoces la extensión Azure Account. Esa extensión tiene varios problemas en Linux.

Uno es que el inicio de sesión "normal" no funciona, entonces debes usar el comando:

Ctrl+Shift+P
> Azure: Sign In with Device Code


Otro es que la sesión dura mientras mantengas abierto el programa. Se vuelve frustrante tener que ir al explorador e introducir el código de inicio todos los días.

Para resolverlo, instala esta "dependencia oculta":

sudo apt-get install gnome-keyring

Cuando vuelvas a iniciar sesión, basta con establecer la contraseña del llavero y la extensión seguirá funcionando sin problema. Puedes ver este enlace para más información.

--

Quizá no necesites esto si usas GNOME. Yo uso KDE.

Instalé Teams en Linux. ¡El audio se escucha mal!

Lamentablemente esto es algo normal en Ubuntu. El audio no viene configurado por defecto y la cancelación de ruido, común en Windows y en Mac, no está.
Basta con editar el archivo

/etc/pulse/default.pa
agregar la línea
load-module module-echo-cancel

y reiniciar el equipo.

En las opciones de Teams (y de otras aplicaciones) vas a ver que aparecen 2 micrófonos. Selecciona el que tiene cancelación de ruido.
Este es un problema conocido y bien documentado. Guarda este enlace para aprender más de la configuración.

--
Esta es una pequeña serie sobre configuraciones del entorno .NET en Ubuntu. Recientemente cambié mi sistema operativo principal de MacOS a Kubuntu porque la nueva versión no será soportada en mi equipo y gran parte de mi trabajo requiere un terminal. Windows+WSL no son una opción porque el soporte de hardware y el sistema de archivos molestan bastante en lo que uso.

Actualiza Azure Data Studio en Linux

Azure Data Studio (ADS) es una aplicación que me gusta usar para administrar mis bases de datos en ambientes de prueba o para hacer consultas sencillas en producción. Se puede descargar desde este enlace.
Cuando lo instalas con un .deb en Ubuntu, lo más fácil es usar la interfaz gráfica del administrador de paquetes (doble click o click derecho-instalar y listo), sin embargo, ADS no siempre se actualiza automáticamente como lo hace Visual Studio Code; debes descargar el nuevo .deb y reinstalarlo.

En la mayoría de los casos basta con instalar la nueva versión "encima" de la existente, pero cuando el cambio es grande (ej. 1.18.x a 1.19.x), el administrador de paquetes no te va a dejar hacerlo.
Entonces debes ejecutar.

sudo apt-get purge azuredatastudio
Reinstalas y listo. Eso es todo... se acabó el post... un solo comando. Ojalá te sirva.

--

¿Por qué todo un post para un comando?
1. Hay muchas formas de desinstalar programas en Linux. El comando purge es muy útil para instalar desde c…

Este no es un artículo sobre DDD

Hace poco publiqué en twitter dos mensajes sobre la relación entre Domain Driven Design y la fase de análisis o diseño que siempre nos recalcaron en la universidad:

DDD es la parte de la programación orientada a objetos en la que más énfasis nos hicieron durante la Universidad, pero que olvidamos por andar pensando en entregar rápido. Ahora toca estudiarla otra vez, para arreglar el despelote que también nos advirtieron que íbamos a armar. En esa época tenía un nombre menos fancy: le llamaban análisis. Con variantes como “divide y vencerás”, “primero resuelve el problema y luego escribe el código”, “identifica el contexto”, etc.Yo no soy experto en DDD -lo escuché por primera vez en septiembre de 2019-, pero después de estudiarlo un poco vi que muchos de los conceptos ya los conocía. Empezaron a encajar en vacíos que tenía en mi código y caí en cuenta que había cometido muchos errores en la fase de diseño. El principal de ellos: no dedicar suficiente tiempo a identificar todos context…

Mis indispensables de C#. Parte 3: Configuraciones

Esta es una serie de 3 artículos cortos sobre características de C# que uso en todas mis aplicaciones.

Configurar el serializador de JSON
Cuando quiero usar la misma configuración en toda la aplicación, creo mi propio serializador. Este esquema me permitió migrar fácilmente desde Newtonsoft.Json a System.Text.Json. Reconocimiento especial al método ToHttpJsonContent()... parece que .NET 5 va a incluir extensiones al HttpClient que ayudan a eso.

usingSystem.Net.Http;usingSystem.Text;usingSystem.Text.Json;namespaceMyApplication.Helpers{publicstaticclassJsonGenerator{publicstaticreadonlyJsonSerializerOptionsserializerOptions=newJsonSerializerOptions{PropertyNamingPolicy=JsonNamingPolicy.CamelCase};publicstaticreadonlyJsonSerializerOptionsdeserializerOptions=newJsonSerializerOptions{PropertyNameCaseInsensitive=true};publicstaticstringSerialize(objectobj){returnJsonSerializer.Serialize(obj,serializerOptions);}publicstaticStringContentToHttpJsonContent(objectobj){returnnewStringContent(Seria…