<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Matheus Araujo on Medium]]></title>
        <description><![CDATA[Stories by Matheus Araujo on Medium]]></description>
        <link>https://medium.com/@matheusr42_?source=rss-df25bdca4a46------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*x4I68NKHspSOoUOBUz4U4w.jpeg</url>
            <title>Stories by Matheus Araujo on Medium</title>
            <link>https://medium.com/@matheusr42_?source=rss-df25bdca4a46------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 26 May 2026 23:29:06 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@matheusr42_/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Smart Home with JavaScript — Controlling Light with Machine Learn]]></title>
            <link>https://medium.com/@matheusr42_/smart-home-with-javascript-controlling-light-with-machine-learn-9e267c5ab98b?source=rss-df25bdca4a46------2</link>
            <guid isPermaLink="false">https://medium.com/p/9e267c5ab98b</guid>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[smarthouse]]></category>
            <dc:creator><![CDATA[Matheus Araujo]]></dc:creator>
            <pubDate>Sat, 12 Dec 2020 23:44:39 GMT</pubDate>
            <atom:updated>2020-12-14T02:00:13.299Z</atom:updated>
            <content:encoded><![CDATA[<h3>Smart Home with JavaScript — Controlling Light with Machine Learn</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/0*q5znfv8LJ4K327iA" /><figcaption>Final result</figcaption></figure><p>Recently I had the idea to control my light using hand gestures. While I was creating this code I found out many interesting libs that I will share in this post. I will not enter in all the details of the implementation here, but you can find all the code in this repository:<br><a href="https://github.com/MatheusR42/yeelight-hand-controller">https://github.com/MatheusR42/yeelight-hand-controller</a></p><p>With this code you can turn on and off your Yeelight just with a finger snap and change the brightness intensity raising or lowering your hand.</p><h3><strong>Equipments</strong></h3><ul><li>Webcam</li><li>Microphone</li><li><a href="https://www.amazon.com/YEELIGHT-YLDP06YL-Wireless-Control-Colorful/dp/B0841PXPLB">Yeelight 2nd generation YLDP06YL</a> (it’s possible to use other lamps too, you will just need to find out a nice lib to work with your version)</li></ul><h3><strong>Libs</strong></h3><ul><li><a href="https://www.tensorflow.org/js">TensorFlow.js</a></li><li><a href="https://teachablemachine.withgoogle.com/">Teachablemachine</a></li><li><a href="https://google.github.io/mediapipe/solutions/hands">MediaPipe Hands</a></li><li><a href="https://github.com/samuraitruong/yeelight">YEELIGHT AWESOME</a></li><li><a href="https://expressjs.com/">Express</a></li></ul><h3><strong>How it works</strong></h3><p>The YEELIGHT AWESOME lib gives handful methods to play with Yeelight(I think that it has all the methods of the App) so you just need to use your imagination to work with that :D.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/736/0*WSYIUR-zHJEAXqa2.jpg" /><figcaption>Yeelight App. Source: <a href="https://china-gadgets.com/yeelight-led-strip-2/">https://china-gadgets.com/yeelight-led-strip-2/</a></figcaption></figure><p>To turn on and off the light with a finger snap I recorded background noises of my room together with some finger snaps and use this data to train a TensorFlow model using Teachablemachine.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FT2qQGqZxkD0%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DT2qQGqZxkD0&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FT2qQGqZxkD0%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/50edc05c85361ebdf1271a846d1f9f41/href">https://medium.com/media/50edc05c85361ebdf1271a846d1f9f41/href</a></iframe><p>To control the brightness intensity I use MediaPipe Hands lib. This lib can track with high precision multiples hand landmarks.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*kM9B2LmHFelT4FgN.gif" /><figcaption><em>Tracked 3D hand landmarks are represented by dots in different shades, with the brighter ones denoting landmarks closer to the camera. Source: </em><a href="https://google.github.io/mediapipe/solutions/hands">https://google.github.io/mediapipe/solutions/hands</a></figcaption></figure><p>I choose to use the wrist landmark because it is more stable to angle changes so it will work similarly even if you use other hand positions like with the palm pointing forward.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*l6ISlFcmbXcqNG5j.png" /><figcaption><em>Hand landmarks. </em>Source: <a href="https://google.github.io/mediapipe/solutions/hands">https://google.github.io/mediapipe/solutions/hands</a></figcaption></figure><p>To put everything together, I use a node back-end with Express to create API endpoints that trigger YEELIGHT AWESOME commands. At the front-end I just write some functions to listen to Tensorflow and MediaPipe and call the back-end. You can find the code <a href="https://github.com/MatheusR42/yeelight-hand-controller/blob/main/frontend/main.js">here</a>.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F7ZPMUDyxuMg%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D7ZPMUDyxuMg&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F7ZPMUDyxuMg%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/3436a4877a60012a2c6531a6a5feec74/href">https://medium.com/media/3436a4877a60012a2c6531a6a5feec74/href</a></iframe><h3><strong>Improvements</strong></h3><p>The Yeelight also can change colors so it is possible to train more categories like clap and whistle with Tensorflow or listen for other types of movements to play around with the light.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9e267c5ab98b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Um ano de JavaScript]]></title>
            <link>https://medium.com/@matheusr42_/um-ano-de-javascript-e631cca96b4a?source=rss-df25bdca4a46------2</link>
            <guid isPermaLink="false">https://medium.com/p/e631cca96b4a</guid>
            <category><![CDATA[graphql]]></category>
            <category><![CDATA[vtex]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Matheus Araujo]]></dc:creator>
            <pubDate>Fri, 28 Dec 2018 20:09:37 GMT</pubDate>
            <atom:updated>2018-12-28T20:20:13.827Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*69i39T2roCubYhJl" /><figcaption>Photo by <a href="https://unsplash.com/@oskaryil?utm_source=medium&amp;utm_medium=referral">Oskar Yildiz</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Trabalho com Front-end na <a href="http://corebiz.com.br/">Corebiz</a> há aproximadamente dois anos e meio e até o início desse ano já havia desenvolvido diversas aplicações, algumas até com certa complexidade. Porém, muitos tópicos da comunidade me faziam sentir desatualizado e parecia que até mesmo o pouco que eu sabia estava incompleto.</p><p>O final do ano chegou e como de costume olhei para trás. Para a minha surpresa percebi que aprendi muito mais JavaScript do que esperava. Neste texto pretendo contar um pouco dessa história.</p><p>Há pouco mais de um ano fui chamado para participar do Hackaton da <a href="https://www.vtex.com/pt-br/">VTEX</a>. Esse evento tinha o objetivo de divulgar o <a href="https://vtex.io/">VTEXIO</a>, uma forma totalmente inovadora de desenvolver na plataforma. O IO trouxe uma série de novidades como o conceito de apps e componentes, criação de workspaces e live reload direto na nuvem. Porém, o que mais me marcou foram as tecnologias utilizadas. React com Server Side Render, Node e GraphQL. Simplesmente não tinha ideia de como tudo isso funcionava.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HWrsBWHPLB7SiCCcx5q6-w.png" /><figcaption>Imagem do e-mail de divugação do Hackathon</figcaption></figure><p>O Hackton não foi exatamente como eu esperava. Cheguei apenas com uma ideia rudimentar de como o React e o GraphQL funcionavam. Para piorar a plataforma apresentou instabilidades, afinal, esse foi o primeiro teste real com diversos desenvolvedores. De qualquer forma resolvi me aprofundar no JavaScript.</p><h3><strong>Eloquent JavaScript</strong></h3><p>Antes de mergulhar de cabeça na infinidade de frameworks e bibliotecas é sempre bom ter uma ideia sobre a base da linguagem de programação escolhida. Para isso pesquisei bons livros sobre JavaScript. Optei pelo livro pois, além da praticidade de consulta no futuro, também criei um habito de leitura no ônibus a caminho do trabalho. O livro mais recomendado na maioria dos sites foi o <a href="https://eloquentjavascript.net/"><em>Eloquent JavaScript: A Modern Introduction to Programming</em></a><em>.</em></p><p>O Eloquent JavaScript é um livro sensacional e cobre diversos conteúdos que vão desde o básico, como o que são variáveis e como funciona o <em>console.log, </em>até conceitos que causam um pouco mais de confusão como <em>Higher-order functions</em>, <em>Clojures</em>, escopo e programação assincronia. Ao longo do livro o autor nos dá diversas dicas que normalmente não são explicadas em nenhum curso. Além disso, existem projetos extremamente interessantes que utilizam os conceitos aprendidos nos capítulos anteriores, como o Eletronic Life onde criamos um “ecossistema” usando muito <em>prototype.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/471/1*wZNxmItk2_0I-OZZXuqaBg.jpeg" /><figcaption>Imagem do terminal rodando o EletronicLife.js</figcaption></figure><p>Não era exatamente esse tipo de ecossistema JavaScript que eu estava procurando no início, mas foi bem legal de desenvolver. Se desejar saber mais, adicionei o código com algumas alterações neste repositório: <a href="https://github.com/MatheusR42/EletronicLife">https://github.com/MatheusR42/EletronicLife</a></p><h3>ECMAScript 2015</h3><p>Infelizmente a edição do Eloquent JavaScript que li não era a mais atualizada e não cobria as novas funcionalidades da linguagem que vieram com o ES6. O React utiliza muito essa sintaxe e portanto esse foi o próximo objeto de estudo. A principal fonte que usei foi o curso <a href="https://laracasts.com/series/es6-cliffsnotes"><em>ES2015 Crash Course do Laracasts</em></a><em>. </em>No ano anterior eu já havia feito um curso de Laravel no mesmo site e achei a didática do <a href="https://twitter.com/jeffrey_way">Jeffrey</a> incrível.</p><p>No inicio estranhei um pouco a sintaxe do ECMAScript 6, parecia ser apenas mais uma forma de fazer o que eu já sabia. Todavia, após algum tempo de uso percebi que mais do que otimizar o desenvolvimento também acaba gerando um código mais limpo.</p><h3><strong>React, </strong>Redux e <strong>React Native</strong></h3><p>Finalmente estava preparado para o React! Escolhi iniciar pelo o React Native porque sempre quis desenvolver apps e tinha visto uma palestra no <a href="https://eventos.imasters.com.br/jsexperience/">JS Experience</a> em que a palestrante deu um argumento muito interessante para iniciar com o Native. O argumento era mais ou menos o seguinte: para quem está acostumado a fazer páginas usando o JQuery o React simplesmente não faz sentido, a todo o momento você ficará tentado a manipular o DOM diretamente e por isso é mais fácil iniciar pelo mobile. Você apenas ignora o que aprendeu para web e aceita a nova forma de desenvolver com o React. Ademais, aplicativos costumam ter uma identidade visual mais bem definida e dessa forma fica mais fácil aplicar o conceito de componentização.</p><p>Novamente entrei na fase de busca pelo melhor conteúdo e um site que me ajudou, e ainda me ajuda bastante, foi o <a href="https://hackr.io/">hackr.io</a>. Neste site você encontra diversos cursos classificados por avaliação de outros usuários. Um dos cursos que estava mais bem rankeado no momento era o <a href="https://www.udemy.com/the-complete-react-native-and-redux-course/"><em>The Complete React Native and Redux Course</em></a><em> do </em><a href="https://www.udemy.com/user/sgslo/">Stephen Grider</a>. Neste curso além de aprender como desenvolver aplicativos com React Native consegui entender melhor a ideia do Redux.</p><h3><strong>Primeiro Projeto</strong></h3><p>Até então havia aprendido bastante coisa, porém não tinha feito nada. Quer dizer, quase nada. Já aplicava alguns conceitos durante o trabalho, mas não havia feito nenhum projeto para juntar tudo isso. A primeira oportunidade surgiu quando me pediram para automatizar um processo.</p><p>O problema era o seguinte: A empresa estava crescendo e alguns serviços eram cobrados por horas, essas horas ficavam nas tarefas do <a href="https://br.atlassian.com/software/jira">Jira</a> e não existia uma forma fácil de calculá-las. Era necessário exportar planilhas, retirar dados desnecessários e deixá-los de uma maneira mais atrativa e compreensível. Esse processo ocorria para vários clientes mensalmente, mas também havia casos de <em>reports</em> semanais. Simplesmente não era possível escalar.</p><p>A primeira versão foi um app simples que buscava as tarefas utilizando a API do Jira, separava por status e calculava as horas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*U_5hzjOF2S_I1x_NqOIMMQ.jpeg" /><figcaption>Primeira versão do aplicativo feito com React Native</figcaption></figure><p>A ideia de aplicativo é bem legal, mas para algo simples acaba gerando mais problemas do que vantagens. Em primeiro lugar é necessário instalá-lo, para isso é interessante publicá-lo nas lojas da Google e da Apple, logo, é preciso dar suporte a duas plataformas e versões diferentes de sistema operacional. Além disso, por se tratar de uma ferramenta corporativa, a maioria das pessoas acabam utilizando no desktop.</p><p>Diante disso, resolvemos migrar para a versão web. Durante a migração a função <em>render</em> precisou ser quase que totalmente refeita. (Até o momento não sei exatamente como compartilhar essa parte entre as duas plataformas). Por outro lado, foi possível reaproveitar quase todo o resto do código e isso mostrou um pouco do poder da Stack React.</p><h3><strong>Loja oBoticário e GraphQL</strong></h3><p>Após o desenvolvimento do CoreTime comecei a tocar outros projetos pessoais e dei uma pausa no JavaScript, mas logo surgiu outra oportunidade para retornar. Fui chamado para participar da equipe de desenvolvimento do <a href="https://www.boticario.com.br/">novo site do oBoticário</a>, a primeira loja a usar o sistema de pages do VTEXIO(a mesma plataforma que citei no início do texto).</p><p>Fazer um projeto para uma grande empresa é algo completamente diferente. A complexidade é maior, a responsabilidade é maior. Estávamos trabalhando com code review, tester e com uma tecnologia nova que estava evoluindo junto ao projeto. Foi nesse momento que comecei a visualizar as vantagens do GraphQL.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/709/1*RB2I_XF4sJxKoO8sGe0Gcw.gif" /><figcaption>Gif exemplificando o funcionamento do GraphQL</figcaption></figure><p>O site do oBoticário possuí diversos componentes que consomem APIs de servidores diferentes, neste contexto o GraphQL cai como uma luva. Se vários componentes precisam do mesmo dado, você não precisa se preocupar com excessos de chamadas ou pensar em uma maneira de enviar tudo isso para a <em>Redux store</em>, basta plugar o GraphQL em todos os componentes e deixar que ele gerencie e <em>cacheie</em> as chamadas para você. Se precisar buscar, validar e juntar dados de mais do que um endpoint, crie um <em>resolver </em>que faça tudo isso e apenas retorne os dados tratados para o <em>front</em>. Além disso, assim que configurado você não ficará mais na incerteza do que é retornado de uma API. Ao criar os <em>resolvers</em> a documentação é gerada automaticamente com a tipagem da resposta e dos parâmetros.</p><p>Todos esses pontos facilitam o desenvolvimento e manutenção e por isso valem o esforço inicial de configuração.</p><h3><strong>Conclusão e futuro…</strong></h3><p>Ainda tenho muito o que aprender, durante esse ano fui exposto a diversos conceitos e tecnologias que pretendo me aprofundar, entre elas o Node. Fiz apenas um curso e alguns <em>resolvers</em>, mas já tenho diversas ideias para aplicá-lo.</p><p>Para finalizar, tive a felicidade de saber que depois de muito esforço fui escolhido por meio de votação popular como o profissional referência do ano! Sou muito grato às pessoas que me incentivaram e proporcionam oportunidades sensacionais, sem elas essa história não seria a mesma.</p><p>Valeu!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*a3FyZll6LZnhc98ylKREvg.jpeg" /><figcaption>Foto do discurso após o resultado da votação</figcaption></figure><p>No texto não consegui colocar todos os projetos e materiais importantes que utilizei, por isso vou deixar essa lista com alguns conteúdos que me ajudaram bastante:</p><p><a href="https://www.youtube.com/watch?v=9ar5ZpBW7NE">6 JavaScript Native Array Functions in 5 Minutes — Code Whisperer</a></p><p><a href="https://eloquentjavascript.net/"><em>Eloquent JavaScript: A Modern Introduction to Programming — </em>Marjin Haverbeke</a></p><p><a href="https://laracasts.com/series/es6-cliffsnotes">ES2015 Crash Course — Laracasts</a></p><p><a href="https://www.udemy.com/graphql-with-react-course/">GraphQL with React: The Complete Developers Guide — Stephen Grider</a></p><p><a href="https://www.youtube.com/watch?v=tsIAyUQc8Ig">JavaScript Array Reduce in 4 Minutes — Code Whisperer</a></p><p><a href="https://www.udemy.com/node-with-react-fullstack-web-development/">Node with React: Fullstack Web Development — Stephen Grider</a></p><p><a href="https://www.syncfusion.com/ebooks/reactjs_succinctly">React.js Succinctly — Samer Buna</a></p><p><a href="https://www.udemy.com/the-complete-react-native-and-redux-course/">The Complete React Native and Redux Course — Stephen Grider</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e631cca96b4a" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>