<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Manu Castrillon</title>
    <description>The latest articles on Forem by Manu Castrillon (@manucastrillonm).</description>
    <link>https://forem.com/manucastrillonm</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%2F214377%2F92ad6496-a91a-4138-ba99-d894f5991afb.png</url>
      <title>Forem: Manu Castrillon</title>
      <link>https://forem.com/manucastrillonm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/manucastrillonm"/>
    <language>en</language>
    <item>
      <title>Lessons I learned as a GitHub Campus Expert</title>
      <dc:creator>Manu Castrillon</dc:creator>
      <pubDate>Tue, 21 Feb 2023 23:09:50 +0000</pubDate>
      <link>https://forem.com/manucastrillonm/lessons-i-learned-as-a-github-campus-expert-5c25</link>
      <guid>https://forem.com/manucastrillonm/lessons-i-learned-as-a-github-campus-expert-5c25</guid>
      <description>&lt;p&gt;More than a year ago, I finished college. With all the challenges and opportunities that this accomplishment means to my life, this also means that now I’ll be transitioning from &lt;strong&gt;GitHub Campus Expert&lt;/strong&gt; to &lt;strong&gt;GitHub Campus Expert Alumni&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;My time as a student wouldn’t have been the same without the communities' impact on my career. Thanks to the tech communities, I’ve had the opportunity to live unique experiences, travel to different countries, give talks at local and international events, meet people I deeply admire, and challenge myself numerous times; As a late closure of this stage of my life, I want to share with you some of the most memorable moments that I’ve had during this road and the lessons that I learned. Hopefully, they can also help you on your road.&lt;/p&gt;

&lt;p&gt;I joined a tech community for the first time (Pioneras Dev 🧡) in 2016 because a friend from University (Cami G 👩‍💻) invited me. I immediately felt so engaged that I attended a second and a third time, and then I started helping with small staffing tasks like helping with the snacks, organizing chairs, and the setup for the speaker. I gave my first talk and progressively acquired more responsibilities until becoming part of the organizing team, and then even created a community and organized events.&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%2Fcdlhqli47rjcx2d0bfj1.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%2Fcdlhqli47rjcx2d0bfj1.jpg" alt="Pioneras dev end of year celebration" width="750" height="563"&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%2F33xzhv3a7lxhrebe9a0y.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%2F33xzhv3a7lxhrebe9a0y.jpg" alt="Pioneras dev members" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This process helped me to learn not only about organizing tech events but also a more significant lesson that I apply in all my projects:&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ START SMALL
&lt;/h2&gt;

&lt;p&gt;Sometimes we get frustrated because we want to run big events and speak at huge conferences from the beginning, but &lt;strong&gt;starting with baby steps helps us build the confidence and skills needed to do it on a bigger stage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This also helped me when I was building my community at college; recruiting members for the organizing team is challenging. Still, when we start delegating small tasks to different people, they can gain the confidence to become leaders later.&lt;/p&gt;

&lt;p&gt;Two years later, I won a scholarship to participate in JSConf Europe in Germany; I was thrilled to have this opportunity, but at the same time, I was TERRIFIED because it was going to be my first international trip (I’m from Colombia); I was traveling alone, I don’t speak German, and I didn’t feel that my English was good enough to survive in a different country. Even with all the insecurities I had, I made this trip. It was a wonderful experience, and that’s when I learned that I could not let fear stop me.&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%2Fnht2ghjyhivdi9fh5gwy.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%2Fnht2ghjyhivdi9fh5gwy.jpg" alt="colombians at jsconf europe" width="640" height="480"&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%2Foackchfw5wbkonm3ms9o.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%2Foackchfw5wbkonm3ms9o.jpg" alt="friends at jsconf europe" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ DON’T LET FEAR STOP YOU
&lt;/h2&gt;

&lt;p&gt;If you feel afraid of doing something, &lt;strong&gt;just do it&lt;/strong&gt;. In the worst scenario, you are just going to learn how not to do something.&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%2F8q32gi793fb1fnfk7cey.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%2F8q32gi793fb1fnfk7cey.jpg" alt="picture at grace hopper celebration" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After returning from this event, I was so inspired that I decided to create a tech community at college to discuss web technologies. We didn’t do it right from scratch, made many mistakes, and needed to re-invent the community and iterate over what we were not doing right. Eventually, the work I was doing with this community allowed me to become a GitHub Campus Expert; it’s not possible to predict the future and the opportunities you are going to have as a consequence of the things you are building today; you should just do one thing at the time. And as we’ve probably heard a lot of times:&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ PROGRESS, NOT PERFECTION
&lt;/h2&gt;

&lt;p&gt;We often get stuck in certain areas just because we are afraid of not doing it right, and in the end, we make more progress doing one little thing every day than waiting a year to do a big one. If you want to create a course, organize an event, or speak in a meetup, just go for it, &lt;strong&gt;start one step at a time&lt;/strong&gt;, even if it’s not perfect, all the lessons you learn will help you improve it next time.&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%2F4wlix3z3enkgs2uyb1wu.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%2F4wlix3z3enkgs2uyb1wu.jpg" alt="speaking at pioneras dev" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And to close up, one of the biggest lessons that I’ve had, I learned even before starting in the tech industry, but I realized it years later: &lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ NEVER UNDERESTIMATE YOUR KNOWLEDGE
&lt;/h2&gt;

&lt;p&gt;In high school, we had a class about programming where we learned how to do basic HTML, not CSS, JS, or any kind of algorithms, just HTML. You don’t need to be a web expert to explain how to add a title and an image on a website, but this teacher completely changed my life because he opened my world to a career that I hadn’t even considered, and I feel I couldn’t have made a better choice for my career. &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%2Fd3l0y7l47z3dtae2ppti.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%2Fd3l0y7l47z3dtae2ppti.jpg" alt="speaking at pioneras dev" width="800" height="1199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So &lt;strong&gt;don’t let the impostor syndrome underestimate everything you know&lt;/strong&gt;; you don’t need to wait until feeling like an expert to share what you already know because some people don’t have that knowledge, and you can have a massive impact on their life by sharing it.&lt;/p&gt;

&lt;p&gt;And remember &lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ YOU ARE NOT ALONE
&lt;/h2&gt;

&lt;p&gt;There are companies, communities, and mentors willing to give you a hand. Programs like GitHub Campus Experts are great spaces to develop the necessary skills to become a better leader and exchange experiences. &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%2Fq352mjo67c0mgi42ddj3.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%2Fq352mjo67c0mgi42ddj3.jpg" alt="picture with friends in the github hq" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I definitely recommend GCE after being part of it, but there are different ambassador programs for students, and you can join the one that better suits your goals.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwaredevelopment</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How to become a GitHub Campus Expert and my experience in the program</title>
      <dc:creator>Manu Castrillon</dc:creator>
      <pubDate>Wed, 06 May 2020 17:16:45 +0000</pubDate>
      <link>https://forem.com/gh-campus-experts/how-to-become-a-github-campus-expert-and-my-experience-in-the-program-2bl4</link>
      <guid>https://forem.com/gh-campus-experts/how-to-become-a-github-campus-expert-and-my-experience-in-the-program-2bl4</guid>
      <description>&lt;h2&gt;
  
  
  What is GitHub Campus Experts?
&lt;/h2&gt;

&lt;p&gt;GitHub Campus Experts is a GitHub Education initiative focused on providing leadership and community skills to student leaders on their campuses. A GCE (GitHub Campus Expert) is a student with the ability to improve the technical skills of its community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌Note:&lt;/strong&gt; A GitHub Campus Expert is not a Git or GitHub expert or GitHub ambassador, that's a common misconception.&lt;/p&gt;

&lt;h3&gt;
  
  
  Responsibilities
&lt;/h3&gt;

&lt;p&gt;Our responsibility as GitHub Campus Experts is to build a strong technical community on our campuses. This can be achieved by running events, hackathons, meetings, workshops, study groups, or any other events where the students can improve their technical skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;p&gt;GitHub is always providing tools and content that can help us build a better community and become better leaders, that’s why we constantly have webinars and trainings to improve our technical and soft skills, led by people from the industry but also by Campus Experts (yes, we also share the knowledge amongst us). Another important part of the GCE journey is the events, where GitHub supports us with swag and budget, the devs are always motivated with cool swag and delicious food 😅 . We also learn about how to run good events by attending even bigger ones, for instance, we have the opportunity to attend the GitHub's global events such are GitHub Satellite and GitHub Universe.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to become a GCE
&lt;/h2&gt;

&lt;p&gt;Now, I want to tell you a bit about my process of becoming a GCE and my experience through it ✨.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;p&gt;To become a GCE you need to fulfill three requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To be studying at the university (I'm currently studying Software Engineering at Universidad de Antioquia).&lt;/li&gt;
&lt;li&gt;To be passionate about community building and technology (I'll tell you later about my campus community).&lt;/li&gt;
&lt;li&gt;To be at least 1 year away from your graduation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Application
&lt;/h3&gt;

&lt;p&gt;The first step is the online application. If you have the 3 requirements, you can fill the online application on &lt;a href="https://apply.githubcampus.expert/" rel="noopener noreferrer"&gt;GitHub's Education website&lt;/a&gt;. in this stage, you will be asked about some basic info related to your community and your motivation to be a GCE.&lt;/p&gt;

&lt;h3&gt;
  
  
  Online training
&lt;/h3&gt;

&lt;p&gt;The second stage is the online training, on your email, you will receive an invitation to join a GitHub repository where you will find up to 7 different training modules focused mostly on soft skills and questions about your community, after completing the training someone from the GitHub Staff will check your solutions and give advice if you have something to improve, this process normally takes from 2-3 revision before your training is ready to be merged. In my case, those rounds of review took around two weeks each, and the whole training process around 3 months (Right now, they are taking around 6 months).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌Note:&lt;/strong&gt; Take into account that a few months can pass between the application and the online training, due to the high number of applications it can take a while, so, be patient if you don't receive a quick answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Videochat
&lt;/h3&gt;

&lt;p&gt;The third and last stage is a zoom video call with the GCE program manager, this call is for you two to meet and to get to know more about you and your community. It's not an interview, so don't be nervous about tricky questions about Git 😅.&lt;/p&gt;

&lt;p&gt;And that's it, you are now ready to be a GitHub Campus Expert 🥳&lt;/p&gt;




&lt;p&gt;Now, I want to tell you more about my campus community and my experience being part of the program&lt;/p&gt;

&lt;h2&gt;
  
  
  My campus community: Codex
&lt;/h2&gt;

&lt;p&gt;Three years ago, after participating in some local tech communities in the city and experiencing the impact it had in our careers, a &lt;a href="https://twitter.com/YoQuinteroO" rel="noopener noreferrer"&gt;friend&lt;/a&gt; and I decided to bring those kinds of spaces to our university, where students can share what they know, and improve both their tech skills and soft skills. At the beginning of this journey, the biggest challenge was to motivate the students to participate as speakers (sometimes we have the false belief that we need to be experts in something to talk about it). My friend and I ended up being the speakers for almost all of the meetings during the first year 🤓. Later we obtained support from local companies, and really talented people from the industry came to share their knowledge and to inspire the students. Now, 3 years later, about 1 in every 5 software engineering students in the university is a part of this group.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Thanks to Codex I have known the wide experience of people from their personal and professional point of view, also some techniques that have helped me in programming, as well as different languages, workshops, exercises, challenges that make me love the infinite possibilities of the systems. Thanks Codex."&lt;/em&gt;&lt;br&gt;
Danny "Pacho" Hernandez&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I like Codex because it's a space where you can learn and share with your friends about everything about technology💻 , soft skills💬, Interviews👨🏻‍💻, and more. In codex we can communicate freely in a friendly environment☕. For me, the best part about it is everyone tries to improve their skills using what we learn during the meeting, and if you want to be a speaker the organizing team is always there to give you a hand! 🆘, to sum it up Codex is great! &lt;br&gt;
PST: The food is also great"&lt;/em&gt;&lt;br&gt;
Santiago Sanchez&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%2Fi%2Fj9szb1xlwndwypulo5gp.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%2Fi%2Fj9szb1xlwndwypulo5gp.png" alt="codex picture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My GCE journey
&lt;/h2&gt;

&lt;p&gt;I became a 🚩GitHub Campus Expert on march of 2019, and it has definitely been my best experience as a student. I've met a lot of smart and talented students from all continents, cultures, and tech backgrounds. Seeing what they do inspires me every day to keep moving forward on the tech community 💪.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/carlogilmar" rel="noopener noreferrer"&gt;Carlo&lt;/a&gt; is really good doing visual thinking, and summarizing tech events and conferences with drawings 🎨. His passion, has become a life project (with a really nice story behind it) called &lt;a href="https://www.instagram.com/visual_partner/" rel="noopener noreferrer"&gt;Visual Partnership&lt;/a&gt;. &lt;a href="https://twitter.com/juanpflores_" rel="noopener noreferrer"&gt;Juanpa&lt;/a&gt; runs an annual huge hackathon (~500 people) at his university 🧑‍💻. &lt;a href="https://twitter.com/imonsh" rel="noopener noreferrer"&gt;Fer&lt;/a&gt; rocks in all hackathons where she participates with her team "Bravers" 🏆, she also won the "Premio Estatal de la Juventud" (State youth award) in her city for the "academy and technology" category. Those are only a few examples from the amazing people from the GCE community. In total, we are ~200 around the globe, each one with an amazing story and different talents.&lt;/p&gt;

&lt;p&gt;During this time, I've run and supported different activities on my community, most of them focused on Women in Tech 👩🏻‍💻 with &lt;a href="https://twitter.com/pionerasdev" rel="noopener noreferrer"&gt;Pioneras Developers&lt;/a&gt;, &lt;a href="https://twitter.com/vuevixensCO" rel="noopener noreferrer"&gt;Vue Vixens&lt;/a&gt; and &lt;a href="https://twitter.com/SheCodesAngular" rel="noopener noreferrer"&gt;She Codex Angular&lt;/a&gt;.&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%2Fi%2Fm93hrfe2jlmny3zg2c7y.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%2Fi%2Fm93hrfe2jlmny3zg2c7y.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&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%2Fi%2Fzyc6135bz7pkxcjpv0mv.jpg" 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%2Fi%2Fzyc6135bz7pkxcjpv0mv.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&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%2Fi%2Fal1eqh38zqncwq8lne6f.jpg" 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%2Fi%2Fal1eqh38zqncwq8lne6f.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At my university, besides our regular meetings, we also have had workshops, we've learned about open source and how to contribute, online activities during quarantine, and of course... about git and GitHub.&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%2Fi%2Fii7smcrrza1b3gr41b3k.jpeg" 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%2Fi%2Fii7smcrrza1b3gr41b3k.jpeg" alt="second codex picture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can also support each others events, like &lt;a href="https://twitter.com/roeeyn" rel="noopener noreferrer"&gt;Rodrigo&lt;/a&gt;, who came from 🇲🇽Mexico to give a talk at Campus Party Colombia last year.&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%2Fi%2Fopjompgii0g4r4sy5tqj.jpg" 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%2Fi%2Fopjompgii0g4r4sy5tqj.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've also had the opportunity to participate in two GitHub's conferences, the first one, was GitHub Satellite, in Berlin, where I got to meet other campus experts for the first time. The day before the conference, we had a meetup where we shared different talks and had time to just hang out.&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%2Fi%2Fty2sn2bifqriw5tb3c3q.jpg" 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%2Fi%2Fty2sn2bifqriw5tb3c3q.jpg" alt="Alt Text"&gt;&lt;/a&gt;&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%2Fi%2Fggtaynsbwg7dq1wan24d.jpg" 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%2Fi%2Fggtaynsbwg7dq1wan24d.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second one was GitHub Universe, in San Francisco, where we attended the conference but we also had the chance to share some time on outings at night, after the event.&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%2Fi%2Fotq5glia4p1nhx5hcyzd.jpg" 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%2Fi%2Fotq5glia4p1nhx5hcyzd.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The day before the conference, we had the 'Diversity and inclusion' panel. There, I met the 'Octogatos' (Latinxs employes at GitHub), they invited me to the GitHub office, and we talked about Latinxs in the tech community.&lt;/p&gt;

&lt;p&gt;The day after the conference, we had the 'GitHub's Education Day' at the GitHub office, where we shared talks and shared time with some people from the GitHub Education Staff.&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%2Fi%2Fkgqihfem0fuasgx93n95.jpg" 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%2Fi%2Fkgqihfem0fuasgx93n95.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After this amazing experience I returned to my country, inspired and with new ideas, like running a &lt;a href="https://www.gitconf.co/#/" rel="noopener noreferrer"&gt;conference about Git&lt;/a&gt;, which next year will be a reality.&lt;/p&gt;

&lt;p&gt;This year, due to the pandemic situation GitHub Satellite was virtual, and we had an online watching party, where we watched the event together, and also had the opportunity to talk with some speakers and people from the GitHub Staff who joined the video call.&lt;/p&gt;

&lt;p&gt;Thanks to the GCE program, I also had the opportunity to attend Grace Hopper Conference, in Orlando - Florida, the biggest gathering of Women In Tech around the globe (~20000 people), during 3 days we attend talks, ranging from career development to quantum computing, events, dinners, and parties hosted by the event sponsors, and met a lot of female inspiring leaders from all the world 🌎.&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%2Fi%2Fkjcw62y1zk9ifvi6j260.jpeg" 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%2Fi%2Fkjcw62y1zk9ifvi6j260.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this time, I'm the only GCE in 🇨🇴Colombia, and one of my goals is to empower more young leaders. I hope this motivates you and I invite you to build a community, in and out of your campus.&lt;/p&gt;

&lt;p&gt;Hit me up if you have any questions about the program, or if I can help you build your community. ✨&lt;/p&gt;

</description>
      <category>github</category>
    </item>
    <item>
      <title>Reconocimiento de imágenes en la web utilizando TensorFlow.js</title>
      <dc:creator>Manu Castrillon</dc:creator>
      <pubDate>Fri, 01 May 2020 00:36:35 +0000</pubDate>
      <link>https://forem.com/manucastrillonm/reconocimiento-de-imagenes-en-la-web-utilizando-tensorflow-js-3gl5</link>
      <guid>https://forem.com/manucastrillonm/reconocimiento-de-imagenes-en-la-web-utilizando-tensorflow-js-3gl5</guid>
      <description>&lt;p&gt;De las primeras cosas que descubrí al empezar en el mundo del ML (Machine Learning) fue que además de la matemática, estadística y teoría que abarca esta área, también debo aprender un nuevo lenguaje de programación (Python) y sentí realmente abrumador toda esta cantidad de información que debía absorber. Investigando un poco mas, descubrí que en JavaScript hay herramientas con las que se puede lograr esto y hacer más amigable mi entrada al mundo del ML, y decidí explorar este camino, ya que JavaScript es un lenguaje que conozco, y así puedo enfocarme más en las bases teóricas (que es mi prioridad en este momento) y dejar en segundo plano aprender un nuevo lenguaje para aplicarlas.&lt;/p&gt;

&lt;p&gt;Spoiler… resulta que hacer ML con JavaScript tiene más ventajas a parte de hacerme la vida más fácil, pero hablaremos de eso mas adelante. 🤫&lt;/p&gt;

&lt;p&gt;En este post quiero mostrarles como con JavaScript, podemos reconocer e identificar imágenes en nuestro navegador haciendo uso de TensorFlow.js, así como las bases teóricas necesarias para lograrlo.&lt;/p&gt;

&lt;p&gt;Para empezar, debemos hablar sobre el modelo computacional sobre el cual construiremos este proceso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redes neuronales
&lt;/h2&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%2Fi%2Fi2e94l1om913dydufgfs.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%2Fi%2Fi2e94l1om913dydufgfs.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Son &lt;strong&gt;modelos computacionales que emulan el comportamiento del cerebro humano&lt;/strong&gt; (o por lo menos, como se creía hasta hace unos años que este funcionaba, porque el cerebro humano hasta ahora sigue siendo todo un misterio) para lograr aprender a resolver problemas computacionales el cual, con neuronas conectadas entre sí, refuerzan sus conexiones para lograr aprender a través de su experiencia, experiencia que se adquiere con los datos que se le entrega a la red para realizar el entrenamiento.&lt;/p&gt;

&lt;p&gt;Una red neuronal está conformada de la siguiente manera:&lt;/p&gt;

&lt;h3&gt;
  
  
  Neurona
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0pu25dimmcz4kyxsk260.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%2Fi%2F0pu25dimmcz4kyxsk260.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Son la unidad básica de construcción de una red neuronal.&lt;br&gt;
La neurona es una unidad que dadas ciertas entradas retorna una salida. Por ejemplo: si queremos saber si ganamos un curso, le podemos enviar a una neurona las calificaciones y si la nota final es mayor que 3, retorna 1 (ganamos la materia), de lo contrario, retorna 0.&lt;/p&gt;

&lt;h3&gt;
  
  
  Capa
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff9xgah2sjfekuaeon0ez.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%2Fi%2Ff9xgah2sjfekuaeon0ez.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una capa es un conjunto de neuronas, cada capa es capaz de reconocer patrones simples.&lt;/p&gt;

&lt;h3&gt;
  
  
  Red
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi2e94l1om913dydufgfs.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%2Fi%2Fi2e94l1om913dydufgfs.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La red neuronal es la unión de varias capas. Que trabajando en conjunto, son capaces reconocer patrones complejos.&lt;/p&gt;




&lt;p&gt;Ahora que sabemos cómo esta construida una Red Neuronal, podemos hablar del tipo de redes neuronales que nos sirven para abordar un problema de reconocimiento de imágenes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redes neuronales convolucionales
&lt;/h2&gt;

&lt;p&gt;Hoy trabajaremos con las redes neuronales que sirven para el reconocimiento y clasificación de imágenes, este tipo de red neuronal es llamado “Red neuronal convolucional” (CNN por sus siglas en inglés) y lo que tiene de especial este tipo de red es que &lt;strong&gt;asume que las entradas van a ser arreglos de grandes dimensiones, y esto le permite optimizar sus cálculos.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Por qué es esto necesario?
&lt;/h3&gt;

&lt;p&gt;Las imágenes son matrices de pixeles de colores representados en los canales RGB (por lo general, también podrían ser Grayscale, HSV, CMYK, entre otros) y cada uno de estos valores en los pixeles serán los parámetros de entrada para la red (número entre 0 y 255 para el caso de la representación RGB), así, si tenemos una imagen por ejemplo de 32px*32px, tendríamos un total de 3072 (32*32*3) parámetros, que es un número muy grande para una imagen tan pequeña, ahora imaginen procesar una imagen en alta definición (2048*1536*3) tendríamos una imagen de 9'437.814 parámetros por cada una de las imágenes, y esto, computacionalmente es un número muy difícil de manejar, entonces el objetivo de las CNN es reducir ese número de parámetros a través de la aplicación de filtros que extraigan características relevantes de la imagen, por ejemplo, pueden haber filtros encargados de extraer bordes, sombras, esquinas…etc&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%2Fi%2Fnah6fywt7bpjo229n7rp.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%2Fi%2Fnah6fywt7bpjo229n7rp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y se acuerdan que ya habíamos hablado de que las redes neuronales están formadas por capas? Pues para el caso de las redes neuronales convolucionales, las capas que la conforman pueden ser de 3 tipos diferentes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Capa de convolución
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6hcvr8v6zpvk213omx1c.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%2Fi%2F6hcvr8v6zpvk213omx1c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Son las capas que le dan el nombre a la red, y se lo merecen ya que son las que realizan el trabajo computacional más pesado, están directamente conectadas con las entradas y a través de una operación llamada convolución genera mapas de activación para reconocer la imagen.&lt;/p&gt;

&lt;p&gt;Estas capas también cuentan con una función de activación para reducir la linearidad de las imágenes (transición entre pixeles, bordes, colores…) y de esta manera aumentar su capacidad de generalización.&lt;/p&gt;

&lt;h3&gt;
  
  
  Capas de pooling
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzwp5qqoi50id5kldta8n.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%2Fi%2Fzwp5qqoi50id5kldta8n.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estas capas realizan un submuestreo de las entradas, por lo cual, su misión es disminuir la cantidad de parámetros disminuyendo así el volumen de la capa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Capas completamente conectadas
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8bvptvg8qniad6lxhsku.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%2Fi%2F8bvptvg8qniad6lxhsku.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Son capas en las que cada neurona esta conectada con todas las salidas de la capa anterior.&lt;/p&gt;

&lt;p&gt;Este es en realidad un acercamiento muy vago al funcionamiento de una red neuronal convolucional, ya que explicar toda la magia que en realidad sucede en estas redes tomaría incluso más de un post 😅, pero es lo necesario para entender lo que veremos a continuación.&lt;/p&gt;

&lt;p&gt;Y ahora que sabemos cómo reconocer una imagen (en la teoría), podemos conocer la herramienta que nos va a permitir hacerlo realidad haciendo uso de JavaScript.&lt;/p&gt;




&lt;h2&gt;
  
  
  TensorFlow
&lt;/h2&gt;

&lt;p&gt;TensorFlow es uno de las frameworks más usados para Machine Learning, donde &lt;strong&gt;la estructura básica de datos es el Tensor&lt;/strong&gt; (un tensor es una generalización para hablar de vectores y matrices), y se especializa en realizar operaciones matemáticas con ellos.&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%2Fi%2Fbxnrh1ns3tv995ytako2.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%2Fi%2Fbxnrh1ns3tv995ytako2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una aplicación de Machine Learning es el resultado de calcular de forma repetida operaciones matemáticas complejas, y en TensorFlow estas operaciones son representadas utilizando un grafo llamado &lt;strong&gt;“Data Flow Graph”&lt;/strong&gt; donde cada nodo del grafo representa una operación matemática y las esquinas representan tensores a los que le serán aplicadas estas operaciones.&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%2Fi%2Fr4k2w3kh403erm9vvluu.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%2Fi%2Fr4k2w3kh403erm9vvluu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto nos trae ventajas en cuanto a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paralelismo:&lt;/strong&gt; Utilizando relaciones de dependencias entre las operaciones, es más fácil para el sistema identificar aquellas que pueden ser ejecutadas en forma paralela.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ejecución distribuida:&lt;/strong&gt; Ya que las esquinas contienen lo valores explícitos para el flujo de trabajo, TensorFlow tiene la capacidad de dividir el programa entre múltiples dispositivos (CPUs, GPUs, TPUs) que pueden estar ligados a diferentes máquinas. TensorFlow se encarga también de agregar los canales de comunicación necesarios entre ellos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compilación:&lt;/strong&gt; El compilador de TensorFlow, puede utilizar información del grafo para generar código más rápido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portabilidad:&lt;/strong&gt; La representación de data flow graph es independiente del lenguaje, por lo cual, se puede construir por ejemplo en Python y ser guardado para abrirlo en otro lenguaje como C++.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TensorFlow.js
&lt;/h2&gt;

&lt;p&gt;Y como resulta que JavaScript es la lengua madre de la internet, pues no se podía quedar por fuera de la revolución del Machine Learning, y si, como ya se lo podían imaginar, también se puede desarrollar TensorFlow en JavaScript.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por qué utilizar TensorFlow en el navegador?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacidad de datos:&lt;/strong&gt; Ya que toda la información se va a manejar a través del navegador, la información no va a ser en ningún momento almacenada en servidores, esto nos ayuda mucho cuando nuestra aplicación hace uso de datos sensibles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplicaciones interactivas de baja latencia:&lt;/strong&gt; Debido a que no es necesario un canal de comunicación con el servidor, el tiempo de respuesta es menor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No es necesario instalar drivers adicionales&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interactividad con el usuario&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Computación en el dipositivo&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  API
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fksituewc1v7mk7h571fe.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%2Fi%2Fksituewc1v7mk7h571fe.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layers API:&lt;/strong&gt; Ofrece los diferentes tipos de capas con los cuales podemos construir nuestra red.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ops API:&lt;/strong&gt; Ofrece las diferentes operaciones que podemos aplicar a los tensores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TensorFlow.js ofrece 2 API, una para correr únicamente en el navegador y otra que se puede ejecutar desde Node.js:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browser:&lt;/strong&gt; Haciendo uso de WebGL, TensorFlow puede acceder a la GPU del computador y utilizar su capacidad de computo para realizar los cálculos necesarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server:&lt;/strong&gt; A través de Node.js se puede aprovechar la capacidad de cómputo de una CPU, GPU o TPU para realizar los cálculos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Manos a la obra
&lt;/h2&gt;

&lt;p&gt;Ahora, te voy a presentar 3 formas de implementar esto en el navegador con TensorFlow.js&lt;/p&gt;

&lt;h3&gt;
  
  
  CNN from scratch
&lt;/h3&gt;

&lt;p&gt;La primer forma es haciendo uso del API ‘Layers’ que ofrece TensorFlow.js con el cual puedes construir tu red neuronal desde cero, en este caso haremos nuestro ejemplo haciendo uso del dataset ‘Iris’ cuyo objetivo es reconocer el tipo de planta de una de las tres clases de plantas ‘Iris’ (setosa, versicolor o virginica) con base en el largo y grosor de sus pétalos.&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%2Fi%2Fgxz0ncsunbf81d760t93.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%2Fi%2Fgxz0ncsunbf81d760t93.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se importan las bibliotecas necesarias:&lt;/p&gt;

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

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tensorflow/tfjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;irisTraining&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./data/training.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;irisTesting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./data/testing.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Los datos se tranforman en tensores:&lt;/p&gt;

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

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trainingData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor2d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;irisTraining&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&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;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sepal_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sepal_width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;petal_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;petal_width&lt;/span&gt;
&lt;span class="p"&gt;]),[&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;testingData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor2d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;irisTesting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&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;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sepal_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sepal_width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;petal_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;petal_width&lt;/span&gt;
&lt;span class="p"&gt;]),[&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor2d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;irisTraining&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&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;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;species&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;setosa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;species&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;virginica&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;species&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;versicolor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Se construye la red neuronal haciendo uso del API ‘Layers’ de TensorFlow.js:&lt;/p&gt;

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

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sequential&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dense&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;inputShape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;activation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sigmoid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;units&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dense&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;inputShape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;activation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;softmax&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;units&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;categoricalCrossentropy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;optimizer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;train&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;adam&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;Se realiza el entrenamiento del modelo:&lt;/p&gt;

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

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;train_data&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
     &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trainingData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="nx"&gt;outputData&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="na"&gt;epochs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;train&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;train_data&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testingData&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Al ejecutar el script, obtenemos como resultado un tensor, el cual indica las probabilidades que cada elemento tiene de pertenecer a una clase&lt;/p&gt;

&lt;h3&gt;
  
  
  Modelos pre-entrenados
&lt;/h3&gt;

&lt;p&gt;TesnsorFlow.js ofrece una serie de modelos pre-entrenados listos para realizar predicciones o ser usados en un proceso de transfer learning.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PoseNet:&lt;/strong&gt; Estimación de poses del cuerpo humano.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BodyPix:&lt;/strong&gt; Segmentación de partes del cuerpo humano.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toxicity:&lt;/strong&gt; Calificación del impacto que puede causar un comentario.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Universal Sentence encoder:&lt;/strong&gt; Modelo para realizar procesamiento de lenguaje natural.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coco SSD:&lt;/strong&gt; Detección de objetos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speech commands:&lt;/strong&gt; Clasifica audios de un segundo dentro de una serie de palabras definidas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KNN Classifier:&lt;/strong&gt; Algoritmo de K vecinos mas cercanos para realizar transfer learning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MobileNet:&lt;/strong&gt; Clasificación de imagenes con las etiquetas de ImageNet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para este ejemplo, utilizaremos KNN Classifier y MobileNet para realizar un entrenamiento en el navegador.&lt;/p&gt;

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

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;classifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;knnClassifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;net&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mobilenet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;setupWebcam&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class-1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;addExample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class-2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;addExample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class-3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;addExample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addExample&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;classId&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;activation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;infer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;videoElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;conv_preds&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;classifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addExample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;activation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;classId&lt;/span&gt;&lt;span class="p"&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;A través de la cámara del dispositivo vamos a capturar imágenes, y cada que se presione un botón, se agregará una muestra de esa respectiva clase, con la cual se irá ajustando el modelo en tiempo real para realizar la predicción de esta misma.&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%2Fi%2Fkq3ykt9s6rzpoba2z7fh.gif" 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%2Fi%2Fkq3ykt9s6rzpoba2z7fh.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bibliotecas externas
&lt;/h3&gt;

&lt;p&gt;La tercer forma que te quiero presentar es haciendo uso de alguna api o biblioteca externa, en este caso haremos uso de &lt;a href="https://github.com/justadudewhohacks/face-api.js" rel="noopener noreferrer"&gt;FaceAPI&lt;/a&gt; una biblioteca para reconocimiento facial.&lt;/p&gt;

&lt;p&gt;Importación de la biblioteca:&lt;/p&gt;

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

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;defer&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"face-api.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Se cargan los modelos que vamos a utilizar:&lt;/p&gt;

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

&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="nx"&gt;faceapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tinyFaceDetector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadFromUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MODEL_URL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;faceapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;faceLandmark68Net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadFromUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MODEL_URL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;faceapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;faceRecognitionNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadFromUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MODEL_URL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;faceapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;faceExpressionNet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadFromUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MODEL_URL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setupWebcam&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Se realiza la detección y se dibujan los resultados en un elemento canvas en el navegador:&lt;/p&gt;

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

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;drawDetections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;displaySize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;faceapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matchDimensions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;videoElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;detections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;faceapi&lt;/span&gt;
                              &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detectAllFaces&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;videoElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;faceapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TinyFaceDetectorOptions&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                              &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withFaceLandmarks&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                              &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withFaceExpressions&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resizedDetections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;faceapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resizeResults&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;detections&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;displaySize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;clearRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;faceapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawFaceExpressions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resizedDetections&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;faceapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawFaceLandmarks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;detections&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;faceapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawDetections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;detections&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;100&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;&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%2Fi%2Fdgq1cmznv00jal8qh5bm.gif" 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%2Fi%2Fdgq1cmznv00jal8qh5bm.gif" alt="Alt Text"&gt;&lt;/a&gt;&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%2Fi%2F6okb54kwqr6recbh2bzz.gif" 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%2Fi%2F6okb54kwqr6recbh2bzz.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Puedes encontrar el código de los ejemplos realizados en este &lt;a href="https://github.com/ManuCastrillonM/cnn-in-the-browser" rel="noopener noreferrer"&gt;repositorio de GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.tensorflow.org/js" rel="noopener noreferrer"&gt;https://www.tensorflow.org/js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cs231n.github.io/" rel="noopener noreferrer"&gt;http://cs231n.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tensorflow.org/guide/graphs" rel="noopener noreferrer"&gt;https://www.tensorflow.org/guide/graphs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tensorflow.org/js/models" rel="noopener noreferrer"&gt;https://www.tensorflow.org/js/models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://itnext.io/realtime-javascript-face-tracking-and-face-recognition-using-face-api-js-mtcnn-face-detector-d924dd8b5740" rel="noopener noreferrer"&gt;https://itnext.io/realtime-javascript-face-tracking-and-face-recognition-using-face-api-js-mtcnn-face-detector-d924dd8b5740&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tensorflow</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Entendiendo la coerción en JavaScript</title>
      <dc:creator>Manu Castrillon</dc:creator>
      <pubDate>Thu, 30 Apr 2020 22:43:10 +0000</pubDate>
      <link>https://forem.com/manucastrillonm/entendiendo-la-coercion-en-javascript-22l8</link>
      <guid>https://forem.com/manucastrillonm/entendiendo-la-coercion-en-javascript-22l8</guid>
      <description>&lt;p&gt;JavaScript es un lenguaje extraño… En el podemos encontrar cosas como&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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="c1"&gt;//true&lt;/span&gt;
&lt;span class="c1"&gt;// pero...&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;    &lt;span class="c1"&gt;//false&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;//true&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;//2&lt;/span&gt;
&lt;span class="c1"&gt;// pero...&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;//"31"&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;NaN&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;NaN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;//false&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;    &lt;span class="c1"&gt;//"1,2,34,5,6"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;                  &lt;span class="c1"&gt;//"[object Object]"&lt;/span&gt;
&lt;span class="c1"&gt;// y como olvidarnos de&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// "baNaNa"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oY27le3C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yu3mhfpydcjcsf90mlyl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oY27le3C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yu3mhfpydcjcsf90mlyl.gif" alt="Alt Text" width="480" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pero… esto no es tan extraño como parece! No son bugs, ni detalles que dejaron pasar y tampoco nadie se quedó dormido sobre el teclado mientras escribía las especificaciones del lenguaje (eso espero 😅), todas estas cosas tienen sentido y suceden por algo llamado &lt;strong&gt;coerción.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En JavaScript, la coerción es una característica que &lt;strong&gt;fuerza a una variable de cierto tipo a tener el comportamiento de una diferente&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="dl"&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="c1"&gt;//2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este caso, el string "3" está siendo forzado a comportarse como un número para poder completar correctamente la operación matemática esperada.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Por qué necesitamos esto?
&lt;/h2&gt;

&lt;p&gt;JavaScript es un lenguaje débilmente tipado, eso quiere decir, que no tienes que especificar el tipo de variables porque el lenguaje va a inferirlo de manera automática. Esto también quiere decir, que el tipo de la variable va a estar asociado con su valor.&lt;/p&gt;

&lt;p&gt;Esto es también llamado &lt;strong&gt;“Duck typing”&lt;/strong&gt;. Este nombre viene de un test utilizado en razonamiento inductivo atribuido a James Whitcomb Riley que dice “Si camina como un pato y grazna como un pato, entonces debe ser un pato”, a lo que el autor se refiere con esto, es que podemos identificar la naturaleza de un objeto solamente observando sus características, y esto es justo lo que hacen los lenguajes de programación que permiten tipados dinámicos, donde solo debemos preocuparnos por lo que la variable va a hacer y no por su tipo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pM7Cypwo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/92tvjyf259o1w7cq35zs.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pM7Cypwo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/92tvjyf259o1w7cq35zs.gif" alt="Alt Text" width="500" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pero esto no es tan bueno en todos los escenarios, ya que podemos terminar haciendo cosas extrañas…&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;duck&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;peanuts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;duck&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;peanuts&lt;/span&gt;  &lt;span class="c1"&gt;// true + 10... WHAT!? 🤯&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para evitar arrojar errores en estos casos, como muchos otros lenguajes lo harían, JavaScript establece a través de la coerción algunas reglas para manejar estos escenarios.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UqBiFrKT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6ic27stw04hqbffnw9io.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UqBiFrKT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6ic27stw04hqbffnw9io.png" alt="Alt Text" width="420" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Operador de igualdad (==)
&lt;/h2&gt;

&lt;p&gt;Este operador compara los valores que hay al lado izquierdo y derecho de el, cuando son del mismo tipo compara los valores y de ser iguales retorna &lt;code&gt;true&lt;/code&gt; y de lo contrario &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cuando al utilizar este operador se tengan a ambos lados de la operación diferentes tipos de datos, el comportamiento será:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;x&lt;/th&gt;
&lt;th&gt;y&lt;/th&gt;
&lt;th&gt;resultado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;undefined&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;undefined&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;x == toNumber(y)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;toNumber(x) == y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;any&lt;/td&gt;
&lt;td&gt;toNumber(x) == y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;any&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;x == toNumber(y)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;string, number, or symbol&lt;/td&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;x == toPrimitive(y)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;string, number, or symbol&lt;/td&gt;
&lt;td&gt;toPrimitive(x) == y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;otros casos&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ejemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;              &lt;span class="c1"&gt;//true&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;one&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;            &lt;span class="c1"&gt;//false&lt;/span&gt;
&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;             &lt;span class="c1"&gt;//true&lt;/span&gt;
&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zero&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;       &lt;span class="c1"&gt;//false&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;//false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puedes encontrar mas información en la &lt;a href="https://www.ecma-international.org/ecma-262/#sec-abstract-equality-comparison"&gt;especificación de ECMA&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Operador de adición (+)
&lt;/h2&gt;

&lt;p&gt;Al utilizar el operador de adición, si ambos lados de la operación son números, se realizará la operación matemática suma, de lo contrario, se concatenarán los valores de ambos lados como Strings.&lt;/p&gt;

&lt;p&gt;Ejemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                       &lt;span class="c1"&gt;//2&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;                     &lt;span class="c1"&gt;//11&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;          &lt;span class="c1"&gt;//"hello world"&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;It's &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;              &lt;span class="c1"&gt;//"It's true"&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pizza&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;cheese&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;extra&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;//"pizza [object Object]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puedes encontrar mas información en la &lt;a href="https://www.ecma-international.org/ecma-262/#sec-addition-operator-plus"&gt;especificación de ECMA&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Operador de sustracción (-)
&lt;/h2&gt;

&lt;p&gt;Este operador siempre realizará la operación matemática restar, en el caso de que ambos lados no sean números, los strings y booleans son convertidos a números y se realiza la operación matemática, en otros casos el resultado será NaN (Not a Number).&lt;/p&gt;

&lt;p&gt;Ejemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;      &lt;span class="c1"&gt;//1&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;    &lt;span class="c1"&gt;//1&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;   &lt;span class="c1"&gt;//2&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;//NaN&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fun&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="c1"&gt;//NaN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puedes encontrar mas información en la &lt;a href="https://www.ecma-international.org/ecma-262/#sec-subtraction-operator-minus"&gt;especificación de ECMA&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Truthy y Falsy
&lt;/h2&gt;

&lt;p&gt;Un valor &lt;strong&gt;truthy&lt;/strong&gt; es aquel que evaluado en un contexto booleano da como resultado true, del mismo modo, un valor &lt;strong&gt;falsy&lt;/strong&gt; es aquel que evaluado en un contexto booleano da como resultado false, en JavaScript todos los valores son true excepto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;false&lt;/li&gt;
&lt;li&gt;0&lt;/li&gt;
&lt;li&gt;""&lt;/li&gt;
&lt;li&gt;''&lt;/li&gt;
&lt;li&gt;null&lt;/li&gt;
&lt;li&gt;undefined&lt;/li&gt;
&lt;li&gt;NaN&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Casos especiales: Objetos
&lt;/h2&gt;

&lt;p&gt;En JavaScript también nos encontramos con esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;   &lt;span class="c1"&gt;//[object Object]&lt;/span&gt;
&lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;   &lt;span class="c1"&gt;//0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Probablemente despues de leer las reglas de coerción del operador de adición sigas sin entender porque sucede esto, y es porque este es un caso especial.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Primer caso:&lt;/strong&gt; &lt;code&gt;[] + {}&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;({})&lt;/span&gt; &lt;span class="c1"&gt;//Ambos lados de la operación son      convertidos a string para ser concatenados&lt;/span&gt;
&lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[object Object]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="c1"&gt;//Se concatenan los resultados&lt;/span&gt;
&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[object Object]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;       &lt;span class="c1"&gt;//Valor resultante&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Segundo caso:&lt;/strong&gt; &lt;code&gt;{} + [] = 0&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;En este caso, lo que sucede es que los brackets vacíos al inicio &lt;code&gt;{}&lt;/code&gt; son interpretados como bloque de código vacío, por lo cual son ignorados por JS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;                   &lt;span class="c1"&gt;//JS ignora el lado izquierdo de la operación&lt;/span&gt;
&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;            &lt;span class="c1"&gt;//El lado restante es convertido a número&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;                     &lt;span class="c1"&gt;//Valor resultante&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;La coerción es una de las características mas curiosas de JavaScript y la considero de gran importancia para aprender ya que hay resultados que muchas veces no sabemos como explicar y podemos pasar mucho tiempo pensando que es un error en la lógica de nuestro código, cuando en realidad, es una característica del lenguaje.&lt;br&gt;
Y finalmente… JavaScript no es tan raro después de todo ✨&lt;/p&gt;
&lt;h2&gt;
  
  
  Reto
&lt;/h2&gt;

&lt;p&gt;Deja en los comentarios cuales de las siguientes lineas de código van a ser mostradas (no se vale utilizar la consola 😅).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pizza&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cheese&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Spaghetti&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Yogurt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Carrot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="o"&gt;!&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bunny&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="o"&gt;==&lt;/span&gt; &lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Panda&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;"&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="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Salt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="dl"&gt;''&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cookie&lt;/span&gt;&lt;span class="dl"&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;h3&gt;
  
  
  Referencias:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ecma-international.org/ecma-262/"&gt;https://www.ecma-international.org/ecma-262/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.etnassoft.com/2011/04/06/coercion-de-datos-en-javascript/"&gt;http://www.etnassoft.com/2011/04/06/coercion-de-datos-en-javascript/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hackernoon.com/understanding-js-coercion-ff5684475bfc"&gt;https://hackernoon.com/understanding-js-coercion-ff5684475bfc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://2ality.com/2012/01/object-plus-object.html"&gt;http://2ality.com/2012/01/object-plus-object.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>coercion</category>
    </item>
    <item>
      <title>React Hooks 101</title>
      <dc:creator>Manu Castrillon</dc:creator>
      <pubDate>Thu, 30 Apr 2020 21:28:34 +0000</pubDate>
      <link>https://forem.com/manucastrillonm/react-hooks-101-51co</link>
      <guid>https://forem.com/manucastrillonm/react-hooks-101-51co</guid>
      <description>&lt;p&gt;El pasado 25 de octubre durante &lt;a href="https://www.youtube.com/watch?v=dpw9EHDh2bM"&gt;React conf&lt;/a&gt; Dan Abramov y Sophie Alpert anunciaron una nueva propuesta para react: ‘React Hooks’. así como un &lt;a href="https://github.com/reactjs/rfcs/pull/68"&gt;RFC&lt;/a&gt; (Request for comments) para esta misma propuesta, con la cual el objetivo es que los desarrolladores de React después de leer la propuesta y experimentar con ella, brinden su retroalimentación.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué está mal con React?
&lt;/h2&gt;

&lt;p&gt;La propuesta de React Hooks busca abordar 3 problemas que tiene React:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Reutilización de la lógica entre componentes
&lt;/h3&gt;

&lt;p&gt;Para solucionar este problema, inicialmente se propusieron los mixins, que &lt;a href="https://reactjs.org/blog/2016/07/13/mixins-considered-harmful.html"&gt;fueron deprecados&lt;/a&gt; en 2016 porque causaba más problemas de los que estaban resolviendo. En este momento, para solucionar este problema se utilizan utilizan 2 estrategias: ‘High order components’ que lo que hacen básicamente es tener un componente contenedor el cual contiene otros componentes, la función del componente contenedor es enviarle a los componentes que contiene el estado que necesitan para su renderización; la otra alternativa es ‘Render props’ que lo que permite es compartir información entre componentes enviando funciones como props.&lt;/p&gt;

&lt;p&gt;Estas alternativas implican agregar mucho código a la aplicación e incluso modificar la estructura del proyecto y como consecuencia, también nos forman un ‘Wrapper Hell’ por la cantidad de componentes que toca anidar para lograr compartir la lógica que queremos.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Componentes gigantes
&lt;/h3&gt;

&lt;p&gt;La lógica suele no estar distribuida coherentemente, en un mismo método del ciclo de vida podemos tener varias líneas de código de lógica que no tiene nada que ver una con la otra y la lógica que si está directamente relacionada, termina estando repartida entre diferentes métodos.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Uso de clases
&lt;/h3&gt;

&lt;p&gt;Para aprender react debemos también aprender cómo funcionan las clases en Javascript (esto implica también el funcionamiento de this), lo cual le agrega más complejidad al proceso de aprendizaje. Y no solo es difícil para las personas... para las máquinas también es difícil aprender clases, porque cuando deben minificar el código no lo hacen de la mejor manera.&lt;/p&gt;

&lt;p&gt;Otro problema a la hora de desarrollar es que no tenemos claro cuándo desarrollar function components (stateless) o class components (stateful), porque si desarrollamos un function component y en algún momento del desarrollo surge la necesidad de que tenga estado, lo debemos refactorizar totalmente para convertirlo en clase, y para evitarnos la fatiga… terminamos dejando todos nuestros componentes como clases.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo lo solucionamos?
&lt;/h2&gt;

&lt;p&gt;Este problema es causado porque la forma más simple que tiene React para manejar un componente que tenga estado es usando clases (y ya vimos que hacerlo de esta forma nos puede generar problemas en algunos casos).&lt;/p&gt;

&lt;p&gt;Para solucionar estos problemas… llegan 🥁 &lt;strong&gt;Hooks&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Que son los Hooks?
&lt;/h2&gt;

&lt;p&gt;Los Hooks son funciones que permiten organizar la lógica en los componentes de forma aislada y ‘engancharlos’ al estado y ciclo de vida del componente. Estos, nos permiten utilizar todos los features de react y tener componentes con estado sin necesidad de crear clases.&lt;/p&gt;

&lt;p&gt;React provee algunos Hooks, pero nosotros también podemos crear nuestros nuestros propios Hooks personalizados.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuales Hooks provee React?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hooks básicos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;useState:&lt;/strong&gt; Retorna un valor con estado y una función para actualizarlo.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;newToDo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setNewToDo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;updateNewToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;setNewToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;useEffect:&lt;/strong&gt; Recibe una función que va a ser ejecutada cada vez que hay cambios en el DOM.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;toDoList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setToDoList&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Eat healthy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pet my dog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="nx"&gt;useEffect&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;toDoList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; tasks`&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;useContext:&lt;/strong&gt; Recibe el objeto retornado por React.createContext y retorna el contexto actual.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hooks adicionales
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;useReducer&lt;/li&gt;
&lt;li&gt;useCallback&lt;/li&gt;
&lt;li&gt;useMemo&lt;/li&gt;
&lt;li&gt;useRef&lt;/li&gt;
&lt;li&gt;useImperativeMethods&lt;/li&gt;
&lt;li&gt;useMutationEffect&lt;/li&gt;
&lt;li&gt;useLayoutEffect&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hooks personalizados
&lt;/h3&gt;

&lt;p&gt;También podemos crear nuestros propios Hooks compartir su lógica entre componentes 🙌&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// function component&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;ToDoApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;newToDo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setNewToDo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;magicNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useMagicNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newToDo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// custom hook&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;useMagicNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;param&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setNumber&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getMonth&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="nx"&gt;useEffect&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;setNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;param&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;day&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;month&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;12.34&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;number&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;h3&gt;
  
  
  Reglas de los Hooks 👮‍♂️
&lt;/h3&gt;

&lt;p&gt;Para poder utilizar los Hooks hay que seguir un par de reglas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solo llama a los Hooks en el ‘Top Level’ del componente, no los llames en ciclos, condicionales, o funciones anidadas, esto asegura que los Hooks se van a llamar siempre en el mismo orden cuando la aplicación es renderizada.
🙅🏻‍♀️:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&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;id&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;superValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSuperValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&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;ul&gt;
&lt;li&gt;Llama a los Hooks solo desde function components o custom Hooks
🙅🏻‍♀️:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Search&lt;/span&gt; &lt;span class="nx"&gt;extend&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;superValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSuperValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;ul&gt;
&lt;li&gt;Al crear un custom hook, su nombre siempre debe iniciar con la palabra ‘use’
🙅🏻‍♀️:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;myCustomHook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;param&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&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;&lt;em&gt;Recomendación:&lt;/em&gt; Utilizar &lt;em&gt;eslint-plugin-react-hooks&lt;/em&gt; un plugin para eslint que te obliga a seguir las reglas anteriormente mencionadas. Para el caso de la tercera regla, lo que hace el plugin es asumir que todas las funciones que inician con use son hooks.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuándo utilizar Hooks?
&lt;/h2&gt;

&lt;p&gt;Las clases van a continuar existiendo en React y no hay planes de deprecarlas, ambos tipos de componentes pueden coexistir sin ningún problema en la misma aplicación. La recomendación es empezar a utilizar Hooks en todos nuestros nuevos componentes, no se recomienda reescribir los componentes antiguos ya que puede ser un poco confuso migrar la lógica, además, debemos tener en cuenta el hecho de que los Hooks aún se encuentran en versión alpha y podrían tener algunos cambios.&lt;/p&gt;

&lt;p&gt;Hooks aún no cumple con todos los casos de uso que podría tener un componente de React ni tiene equivalentes para algunos métodos del ciclo de vida, sin embargo, ya están trabajando en esto y la visión es que a futuro los hooks puedan reemplazar todos los métodos del ciclo de vida. Para el caso de HOC y Render props, siguen siendo útiles para trabajar algunos casos de uso muy concretos, pero la mayoría de ellos ya es posible hacerlos con Hooks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7ItVtDVh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/imcrni2p8gbrod1s94f3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7ItVtDVh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/imcrni2p8gbrod1s94f3.jpeg" alt="Alt Text" width="700" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para finalizar… Yo no tengo mucha experiencia desarrollando en React (apenas estoy aprendiendo) y siento que se me ha hecho sencillo aprenderlo utilizando Hooks, para quienes llevan más tiempo manejando React, no se que tan brusco será el cambio, pero personalmente me gusta el concepto de encapsular toda la lógica que esta relacionada porque considero que es lo más limpio a la hora de hacer código, haciéndola mas fácil de reutilizar y testear.&lt;/p&gt;

&lt;p&gt;Me gustaría conocer su experiencia de cómo fue cambiar de class components a hooks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recursos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/docs/hooks-intro.html"&gt;Documentación de React Hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/reactjs/rfcs/pull/68"&gt;React Hooks RFC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>hooks</category>
      <category>web</category>
    </item>
    <item>
      <title>Diversity and inclusion issues in Colombia… What are we doing? ✨</title>
      <dc:creator>Manu Castrillon</dc:creator>
      <pubDate>Thu, 30 Apr 2020 00:59:18 +0000</pubDate>
      <link>https://forem.com/manucastrillonm/diversity-and-inclusion-issues-in-colombia-what-are-we-doing-2g3f</link>
      <guid>https://forem.com/manucastrillonm/diversity-and-inclusion-issues-in-colombia-what-are-we-doing-2g3f</guid>
      <description>&lt;p&gt;When I was in high school, I used to play music. More specifically, the percussion instruments and those are instruments played mostly by men. During the four years that I was in bands and orchestras, I was the only girl in the percussion section. Later, in University, I decided to study Software Engineering, where the proportion of women and men is very similar to the one I used to see in my music lessons. This time I wasn’t the only girl studying that, but the women were fewer than men. Since I began university, I always have been considered myself very feminist and empowered, but there’s a comment that I used to say to my friends “It seems that I like boy things.” (🤦‍♀️) A few years later, I realized that that’s not true — that these things (and all things) are for everyone. But culturally, what can we do to make all things, for everyone?&lt;/p&gt;

&lt;p&gt;So, let’s start by talking about diversity and inclusion. Diversity is to gather a lot of distinct people, for example for their nationalities, gender, sexual orientation, religion, the way to dress, to think, to get involved, etc. But, in my opinion, this word should always be balanced with the word ‘inclusion’. As a quote by Verna Myers says, “Diversity is being invited to the party; inclusion is being asked to dance.” So, bearing that in mind, diversity and inclusion is not just the gathering of diverse people, it is that all people are accepted and included. The real challenge is not to have a party, it’s to dance with everyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But… why is diversity important in the tech industry? 🤷‍♀️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The people who work in tech are constantly building solutions that could impact a lot of people, and all people are very different, so, if we have different people with diverse perspectives building a solution, we can create products with everyone in mind. If I don’t have an idea of your problems and context, it’s hard create a solution adjusted to your needs, we don’t have anything against white American men (that’s ridiculous) it’s just that &lt;strong&gt;to build a world for EVERYONE we need to listen to EVERYONE.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nobody who is reading this will be surprised if I write that women are a minority in tech, or the fact that in many spaces people are working on efforts to promote diversity. But, would you believe me if I say that today I’ll tell you the solution to all diversity issues worldwide? Hmm…. Definitely Not… All countries and cultures are facing different challenges and difficulties, for instance, it’s not the same to talk about feminism in Canada or Afghanistan or to talk about homosexuality in France or Saudi Arabia where being gay can be punishable by the death penalty because it’s something considered immoral.&lt;/p&gt;

&lt;p&gt;But I won’t write about these countries today. Today, I’ll tell you about Colombia, the country where I was born and where unfortunately the socioeconomic status of your family can almost determine your future, because the social gap is huge. In fact, according to the World Bank it’s the second country with the highest social gap in Latin America and the fourth in the world. If I had been born, for example, in the Guajira, the second poorest region in Colombia (according to the DANE’s 2017 white paper on poverty in Colombia) where the kids have so few opportunities that they are actually dying by malnutrition, the probabilities to be who I am (professionally), are so few. The big boundary that I have been identifying in my country for people to enter the tech industry is the lack of opportunities to access education. Only the people with enough money can pay for professional education. We have public universities and they are excellent, but the capacity is really limited. For example, in 2012 when I did the exam to be accepted at public university, I was competing with 1187 people and only 95 of us were admitted. If you go deeper, the people that have higher chances to do well on entrance exams are those who received a good basic education and these people tend to come from private high schools because public high schools are not so good. We have private universities too, but they are really expensive and families acquire huge debts to pay tuition. As a consequence, in Colombia, only 48% of young people (between 18 and 24 years old) go to university and it’s estimated that only 50% of these people will finish their studies.&lt;/p&gt;

&lt;p&gt;Related to education, the Colombian tech communities are doing the following actions:&lt;/p&gt;

&lt;h2&gt;
  
  
  ColombiaDev 🇨🇴
&lt;/h2&gt;

&lt;p&gt;We have a mostly self-managed tech online community, gathering on Slack more than 1300 Colombian developers ready to share their knowledge, and for almost any topic, you will find someone that will help you, from technical topics to job offers, languages and mental health. This Slack has a strict code of conduct, whose purpose is to provide a friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof).&lt;/p&gt;

&lt;h2&gt;
  
  
  Inclusive Meetups
&lt;/h2&gt;

&lt;p&gt;One of the first tech communities in Colombia was BogotaJS, founded in 2011. A year later,MedellinJS was created, followed by the creation of other communities such as Google Developer Group, React, Vue, Pioneras Dev, QuibdoJS, Angular Med, Codies, and Python among others. These are some actions that the inclusive meetups are doing to promote the inclusion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All our meetups are free so they are accessible for a lot of people.&lt;/li&gt;
&lt;li&gt;All our meetups have a strict code of conduct, most of them are using the ColombiaDev code of conduct.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are also working on new challenges, for example, to reach the people that are living in rural areas. A special sample of effort and social change is QuibdoJS, who is reaching the most economically vulnerable region of the country. They giving to this community, where some people might not have their own computer, a new opportunity to find a professional career.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exclusive Meetups
&lt;/h2&gt;

&lt;p&gt;We are clear about the fact that we don’t want just diverse people, we want diverse people technically good and prepared to face the challenges in the industry, for this, the exclusive meetups are spaces where minorities can learn but also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enter the tech industry through an environment where you can be safe and secure.&lt;/li&gt;
&lt;li&gt;Find people whom you can feel identified with (‘If they can, for sure me too!’ 💪), role models and inspiration.
In Colombia, our exclusive meetups are mostly for women, we have Codies, Pyladies, GeekGirls and Pioneras Developers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conferences
&lt;/h2&gt;

&lt;p&gt;Some of the conferences that we have In Colombia annually are: JSConf, ScaleConf, RubyConf and NgColombia. One of the main goals of these conferences (and at the same time the biggest challenge) is to keep the tickets at an affordable cost without decreasing the quality of the event. In the U.S. The average ticket price is $600 US. In Colombia the tickets have an average cost of $150 US, that is only 25% of the regular cost, but the cost of running a conference aren’t so different in relation to other countries, speakers travel and accommodation, food, venue, conference experiences, etc… And to obtain sponsorship from local companies is really hard because they aren’t used to supporting community initiatives. The result is that volunteer organizing team need to create really good and strong alliances with key companies so our conferences don’t go broke.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Opportunity scholarships:&lt;/strong&gt; Our conferences have scholarship programs that are not exclusively for underrepresented groups, as the name says, these also for people with less opportunities to attend the conference. For instance, last year JSConf granted around 15% of the tickets to opportunity scholarships, they reserved tickets for people from Chocó where is the city with highest poverty index in the country (Quibdó, According to the DANE) and from Venezuelan that as we know, is a country that is suffering an economic crisis. The scholarships include transportation and accommodation if needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supporting each other’s events:&lt;/strong&gt; For example, when RubyConf was created the organizing team received all the support, experience and help from the organizing team of JSConf.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; Even though the English is a global language and I could say that is the official language in the tech world, we know that not all people speak English, for this reason, our conferences offer translation devices that are used by ~40% of the assistants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local talent:&lt;/strong&gt; We want to promote the local talent and empower the people to share their knowledge at these international events.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Training Programs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bootcamps:&lt;/strong&gt; These are spaces for non engineers to learn about programming. We have two Bootcamps in the country: World Tech Makers and Make It Real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coderise:&lt;/strong&gt; This program, trains people from low income families, that are between 13 and 18 years old, it’s an eight-week Bootcamp, where the goal is not only to learn about development, but also to meet young people interested in technology. The mentorship team is formed by people mostly from the tech communities in the city — people that are willing to share their knowledge. This helps attendees learn and also learn how to teach, with the objective of creating a snowball effect and that they will be who will teach the next generation. This program was born in 2011 and has been done in 4 cities from Colombia (Medellín, Popayán, Sabaneta and Cartagena) and 3 Latin American countries (Colombia, Peru and Honduras) having an impact on more than 150 young people. 150 teenagers who now have a new road of professional opportunities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, some companies are also executing diversity programs. Personally, I hate the job offers that say “We are looking for women for the X job”, I consider that hiring process should be for merit… it’s not fair to hire someone just because they are a woman, a person of color, homosexual… or part of some minority. And it’s not profitable for a company to hire someone just to have a ‘token’ employee and demonstrate something, I think is better to have an employee that is the best option for the position independently of their gender, sexual identity, nationality, religion, etc… At least the companies that are doing this are conscious that we need to do something related to diversity and inclusion, but I think it’s not the best approach. Instead, I suggest to do two things if you want to promote diversity and inclusion at your company:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Promote and support educational spaces, in this way you are contributing to train potential new workforce and your company will have more visibility in the dev community… in this way, you will not need to search for devs, they will just come to you.&lt;/li&gt;
&lt;li&gt;Don’t scare away people… Pursue an inclusive culture where each one can feel part of the environment and where all people have something to contribute.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, if you want to do actions related to diversity in your community, don’t be afraid to do it, just keep this actions focused on your context and needs. For me, the Colombian communities are an excellent case of that, and I feel very happy and proud watching how people by their own initiative with help from the community, are working in this unpaid job to make the tech world a more inclusive and safe space for everyone.&lt;/p&gt;

</description>
      <category>diversity</category>
      <category>inclusion</category>
      <category>community</category>
      <category>colombia</category>
    </item>
    <item>
      <title>Hagamos CSS con SASS</title>
      <dc:creator>Manu Castrillon</dc:creator>
      <pubDate>Thu, 30 Apr 2020 00:37:19 +0000</pubDate>
      <link>https://forem.com/manucastrillonm/hagamos-css-con-sass-558n</link>
      <guid>https://forem.com/manucastrillonm/hagamos-css-con-sass-558n</guid>
      <description>&lt;p&gt;La gran cantidad de problemas que podemos abordar en nuestros sitios web hace que los desarrolladores nos tengamos que adaptar a los requerimientos que estos implican, y esto involucra no solamente a los frameworks, arquitecturas, bases de datos… sino también a cómo luce el sitio (los estilos), ya te podrás imaginar, que no es lo mismo escribir estilos para la página de presentación de una panadería local que hacerlo para una gran aplicación bancaria.&lt;/p&gt;

&lt;p&gt;Entonces, en un mundo web donde todo es dinámico, mantenible y escalable (o esa es la idea) nuestros estilos también deberían serlo, y para esto, nacen los preprocesadores de CSS, herramientas que nos permiten extender la sintaxis de nuestras hojas de estilo agregándole un montón de superpoderes como el uso de variables, funciones, mixins y anidación. Esta sintaxis, es posteriormente traducida al CSS que todos conocemos y que los navegadores saben interpretar.&lt;/p&gt;

&lt;p&gt;Existen varios preprocesadores de CSS, entre ellos Sass, Stylus y Less, que después de conocerlos no queremos volver a saber de 'Vanilla CSS', eso sí, aunque estos nos ofrecen un montón de ventajas, si aún estás iniciando en el desarrollo web, te aconsejo primero dominar los conceptos claves de CSS antes de aprender el camino con atajos.&lt;/p&gt;

&lt;p&gt;Por su sintaxis, funciones y comunidad, yo me quedo con SASS (Syntactically Awesome Style Sheets), y en este articulo aprenderemos un poco más sobre el.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Como utilizar Sass?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Instalación
&lt;/h3&gt;

&lt;p&gt;Como la sintaxis de Sass no puede ser interpretada por los navegadores, se requiere un traductor que nos convierta el código en CSS, para esto, debemos instalar la gema de Ruby correspondiente para esto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sass-lang.com/install"&gt;Guía de Instalación&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si estás construyendo tu aplicación con el CLI de algún framework o biblioteca, algunos de estos ya tienen la opción de agregar Sass al crear el proyecto, entonces te recomiendo consultar la documentación de estos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxis
&lt;/h3&gt;

&lt;p&gt;Para escribir tu código con Sass tienes dos opciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SASS:&lt;/strong&gt; Tus archivos SASS deben tener la extensión &lt;code&gt;.sass&lt;/code&gt;. A diferencia de CSS esta sintaxis no hace uso de llaves ni punto y coma, la jerarquía se da haciendo uso de la identacion.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sass"&gt;&lt;code&gt;  &lt;span class="nt"&gt;div&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#FF0000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SCSS:&lt;/strong&gt; Tus archivos Sass deben tener la extensión &lt;code&gt;.scss&lt;/code&gt;. Esta sintaxis surgió a partir de la versión 3 del preprocesador, requiere el uso de llaves y punto y coma.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;  &lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#FF0000&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;Cual de las dos elegir? Con la que te sientas mas comodx&lt;/p&gt;

&lt;h2&gt;
  
  
  Superpoderes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Variables
&lt;/h3&gt;

&lt;p&gt;Como en los lenguajes de programación, te permite almacenar valores para reutilizarlos en la hoja de estilos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;scss:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nv"&gt;$font-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Roboto&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$primary-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#668cff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$font-name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$primary-color&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;&lt;strong&gt;css:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Roboto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#668cff&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;h3&gt;
  
  
  Anidación
&lt;/h3&gt;

&lt;p&gt;Permite organizar los estilos de forma jerárquica. Ten precaución de no abusar del uso de este porque puede terminar siendo una mala practica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;scss:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nt"&gt;-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&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;&lt;strong&gt;css:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&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;h3&gt;
  
  
  Import
&lt;/h3&gt;

&lt;p&gt;Con &lt;code&gt;@import&lt;/code&gt; puedes hacer uso de un archivo dentro de otro scss. La ventaja de importar los archivos con Sass en lugar de hacerlo con el import de CSS es que al hacerlo con CSS, este genera un llamado http para solicitar cada archivo, mientras Sass al ser compilado previamente, genera un solo archivo que contiene todo lo que fue importado, evitando así estas llamadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;scss:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;// _variables.scss&lt;/span&gt;
&lt;span class="nv"&gt;$color-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#ff80bf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;// main.scss&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;'variables'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$color-primary&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&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;&lt;strong&gt;css:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ff80bf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&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;h3&gt;
  
  
  Archivos parciales
&lt;/h3&gt;

&lt;p&gt;Puedes crear archivos con pequeños trozos de código con el objetivo de modularizar tu código, para esto, solo necesitas crear un archivo que en el nombre contenga al inicio el símbolo &lt;code&gt;_&lt;/code&gt;, como por ejemplo &lt;code&gt;_estilos.scss&lt;/code&gt; y con esto, Sass sabrá que es un archivo parcial y lo podrás agregar a otro archivo haciendo uso de &lt;code&gt;@import&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mixins
&lt;/h3&gt;

&lt;p&gt;Los mixins nos permiten reutilizar un trozo de código, agrupando una serie de lineas que pueden ser insertadas posteriormente en otro lugar del CSS, con valores que pueden ser dinámicos haciendo uso de parámetros. Los mixins son de gran utilidad, por ejemplo, cuando tenemos una propiedad a la que se le debe agregar el prefijo correspondiente para cada navegador (-webkit, -moz, -ms…).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;scss:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@mixin&lt;/span&gt; &lt;span class="nf"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$radius&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;-webkit-border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$radius&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;-moz-border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$radius&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;-ms-border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$radius&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$radius&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nd"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10px&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;&lt;strong&gt;css:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;-moz-border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;-ms-border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&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;



</description>
      <category>css</category>
      <category>sass</category>
    </item>
  </channel>
</rss>
