<?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>DEV Community: Jorge Cano</title>
    <description>The latest articles on DEV Community by Jorge Cano (@jorgeucano).</description>
    <link>https://dev.to/jorgeucano</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%2F63548%2F16184af0-c55e-4f3b-81bd-f6639fe3b106.jpg</url>
      <title>DEV Community: Jorge Cano</title>
      <link>https://dev.to/jorgeucano</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jorgeucano"/>
    <language>en</language>
    <item>
      <title>10 años participando en DevFest!</title>
      <dc:creator>Jorge Cano</dc:creator>
      <pubDate>Sun, 17 Nov 2024 22:54:50 +0000</pubDate>
      <link>https://dev.to/jorgeucano/10-anos-participando-en-devfest-5hne</link>
      <guid>https://dev.to/jorgeucano/10-anos-participando-en-devfest-5hne</guid>
      <description>&lt;p&gt;8 años como Google Developer Expert, y más de 10 participando en Devfest y meetups mensuales. A pesar de todo, recuerdo mi primer Devfest, e imagino mi cara en ese momento como la de un niño entrando a Disney por primera vez...&lt;/p&gt;

&lt;p&gt;Tantas personas que hacen lo mismo que vos, tantas personas con ganas de escuchar y participar en un evento "nerd" donde lo que reina es la buena onda, el compartir y aprender.&lt;/p&gt;

&lt;p&gt;Recuerdo disfrutar las charlas como si fuera un recital de música, cada momento, el contenido, las risas, hasta las preguntas... Ahí entendí que era algo que quería en mi vida, no sabía qué ni cómo se tenía que hacer, pero sabía que yo quería eso...&lt;/p&gt;

&lt;p&gt;Claro que hoy te puede parecer algo raro, arrancaste tu carrera como Dev viendo videos en youtube, meetups, streamings, o algo así, pero no siempre fue el prime time de las comunidades de desarrollo, y yo había descubierto algo que cambió mi carrera profesional y mi vida.&lt;/p&gt;

&lt;p&gt;Hoy escribo desde el aeropuerto de Montevideo, Uruguay&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxx8vzuke2417mopfly9e.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxx8vzuke2417mopfly9e.JPG" alt="aeropuerto de Montevideo con una computadora" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ayer se realizó el DevFest Montevideo 2024, y fue algo que disfruté demasiado. No voy a mentirles, dormí 4 horas el día anterior, estuvimos con el pana (&lt;a class="mentioned-user" href="https://dev.to/villanuevand"&gt;@villanuevand&lt;/a&gt;) preparando una charla MUY PERO MUY detallista, que tal vez deje el video de intro que hicimos por mis redes... Pero a pesar del cansancio y todo, al llegar al evento, vuelve esa sensación de sentirse en casa, a pesar de conocer poca gente, o casi nadie en porcentual... Sentirte parte de algo tan bonito es un boost de energía tan fuerte que se te va el sueño, absolutamente todo.&lt;/p&gt;

&lt;p&gt;Y esto me puso a reflexionar un poco, cuánto tiempo ya, cuántos eventos, cuántas charlas, risas, abrazos, reencuentros y tantas sensaciones en algo tan importante...&lt;/p&gt;

&lt;p&gt;A veces, tantos años haciendo algo a uno lo cansa, lo desmotiva, lo hasta pone nervioso que todo salga bien. Al final, te paras en un escenario frente a un público, y en mi mente por lo menos, ellos tienen esa ilusión que tengo yo cada vez que voy a ver una charla que me gusta... Esa ilusión de reírme, de aprender algo nuevo, de que me hagan sentir parte de esto.&lt;/p&gt;

&lt;p&gt;Tal vez otros lo sienten con un club de fútbol/béisbol/básquet/lo que sea, yo lo siento con las comunidades de desarrollo.&lt;/p&gt;

&lt;p&gt;A pesar de que tengo muchas cosas trackeadas sobre mis charlas/videos/eventos, ya que hay programas que me lo piden... Perdí la cuenta de las veces que me reí, aprendí e hice cosas por la comunidad, como tan solo ir a ver una charla, correr hacia un avión porque no llego gracias a la conexión, o esas personas que te agradecen por algún motivo X.&lt;/p&gt;

&lt;p&gt;Sería deshonesto decirte que nunca pensé en dejar todo esto, en simplemente no hacerlo más, pero la realidad es que cada vez que lo hago, me da la suficiente energía para volver a pasar todo lo que no se ve de los eventos/charlas... Toda esa preparación previa, coordinaciones, gastos (se gasta mucho dinero aunque no lo crean) y por sobre todo el tiempo invertido, realmente vale cada segundo, centavo, nervio y por eso siempre vuelvo a hacerlo.&lt;/p&gt;

&lt;p&gt;Si llegaste hasta acá, es porque hay algo de todo esto que te llama la atención, y te voy a decir algo, son más de 10 años en esto, y 8 como GDE (que me dio un boost de invitaciones y viajes importantes, aunque antes ya lo hacía), y si a vos te gustaría compartir, ir a conocer gente que hace lo mismo que vos... Ser parte de la comunidad, ¡no lo esperes más!&lt;br&gt;
En esta &lt;a href="https://gdg.community.dev/" rel="noopener noreferrer"&gt;web vas a encontrar todos los GDG del mundo&lt;/a&gt;, por lo tanto, hay demasiadas posibilidades de que alguno te quede "cerca" y, en el caso de que no, muchas veces hay eventos online a los cuales te podés conectar, por ejemplo, en unos días (depende cuándo leas esto) vamos a hacer muchos un &lt;a href="https://gdg.community.dev/events/details/google-gdg-buenos-aires-presents-watch-party-angular-v19/" rel="noopener noreferrer"&gt;watch party del evento de Angular v19&lt;/a&gt; y lo que hacemos es comunidad, charlar, ser parte de algo, aunque estemos en nuestras casas, vamos a verlo "juntos".&lt;/p&gt;

&lt;p&gt;Hay otros eventos y comunidades por fuera de los GDGs que también son lo mismo, cambian los nombres o tipos de tecnologías (tal vez no)...&lt;/p&gt;

&lt;p&gt;Dale, animate a ir a uno, hablá con alguien que no conocés, animate a divertirte, aprender, conocer nueva gente que hace y le encanta lo mismo que vos... Sé parte de una comunidad, ¡te va a cambiar la vida profesional como mínimo! Quién te dice que le decís "Hola soy X" a la persona que va a ser tu próximo compañero de trabajo y no lo sabías en ese momento.&lt;/p&gt;

&lt;p&gt;Sin más, sé que no es un blogpost técnico, pero hace rato que no escribía, tengo tiempo y quería aprovechar para revivir un poco esto y agradecer un poco a todos los que hacen comunidades, ya sea organizando, dando charlas, talleres/workshops o simplemente sentando y escuchando...&lt;/p&gt;

&lt;p&gt;Seguramente existan mil fotos mejores que estas dos que voy a poner del evento de ayer, pero así se ven dos personas que se conocieron hace muchos años en un evento y se hicieron grandes amigos ¡y hasta ayer no habían dado una charla juntos!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjqk0uj7m2wfb295v96i.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjqk0uj7m2wfb295v96i.JPG" alt="escenario con Andres y Jorge" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2t7k9fjoqarxwya1fyp.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2t7k9fjoqarxwya1fyp.JPG" alt="Andres y Jorge sentados en el escenario esperando el momento de su charla" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gracias por leerme, y nos vemos por las redes! &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>gdg</category>
      <category>devfest</category>
    </item>
    <item>
      <title>Angular signals, que son y como funcionan? - parte 1</title>
      <dc:creator>Jorge Cano</dc:creator>
      <pubDate>Mon, 11 Dec 2023 10:32:38 +0000</pubDate>
      <link>https://dev.to/jorgeucano/angular-signals-que-son-y-como-funcionan-4mem</link>
      <guid>https://dev.to/jorgeucano/angular-signals-que-son-y-como-funcionan-4mem</guid>
      <description>&lt;p&gt;No hay nada nuevo que decir que son un gran fan de RxJS… que desde que lo descubri con angular para mi se volvio una de mis herramientas favoritas&lt;/p&gt;

&lt;p&gt;al punto que 2 veces cree cursos gratuitos en youtube sobre esta tecnologia, aprovechando sus actualizaciones y novedades…&lt;/p&gt;

&lt;p&gt;Pero angular, tomo un camino de decidir que tenia que cambiar algunas cosas en el framework, es un camino que viene de varias versiones para atras, y esto esta armando un poco de GRANDES cambios en el framework en si…&lt;/p&gt;

&lt;p&gt;Por lo tanto, integraron Signals, con su reactividad primitiva, para utilizar en angular… esto hace que muchas cosas que soliamos hacer con rxjs u otros metodos, paso a utilizar signals, lo cual hace que mejore la performance debido a que el framework tiene que realizar menos chequeos y re-draws de algunas cosas en nuestros templates… &lt;/p&gt;

&lt;p&gt;Por eso decidi hacer algunos videos y posts, los cuales van a ayudarte a entender esto, pero bien desde dentro… no solo a utilizarlos si no, a entender como funciona, porque deberiamos utilizarlos y cuando deberiamos utilizarlos.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/tmrDAbXwSB0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;Con esta intro, vamos a escribir un poco de codigo, en este post vamos a ver los principios de Signals, como funcionan que es un compute y los effects…&lt;/p&gt;




&lt;p&gt;Podriamos ver los signals como un objeto que tiene las siguientes funciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creacion con seteo de valor inicial&lt;/li&gt;
&lt;li&gt;getter&lt;/li&gt;
&lt;li&gt;setter&lt;/li&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;estas cuatro funciones hacen de nuestro manejo de datos algo mas facil, y me preguntas porque… &lt;/p&gt;

&lt;p&gt;Bueno, vamos a verlo en el codigo directamente y pasando a explicar cada uno de ellos.&lt;/p&gt;

&lt;p&gt;El Signal se crea con un valor inicial SIEMPRE, depende de nosotros darle un type inicial o no, pero en el caso de que no lo hagamos el runtime lo va a hacer por nosotros y le va a setear el type del valor que le damos.&lt;/p&gt;

&lt;p&gt;entonces, primero vamos a importarlo de &lt;code&gt;@angular/core&lt;/code&gt;, una vez que lo tenemos ya podemos usarlo&lt;/p&gt;

&lt;p&gt;Como lo vamos a crear, bueno de una forma bastante simple, &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;en esta variable version, vamos a decirle que es del tipo signals y su generico va a pasar a ser un number.&lt;/p&gt;

&lt;p&gt;QUE? COMO?&lt;/p&gt;

&lt;p&gt;bueno, vamos a ver la firma del mismo&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="cm"&gt;/**
 * A `Signal` with a value that can be mutated via a setter interface.
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="nx"&gt;declare&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;WritableSignal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/**
     * Directly set the signal to a new value, and notify any dependents.
     */&lt;/span&gt;
    &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="cm"&gt;/**
     * Update the value of the signal based on its current value, and
     * notify any dependents.
     */&lt;/span&gt;
    &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;updateFn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="cm"&gt;/**
     * Returns a readonly version of this signal. Readonly signals can be accessed to read their value
     * but can't be changed using set, update or mutate methods. The readonly signals do _not_ have
     * any built-in mechanism that would prevent deep-mutation of their value.
     */&lt;/span&gt;
    &lt;span class="nf"&gt;asReadonly&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;Signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Aca esta la firma de los signals, usan generics, que es una de las grandes genialidades de typescript a la hora de crear cosas de este estilo.&lt;/p&gt;

&lt;p&gt;Lo que vamos a indicarle es que ese generico (que dejara de serlo, va a ser el mismo type de esta instancia de signal), por lo tanto, siempre que lo utilicemos, ya sea para obtener el valor o modificarlo vamos a tener un number.&lt;/p&gt;

&lt;p&gt;Sigamos, entonces, ahora tenemos la segunda función, el getter, que es basicamente obtener el valor un &lt;em&gt;get&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Esto se hace con los parentesis directamente, sin la necesidad de escribir nada mas&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="nf"&gt;version&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;en&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;
&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;version&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;en&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="nx"&gt;componente&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;ahora que pasa si nos olvidamos de esto y ponemos simplemente &lt;code&gt;version&lt;/code&gt; bueno… &lt;/p&gt;

&lt;p&gt;nos vamos a encontrar la firma de la funcion, que es el getter() y su nombre en el prototipo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flzjwzyz61tvln2zevwtk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flzjwzyz61tvln2zevwtk.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Asi que si encuentran algo asi, ya sabes que se olvidaron los &lt;code&gt;()&lt;/code&gt; parentesis.&lt;/p&gt;

&lt;p&gt;Pero bueno sigamos con lo importante, obtener el dato, es facil, ahora que pasa si queremos actualizar el valor del mismo, bueno tal y como comente antes vamos a tener 2 opciones para hacerlo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;el &lt;code&gt;set&lt;/code&gt; es la primera forma, que lo que va a hacer directamente es sobre-escribir el valor actual por el nuevo.&lt;/p&gt;

&lt;p&gt;Ahora, muchas veces queremos actualizar el valor, pero utilizando el valor actual, por ejemplo en una cuenta (sumandole 1 por ejemplo).&lt;/p&gt;

&lt;p&gt;Para eso tenemos update, que a diferencia de set, que sobre-escribe el valor, lo que hace es darnos el valor, para que podamos ejecutarlo en una funcion anonima la cual su retorno &lt;code&gt;return&lt;/code&gt; es el valor que va a “setear” en el signal.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;valorActual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;valorActual&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;como asi podemos hacer algunas cosas un poco mas “complejas” que esta, por ejemplo&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valorActual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valorActual&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;valorActual&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;De esta forma, tenemos las actualizaciones y todas las funciones que podes obtener de los signals, pero hay una cosa que no te comente hasta ahora…&lt;/p&gt;

&lt;p&gt;Hay 2 tipos de signals, los que acabamos de ver que son los &lt;code&gt;WritableSignals&lt;/code&gt; y luego tenemos los &lt;code&gt;Signals&lt;/code&gt; que a diferencia de los anteriores, no se pueden escribir/setear a “mano” por asi decirlos y van a necesitar de uno o mas signals para poder obtener valores y ejecutarse.&lt;/p&gt;

&lt;p&gt;Estos son los &lt;code&gt;computed&lt;/code&gt; estos signals a diferencias de los anteriores, son funciones anonimas que son lazy y memorized, que quiere decir, que derivan del valor de otro signal, y dependen de su cambio de valor para actulizarse y ejecutarse&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// writableSignal&lt;/span&gt;
&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WritableSignal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// return 17&lt;/span&gt;

&lt;span class="c1"&gt;// signal&lt;/span&gt;
&lt;span class="nl"&gt;versionComputed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;version&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// return 18&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Aca esta las pequeñas diferencias, los computed, solo ejecutan una funcion anonima que va a ejecutarse cada vez que el/los signal/s que tiene dentro cambien de valor (que se les haga un set o update)… y entrega un nuevo valor.&lt;/p&gt;

&lt;p&gt;Esta forma, los computed basicamente “reaccionan” a los cambios de otros signals, algo que estamos acotumbrados en cosas como el combineLatests de rxjs por ejemplo… que si alguno de los valores cambia se ejecuta de nuevo. Por esto mismo, se dice que sus dependencias son dinamicas, ya que depende 100% del cambio de valor de 1 o mas signals.&lt;/p&gt;




&lt;p&gt;Y por ultimo tenemos, los effects, que es una funcion que se ejecuta siempre que un signal que este dentro de esta funcion, cambie de valor.&lt;/p&gt;

&lt;p&gt;Los effects tienen bastantes complejidades si queremos verlos en profundidad, pero por ahroa lo vamos a ver bien por arriba, osea las funciones mas basicas que tiene:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;

&lt;span class="nf"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;se modifico el valor de version: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;version&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Y asi se ven los effects, y esta funcion anonima que lleva dentro, solo se va a ejecutar cuando &lt;code&gt;version&lt;/code&gt; cambie de valor, en el caso de que nunca cambie, este effect nunca se ejecutara ya que es un efecto del cambio del signal.&lt;/p&gt;

&lt;p&gt;El equipo de Angular, en su documentacion, habla de que los effects los deberiamos usar en por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;loggear datos cuando cambia para analitics o debbugear&lt;/li&gt;
&lt;li&gt;mantener los datos del localstorage en sync&lt;/li&gt;
&lt;li&gt;agregar custom data al DOM, que no se pueda hacer en el template directo&lt;/li&gt;
&lt;li&gt;para el elemento canvas para mejorar la performance del mismo.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Con esto, ya tenemos el primer vistaso de que son los signals, cuales son las funcionalidades que tienen y que podemos empezar a hacer con ellos, creo que tal vez lo mas importante que podemos ver es la diferencia entre un writableSignal y un signal comun, osea entre el signal que vamos a setear nosotros y el computed que es el que depende de otros.&lt;/p&gt;

&lt;p&gt;En proximos capitulos, vamos a ver como funciona mas adentro los effects, como asi hacer una comparativa de funcionalidades y velocidad entre codigo con signals y codigo con rxjs.&lt;/p&gt;

&lt;p&gt;Si quieren ver el codigo completo que utilice en el video lo tienen aqui: &lt;a href="https://stackblitz.com/edit/stackblitz-starters-dcqlbf?file=src%2Fmain.ts" rel="noopener noreferrer"&gt;https://stackblitz.com/edit/stackblitz-starters-dcqlbf?file=src%2Fmain.ts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se vienen cosas muy interesantes, asi que espero que esto te sirva mucho y estes muy atento a las novedades que voy a ir trayendo!&lt;/p&gt;

&lt;p&gt;Gracias por llegar hasta aqui, nos vemos en la proxima!&lt;/p&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;JC&lt;/p&gt;

</description>
      <category>angular</category>
      <category>signals</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>El detrás de escena de las charlas</title>
      <dc:creator>Jorge Cano</dc:creator>
      <pubDate>Tue, 03 Sep 2019 11:04:57 +0000</pubDate>
      <link>https://dev.to/jorgeucano/el-detras-de-escena-de-las-charlas-39l3</link>
      <guid>https://dev.to/jorgeucano/el-detras-de-escena-de-las-charlas-39l3</guid>
      <description>&lt;p&gt;Alguna vez pensaste cuanto tiempo gasta un speaker para armar una charla?&lt;br&gt;
No tan solo en el dinero, si no en el tiempo y todo lo demás.&lt;/p&gt;

&lt;p&gt;Hace un tiempo que no escribo... Y creo que es hora de escribir un poco de todo esto!&lt;/p&gt;

&lt;p&gt;Me gustaría aclarar que escribo esto con la idea de todo el trabajo que hacemos para cada charla, cada uno de los que dan una charla o un workshop.&lt;/p&gt;




&lt;p&gt;Para empezar, me gustaría contarles que a pesar de que tengas mucha experiencia o no, vas a tener que invertirle un tiempo a la charla/workshop que tengas que dar...&lt;br&gt;
Son horas y horas entre tener la idea, conocer del tema, estudiar un poco mas para simplemente crear un titulo y una breve descripción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Si queres tener una idea de como hago para crear una idea, escribí hace algún tiempo sobre esto (en ingles, si a veces toca) &lt;a href="https://medium.com/@jorgeucano/some-tips-to-create-a-wonderful-cfp-43b1058392ee"&gt;https://medium.com/@jorgeucano/some-tips-to-create-a-wonderful-cfp-43b1058392ee&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Por lo tanto, hablemos de esta primera faceta, vos creas todo con mucha fuerza y ganas pensando en que estas casi seguro que te va a llegar esa confirmación de que vas a poder dar la charla. Pero bueno tenes que entender que no siempre pasa.&lt;/p&gt;

&lt;p&gt;Creo que en la mayoría de las veces que aplique me dijeron que NO!.&lt;/p&gt;

&lt;p&gt;Pero bueno, eso seria la primera etapa.&lt;/p&gt;

&lt;p&gt;Por lo tanto, la etapa uno, seria poner algunas horas entre estudio y creación de todo para poder crear el titulo y descripción.&lt;/p&gt;




&lt;p&gt;Ahora que pasa cuando te aceptan la charla.&lt;/p&gt;




&lt;p&gt;Una vez que te aprueba la charla viene la corrida, que quiero decir con esto, muchas conferencias/meetups tienen sus tiempos y no todas tienen el tiempo necesario para avisarte con tiempo para que puedas preparar todo como corresponde. Sin olvidar y contar que algunas te piden las slide's unos 30 días antes (vuelvo a repetir) no todas pero algunas conferencias lo hacen. Lo cual me parece perfecto, ya que esta bueno que vean que no tengas nada que pueda llegar a incomodar a nadie y que tus diapositivas concuerdan con lo que vos vas a presentar...&lt;/p&gt;

&lt;p&gt;quiero aclarar que esos 20 minutos a 4/8 horas dependiendo si das una charla o un workshop, no hay con que pagarlo, por lo menos para mi, yo disfruto mucho compartiendo desde mi punto de vista lo que aprendo y trato  de compartir de una forma mas "divertida", esto no quiere decir que todas las charlas deberían ser así, cada uno tiene su estilo y forma donde se siente cómodo... A mi en lo personal a veces me gusta estar en temas complejos de formas divertidas.&lt;/p&gt;

&lt;p&gt;Pero bueno, es hora de empezar la charla, como ya hiciste un titulo y un abstract, seguramente tengas una idea del "theme" que va a tener tus diapositivas... Pero bueno, no siempre pasa, o a veces uno varia un poco, CLARO QUE ES NORMAL pivotar un poco en la charla, no drasticamente, si no a veces un enfoque un poquito mas de costado.&lt;/p&gt;

&lt;p&gt;Entonces, ahora arrancamos con todo esto, crear la charla, esto casi nunca es cuestión de salir de una. Nos damos cuenta que tenemos que aprender algo, leer mas sobre otra cosa, ver si llegamos con el tiempo, agregar unos memes del momento, y como siempre si elegís demo, esa sensación de no saber si llegas a hacerla, si funciona, si no cambia nada antes.&lt;/p&gt;

&lt;p&gt;Por lo tanto ya estamos hablando de algunas noches sin dormir, muchas horas invertidas y eso se refleja en varias cosas, que voy a mencionar mas adelante.&lt;/p&gt;




&lt;p&gt;Llega el momento y luego de un promocionar el evento al que vamos, tal vez hacer un vídeo o una serie de tweets(o red social que usen) sea la hora de empezar el viaje.&lt;/p&gt;

&lt;p&gt;No siempre, o casi nunca, la conferencia se hace en tu ciudad/provincia/estado/país/continente... Parece medio drástico lo que digo, pero es la verdad, a veces es simplemente tomarse un medio de trasporte publico, pero otra veces uno tiene que viajar muchas horas (hasta 1 o 2 dias) para poder llegar al lugar de la conferencia.&lt;/p&gt;

&lt;p&gt;Claro que en el avión/(medio de transporte) no podes descansar mucho, pensando en no olvidarte nada para la conferencia, llegas cansado, muchas veces cambios de horarios, de altura o lo que sea.&lt;/p&gt;




&lt;p&gt;Pero a llegar a este momento, uno esta feliz y cansado, claro todavía no diste la charla pero te juntas con los speakers organizadores o algún amigo y estas con tu mente dividida en: no estoy al 100% seguro de que la charla este terminada, el ejemplo del workshop no funciona, me cambiaron una librería de versión o alguna cosa por el estilo que podría romper todo... LO DIGO PORQUE ME PASO y siempre terminas hablando de eso con los demás speakers...&lt;/p&gt;

&lt;p&gt;Por lo tanto las noches anterior/es que estas ahí, vas a estar cansado/nervioso y corriendo a contra reloj para poder llegar al momento mágico como se debe.&lt;/p&gt;




&lt;p&gt;Este apartado lo voy a usar para los workshops y voy a hablar de &lt;strong&gt;MI caso en particular&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A mi me gusta que cuando doy un workshop este todo en perfección para que cada una de las personas que van, puedan aprovechar el máximo tiempo en el que yo estoy dictando el workshop.&lt;/p&gt;

&lt;p&gt;Yo siento personalmente que cada una de las personas que pagan y van a mis workshops lo hacen esperando que de lo mejor de mi, aprovechar algún momento extra para colar alguna pregunta extra del tema en el cual estamos o algo que no estemos cubriendo.&lt;br&gt;
Y en lo personal trato de dar lo mejor de mi en cada workshop.&lt;br&gt;
Y me veo obligado a contarles también, que NUNCA cobre por ningún workshop en latinoamerica... Si fuiste a algún workshop mio, en algún evento de LATAM, seguramente pagaste (no en todos) ese dinero yo no lo toque, ni tampoco lo vi, ni nunca me lo ofrecieron.&lt;br&gt;
Y si te preguntas, &lt;strong&gt;pero porque nunca lo pediste? o porque no preguntaste?&lt;/strong&gt;&lt;br&gt;
Porque me gusta pensar que ese dinero se usa para que la gente pueda estar o llevarse algo mas en el workshop.&lt;/p&gt;

&lt;p&gt;Como cuando regalo algo, lo saco de mi bolsillo, si gasto dinero para que la gente que paga por algo que no cobro se lleven mas cosas... &lt;code&gt;Pero lo mas importante es que brindo mi conocimiento y todo lo que me hubiese gustado ver a mi cuando estaba aprendiendo lo que yo estoy ensenando&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;Ahora el apartado charla, llegan esos 20 a 45 minutos (dependiendo el evento) y uno juega a todo o nada... es en ese momento donde se ve si todo sale bien o mal... como no estar nervioso no? cuantas noches sin dormir, cuanto tiempo invertido viajando... cuando y cuanto...&lt;/p&gt;

&lt;p&gt;Claro que el placer que me da a mi personalmente, poder dar una charla y compartir con la comunidad vale muchísimo, pero algún vez pensaron en mas allá de esto.&lt;br&gt;
Alguna vez pensaron cuanto dinero, tiempo, historia gasto en todo esto?&lt;/p&gt;

&lt;p&gt;Vamos a hacer un repaso a todo esto...&lt;/p&gt;

&lt;p&gt;Para una charla en un evento, utilizo:&lt;/p&gt;

&lt;p&gt;Alrededor de &lt;strong&gt;10 horas en el titulo y abstract&lt;/strong&gt;.&lt;br&gt;
alrededor de &lt;strong&gt;30 a 60 horas en la creación del contenido&lt;/strong&gt;, slides, ejemplos y demás.&lt;br&gt;
Unos &lt;strong&gt;50 dolares&lt;/strong&gt; (para el ida y vuelta al aeropuerto)&lt;br&gt;
Otros &lt;strong&gt;50 a 150 dolares&lt;/strong&gt; entre taxis y comidas/cafés en los lugares que voy (sin quedarme días extra... simplemente viajando para la conferencia.&lt;br&gt;
&lt;strong&gt;Noches sin dormir, y tiempo que dejo de estar con mi novia, familia, amigos o trabajando simplemente&lt;/strong&gt;.&lt;br&gt;
Al no trabajar todos esos días, obviamente, no cobro dinero... &lt;strong&gt;así que mínimo son 2 días menos que facturo por esa semana&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Si, si hacemos una cuenta, yo por lo menos, termino pagando mucho dinero para cada una de las charlas que voy a dar... pero lo hago con mucho amor, porque me encanta hacer todo esto para la comunidad.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;PERO me duele mucho, cuando hay gente desagradecida, que o porque no hablaste de lo que ellos querían o por X motivo, se llenan la boca hablando mal de una charla (sea la mía o la de cualquier otro).&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Es hora de hacer los números para los workshops.&lt;br&gt;
Hablemos de otras &lt;strong&gt;10 horas entre pensar el titulo y el temario&lt;/strong&gt;&lt;br&gt;
Y luego de unas &lt;strong&gt;50 a 150 horas&lt;/strong&gt; entre terminar el temario aprender lo que falta y empezar a generar el &lt;strong&gt;contenido&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;Claro que si llega a cambiar algo en el transcurso de que vos creaste todo y el día/hora del workshop, tenes que salir a modificar todo y cambiar y cambiar hasta que quede todo finalizado&lt;/strong&gt;.&lt;br&gt;
Y acá volvemos a repetir&lt;br&gt;
&lt;code&gt;Unos 50 dolares (para el ida y vuelta al aeropuerto)&lt;br&gt;
Otros 50 a 150 dolares entre taxis y comidas/cafés en los lugares que voy (sin quedarme días extra... simplemente viajando para la conferencia.&lt;br&gt;
Noches sin dormir, y tiempo que dejo de estar con mi novia, familia, amigos o trabajando simplemente.&lt;br&gt;
Al no trabajar todos esos días, obviamente, no cobro dinero... así que mínimo son 2 días menos que facturo por esa semana.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Claro que es un montón de dinero y tiempo que invierte uno, que lo podría gastar en otras cosas... Por lo tanto, como siempre dije, sean agradecidos con los que hacen una conferencia o evento, recuerden que esa gente usa tiempo suyo para poder crear todo... &lt;strong&gt;Pero también, entiendan y sean agradecidos con los speakers y quienes dan los workshops, porque ellos también pusieron de su tiempo y dinero&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Debo admitir que hace tiempo tenia ganas de escribir esto, que todos entiendan que no es como dirían en Argentina "soplar y hacer botella", si no que conlleva &lt;strong&gt;un montón de tiempo&lt;/strong&gt; hacer todo esto.&lt;/p&gt;

&lt;p&gt;Y si vos organizas un evento/meetup, también deberías entender que quienes dictan el workshop o dan una charla, son personas que se pueden enfermar, tienen familia y también tienen que pagar las cuentas... &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creo que es hora que seamos todos mas agradecidos y sigamos haciendo crecer las comunidades en las somos partes...&lt;/strong&gt; y lo siento como un descargo mas que nada, ya que a veces siento que porque sos &lt;em&gt;speaker&lt;/em&gt; tenes la obligación de X o Y, y la gente (ya sea organizadores o asistentes) no se da cuenta que también sos una persona, que puede estar pasando porque cualquier situación, ya sea cansancio o cualquier otra.&lt;/p&gt;




&lt;h4&gt;
  
  
  La verdad que yo estoy super feliz de ir a cada uno de los eventos que voy, y me pone triste a veces tener que decir que "no". Pero a veces no queda otra, hay cosas que resolver antes de ir a cada evento y también ver la agenda, no tan solo de eventos, si no la agenda personal.
&lt;/h4&gt;




&lt;p&gt;Así que simplemente, este es otro de estos post de &lt;code&gt;concientización&lt;/code&gt; que me gusta hacer cada tanto!&lt;/p&gt;

&lt;p&gt;El próximo, seguramente sea sobre algo mas técnico!&lt;/p&gt;




&lt;p&gt;Si me queres ver y hacer preguntas en vivo, me encontraras los &lt;code&gt;lunes a las 7pm (hora argentina)&lt;/code&gt; en &lt;code&gt;twitch&lt;/code&gt; &lt;a href="https://www.twitch.tv/jorgeucano"&gt;https://www.twitch.tv/jorgeucano&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;Si queres ver mis videos sobre los lives y otras cosas lo podes hacer en &lt;code&gt;youtube&lt;/code&gt; &lt;a href="https://www.youtube.com/channel/UCdp9sM22GW5uIOaU9eZ7n6w"&gt;https://www.youtube.com/channel/UCdp9sM22GW5uIOaU9eZ7n6w&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si queres ver mis articulos anteriores a &lt;code&gt;dev.to&lt;/code&gt;, podes ir a verlos a mi &lt;code&gt;medium&lt;/code&gt; en &lt;a href="https://medium.com/@jorgeucano"&gt;https://medium.com/@jorgeucano&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si queres contactarme por cualquier motivo, o simplemente ver de que hablo, podes darme follow en &lt;code&gt;twitter&lt;/code&gt; &lt;a href="https://twitter.com/jorgeucano"&gt;https://twitter.com/jorgeucano&lt;/a&gt;&lt;/p&gt;




&lt;h5&gt;
  
  
  Gracias por llegar y leer todo! nos estamos leyendo/viendo en la próxima!!!
&lt;/h5&gt;

</description>
      <category>showdev</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>Deberías colaborar en proyectos open source</title>
      <dc:creator>Jorge Cano</dc:creator>
      <pubDate>Thu, 06 Dec 2018 12:28:35 +0000</pubDate>
      <link>https://dev.to/jorgeucano/deberias-colaborar-en-proyectos-open-source-1onf</link>
      <guid>https://dev.to/jorgeucano/deberias-colaborar-en-proyectos-open-source-1onf</guid>
      <description>&lt;p&gt;Hace algunas semanas en las oficinas de google de sunnyvale se hosteo el “Google Developer Expert Summit” y tuve la “gran idea” de hablar sobre porque deberíamos trabajar en proyectos open source en nuestro tiempo libre.&lt;/p&gt;

&lt;p&gt;Y toque varios puntos que me gustaría compartir con ustedes:&lt;/p&gt;

&lt;h3&gt;
  
  
  - Yo haciendo OSS?
&lt;/h3&gt;

&lt;p&gt;Claro, basicamente si sabes programar podes colaborar en OSS&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¿Qué te diferencia de la gente que lo hace? Que ellos simplemente lo hacen!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Seguramente una persona que esta haciendo hace tiempo OSS sabra algunos trucos mas que vos a la hora de crear un PR o de entender y dialogar en los tickets abiertos… Pero no se nace sabiendo, se va aprendiendo todo…&lt;/p&gt;

&lt;p&gt;Así que a la primera pregunta es un SI, tu código en proyectos open source es posible, solo tenés que tener ganas, tiempo y hacerlo.&lt;/p&gt;

&lt;h3&gt;
  
  
  No es tan fácil!
&lt;/h3&gt;

&lt;p&gt;Bueno, claro que no, pero nunca te topaste con uno de esos issues bien difíciles hasta que lo sacaste?&lt;/p&gt;

&lt;p&gt;Bueno, es lo mismo, la diferencia es que posiblemente tenga el “síndrome del impostor”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F926%2F0%2AyKQQUkVVSfR4H6rW" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F926%2F0%2AyKQQUkVVSfR4H6rW"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Claro que existe, lo dice wikipedia.&lt;/p&gt;

&lt;p&gt;La verdad que a veces uno piensa que no esta “al nivel” de los que hacen “open source” pero la verdad es que si no empezás a hacer aunque sea cambios SUPER chiquitos, no vas a empezar nunca.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué necesito contribuir en open source?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F498%2F0%2AssFA3EJN4f0ZyXRn" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F498%2F0%2AssFA3EJN4f0ZyXRn"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta es una de las preguntas que me hicieron varias veces… Y creo que es la más fácil de responder de todas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vas a entender mejor la libreria/framework&lt;/li&gt;
&lt;li&gt;Vas a ayudar a otros desarrolladores&lt;/li&gt;
&lt;li&gt;Vas a tener una mejor vision del potencial de utilizar ese proyecto&lt;/li&gt;
&lt;li&gt;Vas a ayudar a las personas que te ayudan a vos (los mantainers)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;¡Aprendes una nueva forma de ayudar y mejorar tus habilidades!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;¿Cómo empiezo a colaborar?&lt;/p&gt;

&lt;p&gt;Esta es una pregunta tal vez un poco mas trabajosa (?) , bueno en realidad no, una vez que arrancas te vas a dar cuenta que es más fácil de lo que parece… pero para mí, las mejores formas de arrancar son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buscando en el proyecto los issues con label “good for first PR” / “community help”&lt;/li&gt;
&lt;li&gt;Busca algún mentor que haga OSS&lt;/li&gt;
&lt;li&gt;Busca la forma de comunicarte con el team que mantiene el proyecto&lt;/li&gt;
&lt;li&gt;No te avergüences por preguntar o por lo que estas haciendo&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Agradecer, no cuesta nada y alegra a muchos&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F480%2F0%2A5uhbsJVA1k2iKWg1" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F480%2F0%2A5uhbsJVA1k2iKWg1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cuando alguien te ayude o te de una mano, siempre tenes que ser agradecido, no te cuesta realmente nada… Y eso va a hablar bien de vos!&lt;/p&gt;

&lt;h4&gt;
  
  
  Espero que estos pequeños tips te sirvan para arrancar a colaborar con proyecto open source y lleves tus skills a otro nivel !!
&lt;/h4&gt;

&lt;p&gt;Como siempre, espero que les guste lo compartido y cualquier duda dejo mis canales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/@jorgeucano" rel="noopener noreferrer"&gt;Jorge Cano (@jorgeucano) | Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCdp9sM22GW5uIOaU9eZ7n6w" rel="noopener noreferrer"&gt;Jorge Cano&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saludos&lt;/p&gt;

</description>
      <category>community</category>
      <category>developer</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Atrévete, vos podes!</title>
      <dc:creator>Jorge Cano</dc:creator>
      <pubDate>Wed, 05 Dec 2018 12:46:19 +0000</pubDate>
      <link>https://dev.to/jorgeucano/atrevete-vos-podes-1h7m</link>
      <guid>https://dev.to/jorgeucano/atrevete-vos-podes-1h7m</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZaWUO2z---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/513/0%2AdeiF-RRGteJRPc9p" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZaWUO2z---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/513/0%2AdeiF-RRGteJRPc9p" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Muchas veces leo cosas de como la gente se “atreve” a hacer algo y me pone muy contento y ayer lei de dos personas de la comunidad de Buenos Aires que contaron sus perspectivas, de animarse a mas&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@MeliHildt/de-un-futuro-incierto-a-trabajar-de-lo-que-me-apasiona-7340245f35a7"&gt;De un futuro incierto a trabajar de lo que me apasiona&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@blayermatias/alguna-vez-pensaste-que-lo-que-tienes-para-contar-a-alguien-le-puede-interesar-c6a26502c06e"&gt;¿Alguna vez pensaste que lo que tienes para contar, a alguien le puede interesar?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y justo ayer charlando con otras personas de la comunidad me puse a pensar todo lo que me dio a mí la comunidad y no hablo solo de Buenos Aires o Argentina… hablo de la comunidad de todo el mundo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Esto no es “auto-bombo” no estoy “vendiendo” nada escondido, simplemente es una especie de descargo que hace tiempo tengo ganas de hacer&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tengo varios puntos de “quiebre” en situaciones específicas… pero me encantaría que cuando termines de leer esto, te pongas a pensar en que hizo la comunidad de vos y porque estas agradecido, y si te animas a escribirlo me encantaría leerlo..&lt;/p&gt;

&lt;p&gt;Voy a arrancar por el gran impulso de Google en todo esto, desde los GDG’s hasta los Experts…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Los GDG son Google Developers Group&lt;/strong&gt; (pero sin google) jejeje, que quiere decir esto, quiere decir que Google ayuda a un grupo de personas a tratar de “evangelizar” la tecnología con el espíritu de compartir… Seria como una meetup pero mas balanceada al mundo de la gran G.&lt;/p&gt;

&lt;p&gt;Y porque lo pongo primero, porque gracias a un GDG arranque con mi misión de compartir mas mis conocimientos (por muchos o pocos que sean) entendi que uno tiene que compartir lo que sabe, y ayudar a los demas, porque SIEMPRE PERO SIEMPRE todo vuelve.&lt;/p&gt;

&lt;p&gt;Pero no es tan solo compartir lo que aprendiste, si no que es conocer un monton de gente a tal punto de llamar amigos a mucho (esto es mas genial que aprender lo que sea)&lt;/p&gt;

&lt;p&gt;Por otro lado esta el programa de Experts, GDE o Google Developer Expert, es un programa para NO EMPLEADOS de Google, lo que quiere decir es que es solo para personas que NO TRABAJAN directa o indirectamente con Google, si no entendiste la indirecta hasta ahora “NO COBRAMOS UN CENTAVO”… Exacto, lo hacemos por amor a la comunidad :) … Ser GDE no te hace mejor que otro (somos todos iguales) lo que hace es que puedas tener mas visibilidad y eso conlleva la responsabilidad de AYUDAR MAS… Lo bueno de esto como mencione antes es que me hizo ponerme mas la camiseta de la comunidad (como se dice en Argentina, me puse la 10) y le dedique MAS tiempo todavía a la comunidad… Como les dije ser mas “visible” hizo que de cursos en las plataformas mas importantes de habla Hispana de “la internet” y que cada vez que escribo o hago un video tenga un impacto interesante… Pero como les dije no todo son números, pero si lo mas importante para mi son los Amigos alrededor del mundo, tengo muchos amigos que cada vez que veo (a veces solo 1 vez por año) hacen que esos momentos sean geniales, que no dormir, o tomarte 3 aviones, estar 1 hora esperando migración y trabajar a deshoras hagan que valga de verdad.&lt;/p&gt;

&lt;p&gt;Las meetups me dieron muchísimos amigos y momentos invaluables, cree NG-BAIRES con la idea de compartir mas de Angular, hoy en día, somos un grupo de amigos que llevan NG-BAIRES que van haciéndose tiempo para poder dar una charla o organizar la meetup para que siga viviendo mes a mes…&lt;/p&gt;

&lt;p&gt;Por otro lado esta MEETUPJS que es la meetup de Javascript de Buenos Aires, que ya tiene mas de 1900 personas en slack y tengo la suerte de llamar amigos a varios, pero lo importante es que se dedica a ser inclusiva y ayudar, sin importar sobre que preguntes…&lt;/p&gt;

&lt;p&gt;Y creo que por ultimo quiero hablar de la ng-conf, la conferencia mas grande de Angular en el mundo, que la hace la comunidad… esto me parece increíble y como esta formado todo me parece MAS GENIAL aun… entender que cada paso que dan esta totalmente revisado y se preocupan porque absolutamente todos puedan estar cómodos es muy difícil, a veces es difícil manejar a 5 personas, 1500 son muchas mas xD… Pero ahi entendí que hasta esta mal tener un lugar “separado” para los speakers, las personas que van a los eventos mejor dicho a TODOS nos gusta hablar con los speakers, organizadores, con todos… Hoy después de mucho ayudar, me dieron la oportunidad de ser uno de los nuevos organizadores y eso me puso realmente muy contento, estar tras escenario desde 6 meses antes, preparando todo para que las personas que vayan sientan que estuvo mejor que el año anterior, es algo que me esta motivando mucho…&lt;/p&gt;

&lt;p&gt;Escribo esto para que cuando estes leyendo esto, tengas ganas de compartir algo, animarte a mas…&lt;/p&gt;

&lt;p&gt;Criticas vas a tener siempre, cuesta mucho, pero uno tiene que entender cuales son constructivas y cuales no… Entonces las que no, aunque duelan a veces, hay que dejarlas pasar de largo. Ahora las criticas constructivas hay que tomarlas con mucho amor y entender que siempre se puede mejorar.&lt;/p&gt;

&lt;p&gt;Tenes ganas de preparar una charla te dejo un video que tal vez te ayude =&amp;gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/xisDuF-LMQ0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Tambien escribí algunos tips para preparar un CFP =&amp;gt; &lt;a href="https://medium.com/@jorgeucano/some-tips-to-create-a-wonderful-cfp-43b1058392ee"&gt;https://medium.com/@jorgeucano/some-tips-to-create-a-wonderful-cfp-43b1058392ee&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tenés ganas de escribir, hazlo, crear un perfil en medium es cuestión de un clic, no necesitas una mega web hecha por vos para eso, “just do it”.&lt;/p&gt;

&lt;p&gt;Tenés ganas de hacer un curso, graba tu pantalla, hacelo, iteralo, compartilo a amigos/colegas.&lt;/p&gt;

&lt;p&gt;Simplemente hazlo, te vas a sentir genial y la gente te lo va a agradecer!&lt;/p&gt;

&lt;p&gt;Creo que todo lo bueno y lo agradecido que estoy, es porque alguien me dio el espacio y me anime a un poquito mas… así que quiero que te animes a mas… y si me compartís en que te animaste voy a estar mas contento de ver que pudiste y saber que esto sirvió 😃&lt;/p&gt;

&lt;p&gt;Como siempre, espero que les guste lo compartido y cualquier duda dejo mis canales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/@jorgeucano"&gt;Jorge Cano (@jorgeucano) | Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCdp9sM22GW5uIOaU9eZ7n6w"&gt;Jorge Cano&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saludos&lt;/p&gt;

</description>
      <category>justdoit</category>
      <category>community</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Some tips to create a Wonderful CFP</title>
      <dc:creator>Jorge Cano</dc:creator>
      <pubDate>Thu, 22 Nov 2018 11:42:10 +0000</pubDate>
      <link>https://dev.to/jorgeucano/some-tips-to-create-a-wonderful-cfp-16d6</link>
      <guid>https://dev.to/jorgeucano/some-tips-to-create-a-wonderful-cfp-16d6</guid>
      <description>&lt;p&gt;Each year, ng-conf receives hundreds of proposals, and there is not enough space for all … That’s why having a good CFP is very important when submitting a proposal to speak at #ngconf2019 .&lt;/p&gt;

&lt;p&gt;The first thing I have to tell you is that there is not magic potion …&lt;/p&gt;

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

&lt;p&gt;But, there are a few good tips for making your CFP more striking and impressive. Here are just a few:&lt;/p&gt;

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

&lt;p&gt;It is very important that you understand what your “purpose” is for the talk, let’s see some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Explain specific functionality&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Show the library you were creating&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Talk about performance on X performance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, if you want to tell how cool your company is and what they do, it would be better to have your company sponsor, because the talks about “how cool is my company” are usually not selected.&lt;/p&gt;

&lt;p&gt;Now that you know what you want to talk about, you’re going to have to think about a title and a description for the talk … but we’re going in parts…&lt;/p&gt;

&lt;p&gt;Every year, ng-conf chooses a theme … if you have not seen it yet, for the #ngconf2019 the theme is going to be “space” … so if you are creative, hook your CFP with something of the theme. This could make it more attractive…&lt;/p&gt;

&lt;p&gt;Returning to the proposal, we should think about our description (Yes, the title is left for later)…&lt;/p&gt;

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

&lt;p&gt;Imagine that we want to talk about the “remoteness of a star” … Then we have the idea of the talk … now we should focus on “selling” it so that they choose it …&lt;/p&gt;

&lt;p&gt;There are many methods of “selling” our talk, but let’s see some interesting ones:&lt;/p&gt;

&lt;p&gt;“When you look at a star, have you ever thought about how far away it is?, Did you take into account the distance or the equipment that we would need to reach it? “&lt;/p&gt;

&lt;p&gt;Ask “interesting” questions that you will then answer in the talk. It is a good option to give an overview of what you want to cover in your talk …&lt;/p&gt;

&lt;p&gt;“SUPERREMOTESTAR is a mega-framework for research the best options for navigating to your favorite start, are you ready for arrive?”&lt;/p&gt;

&lt;p&gt;Another option is to say what you are going to do in a few words, so that reading it generates intrigue.&lt;/p&gt;

&lt;p&gt;There are many methods to write a CFP (it could be a university course), but the important thing is that it has a meaning. You are selling your talk for others to “buy” and be chosen among the few that can enter every year.&lt;/p&gt;

&lt;p&gt;You have the “idea”, the “Abstract”, and now it’s time to create your title…&lt;/p&gt;

&lt;p&gt;The first thing that catches the attention of a talk is the title, if the title is attractive, people will take the time necessary to read the abstract of the talk…&lt;/p&gt;

&lt;p&gt;This year, I gave a talk about “Angular Bazel and closure compiler”, of course, if I put this on my own and the organizer’s don’t know what Bazel is, it would not be attractive to them, so I called her “ABC: it is not the beginning of the alphabet “. After several iterations I end up calling my talk ABC: the new Alphabet for Angular “, and it was striking enough for the selectors of 4 different conferences to read the abstract and accept the talk …&lt;/p&gt;

&lt;p&gt;The point is, the title and the abstract must have absolute meaning between them both. An individually striking title and striking abstract do do not necessarily make them attractive together … this is important, to pivot between the title and the abstract so that they are a unique piece of art.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ABC, The new Alphabet for Angular&lt;/p&gt;

&lt;p&gt;Monorepos, Blazingly-fast localized builds, and highly optimized output bundles are no longer a dream reserved just for the dream teams — they are now a big-time reality in Angular.&lt;/p&gt;

&lt;p&gt;You are prepared for what is coming: Angular Bazel &amp;amp; Closure!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is an example of a CFP, which worked for me (not in all proposal), this does not mean that it is perfect or that yours should be like this, it is just an example … as mentioned at the beginning, there are no magic potions for this …&lt;/p&gt;

&lt;p&gt;Many CFP forms, allow us to write something “extra” outside of what is going to show to the public, this place is VERY IMPORTANT, here is where you can write a little more about your talk and also clear some doubts that may Get to bring your Title or abstract…&lt;/p&gt;

&lt;p&gt;So it is very important to do a little more in this section, remember to add everything you have in mind, if you have an example to show in the chat, add it there, for example =&amp;gt; “I’m going to show you how to make a migration to bazel in 5 minutes and every time I make a compilation takes 10x less than with the common method “, “create a karaoke machine and I want to make someone sing “… this will be known by you and the organizers ( who should know to help you in the preparation), BUT it will be a big surprise for those who see your talk, for example.&lt;/p&gt;

&lt;p&gt;It’s All About The Angular Baby — ng-rap — LIVE — Shai Reznik&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/vztUMbRARoo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Do you already have everything?&lt;/p&gt;

&lt;p&gt;Okay, so it’s time to push the button and send your proposal!!&lt;/p&gt;

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

&lt;p&gt;Good Luck and Enjoy creating your CFP&lt;/p&gt;

&lt;p&gt;Before leaving, I leave all the places for which it is possible to see what I’m doing, or just to be greeted =).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jorgeucano"&gt;Jorge Cano (@jorgeucano) | Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtube.com/channel/UCdp9sM22GW5uIOaU9eZ7n6w"&gt;Jorge Cano&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for read 👌&lt;/p&gt;

&lt;p&gt;JC&lt;/p&gt;

</description>
      <category>ngconf</category>
      <category>angular</category>
      <category>speakers</category>
    </item>
    <item>
      <title>Entendiendo Bazel</title>
      <dc:creator>Jorge Cano</dc:creator>
      <pubDate>Mon, 24 Sep 2018 11:52:01 +0000</pubDate>
      <link>https://dev.to/jorgeucano/entendiendo-bazel-11d5</link>
      <guid>https://dev.to/jorgeucano/entendiendo-bazel-11d5</guid>
      <description>&lt;p&gt;Para arrancar bazel es una herramienta que utiliza google para compilar TODOS sus códigos fuentes, basado en un mono-repo (lo que quiere decir es que todo el código de google se encuentra en un solo repositorio) Podes imaginarte cuanta cantidad de lineas de código, lenguajes y configuraciones distintas en un mismo repositorio.&lt;br&gt;&lt;br&gt;
Que locura no? Y nosotros a veces nos quejamos de tener alguna diferencia entre dev y producción xD …&lt;/p&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;vamos a hacer un pequeño parentesis en todo esto, imagino que se estaran preguntando porque en todo esto tenemos que entender:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;porque y para que sirve bazel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La realidad es que angular esta migrando sus funcionalidades hacia bazel, para que podamos mejorar en nuestros tiempos de desarrollo, transpilación y compilación. Tambien es importante entender que los equipos de google (que tienen alrededor de 600 apps realizadas con angular), no pueden usar el CLI porque usan bazel… pero hace poquitos días ya se pudo ver los primeros avances interesantes en este merge entre bazel y webpack… entonces para poder explicar como funciona lo demas, tienen que entender como funciona bazel.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;—&lt;/p&gt;

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

&lt;p&gt;El primer punto que tenemos que entender es que bazel se basa en una serie de conceptos y terminología que tenemos que ir aprendiendo.&lt;/p&gt;

&lt;p&gt;Bazel crea software a partir del código fuente organizado en un directorio llamado WORKSPACE. Los archivos de origen en el workspace están organizados en una jerarquía anidada de paquetes, donde cada paquete es un directorio que contiene un conjunto de archivos fuente relacionados y un archivo BUILD. El archivo BUILD especifica qué salidas de software se pueden generar a partir de la fuente.&lt;/p&gt;
&lt;h3&gt;
  
  
  Workspace
&lt;/h3&gt;

&lt;p&gt;Un Workspace es un directorio en su sistema de archivos que contiene los archivos de origen para el software que vamos a programar, así como enlaces simbólicos a directorios que contienen los resultados de compilación. Cada directorio del espacio de trabajo tiene un archivo de texto llamado WORKSPACE que puede estar vacío, o puede contener referencias a dependencias externas necesarias para construir los resultados.&lt;/p&gt;
&lt;h3&gt;
  
  
  Packages
&lt;/h3&gt;

&lt;p&gt;La unidad primaria de organización del código en un workspace es el paquete. Un paquete es una colección de archivos relacionados y una especificación de las dependencias entre ellos.&lt;/p&gt;

&lt;p&gt;Un paquete se define como un directorio que contiene un archivo llamado BUILD, que reside debajo del directorio de nivel superior en el espacio de trabajo. Un paquete incluye todos los archivos en su directorio, más todos los subdirectorios debajo de él, excepto aquellos que contienen un archivo BUILD.&lt;/p&gt;

&lt;p&gt;Por ejemplo, en el siguiente árbol de directorios hay dos paquetes, my/app y el sub-paquete my/app/tests. Tenga en cuenta que my/app/data no es un paquete, sino un directorio que pertenece al paquete my/app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/my/app/BUILD  
src/my/app/app.ts  
src/my/app/data/input.txt  
src/my/app/tests/BUILD  
src/my/app/tests/test.ts  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  targets
&lt;/h3&gt;

&lt;p&gt;Un package es un contenedor. Los elementos de un package se llaman targets. La mayoría de los targets son uno de los dos principales tipos, archivos y reglas. Además, hay otro tipo de targets, grupos de package, pero son mucho menos numerosos.&lt;/p&gt;

&lt;p&gt;Los archivos se dividen en dos tipos. Los archivos de origen generalmente se escriben por el esfuerzo de las personas y se registran en el repositorio. Los archivos generados, a veces llamados archivos derivados, no se incorporan, pero la herramienta de compilación los genera a partir de los archivos fuente de acuerdo con reglas específicas.&lt;/p&gt;

&lt;p&gt;El segundo tipo de target es la regla(rule). Una regla especifica la relación entre un conjunto de entrada y un conjunto de archivos de salida, incluidos los pasos necesarios para derivar los resultados de las entradas. Los resultados de una regla son siempre archivos generados. Las entradas a una regla pueden ser archivos fuente, pero también pueden ser archivos generados; en consecuencia, los resultados de una regla pueden ser las entradas a otra, lo que permite construir largas cadenas de reglas.&lt;/p&gt;

&lt;p&gt;Si la entrada a una regla es un archivo fuente o un archivo generado es en la mayoría de los casos no es importante; lo que importa es solo el contenido de ese archivo. Este hecho hace que sea fácil reemplazar un archivo fuente complejo con un archivo generado por una regla, como ocurre cuando la carga de mantener manualmente un archivo altamente estructurado se vuelve demasiado molesto, y alguien escribe un programa para derivarlo. No se requiere ningún cambio para los consumidores de ese archivo. Por el contrario, un archivo generado puede ser reemplazado fácilmente por un archivo fuente con solo cambios locales.&lt;/p&gt;

&lt;p&gt;Las entradas a una regla también pueden incluir otras reglas. El significado preciso de tales relaciones suele ser bastante complejo y dependiente del lenguaje o de la regla, pero intuitivamente es simple: una regla A de la biblioteca C ++ podría tener otra regla B de la biblioteca C ++ para una entrada. El efecto de esta dependencia es que los archivos de encabezado B están disponibles para A durante la compilación, los símbolos B están disponibles para A durante el enlace, y los datos de tiempo de ejecución de B están disponibles para A durante la ejecución.&lt;/p&gt;

&lt;p&gt;Una variante de todas las reglas es que los archivos generados por una regla siempre pertenecen al mismo paquete que la regla en sí; no es posible generar archivos en otro paquete. Sin embargo, no es raro que las entradas de una regla provengan de otro paquete.&lt;/p&gt;

&lt;p&gt;Los grupos de paquetes son conjuntos de paquetes cuyo propósito es limitar el acceso a ciertas reglas. Los grupos de paquetes se definen mediante la función package_group. Tienen dos propiedades: la lista de paquetes que contienen y su nombre. Las únicas formas permitidas de referirse a ellas son desde el atributo de visibilidad de las reglas o desde el atributo default_visibility de la función de paquete; no generan ni consumen archivos&lt;/p&gt;

&lt;h3&gt;
  
  
  Labels
&lt;/h3&gt;

&lt;p&gt;Todos los targets pertenecen exactamente a un package. El nombre de un target se llama su label, y una label típica en forma canónica se ve así:&lt;br&gt;&lt;br&gt;
&lt;code&gt;//my/app/main:app_binary&lt;/code&gt;&lt;br&gt;&lt;br&gt;
Cada label tiene dos partes, un *nombre de paquete* (*my/app/main*) y un nombre de destino (*app_binary*). Cada label identifica de manera única un objetivo. Las etiquetas a veces aparecen en otras formas; cuando se omiten los dos puntos, se supone que el nombre del objetivo es el mismo que el último componente del nombre del paquete, por lo que estas dos etiquetas son equivalentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//my/app  
//my/app:app

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los labels de formato corto como /my/app no deben confundirse con los nombres de los packages. Los labels comienzan con //, pero los nombres de los packages nunca lo hacen, por lo tanto my/app es el package que contiene //my/app. (Una idea errónea común es que //my/app se refiere a un package, o a todos los objetivos en un paquete; ninguno es verdadero).&lt;/p&gt;

&lt;p&gt;Dentro de un archivo BUILD, la parte del nombre del package del label puede omitirse y, opcionalmente, también los dos puntos. Entonces, dentro del archivo BUILD para el package my/app (es decir, //my/app:BUILD), los siguientes labels “relativos” son todos equivalentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//my/app:app  
//my/app  
:app  
app  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Es una cuestión de convención que los dos puntos se omiten para los archivos, pero se retienen para las reglas, pero no es significativo).&lt;/p&gt;

&lt;p&gt;Del mismo modo, dentro de un archivo BUILD, los archivos que pertenecen al package pueden ser referenciados por su nombre sin adornos relativo al directorio del paquete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generate.cc  
testdata/input.txt  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rules
&lt;/h3&gt;

&lt;p&gt;Una regla especifica la relación entre las entradas y las salidas, y los pasos para construir las salidas. Las reglas pueden ser de uno de muchos tipos o clases diferentes, que producen ejecutables compilados y bibliotecas, ejecutables de prueba y otros resultados compatibles, tal como se describe en Build Encyclopedia.&lt;/p&gt;

&lt;p&gt;Cada regla tiene un nombre, especificado por el atributo de nombre, de tipo cadena. El nombre debe ser un nombre de objetivo sintácticamente válido, como se especifica arriba. En algunos casos, el nombre es algo arbitrario, y más interesantes son los nombres de los archivos generados por la regla; esto es cierto de genrules. En otros casos, el nombre es significativo: para las reglas * _binary y * _test, por ejemplo, el nombre de la regla determina el nombre del ejecutable producido por la compilación.&lt;/p&gt;

&lt;p&gt;Cada regla tiene un conjunto de atributos; los atributos aplicables para una regla dada, y el significado y la semántica de cada atributo son una función de la clase de la regla; consulte Build Encyclopedia para obtener la lista completa de las reglas admitidas y sus atributos correspondientes. Cada atributo tiene un nombre y un tipo. Algunos de los tipos comunes que un atributo puede tener sone integer, label, list of labels, string, list of strings, output label, list of output labels.. No todos los atributos deben especificarse en cada regla. Los atributos forman así un diccionario de claves (nombres) a valores tipados opcionales.&lt;/p&gt;

&lt;p&gt;El atributo *srcs* presente en muchas reglas tiene el tipo “list of label”; su valor, si está presente, es una lista de etiquetas, cada una es el nombre de un objetivo que es una entrada a esta regla.&lt;/p&gt;

&lt;p&gt;El atributo de salida presente en muchas reglas tiene el tipo “list of outputs labels“; esto es similar al tipo del atributo srcs, pero difiere de dos maneras significativas. En primer lugar, debido a la invariabilidad de que los resultados de una regla pertenecen al mismo paquete que la regla en sí, las etiquetas de salida no pueden incluir un componente de paquete; deben estar en una de las formas “relativas” que se muestran arriba. En segundo lugar, la relación implicada por un atributo de etiqueta (ordinario) es inversa a la implícita en una etiqueta de salida: una regla depende de sus srcs, mientras que una regla depende de sus salidas. Los dos tipos de atributos de etiqueta asignan dirección a los bordes entre los objetivos, dando lugar a un gráfico de dependencia.&lt;/p&gt;

&lt;p&gt;Este gráfico acíclico dirigido sobre los objetivos se denomina “gráfico objetivo” o “gráfico de dependencia de compilación”, y es el dominio sobre el que opera la herramienta Bazel Query.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build file
&lt;/h3&gt;

&lt;p&gt;La sección anterior describía los packages, los targets y las labels, y el gráfico de dependencia de compilación en forma abstracta. En esta sección, veremos la sintaxis concreta utilizada para definir un package.&lt;/p&gt;

&lt;p&gt;Por definición, cada paquete contiene un archivo BUILD, que es un programa corto. La mayoría de los archivos BUILD parecen ser poco más que una serie de declaraciones de reglas de compilación; de hecho, el estilo declarativo se recomienda encarecidamente al escribir archivos BUILD.&lt;br&gt;&lt;br&gt;
Sin embargo, los archivos BUILD se evalúan usando un lenguaje imperativo, Skylark.&lt;/p&gt;

&lt;h4&gt;
  
  
  Declaring build rules
&lt;/h4&gt;

&lt;p&gt;Los archivos BUILD utilizan un lenguaje imperativo, por lo que, en general, el orden sí importa: las variables se deben definir antes de usarlas, por ejemplo. Sin embargo, la mayoría de los archivos BUILD constan solo de declaraciones de reglas de compilación, y el orden relativo de estas afirmaciones es irrelevante; lo único que importa es qué reglas se declararon, y con qué valores, cuando la evaluación del paquete finaliza. Por lo tanto, en los archivos BUILD simples, las declaraciones de reglas se pueden reordenar libremente sin cambiar el comportamiento.&lt;/p&gt;

&lt;p&gt;Se alienta a los autores de archivos BUILD a usar los comentarios generosamente para documentar el rol de cada objetivo de compilación, ya sea para uso público y cualquier otra cosa que ayude a los usuarios y a los futuros mantenedores, incluyendo un comentario en la parte superior, explicando el papel del paquete .&lt;/p&gt;

&lt;p&gt;La sintaxis de comentario de Python de # … es compatible. Los literales de cadena de comillas triples pueden abarcar varias líneas y se pueden usar para comentarios de varias líneas.&lt;/p&gt;

&lt;h4&gt;
  
  
  Types of build rule
&lt;/h4&gt;

&lt;p&gt;La mayoría de las reglas de compilación vienen en familias, agrupadas por idioma. Por ejemplo, cc_binary, cc_library y cc_test son las reglas de compilación para los binarios, las bibliotecas y las pruebas de C ++, respectivamente. Otros idiomas usan el mismo esquema de nombres, con un prefijo diferente, p. java_ * para Java. Estas funciones están documentadas en Build Encyclopedia.&lt;/p&gt;

&lt;p&gt;* *_binary Las reglas de binary crean programas ejecutables en un idioma determinado. Después de una compilación, el ejecutable residirá en el árbol de salida binaria de la herramienta de compilación con el nombre correspondiente para la etiqueta de la regla, por lo que //my:program aparecerá en (por ejemplo) $(BINDIR)/my/program.&lt;/p&gt;

&lt;p&gt;Dichas reglas también crean un directorio de archivos de ejecución que contiene todos los archivos mencionados en un atributo de datos que pertenece a la regla, o cualquier regla en su cierre transitivo de dependencias; este conjunto de archivos se reúne en un solo lugar para facilitar el despliegue a la producción.&lt;/p&gt;

&lt;p&gt;* *_test Las reglas de prueba son una especialización de una regla * _binary, usada para pruebas automatizadas. Las pruebas son simplemente programas que devuelven cero en el éxito.&lt;/p&gt;

&lt;p&gt;Al igual que los archivos binarios, las pruebas también tienen árboles de ejecución y los archivos que se encuentran debajo son los únicos archivos que una prueba puede abrir legítimamente en el tiempo de ejecución. Por ejemplo, un programa cc_test (name = ‘x’, data = [‘// foo: bar’]) puede abrir y leer $TEST_SRCDIR/workspace/foo/bar durante la ejecución. (Cada lenguaje de programación tiene su propia función de utilidad para acceder al valor de $ TEST_SRCDIR, pero todos son equivalentes al uso directo de la variable de entorno.) Si no se observa la regla, la prueba fallará cuando se ejecute en un host de prueba remoto .&lt;/p&gt;

&lt;p&gt;* *_library rules especifica los módulos compilados por separado en el lenguaje de programación proporcionado. Las bibliotecas pueden depender de otras bibliotecas, y los binarios y las pruebas pueden depender de las bibliotecas, con el comportamiento esperado de compilación independiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependencies
&lt;/h3&gt;

&lt;p&gt;Un target A depende de un target B si B es necesario por A en el tiempo de construcción o ejecución. El depende de la relación induce un gráfico acíclico dirigido (DAG) sobre los objetivos, y lo llamamos un gráfico de dependencia. Las dependencias directas de un objetivo son aquellos otros objetivos alcanzables por una ruta de longitud 1 en el gráfico de dependencia. Las dependencias transitivas de un objetivo son aquellos objetivos de los que depende a través de una ruta de cualquier longitud a través del gráfico.&lt;/p&gt;

&lt;p&gt;De hecho, en el contexto de construcciones, hay dos gráficos de dependencia, el gráfico de dependencias reales y el gráfico de dependencias declaradas. La mayoría de las veces, los dos gráficos son tan similares que no es necesario hacer esta distinción, pero es útil para la discusión a continuación.&lt;/p&gt;

&lt;h3&gt;
  
  
  Types of dependencies
&lt;/h3&gt;

&lt;p&gt;La mayoría de las reglas de compilación tienen tres atributos para especificar diferentes tipos de dependencias genéricas: srcs, deps y data. Estos se explican a continuación.&lt;/p&gt;

&lt;p&gt;Muchas reglas también tienen atributos adicionales para clases de dependencia específicas de reglas compiler, resources, etc. E&lt;/p&gt;

&lt;h4&gt;
  
  
  srcs
&lt;/h4&gt;

&lt;p&gt;Archivos consumidos directamente por la regla o reglas que generan archivos fuente.&lt;/p&gt;

&lt;h4&gt;
  
  
  deps
&lt;/h4&gt;

&lt;p&gt;Regla que apunta a módulos compilados por separado que proporcionan archivos de encabezado, símbolos, bibliotecas, datos, etc.&lt;/p&gt;

&lt;h4&gt;
  
  
  data
&lt;/h4&gt;

&lt;p&gt;Un target de compilación puede necesitar algunos archivos de datos para ejecutarse correctamente. Estos archivos de datos no son código fuente: no afectan cómo se construye el target. Por ejemplo, una prueba unitaria puede comparar la salida de una función con el contenido de un archivo. Cuando construimos la prueba unitaria, no necesitamos el archivo; pero lo necesitamos cuando hacemos la prueba. Lo mismo se aplica a las herramientas que se lanzan durante la ejecución.&lt;/p&gt;

&lt;p&gt;El sistema de compilación ejecuta pruebas en un directorio aislado donde solo están disponibles los archivos que figuran como “datos”. Por lo tanto, si un archivo binario / biblioteca / prueba necesita algunos archivos para ejecutarse, especifíquelos (o una regla de compilación que los contenga) en los datos.&lt;/p&gt;

&lt;p&gt;Aca dejo un ejemplo de como funciona en angular sin ningun tipo de “bridge” entre el CLI y Bazel….&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jorgeucano/ngx-bazel-ngrx-template"&gt;jorgeucano/ngx-bazel-ngrx-template&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el proximo post, voy a estar explicando como funciona Bazel con Angular y el angular CLI , así podemos empezar a sacarle provecho a esta magnifica combinación.&lt;/p&gt;

&lt;p&gt;Como siempre, espero que les guste lo compartido y cualquier duda dejo mis canales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/@jorgeucano"&gt;Jorge Cano (@jorgeucano) | Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCdp9sM22GW5uIOaU9eZ7n6w"&gt;Jorge Cano&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saludos&lt;/p&gt;

</description>
      <category>bazel</category>
      <category>monorepo</category>
      <category>angular</category>
    </item>
    <item>
      <title>From no-sql database to Firestore &amp; AngularFire</title>
      <dc:creator>Jorge Cano</dc:creator>
      <pubDate>Fri, 13 Jul 2018 13:20:04 +0000</pubDate>
      <link>https://dev.to/jorgeucano/from-no-sql-database-to-firestore-angularfire-k1j</link>
      <guid>https://dev.to/jorgeucano/from-no-sql-database-to-firestore-angularfire-k1j</guid>
      <description>&lt;h3&gt;
  
  
  From no-sql database to Firestore &amp;amp; AngularFire
&lt;/h3&gt;

&lt;p&gt;Have you ever thought that the unique querys format of firestore is unlike any other nosql …&lt;br&gt;&lt;br&gt;
Firestore is this super powerful database created by the Firebase team in google, but what happens when we want to migrate what we had in another database and we find that we handle state data, and these are not handled equally in query’s from firestore…&lt;/p&gt;

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

&lt;p&gt;Suppose we want to migrate from mongodb to firestore…&lt;/p&gt;

&lt;p&gt;And suppose that what we are migrating is a chat … a chat normally has data like who sends it, who receives it, and above all it has an important data, the famous double blue check, or rather the follow-up of read.&lt;/p&gt;

&lt;p&gt;Then we would have a structure similar to this one:&lt;/p&gt;

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

&lt;p&gt;With this format, we would have no problem in making an easy query to identify if it is true or false, reading them, because there are simply two states, if we want to see “the readings” we go to the ones that are true and the opposite for the “unread”…&lt;/p&gt;

&lt;p&gt;Let’s think about how to do the query:&lt;/p&gt;

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

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

&lt;p&gt;But there are more “states” that actually read or not read … We have to identify “by sending”, “sent”, “received / not-read”, “received / read”&lt;/p&gt;

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

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

&lt;p&gt;But, what would be the problem? It’s easy, I can add more “where” and filter by 2 or 3 diferentes “allRead”, yes in MongoDB, but in firestore NO&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qQcdvKRV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/500/1%2AChMf4j6WKQG0z7XTO4cnGw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qQcdvKRV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/500/1%2AChMf4j6WKQG0z7XTO4cnGw.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In firestore we would have to generate a structure of this type:&lt;/p&gt;

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

&lt;p&gt;So, are you telling me that I can not do the migration?&lt;/p&gt;

&lt;p&gt;Well actually if we want to keep the format of the data we will have to make some changes in our code…&lt;/p&gt;

&lt;p&gt;The first thing we could think about is to call the different functions and push in a general array:&lt;/p&gt;

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

&lt;p&gt;But, is this fine?&lt;br&gt;&lt;br&gt;
Is it the best way to do it?&lt;br&gt;&lt;br&gt;
does not exist something to not have to do so much code?&lt;br&gt;&lt;br&gt;
I’m repeating a lot the same …&lt;/p&gt;

&lt;p&gt;Thanks to RXJS and some small tricks, we will be able to improve our experience with AngularFire and Firestore&lt;/p&gt;

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

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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1mtHEBx0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/500/1%2AT-657J1OUtxKqgJs9whm3w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1mtHEBx0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/500/1%2AT-657J1OUtxKqgJs9whm3w.gif" alt=""&gt;&lt;/a&gt;RxJS my precious&lt;/p&gt;

&lt;p&gt;In this way, thanks to the data and data that comes from firestore, we will be able to make a fusion of data, and be able to show them completely, without thinking about how many things we have to do.&lt;/p&gt;
&lt;h4&gt;
  
  
  But how does it work?
&lt;/h4&gt;

&lt;p&gt;What we do is iterate the arrays and thus be able to work with the different returns, but what firestore actually delivers is an “observable” by which we send the data we requested in the query.&lt;br&gt;&lt;br&gt;
In this way with the switchMap we will be able to bring all the data of all the observables and in this way concatenate them.&lt;br&gt;&lt;br&gt;
Once all the data have been established in the same array, we will make the map to obtain the data of the collection plus the unique ID of each one and thus deliver it in our list, in order to work with the data correctly.&lt;/p&gt;

&lt;p&gt;Remember that the collection surely does not include all the real data that exists in a database of a real chat, but it is a way to explain how the differences in how we use a non-sql and Firestore.&lt;/p&gt;

&lt;p&gt;The function can be in:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Right now, you can migrate to firestore :) … enjoy it&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After more than 9 years working in the tech industry, Jorge is a full stack developer with focus on JavaScript technologies. Today, Jorge is working at ByteDefault using Angular / RxJS / Firebase / Nativescript as well as other technologies. He delivered several courses and talks as well as write some tech articles on these subjects. Because of that, he was recognised as a Google Developer Expert in Angular &amp;amp; web technologies and Nativescript Developer Expert.&lt;/p&gt;

&lt;p&gt;Before leaving, I leave all the places for which it is possible to see what I’m doing, or just to be greeted =).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jorgeucano"&gt;Jorge Cano (@jorgeucano) | Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtube.com/channel/UCdp9sM22GW5uIOaU9eZ7n6w"&gt;Jorge Cano&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for read 👌&lt;/p&gt;

&lt;p&gt;JC&lt;/p&gt;




</description>
      <category>angularfire</category>
      <category>firestore</category>
      <category>javascript</category>
      <category>nosql</category>
    </item>
  </channel>
</rss>
