Aqui estamos tratando de organizar una nueva comunidad de usuarios de .Net en Argentina, recien se esta formando y la idea es sumar gente interesada e ir dandole forma entre todos.
Arme una pagina de github para ir compartiendo informacion aqui y ademas tenemos discord para quien quiera sumarse.
Una API, o “Application Programming Interface”, es una forma en que diferentes sistemas pueden comunicarse y compartir información.
Las APIs están diseñadas para proporcionar una interfaz clara y bien definida para que los desarrolladores de software puedan interactuar con un servicio o plataforma en particular. Por lo tanto, cuando un desarrollador crea una aplicación o un sitio web, puede usar una API existente para acceder a datos o funcionalidades específicas en otro sistema sin tener que crear todo desde cero.
Que significa esto en la practica? A continuacion les voy a mostrar un ejemplo de una API que esta disponibles publicamente para que cualquier desarrollador la pueda utilizar y que devuelve informacion de uno de los temas que son la razon de existir de internet, si, acertaron, una api de gatos!
Y como funciona esta API? Como otras APIs REST, recibe solicitudes por medio de parametros o en formato JSON y responde de acuerdo a nuestra consulta con una respuesta tambien en formato JSON.
Para enviar nuestra solicitud, podemos utilizar cualquier cliente HTTP, como Postman (necesita instalacion en tu computadora) o disponible en linea reqbin.com
Se puede ver en la siguiente imagen que luego de colocar la direccion https://api.thecatapi.com/v1/images/search?limit=10 (1) y presionar el boton Send o Enviar (2) obtenemos la respuesta en formato JSON (3)
La respuesta es un conjunto de imagenes, en las que cada elemento tiene un identificador unico (id) la ubicacion de la imagen en internet (url), y el ancho (width) y alto (height) de la misma.
Notese que podemos utilizar cualquiera de los valores devueltos como “url” y colocandolo en nuestro navegador de internet, podremos ver la imagen.
Tengamos en cuenta que este es un post introductorio y que el verdadero poder de las APIs sera aprovechado cuando podamos procesar y utilizar la respuesta en nuestros propios programas con nuestro lenguaje preferido.
Intencionalmente he dejado de lado muchos temas que seran explicados luego, como REST, verbos, etc.
JSON significa “JavaScript Object Notation”, es un formato de datos ligero y fácil de leer y escribir para intercambiar información entre diferentes plataformas de software.
En términos simples, JSON es un formato de texto que se utiliza para representar estructuras de datos en forma de pares de clave-valor.
Podemos ver que tiene cuatro pares clave-valor. La clave es el nombre de la propiedad y el valor puede ser de cualquier tipo de datos, incluyendo otro objeto JSON, una lista o un valor primitivo como un número o una cadena de texto.
En varias oportunidades he tenido que crear aplicaciones de consola que van actualizando la pantalla a medida que va pasando el tiempo o sucede algo, termino teniendo cosas como en la siguiente captura de pantalla
Tratando de mejorar esto, podemos reformatear la informacion y utilizar un Console.Clear(); para repintar la pantalla, lo cual nos da una salida como la siguiente
El problema surge cuando es mucha la informacion que queremos presentar y el armado de la pantalla se vuelve rapidamente muy complicado
Para facilitar este proceso, podemos recurrir a Spectre.Console, que nos permitira crear aplicaciones de consola mucho mas bonitas
Instalacion
Solo es necesario agregar una referencia al paquete NuGet de Spectre.Console.
Uso
Una de las funcionalidades disponibles es el uso de Markup, el cual permite enviar texto enriquecido a la consola, como puede verse en el siguiente ejemplo
string color;
switch (loadPercentage)
{
case > 80:
color = "red";
break;
case > 30:
color = "yellow";
break;
default:
color = "green";
break;
}
AnsiConsole.Markup($"CPU usage [{color}]{loadPercentage}[/]%");
Tambien podemos crear widgets como una Table con el siguiente codigo
// Create a table
var table = new Table();
// Add some columns
table.AddColumn("Sensor");
table.AddColumn("Value");
// Add some rows
table.AddRow("CPU usage", $"[{color}]{loadPercentage}[/]%");
// Render the table to the console
AnsiConsole.Render(table);
Otra funcionalidad muy interesante, son los componentes Live que nos permiten modificar solo una parte de la informacion mostrada, sin necesidad de reescribir toda la pantalla.
Vemos en el siguiente codigo como usar un Live-Display con una tabla, y luego usamos el contexto para refrescar la pantalla
AnsiConsole.Live(computerInfo.Table).Start(ctx =>
{
do
{
while (!Console.KeyAvailable)
{
computerInfo.GenerateFormattedOutput();
ctx?.Refresh();
Thread.Sleep(1000);
}
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
});
Dentro de nuestro metodo GenerateFormattedOutput actualizaremos la tabla de la siguiente manera
Pueden acceder a un proyecto en el siguiente repositorio de github, en el cual se encuentra un ejemplo completo de la funcionalidad mostrada en este post
Conclusion
Como pueden ver, es muy sencillo de utilizar, yo aqui solo he mencionado funcionalidad basica, pero en el sitio del proyecto pueden ver todos los casos de uso, y pantallas mostrando gran cantidad de informacion y otros controles
Estuve recientemente actualizando las librerias de una aplicacion desarrollada en Xamarin.Forms que hace bastante tiempo se encuentra finalizada y que accede a datos de salud y actividad fisica en iOS.
Una de las librerias a actualizar fue la libreria de terceros que es la encargada de tomar los datos de HealthKit y prepararlos para ser enviados al servidor.
Luego de la actualizacion, comprobe que la sincronizacion seguia funcionando y enviamos la aplicacion a los usuarios.
La aplicacion en principio parecia funcionar correctamente, pero cuando pasaba a segundo plano, dejaba de funcionar la sincronizacion. Este comportamiento era raro, ya que la actualizacion y documentacion de la libreria no indicaba la necesidad de ningun cambio para la nueva version.
Al volver a realizar las pruebas con la aplicacion en segundo plano, encontramos que estaba fallando con un mensaje de permisos insuficientes.
Esto sucedia debido a que iOS a partir de su version 15, necesita de un nuevo entitlement para acceder a la informacion de salud en segundo plano.
Luego de agregar com.apple.developer.healthkit.background-delivery a la lista de entitlements, todo comenzo a funcionar correctamente.
Habitualmente trabajo con mas de una computadora para desarrollo y ademas hago reinstalaciones periodicas del sistema operativo, por lo que termino ocupando bastante tiempo descargando e instalando Visual Studio. Para facilitar esto, tenemos la posibilidad de utilizar el mismo archivo instalador que inicia el proceso interactivo de instalacion y agregando parametros podemos obtener una copia local de todos los archivos necesarios asi como automatizar los flujos o paquetes que deseamos instalar. Tambien podemos actualizar nuestro instalador offline para siempre tener la ultima version disponible y no tener que realizar todo el proceso cuando se publican nuevas versiones.
Creando nuestro instalador offline
En este post voy a detallar paso a paso como realizar todas estas operaciones y voy a utilizar la version 2022 Community preview al momento de escribir esto. Otras versiones funcionan en forma similar, descargando el archivo instalador de dicha version. Siempre se pueden consultar los parametros ejecutando en la linea de comandos el archivo instalador con el parametro -? lo cual nos abrira una pagina web local temporal con toda la informacion
Primero necesitamos obtener el archivo de instalacion desde la pagina de descarga de Visual Studio y guardarlo en un directorio local, en mi caso utilizare c:\VSOffline
Luego debemos abrir una ventana de comandos en la carpeta en donde descargamos el instalador y ejecutar la siguiente instruccion que iniciara el (largo) proceso de descarga
–lang el lenguage a descargar, los posibles valores son los de la columna BCP 47 en el siguiente enlace
–includeRecommended & –includeOptional asegura que se descargan todos los archivos que necesitaremos al realizar la instalacion
-add los flujos que queremos esten incluidos en nuestro instalador. En mi caso estoy interesado solo en los flujos relacionados a desarrollo cross platform. Se puede seleccionar cualquiera de los disponibles, utilizando la lista de posibles valores que se encuentra aqui.
Actualizar nuestro instalador offline
Si ya tenemos nuestra carpeta con los archivos de instalacion y deseamos actualizar a la ultima version cuando existen cambios, solo debemos volver a ejecutar la misma instruccion que usamos originalmente.
Instalar visual studio
En la misma ventana de comandos en la que ejecutamos el comando para descarga, corremos la siguiente instruccion
Esto iniciara el proceso de instalacion, como se puede ver en la siguiente captura de pantalla. Los archivos no son descargados nuevamente, solo se verifica que esten disponibles.
Si abrimos el instalador, podemos ver que se instalaron correctamente los flujos deseados
En un proximo post, voy a agregar informacion sobre como se puede automatizar aun mas el proceso y ademas como podemos utilizarlo junto a Windows Sandbox para crear rapidamente entornos de desarrollo repetibles y que se encuentran siempre en el mismo estado incial.
Espero les haya sido de utilidad y les permita configurar sus equipos de desarrollo rapidamente!
En un post anterior comento como instalar y la utilizacion basica de Windows Sandbox.
Si comenzamos a utilizarlo habitualmente, veremos que debido a la reinicializacion total, estaremos repitiendo ciertos pasos cada vez que iniciamos la aplicacion.
Para evitar algunos de estos pasos repetitivos, podemos utilizar un archivo de configuracion. Windows Sandbox nos permite escribir archivos de configuracion, formateados como XML, los mismos utilizan la extension .wsb.
Utilizando cualquier editor de texto que nos permita trabajar con texto plano, podemos crear nuestro archivo de configuracion.
En el siguiente archivo de configuracion de ejemplo, vemos las opciones que tenemos disponibles, como la posibilidad de mapear una carpeta de la maquina host en una carpeta del Sandbox, o ejecutar un comando en el sandbox luego de que inicia. En el ejemplo, estamos ademas iniciando la instalacion de Visual Studio Community 2022 que ya tenemos previamente descargado en la computadora host.
<Configuration>
<vGPU>Default</vGPU><!--Enable|Disable|Default-->
<Networking>Default</Networking><!--Disable|Default-->
<MappedFolders>
<MappedFolder>
<HostFolder>D:\VS\Preview\Community2022</HostFolder><!--absolute path to the host folder-->
<SandboxFolder>C:\VS</SandboxFolder><!--absolute path to the sandbox folder-->
<ReadOnly>false</ReadOnly> <!--true|false-->
</MappedFolder>
</MappedFolders>
<LogonCommand>
<Command>C:\VS\vs_community.exe --passive --norestart --includeOptional</Command> <!--command to be invoked-->
</LogonCommand>
<AudioInput>Default</AudioInput><!--Enable|Disable|Default-->
<VideoInput>Default</VideoInput><!--Enable|Disable|Default-->
<ProtectedClient>Default</ProtectedClient><!--Enable|Disable|Default-->
<PrinterRedirection>Default</PrinterRedirection><!--Enable|Disable|Default-->
<ClipboardRedirection>Default</ClipboardRedirection><!--Disable|Default-->
<MemoryInMB>4096</MemoryInMB>
</Configuration>
Luego de guardar el archivo en nuestro disco local con la extension .wsb podemos hacer doble click sobre el mismo, lo que iniciara Windows Sandbox y cargara las opciones establecidas.
Podemos de esta manera tener distintos archivos de configuracion que nos daran acceso a diferentes configuraciones de prueba en forma muy rapida y sencilla.
Aqui les dejo el enlace a la documentacion oficial para que puedan ver los detalles de los distintos parametros.
En ocasiones, podemos necesitar enlazar a un origen de datos, pero el origen puede no estar en el formato correcto, en esos casos necesitamos manipularlo.
Por ejemplo, supongamos, como veremos a continuacion, que tenemos una caja de texto y un boton, y queremos que el boton se encuentra habilitado solamente cuando la caja de texto tenga uno o mas caracteres.
Podriamos enlazar el boton a una propiedad booleana en el view model y el texto a otra propiedad string, entonces cuando el texto cambia, podemos actualizar la propiedad booleana. Utilizar esta tecnica funciona, pero agrega complejidad innecesaria. Veremos a continuacion una mejor solucion utilizando value converters.
Este es el primer post de una serie sobre data binding avanzado. Veremos value converters, relative binding, {Binding .} y {Binding self}, constructores y mas.
Esperamos publicar un nuevo post semanal o quincenal.
Empezando
En breve publicaremos un post introductorio a data binding.
Ejemplos
Por cada tema a cubrir, proveeremos un ejemplo simple (tan simple como sea posible), el cual estara disponible en GitHub y enlazado en el post. Usaremos estos ejemplos para eliminar cualquier confusion y ayudar a comprender mejor los temas.
Algunos de los ejemplos de esta serie seran creados por nosotros y otros tomados de la documentacion oficial de Microsoft. Lo cual nos hace preguntarnos, porque utilizar estos posts en lugar de la documentacion oficial? Desde nuestro punto de vista, la documentacion de Microsoft es exhaustiva, pero a veces puede ser abrumadora. Ademas la utilizacion de multiples origenes, pueden ayudar a obtener un mejor entendimiento del tema.
Topico #1: Paths
El uso de la palabra clave path es un buen punto intermedio para comenzar. Puede ser usada de diferentes maneras. El uso mas frecuente es para apuntar a la propiedad de un objeto almacenado en un recurso, o para apuntar a la propiedad de un objeto miembro.