<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Alex</title>
    <description>The latest articles on Forem by Alex (@mercadoalex).</description>
    <link>https://forem.com/mercadoalex</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F102724%2Fd3f956cc-7986-4e6d-be92-64c752eb6a71.jpeg</url>
      <title>Forem: Alex</title>
      <link>https://forem.com/mercadoalex</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mercadoalex"/>
    <language>en</language>
    <item>
      <title>Uno Platform</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Thu, 05 Dec 2019 22:52:14 +0000</pubDate>
      <link>https://forem.com/mercadoalex/uno-platform-15a4</link>
      <guid>https://forem.com/mercadoalex/uno-platform-15a4</guid>
      <description>&lt;p&gt;El mundo de del desarrollo de software, web y de aplicaciones móviles, estamos saturados de herramientas, plataformas y frameworks.&lt;/p&gt;

&lt;p&gt;El que ser emprendedor valiente o un experimentado developer no significa que nunca vayas a tener o experimentar miedo y/o preocupaciones sobre lo que viene o te piden implementar; simplemente quiere decir que reconoces esas emociones y que tienes la &lt;strong&gt;confianza&lt;/strong&gt; que serás capaz de superar los obstáculo y alcanzar las y metas y/o tu visión. Con esto dicho vamos a platicar un poco de la Plataforma Uno ¿que ofrece? ¿ ventajas? ¿desventajas? etc, etc..&lt;/p&gt;

&lt;p&gt;Echemos un vistazo ahora a la plataforma Uno.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8LjFvCgN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AtycunI8mEytBTy3UzPxc5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8LjFvCgN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AtycunI8mEytBTy3UzPxc5g.png" alt=""&gt;&lt;/a&gt;Build Mobile, Desktop and WebAssembly apps with C# and XAML.&lt;/p&gt;

&lt;h4&gt;
  
  
  Breve historia
&lt;/h4&gt;

&lt;p&gt;La version inicial fue lanzada en mayo 7 del 2018, liberada bajo la licencia &lt;a href="https://en.wikipedia.org/wiki/Apache_2.0"&gt;Apache 2.0&lt;/a&gt; , creada por Richard Campbell and Carl Franklin, pueden ver lo joven que es el proyecto. Originalmente solo se centraba en la creación de aplicaciones móviles Universal Windows Platform (UWP), la plataforma &lt;a href="https://platform.uno/"&gt;&lt;strong&gt;Uno Platform&lt;/strong&gt;&lt;/a&gt; fue descrita como un puente UWP que permite UWP-Code correr en iOS, Android y WebAssembly.&lt;/p&gt;

&lt;p&gt;Con &lt;em&gt;Uno Platform&lt;/em&gt;, podemos darle el poder a los equipos .NET para crear aplicaciones no solo agradables, sino con buen performance y con un solo código base, multi plataforma, para dispositivos móviles, web y escritorio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3g3lrueX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ACmePzu_H04VZHNGa65cTLQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3g3lrueX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ACmePzu_H04VZHNGa65cTLQ.png" alt=""&gt;&lt;/a&gt;Diagrama&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Uno is a UWP bridge for iOS, Android and WebAssembly&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Algo que ya hemos escuchado eso muchas veces ¿correcto? Peroooo, esta dice que es la única plataforma que puede ser usada para construir aplicaciones móviles, de escritorio y aplicaciones &lt;strong&gt;WebAssembly&lt;/strong&gt; con C# y XAML desde un solo código base.&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Que es WebAssembly?
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lSMtO76s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/880/1%2AUTRRw50iQFe6Se0LYs0kCA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lSMtO76s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/880/1%2AUTRRw50iQFe6Se0LYs0kCA.png" alt=""&gt;&lt;/a&gt;&lt;em&gt;Image de : &lt;/em&gt;&lt;a href="https://blog.logrocket.com/webassembly-how-and-why-559b7f96cd71/"&gt;&lt;em&gt;&lt;a href="https://blog.logrocket.com/webassembly-how-and-why-559b7f96cd71/"&gt;https://blog.logrocket.com/webassembly-how-and-why-559b7f96cd71/&lt;/a&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ya hemos escrito en otros artículos al respecto pero en resumen WebAssembly operates on a stack-based machine that allows web applications to run near-native speed by using a binary format. It can be generated by higher level programming languages like C++ or C#. The idea is that it runs a lot faster than JavaScript.&lt;/p&gt;

&lt;p&gt;Regresando al hilo principal. L a plataforma Uno enables you to write the UI once, then, using native controls, deploys native UI look and feel to each of your platforms. This means, you write the same code for a button regardless of the platform the button is for, and the user will see the native button for their platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9HToeKvY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/804/1%2Apvd9qcNszso4VfRpfaiIhQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9HToeKvY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/804/1%2Apvd9qcNszso4VfRpfaiIhQ.png" alt=""&gt;&lt;/a&gt;Ay! Papantla tus hijos vuelan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://webassembly.org/"&gt;&lt;strong&gt;WebAssembly&lt;/strong&gt;&lt;/a&gt;, que respalda el proyecto de Microsoft &lt;a href="https://visualstudiomagazine.com/articles/2019/09/18/blazor-webassembly.aspx"&gt;&lt;strong&gt;Blazor&lt;/strong&gt;&lt;/a&gt;, provee un ensamble de bajo nivel como lenguaje de compilación objetivo para lenguajes de programación de lato nivel como C/C++, C#,Rust, etc) así que pueden ser usados para Desarrollo Web en lugar de JavaScript, el lenguaje que actualmente domina el desarrollo basado en web.&lt;/p&gt;

&lt;p&gt;El administrador comercial del proyecto de código abierto Uno project, inventive Inc., el 19 de septiembre anunció una nueva integración con Xamarins Forms que provee que los renders de WebAssembly permitan a los desarrolladores extender las apps de los formularios (Xamarin &lt;em&gt;Xamarins.Forms-based&lt;/em&gt; apps) a la Web simplemente ejecutando una simple linea en la linea de comandos de Visual Studio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arquitectura
&lt;/h3&gt;

&lt;p&gt;En iOS y Android, la Plataforma Uno Platform recae exhaustivamente en el stack nativo de Xamarin. En WebAssembly, la plataforma recae directamente en el runtime de Mono WASM. Al final, la plataforma nos provee con la habilidad de correr un solo código fuente, C#y aplicaciones XAML en todas estas plataformas.&lt;/p&gt;

&lt;h3&gt;
  
  
  El Stack de Uno
&lt;/h3&gt;

&lt;p&gt;Uno es un framework UI multi plataforma. Tu escribes tu app in C# y un marcado &lt;a href="https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/"&gt;UWP-flavoured XAML&lt;/a&gt;. Este corre en Windows por que es una UWP app. Con Uno, esta corre en Android, iOS, y (para los valientes) en el navegadores también a través de WebAssembly.&lt;/p&gt;

&lt;p&gt;El siguiente esquema es muy ilustrativo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Sj10Tws3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ACyZG65nXFRhlKwsdjUWJvQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sj10Tws3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ACyZG65nXFRhlKwsdjUWJvQ.png" alt=""&gt;&lt;/a&gt;Muy ilustrativo ¿no? (Imagen propiedad de Uno Platform)&lt;/p&gt;

&lt;p&gt;En iOS y Android, la plataforma Uno usa &lt;a href="https://visualstudio.microsoft.com/xamarin/"&gt;Xamarin&lt;/a&gt; para acceder las frameworks nativos de la plataforma. En la versión web esta corriendo directamente arriba de &lt;a href="https://github.com/mono/mono"&gt;Mono&lt;/a&gt;, el cual resulta esta corriendo arriba de &lt;a href="https://webassembly.org/"&gt;WebAssembly&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugging C# en WebAssembly
&lt;/h3&gt;

&lt;p&gt;El equipo Mono ha estado invirtiendo bastante tiempo en la experiencia de debugging y las recientes mejoras han hecho mucho más fácil trabajar con este. Aún es experimental, pero aún así es de gran ayuda en la depuración de los proyectos WebAssembly.&lt;/p&gt;

&lt;p&gt;Por ahora solo existe una importante restricción: la depuración solo trabaja en Chrome. Esta utilizando el protocolo de las &lt;a href="https://chromedevtools.github.io/devtools-protocol/"&gt;herramientas de desarrollo de Chrome&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para ser honestos, la experiencia de depuración es un dolor de muelas, eñ debugger falla frecuentemente (con el Chrome diciendo que un se desconecto un WebSocket) entendamos que aún hay muchos escenarios sin mucha luz que digamos que no han sido probados aún. Esto significa que tal vez no podrás poner puto de interrupción (breakpoints) , pasos dentro o fuera de algunas secciones de código (ej. métodos parciales).&lt;/p&gt;

&lt;h4&gt;
  
  
  ¡Gracias! Nos seguimos leyendo.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/presentation/d/1gvCczOGNhO101wKZWIFPMbaKs_N71G0CLHLKgGlHaLg/edit?usp=sharing"&gt;Aquí les dejo el enlace&lt;/a&gt; la presentación que tuve oportunidad de dar del 5 de diciembre de este año en &lt;a href="http://kmmx.mx/"&gt;KMMX&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Algunos enlaces de interes
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://platform.uno/showcases/"&gt;Casos de éxito&lt;/a&gt;, algunas apps hechas con esta plataforma.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://platform.uno/docs/articles/get-started.html"&gt;El primer tutorial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://playground.platform.uno/#wasm-start"&gt;Playground&lt;/a&gt;&lt;/p&gt;

</description>
      <category>xaml</category>
      <category>csharp</category>
      <category>unoplatform</category>
      <category>webassembly</category>
    </item>
    <item>
      <title>NodeGUI</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Sun, 17 Nov 2019 18:30:13 +0000</pubDate>
      <link>https://forem.com/mercadoalex/nodegui-1d83</link>
      <guid>https://forem.com/mercadoalex/nodegui-1d83</guid>
      <description>&lt;p&gt;Una alternativa al desarrollo de interfaces gráficas (GUI) en el ecosistema NodeJS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S80KrwKb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A-3eLQ-pSkBf-kKJLNtvykA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S80KrwKb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A-3eLQ-pSkBf-kKJLNtvykA.png" alt=""&gt;&lt;/a&gt;&lt;a href="https://nodegui.github.io/"&gt;&lt;/a&gt;&lt;a href="https://nodegui.github.io"&gt;https://nodegui.github.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NodeGUI es básicamente una vinculación nativa de JavaScript para QT. QT es entorno de desarrollo de plataforma cruzada hecho en C++ para aplicaciones de escritorio, web y móviles y otros.&lt;/p&gt;

&lt;p&gt;NodeGUI tiene todo el poder de Qt5 💚 el cual lo hace muy eficiente en cuanto a CPU y memoria sobre todo si se compara con otras soluciones basadas en &lt;a href="https://es.wikipedia.org/wiki/Chromium_(navegador)"&gt;chromium&lt;/a&gt; como &lt;a href="https://electronjs.org/"&gt;electron&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Las aplicaciones basadas en Electron son pesadas.
&lt;/h3&gt;

&lt;p&gt;Pues esa es la mayor critica a Electron — &lt;a href="https://news.ycombinator.com/item?id=12119278"&gt;main criticism levelled at Electron apps&lt;/a&gt;, que están super hinchadas y requieren mucha memoria. Estos es porque cada app de Electron se entrega con una versión del navegador &lt;a href="https://www.chromium.org/Home"&gt;Chromium&lt;/a&gt; y no esta en una posición de compartir recursos, como las apps nativas hacen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uKuM5-YY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AKt9YsGFcHSx1LsaLWBH_SQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uKuM5-YY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AKt9YsGFcHSx1LsaLWBH_SQ.png" alt=""&gt;&lt;/a&gt;Logo de QT&lt;/p&gt;

&lt;p&gt;La compañía &lt;strong&gt;Qt&lt;/strong&gt; (antes &lt;strong&gt;Trolltech&lt;/strong&gt; ) es una compañía de software fundada en Espoo, Finlandia, desde donde supervisa el desarrollo de su framework de aplicaciones Qt, siendo este un entorno de trabajo multi plataforma para la creación de interfaces gráficas (GUI) escrito en C++ como ya habíamos mencionado, pero es soportado con enlaces a otros lenguajes de programación como Python, Lua, etc y ¡si! recientemente JavaScript.&lt;/p&gt;

&lt;h4&gt;
  
  
  Nota curiosa
&lt;/h4&gt;

&lt;p&gt;KDE el escritorio de linux, en su versión denominada plasma, esta desarrollada con Qt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Os5jhFHr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AtbpGhNa0lEaaXMZI118sPA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Os5jhFHr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AtbpGhNa0lEaaXMZI118sPA.jpeg" alt=""&gt;&lt;/a&gt;KDE Plasma esta desarrollado con Qt.&lt;/p&gt;

&lt;p&gt;Los enlaces (bindings) nativos de JavaScript son escritos usando N-API o &lt;em&gt;node addon api&lt;/em&gt;. N-API es una API para construir complementos nativos, para mayor referencia pueden revisar la documentación, dando &lt;a href="https://nodejs.org/api/n-api.html"&gt;click aquí&lt;/a&gt;. esto significa que las aplicaciones escritas usando NodeGUI no se despliegan en una instancia del navegador y dibujan la UI en este, en lugar de eso todos los widgets son dibujados nativamente.&lt;/p&gt;

&lt;p&gt;Ya que NodeGUI es un complemento nativo de NodeJS, es decir extiende NodeJS tenemos acceso completo a todas las APIs de Node y a todos los módulos npm compatibles. Y también por supuesto las herramientas de depuración que usamos con NodeJS podemos usarlas con NodeGUI ¿fantástico no?&lt;/p&gt;

&lt;p&gt;Otra ventaja de usar de usar Qt es que esta tiene un API para poder definir los estilos de nuestros widgets via CSS y el soporte de Flex Box a las hojas de estilo de Qt se añadió usando &lt;a href="https://yogalayout.com/"&gt;Yoga&lt;/a&gt;, entonces pues tenemos soporte en Qt para pintar y definir propiedades de layout via CSS.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mucho ruido y pocas nueces.
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/nodegui/nodegui-starter
cd nodegui-starter
npm install
npm run build
npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ooops. Me mando un error al momento de instalar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ky87UoEv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ACmzOdCb4D8GO0x7S5EJXew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ky87UoEv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ACmzOdCb4D8GO0x7S5EJXew.png" alt=""&gt;&lt;/a&gt;error&lt;/p&gt;

&lt;p&gt;Parece que falta instalar la librería y la dependencia C make.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_npm i @nodegui/nodegui_
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  holamundo.js con Qt
&lt;/h4&gt;

&lt;p&gt;En nuestro editor favorito&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const {
  QMainWindow,
  QWidget,
  QLabel,
  FlexLayout
} = require("@nodegui/nodegui");

const win = new QMainWindow();

const centralWidget = new QWidget();
centralWidget.setObjectName("myroot");
const rootLayout = new FlexLayout();
centralWidget.setLayout(rootLayout);

const label = new QLabel();
label.setObjectName("mylabel");
label.setText("Hello");

const label2 = new QLabel();
label2.setText("World");
label2.setInlineStyle(`
  color: red;
`);

rootLayout.addWidget(label);
rootLayout.addWidget(label2);
win.setCentralWidget(centralWidget);
win.setStyleSheet(
  `
    #myroot {
      background-color: #009688;
      height: '100%';
      align-items: 'center';
      justify-content: 'center';
    }
    #mylabel {
      font-size: 16px;
      font-weight: bold;
    }
  `
);
win.show();

(global as any).win = win; //to prevent gc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--49KsaUWY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/200/1%2A_H3XmAgntJwfJupZ1tNagQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--49KsaUWY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/200/1%2A_H3XmAgntJwfJupZ1tNagQ.png" alt=""&gt;&lt;/a&gt;Bonito ¿no?&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusión
&lt;/h4&gt;

&lt;p&gt;Me queda la duda de si realmente QT será una opción para el desarrollo de UIs en Node. No me queda duda de que Qt es una gran herramienta y de que el sistema NodeJS cada vez crece más. A pesar de que NodeGUI esta en desarrollo constante, el proyecto aún esta en su infancia y el equipo que lleva este recomienda no usarlo en producción todavía.&lt;/p&gt;

&lt;p&gt;Nos leemos. Alex&lt;/p&gt;

</description>
      <category>uidesign</category>
      <category>qt</category>
      <category>node</category>
    </item>
  </channel>
</rss>
