10.15.2023

Ejecutando aplicaciones MAUI en MacOS con Visual Studio Code: “Bad CPU type in executable”

 Una vez solucionado el error mostrado en el post anterior, recibí el siguiente mensaje cuando intentaba ejecutar la aplicación generada:

“Bad CPU type in executable”

Para solucionar este problema busque cómo ejecutar una aplicación MAUI en una Mac que utiliza un procesador M2. 

Lo primero que busqué es que puede estar causando este error y me encontré que hay dos posibles causas:

  1. Mac M2 no soporta los programas de 32 bits a partir de Catalina OS, por lo tanto, tratar de instalar un programa que no es de 64 bits o que tiene algunas librerías de 32 bits va a provocar este error.

  2. Migración de procesador de Intel a procesadores Apple Silicon. Cuando se dio el reemplazo de los procesadores de Intel a los procesadores M1 provocó que las aplicaciones diseñadas para los procesadores Intel no funcionaran en las Macs basadas en ARM64 - esta es la causa más común. 

Para solucionar este problema cuando es causado por la razón 2 antes expuesta - mi caso - se debe instalar un traductor binario dinámico que se agregó por primera vez en el sistema operativo MacOS Big Sur. Este traductor lo que hace es traducir las aplicaciones basadas en los procesadores Intel para que puedan correr en los procesadores de Apple sin modificar el código, específicamente traduce instrucciones x86_64 por instrucciones ARM. 

Este traductor se llama Rosetta 2 y en mi caso lo instalé desde el terminal del sistema operativo. La instrucción a ejecutar es la siguiente:


/usr/sbin/softwareupdate -install-rosetta -agree-to-license


Una vez ejecutada la instrucción procedemos a ejecutar el programa que ha generado la instrucción dotnet new. Para llevar a cabo esta ejecución procedemos con el siguiente comando:

dotnet build -t:Run -f net8.0-ios

El resultado de la ejecución de dicho comando se puede ver en la siguiente figura.


10.14.2023

Ejecutando aplicaciones MAUI en MacOS con Visual Studio Code: “The launch profile "(Default)" could not be applied.”

Tratando de ejecutar ejecutar un proyecto generado automáticamente utilizando el cli de dotnet con el comando “dotnet new maui” me tope con una serie de errores que voy a ir describiendo en una serie de posts durante estas semanas. 

El primer error que me dio tratando de ejecutar la aplicación antes mencionada fue : “The launch profile "(Default)" could not be applied.” A continuación la pantalla con todo el detalle del error.



Como se puede apreciar en el mensaje de error hay uno en específico que indica que el proyecto apunta a varios frameworks. Lo primero que busqué es cómo saber cuáles frameworks tengo instalados? Para esto encontré el siguiente comando que me lista los frameworks que tengo instalados en la Mac.

dotnet --list-sdks

El resultado a la hora de ejecutar el comando anterior me dio la siguiente salida:

7.0.401 [/usr/local/share/dotnet/sdk]

8.0.100-rc.1.23463.5 [/usr/local/share/dotnet/sdk]

Como se ve en la salida, tengo dos versiones instaladas. Yo quería utilizar la versión 8 rc y por lo tanto para ese propósito tengo que ejecutar el comando run especificando la versión del framework que quiero utilizar:


dotnet build -t:Run -f net8.0-ios   


  • La descripción del comando anterior es la siguiente:

  • -t:Run: Especifica el target del buid como “Run”, lo que va a tratar de ejecutar la aplicación después de construirla

  • -f net8.0.100-ios: Especifica el “target framework” que se va a utilizar, en este caso, el 8.0.100 para ios

Una vez ejecutado el comando anterior, la compilación supera el error descrito en el título del post - al menos en mi caso.

En el próximo post vamos a mostrar el siguiente error que apareció después de la solución indicada anteriormente. 


4.24.2020

Principios SOLID en .NET Core - Parte 1

Los principios SOLID están conformados de 5 principios individuales para escribir "mejor" software en el mundo de la orientación a objetos principalmente. El objetivo de los mismos es proveer al desarrollador con una guía para crear software que pueda ser probado y mantenible con el paso del tiempo.  Pero, ¿Qué es SOLID?
SOLID es un acrónimo para recordar los cinco principios para el desarrollo de software en lenguajes orientados a objetos. Estos principios son los que se enumeran a continuación y estarán detallados cada uno en publicaciones posteriores. 
SRP --> Single Responsibility Principle (Principio de responsabilidad única)
OCP --> Open Close Principle ( Principio cerrado abierto)
LSP --> Liskov Substitution Principle (Principio de substitución de Liskov)
ISP --> Interface Segregation Principle (Principio de segregación de interfaces)
DIP --> Dependency Inversion Principle (Principio de inversión de dependencia)
Es común ver referencias a cada uno de estos principios por su acrónimo; es decir, SRP, OCP, LSP, etc.
Una pregunta común entre desarrolladores es ¿Cuándo aplicar estos principios? La respuesta no es sencilla; sin embargo, creo que primero se debe resolver el problema que estamos trabajando de la forma más sencilla posible, y luego optimizar el código conforme se van encontrando oportunidades al crecer la aplicación. Conforme avanza el tiempo y el desarrollador adquiere más experiencia en el uso de estos principios, usualmente estos emergen solos cuando estamos diseñando el aplicativo.
En el próximo post vamos a enfocarnos en SRP o el principio de la responsabilidad única.

12.11.2018

Guardar un ítem en un table storage usando function apps – parte 1

En este post vamos a mostrar como podemos guardar un ítem en un table storage utilizando un function app.

Creación de la cuenta de storage y de la tabla

El primer paso en el ejercicio es crear una cuenta de almacenamiento en Azure y agregar una tabla, lo que estaremos llevando a cabo en este post. Para esto nos vamos a la sección de cuentas de almacenamiento (storage accounts) y seleccionamos la opción agregar.

image

Seguidamente escogemos las opciones de la creación de la cuenta que se presentan en la siguiente imagen (en post posterior vamos a tratar mas a profundidad el tema del storage).

image

Procedemos a revisar le seleccionado para la creación de la cuenta y le damos crear. Una vez creada la cuenta procedemos a crear la tabla que vamos a utilizar en este ejemplo, para esto seleccionamos el botón de ir al recurso y ya nos ubicamos la pantalla de “overview” del recurso recién creado. Ya ubicados en esta pantalla seleccionamos la opción de tablas.

image

Ya en la vista de las tablas seleccionamos agregar tabla.

image

Procedemos a seleccionar un nombre para la tabla y le damos click al botón de ok.

image

La tabla se crea de forma inmediata y nos aparece lista para accederse  como se ve en la siguiente imagen.

image

6.16.2017

Expresiones Lambda

En este post vamos a analizar que es una expresión Lambda, como se forma, en que escenarios debería considerar su uso y por supuesto como programarlas.

Definición

De acuerdo al sitio documentación de Microsoft una expresión lambda es una función anónima utilizada para crear delegados o tipos de árboles de expresión. Poniéndolo de forma básica, podríamos decir que una expresión lambda es una función no declarada; de decir, sin modificador de acceso, valor de retorno y nombre.

Las expresiones lambdas se definen de la siguiente forma: Parámetros => código a ejecutar.

Por ejemplo, supongamos que tenemos una lista de enteros y queremos sacar de esa lista, todos los números pares. La definición de la lista se presenta a continuación.

image

Ahora podríamos obtener todos los números pares de la lista e imprimirlos usando en ambos casos expresiones lambda como se muestra a continuación.

image

En la primera instrucción utilizamos una expresión lambda para obtener los números pares, donde p representa a cada uno de los números de la lista. En la siguiente instrucción procedemos a imprimir cada uno de los elementos con la instrucción ForEach, la cual aplica la expresión lambda a cada uno de los elementos de la lista _numerosPares.

5.01.2017

Integrando Azure Service Bus con DocumentDB utilizando LogicApps

El “Stack” de integración de Azure crece continuamente con nuevas características dentro de los productos ya desarrollados o con nuevos productos para escenarios específicos. Una herramienta que facilita las tareas de integración en la nube es Logic Apps; la cual nos permite conectarnos con diversos endpoints tales como Dynamics, OneDrive, Azure Service Bus, y muchas otras más.

En este post vamos a desarrollar un flujo de integración para escenarios asincrónicos utilizando los siguientes componentes:

  • Cliente .NET
  • Azure Service Bus Queues
  • Logic Apps
  • DocumentDB

El siguiente diagrama nos muestra el escenario a implementar.

image

Como se puede ver en la figura anterior una aplicación de consola desarrollada en C# va a enviar un mensaje a una cola en el Azure Service Bus; seguidamente un flujo en Logic App va a estar escuchando la cola del Service Bus para guardar el contenido del mensaje en una colección en la base de datos DocumentDB.

El cliente C#

El primer paso es crear un cliente en .NET que envíe los mensajes al bus. Este cliente incorpora los valores de un pago ficticio dentro de las propiedades del mensaje. El código del cliente se ve a continuación.

image

El flujo en Logic App

El flujo de Logic App tiene un disparador que es un componente que se dispara cada vez que llega un mensaje a la cola del bus de servicios. La configuración del mismo se puede apreciar en la siguiente imagen.

image

Seguidamente procedemos a configurar el componente que guarda el registro del pago en la colección del DocumentDB. En este componente no solo especificamos la configuración de conexión sino que también creamos la estructura del documento que vamos a enviar a guardar, en este caso, un documento de pago. Tal y como se ve en la siguiente figura el mensaje se construye con las propiedades del mensaje obtenido de la cola del Azure Service Bus.

image

Cuando se intenta crear el documento desde las propiedades de mensaje que vienen del bus de servicios no tenemos acceso a las propiedades del mismo porque estas no son tipificadas y no se pueden determinar en tiempo de diseño. Para lograr acceso a las mismas tenemos que cambiar a la vista de código tal y como se muestra en al siguiente figura.

image

En este caso se accede la colección de propiedades y se especifica cual es el campo que se desea acceder. Después de esto, ejecutamos el flujo y el registro se inserta en a partir del mensaje que se envía a la cola de Windows Azure.

4.28.2017

Configurando Visual Studio para trabajar con Logic Apps

Para trabajar el diseño de flujos de Logic Apps hay que configurar el ambiente de desarrollo instalando un par de componentes. En este post vamos a ver rápidamente como llevar a cabo esta configuración

Azure SDK

El primer componente a utilizar es el SDK de Azure. Este se puede obtener utilizando el Web Platform Installer. Este SDK tiene todos los componentes para programar diferentes funcionalidades de Azure, incluyendo Logic Apps.

image

Azure Logic Apps Tools for VS 2015

Seguidamente procedemos a instalar la extensión para desarrollar Logic Apps en Visual Studio. Para esto vamos al menú de herramientas y seleccionamos la opción extensiones y actualizaciones.

image

En esta ventana seleccionamos la ubicación de la extensión (1 – en línea), seguidamente digitamos logic apps en la caja de búsqueda (2), y por último instalamos la extensión que nos aparece en el cuadro principal como se ve en la siguiente figura.

image

Crear un proyecto para Logic Apps

Ahora procedemos a crear un proyecto de prueba para verificar que todo esté instalado correctamente, primero creamos un nuevo proyecto y seleccionamos la opción Cloud (1), seguidamente procedemos a seleccionar la plantilla Grupo de recursos de Azure (2) – habrá un post posterior detallando el tema de grupos de recurso de Azure o ARM.

image

En la siguiente ventana seleccionamos la plantilla de Logic Apps.

image

Una vez creado el proyecto en el vamos al explorador de soluciones y vemos los archivos json generados(1), los cuales son las plantillas de los flujos de logic apps.

image

Para poder ver el lienzo de diseño de Logic Apps, procedemos a abrir el archivo LogicApp.json con el diseñador tal y como se muestra en la siguiente figura.

image

Seguidamente el VS nos va  a pedir las credenciales de nuestra cuenta de Azure y la cuenta de recursos donde queremos ubicar

image

Luego se nos presenta la pantalla principal para escoger una plantilla a partir de la cual queremos crear nuestro flujo (esta pantalla es la página web del desarrollo en logic Apps)Nosotros escogemos la plantilla vacía(1).

image

Por último, nos aparece el lienzo de diseño con las opciones correspondientes y estamos listos para desarrollar.

image

4.11.2017

Creando un app con Ionic y VS Code–configurando el ambiente

Visual Studio Code es un IDE muy versátil que nos permite desarrollar utilizando muchas tecnologías, y en este caso lo vamos a utilizar para desarrollar un app móvil utilizando Ionic Framework. Ionic es un Framework que permite utilizar los conceptos del desarrollo web para crear aplicaciones para iOS, Android, Windows, etc.  En esta serie de post vamos a aprender como desarrollar estas aplicaciones usando Ionic + VS Code.

Instalando el ambiente

Para iniciar tenemos que instalar node.js en nuestra máquina ya que Ionic necesita de esta librería para poder funcionar. Para llevarlo vamos a la pagina de node.js y descargamos e instalamos la versión de node.js para nuestro sistema operativo, en mi caso, Windows de 64 bits.

image

Utilizamos LTS porque es la versión que es normalmente soportada por Ionic.

Ahora ya podemos utilizar el IDE VS Code para continuar con los siguientes pasos. Primeramente abrimos el terminal integrado de VS Code y procedemos a instalar Ionic utilizando el siguiente comando – utilizando npm de node.js

image

Ahora desde el mismo terminal procedemos a crear una aplicación utilizando el comando ionic start nombredelapp –-version de ionic.

image

Este comando nos crea un aplicativo llamado AccountMe en el folder donde estamos posicionados con una plantilla de “tabs” pre diseñada y lista para funcionar. Si abrimos este folder en VS Code podemos ver a estructura del proyecto generada.

image

El siguiente paso es probar nuestro aplicativo recién generado para comprobar que todo esta listo para iniciar el desarrollo utilizando el Ionic Serve Lab desde donde podemos ver nuestro aplicativo en una página Web y probarlo. El comando para lanzar el app es el siguiente:

image

Si todo salió correctamente veremos el aplicativo web funcionando con las plataformas seleccionadas en el combo de plataformas tal y como se ve en la siguiente figura.

image

3.29.2017

Trabajando JSON en BizTalk Server 2016 – Parte 2

Continuando con los post acerca de trabajar documentos JSON en BizTalk Server 2016, vamos a proceder a crear un ejemplo donde se recibe un documento XML y se rutea a un folder donde lo vamos a dejar convertido a un documento JSON.

Ejemplo

En este ejemplo, vamos a crear un puerto de ingreso donde se recibe un documento XML (el mismo que convertimos en el ejemplo del post anterior) tal y como lo muestra la siguiente figura.

image

Iniciamos creando un puerto de una vía por donde ingresará este documento XML utilizando el pipelines estándar de PassThru.

image

Ahora procedemos a crear el puerto de salida de una vía con dos condiciones importantes. La primera de esas condiciones es utilizar el pipeline de envío JSON que creamos en el proyecto JSONPipelines del post anterior tal y como se muestra en la siguiente figura.

image

La segunda condición es agregar un filtro para rutear el mensaje XML desde el puerto de recibo al puerto de envío utilizando la propiedad ReceivePortName tal y como se ve en la siguiente figura.

image

Seguidamente procedemos a activar los puertos de envío y recibo y enviamos el mensaje XML de prueba mostrado al inicio de este post. Como vemos en la siguiente figura, el documento fue enviado al puerto especificado en formato JSON.

image

3.28.2017

Trabajando JSON en BizTalk Server 2016 – Parte 1

Uno de las nuevas características en BizTalk 2016 es la adición de componentes para pipeline para manejar el formato JSON(codificar/decodificar) tanto para consumir como para enviar mensajes JSON. En este post vamos a ver como trabajar el formato JSON en BizTalk Server 2016 a nivel de pipelines.

Ejemplo

Inicialmente, vamos a crear una pequeña orquestación que recibe un documento JSON y lo decodifica a un documento XML para direccionarlo a otro puerto en formato XML. Por facilidad del ejemplo, la orquestación funcionara con adaptadores FILE tanto para iniciar la orquestación como para enviar la respuesta.

Primero vamos a crear un proyecto que solo va a contener todos los pipelines (los que vamos a ir usando en esta serie de posts) y creamos un pipeline para decodificar un mensaje JSON a XML y otro para codificar un mensaje XML en un mensaje JSON. El primer pipeline se puede ver en la siguiente figura.

image

En el siguiente paso procedemos a publicar el aplicativo BizTalk para que estos pipelines queden disponibles para otras aplicaciones. Seguidamente procedemos a crear una aplicación BizTalk y agregamos como referencia el aplicativo recientemente publicado.

Ahora procedemos a crear un puerto de recibo donde vamos a configurar el pipeline para recibir el documento JSON tal y como se ve en la siguiente figura.

image

El primer paso es configurar el adaptador FILE(1), seguidamente seleccionamos el pipeline que creamos en el proyecto común y agregamos como referencia(2),  luego vía el botón elipse procedemos a configurar el pipeline(3). En este caso debemos definir el nodo raíz y seguidamente proceder a crear un namespace ya que el documento XML así lo va a requerir(4).

Ahora procedemos a crear un puerto de envío que tiene la particularidad de que utiliza un filtro para rutear el mensaje recibido JSON, solo que vamos a usar el pipeline passthru para grabarlo en el directorio tal y como viene decodificado.

image

Luego de este paso ya estamos listos, arrancamos el aplicativo y procedemos a realizar la prueba con el siguiente archivo.

image

La salida resultante será en formato XML tal y como se ve en la siguiente figura.

image