<?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 Alex José Silva on Medium]]></title>
        <description><![CDATA[Stories by Alex José Silva on Medium]]></description>
        <link>https://medium.com/@alexjosesilva?source=rss-8fb0e05e386e------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*y0rJXLhoStLLn3d6Duvn4w.jpeg</url>
            <title>Stories by Alex José Silva on Medium</title>
            <link>https://medium.com/@alexjosesilva?source=rss-8fb0e05e386e------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 01:13:20 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@alexjosesilva/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[Construindo um SaaS para Gerenciar o Consumo de Energia: Flutter + FastAPI + Dados Reais…]]></title>
            <link>https://medium.com/@alexjosesilva/construindo-um-saas-para-gerenciar-o-consumo-de-energia-flutter-fastapi-dados-reais-05d53d369d5e?source=rss-8fb0e05e386e------2</link>
            <guid isPermaLink="false">https://medium.com/p/05d53d369d5e</guid>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[fastapi]]></category>
            <category><![CDATA[saas]]></category>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[Alex José Silva]]></dc:creator>
            <pubDate>Mon, 13 Apr 2026 03:44:13 GMT</pubDate>
            <atom:updated>2026-04-13T03:44:13.372Z</atom:updated>
            <content:encoded><![CDATA[<h3>Construindo um SaaS para Gerenciar o Consumo de Energia: Flutter + FastAPI + Dados Reais (ANEEL/IBGE)</h3><p>Recentemente desenvolvi um projeto que une Mobile, Backend e Dados Públicos para resolver um problema real: visualizar e analisar consumo de energia por região no Brasil.</p><ul><li>Tempo de desenvolvimento 24 horas.</li><li>Repositório: <a href="https://github.com/alexjosesilva/flutter-energy-consumption">https://github.com/alexjosesilva/flutter-energy-consumption</a></li><li>Dados reais ANEEL/IBGE lista esta no fim do artigo</li></ul><h3>Motivação</h3><p>O setor energético brasileiro possui dados públicos ricos (como da ANEEL e IBGE), mas pouco acessíveis para análise rápida. A ideia foi criar uma plataforma simples, visual e escalável para:</p><ul><li>Analisar consumo por região</li><li>Prever demanda energética</li><li>Detectar desperdícios</li></ul><h3><strong>Arquitetura do Projeto</strong></h3><p>O projeto flutter-energy-consumption foi desenvolvido seguindo uma arquitetura moderna baseada em separação de responsabilidades, combinando Mobile, Backend e múltiplas fontes de dados. Abaixo segui o desenho da arquitetura:</p><p>A arquitetura foi desenhada para separar claramente apresentação, processamento e dados, utilizando FastAPI como camada de orquestração e normalização de dados, Flutter como cliente desacoplado e Firebase como suporte de identidade e telemetria. Isso permite escalar a solução para um modelo SaaS, integrar IA e evoluir para dados em tempo real sem reescrever o core do sistema.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ATXSTtY1U6NGjqbI5qEJ7g.png" /></figure><h3>Visão Geral</h3><p>O projeto integra dados públicos (ANEEL/IBGE) com uma camada de backend em FastAPI e persistência de eventos de usuários via Firebase (Auth + Firestore), permitindo não apenas análise de consumo energético, mas também observabilidade de uso e evolução para um modelo SaaS multi-tenant.</p><h3>Funcionalidades Documentadas:</h3><ol><li>Autenticação (Email, Password, Google)</li><li>Análise de Consumo por Região (Gráficos)</li><li>Previsão de Demanda (Forecasting)</li><li>Alertas de Desperdício (Anomaly Detection)</li><li>Perfil de Usuário (User Management)</li><li>Histórico de Login (Audit Trail)</li><li>Visualizações de Dados (Charts &amp; Analytics)</li></ol><h3>Camadas</h3><p>A solução é baseada em um modelo Client-Server + Data-Driven, com três domínios principaisA arquitetura foi desenhada para separar claramente apresentação, processamento e dados, utilizando FastAPI como camada de orquestração e normalização de dados, Flutter como cliente desacoplado e Firebase como suporte de identidade e telemetria. Isso permite escalar a solução para um modelo SaaS, integrar IA e evoluir para dados em tempo real sem reescrever o core do sistema.</p><p>1. <strong>Frontend</strong> (Flutter)</p><ul><li>UI moderna (foco em UX estilo Nubank)</li><li>Consome APIs REST</li><li>Gráficos dinâmicos</li><li>Navegação modular (submenu)</li></ul><p>2. <strong>Backend</strong> (FastAPI)</p><ul><li>Endpoints REST: /api/consumo/regioes /api/previsao/demanda</li><li>Validação de parâmetros (região, ano)</li><li>Integração com dados reais (CSV / APIs públicas)</li></ul><p>3. <strong>Dados</strong></p><ul><li>Dados mockados (fase inicial)</li><li>Integração planejada com: ANEEL (energia) IBGE (dados regionais)</li></ul><h3>Fluxo das Funcionalidades</h3><p>1. Análise de Consumo por Região</p><p>2. Previsão de Demanda</p><p>3. Alertas de Desperdício</p><h3>Interface do App</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/714/1*_c6PfiPjyJzsl2UNIIyCuQ.png" /></figure><h3>Interface Navegador</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*w4QpCHT_ml0qSNoNA412pw.png" /></figure><h3>Camada de Dados no Firebase</h3><p>Além das fontes públicas como ANEEL e IBGE, o projeto também utiliza o Firebase como camada complementar de dados. Isso transforma o app de visualização em uma plataforma interativa e escalável (SaaS-ready).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BHygdEPNgG27-fcpb7eB2A.png" /></figure><h3>Autenticação e Observabilidade</h3><ul><li>Login via Firebase Auth</li><li>Registro de acessos:</li></ul><pre>{<br>  &quot;uid&quot;: &quot;...&quot;,<br>  &quot;email&quot;: &quot;...&quot;,<br>  &quot;loginAt&quot;: &quot;timestamp&quot;<br>}</pre><p>Isso permite:</p><ul><li>Auditoria</li><li>Métricas de uso</li><li>Base para SaaS futuro</li></ul><h3>Para que isso serve na prática?</h3><p>Essa base no Firebase permite:</p><h3>Observabilidade</h3><ul><li>Saber quantos usuários acessam o app</li><li>Horários de pico</li><li>Frequência de uso</li></ul><h3>Stack Tecnológica</h3><ul><li>Flutter → Frontend Mobile</li><li>FastAPI → Backend</li><li>Firebase → Auth + Logs</li><li>Python → Processamento de dados</li><li>CSV / APIs públicas → Fonte de dados</li></ul><h3>1. Dados da ANEEL</h3><p><strong>Geração de Energia (usinas no Brasil):</strong> <a href="https://dadosabertos.aneel.gov.br/dataset/relacao-de-empreendimentos-de-geracao">https://dadosabertos.aneel.gov.br/dataset/relacao-de-empreendimentos-de-geracao</a></p><p><strong>Distribuição de Energia (DEC/FEC):</strong> <a href="https://dadosabertos.aneel.gov.br/dataset/indicadores-de-continuidade">https://dadosabertos.aneel.gov.br/dataset/indicadores-de-continuidade</a></p><p><strong>Tarifas de Energia</strong>: <a href="https://dadosabertos.aneel.gov.br/dataset/tarifas-de-energia-eletrica">https://dadosabertos.aneel.gov.br/dataset/tarifas-de-energia-eletrica</a></p><h3>2. Dados do IBGE</h3><p><strong>População por Região</strong>: <a href="https://servicodados.ibge.gov.br/api/v1/localidades/regioes">https://servicodados.ibge.gov.br/api/v1/localidades/regioes</a></p><p><strong>PIB por Região</strong>: <a href="https://servicodados.ibge.gov.br/api/v3/agregados/5938/periodos/2022/variaveis/37?localidades=N1[all]">https://servicodados.ibge.gov.br/api/v3/agregados/5938/periodos/2022/variaveis/37?localidades=N1[all]</a></p><p><strong>Malha territorial (mapas)</strong>: <a href="https://www.ibge.gov.br/geociencias/organizacao-do-territorio/malhas-territoriais">https://www.ibge.gov.br/geociencias/organizacao-do-territorio/malhas-territoriais</a></p><h3>3. Dados Complementares (IMPORTANTE)</h3><p>INMET (Clima — impacto no consumo): <a href="https://portal.inmet.gov.br/dadoshistoricos">https://portal.inmet.gov.br/dadoshistoricos</a></p><p>ONS (Operador Nacional do Sistema): <a href="https://dados.ons.org.br/">https://dados.ons.org.br/</a></p><h3>Conclusão</h3><p>Esse projeto mostra como é possível combinar:</p><ul><li>Dados públicos</li><li>Arquitetura moderna</li><li>Mobile + Backend</li><li>Visão de produto</li></ul><h3>Inteligência de Produto</h3><ul><li>Quais regiões são mais consultadas</li><li>Quais funcionalidades são mais usadas</li></ul><h3><strong>Próximo passo: VENDER!</strong></h3><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=05d53d369d5e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Passo a Passo: Implementar Redis no Spring-boot]]></title>
            <link>https://medium.com/@alexjosesilva/passo-a-passo-implementar-redis-no-spring-boot-cc42d5c4508f?source=rss-8fb0e05e386e------2</link>
            <guid isPermaLink="false">https://medium.com/p/cc42d5c4508f</guid>
            <category><![CDATA[spring-boot]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[java21]]></category>
            <category><![CDATA[redis]]></category>
            <category><![CDATA[cache]]></category>
            <dc:creator><![CDATA[Alex José Silva]]></dc:creator>
            <pubDate>Thu, 04 Apr 2024 10:58:06 GMT</pubDate>
            <atom:updated>2024-04-04T10:58:06.265Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Upi4XpxzKFQBFTMdeR6dTA.png" /></figure><p><strong>Utilizando Redis no Spring Boot: Acelerando o Desempenho da sua Aplicação</strong></p><p>No universo do desenvolvimento de software, a otimização do desempenho é uma prioridade constante. Nesse contexto, o Spring Boot, um dos frameworks mais populares para o desenvolvimento de aplicativos Java, aliado ao Redis, um banco de dados em memória de alto desempenho, se torna uma combinação poderosa para impulsionar a eficiência e a escalabilidade das aplicações.</p><p><strong>O que é Redis ?</strong></p><p>Redis é um banco de dados em memória de código aberto, conhecido por sua velocidade e flexibilidade. Ele oferece estruturas de dados versáteis, como strings, hashes, listas, conjuntos e muito mais, tornando-o ideal para uma variedade de casos de uso, desde caching até gerenciamento de sessões.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JAQS_JhdAk6ThgnlZjWNTQ.png" /></figure><p><strong>Integração com Spring Boot</strong></p><p>O Spring Boot simplifica a integração com o Redis por meio do Spring Data Redis, que fornece abstrações convenientes para interagir com o Redis de forma eficiente. Configurar a conexão com o Redis é simples, exigindo apenas algumas linhas de configuração no arquivo application.properties.</p><p><strong>Benefícios para o Desempenho</strong></p><p>Ao utilizar o Redis, você reduz a carga no banco de dados principal, acelera o acesso a dados frequentemente acessados e melhora a escalabilidade horizontal de sua aplicação, resultando em tempos de resposta mais rápidos e uma experiência do usuário aprimorada.</p><h3>Configurações recomendadas antes de realizar o Passo-Passo</h3><ol><li>baixar o redis e configurar antes de executar o codigo abaixo: <a href="https://redis.io/docs/install/install-redis/install-redis-on-windows/">https://redis.io/docs/install/install-redis/install-redis-on-windows/</a></li><li>Usar Redis Insigth para visualar os dados: <a href="https://redis.io/docs/connect/insight/">https://redis.io/docs/connect/insight/</a></li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2mKgs5JlK3VCqy318XXiTw.png" /></figure><h3>Implementação no Spring boot — Passo a Passo</h3><h3>Passo 1: Set Up Spring Boot Project</h3><p>Primeiro, criar um novo projeto Spring Boot usando Spring Initializr (<a href="https://start.spring.io/">https://start.spring.io/</a>). Escolha as dependencias:</p><ul><li>Spring Web</li><li>Spring Data Redis</li><li>Lombok (opicional)</li></ul><h3>Passo 2: Configure Redis in application.properties e config</h3><p>application.properties</p><pre>spring.data.redis.host=localhost<br>spring.data.redis.port=6379<br>spring.data.redis.password= //opcional</pre><h3>Passo 3: Criar uma classe Modelo (anotada com @RedisHash)</h3><pre>package org.example.crudspringredis.model;<br><br>import org.springframework.data.annotation.Id;<br>import org.springframework.data.redis.core.RedisHash;<br><br>import java.io.Serializable;<br><br>@RedisHash(&quot;Product&quot;)<br>public class Product implements Serializable {<br>    @Id<br>    private String id;<br>    private String name;<br>    private double price;<br><br>    // getters and setters<br><br>    public String getId() {<br>        return id;<br>    }<br><br>    public void setId(String id) {<br>        this.id = id;<br>    }<br><br>    public String getName() {<br>        return name;<br>    }<br><br>    public void setName(String name) {<br>        this.name = name;<br>    }<br><br>    public double getPrice() {<br>        return price;<br>    }<br><br>    public void setPrice(double price) {<br>        this.price = price;<br>    }<br>}</pre><h3>Passo 4: Criar a Repository Interface</h3><pre>package org.example.crudspringredis.repository;<br><br>import org.example.crudspringredis.model.Product;<br>import org.springframework.data.repository.CrudRepository;<br>import org.springframework.stereotype.Repository;<br><br>@Repository<br>public interface ProductRepository extends CrudRepository&lt;Product, String&gt; {<br>}</pre><h3>Passo 5: Criar um Controller</h3><pre>package org.example.crudspringredis.controller;<br><br>import org.example.crudspringredis.model.Product;<br>import org.example.crudspringredis.repository.ProductRepository;<br>import org.springframework.web.bind.annotation.*;<br><br>import java.util.List;<br>import java.util.Optional;<br><br>@RestController<br>@RequestMapping(&quot;/products&quot;)<br>public class ProductController {<br>    private final ProductRepository productRepository;<br><br>    public ProductController(ProductRepository productRepository) {<br>        this.productRepository = productRepository;<br>    }<br><br>    @PostMapping<br>    public Product addProduct(@RequestBody Product product) {<br>        return productRepository.save(product);<br>    }<br><br>    @GetMapping(&quot;/{id}&quot;)<br>    public Optional&lt;Product&gt; getProduct(@PathVariable String id) {<br>        return productRepository.findById(id);<br>    }<br>    @GetMapping<br>    public List&lt;Product&gt; getAllProducts() {<br>        return (List&lt;Product&gt;) productRepository.findAll();<br>    }<br><br>    @PutMapping(&quot;/{id}&quot;)<br>    public Product updateProduct(@PathVariable String id, @RequestBody Product productDetails) {<br>        Product product = productRepository.findById(id)<br>                .orElseThrow(() -&gt; new RuntimeException(&quot;Produto não encontrado&quot;));<br>        product.setName(productDetails.getName());<br>        product.setPrice(productDetails.getPrice());<br>        return productRepository.save(product);<br>    }<br><br>    @DeleteMapping(&quot;/{id}&quot;)<br>    public void deleteProduct(@PathVariable String id) {<br>        productRepository.deleteById(id);<br>    }<br>}</pre><h3>Passo 6: Run Application</h3><p>Após concluir essas etapas, execute seu aplicativo Spring Boot. Agora você pode usar clientes REST como Postman ou curl para interagir com seu aplicativo e executar operações em objetos Product, que são armazenados e recuperados do Redis.</p><h3>Passo 7: Testing Endpoints</h3><ul><li>add Product: POST request para <a href="http://localhost:8080/products">http://localhost:8080/products</a> com JSON body contendo o objeto Product</li></ul><pre>{<br>  &quot;id&quot;: 1,<br>  &quot;name&quot;: &quot;TV&quot;,<br>  &quot;price&quot;: 11.00<br>}</pre><ul><li>list product GET: request <a href="http://localhost:8080/products">http://localhost:8080/products</a>/{id}</li><li>delete product: DELETE <a href="http://localhost:8080/products">http://localhost:8080/products</a>/{id}</li><li>update product: PUT <a href="http://localhost:8080/products">http://localhost:8080/products</a>/{id}</li><li>list all GET: request <a href="http://localhost:8080/products">http://localhost:8080/products</a></li></ul><h3>Prints da projeto funcionando</h3><p>Estrutura do Projeto</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/408/1*d0wNf1uGeMvIgkwhcRlOsA.png" /></figure><p>Teste no Postman</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qqHDSX9pqAUh5W7L5YxIxA.png" /></figure><p>ReadInsigth</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jFEMFr8kG4ve3_n5fCh5cw.png" /></figure><h3>Repositório do Projeto acima</h3><p><a href="https://github.com/alexjosesilva/manager-products-redis-springboot">GitHub</a></p><h3>Conclusão</h3><p>Esta é uma implementação básica para começar. Você pode expandi-la conforme necessário, adicionando métodos para outras operações CRUD ou explorando recursos avançados do Spring Data Redis, como consultas, Pub/Sub e transações.</p><h3>Pra Saber +</h3><ol><li>Messaging with Redis. Disponível em: <a href="https://spring.io/guides/gs/messaging-redis">https://spring.io/guides/gs/messaging-redis</a></li><li>Integrating Redis with Spring Boot: A Step-by-Step Guide to Enhancing Application Performance. Disponível em: <a href="https://www.linkedin.com/pulse/integrating-redis-spring-boot-step-by-step-guide-enhancing-ali-1nk5c">https://www.linkedin.com/pulse/integrating-redis-spring-boot-step-by-step-guide-enhancing-ali-1nk5c</a></li><li>Getting Started. Disponível em: <a href="https://docs.spring.io/spring-data/redis/reference/redis/getting-started.html">https://docs.spring.io/spring-data/redis/reference/redis/getting-started.html</a></li><li>How to use Redis with Spring boot to store sessions and why. Disponível em: <a href="https://www.youtube.com/watch?app=desktop&amp;v=4K5N7SRcyK8">https://www.youtube.com/watch?app=desktop&amp;v=4K5N7SRcyK8</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cc42d5c4508f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Afinal, o que é BFF ?]]></title>
            <link>https://medium.com/@alexjosesilva/afinal-o-que-%C3%A9-bff-17ae9d60f65b?source=rss-8fb0e05e386e------2</link>
            <guid isPermaLink="false">https://medium.com/p/17ae9d60f65b</guid>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[arquitetura]]></category>
            <category><![CDATA[bff]]></category>
            <dc:creator><![CDATA[Alex José Silva]]></dc:creator>
            <pubDate>Mon, 01 Apr 2024 02:44:45 GMT</pubDate>
            <atom:updated>2024-04-01T02:44:45.705Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/799/1*uivgK_fn4kVPFQ1GFE8GNQ.jpeg" /></figure><h3>Afinal, o que é BFF ?</h3><p>A Arquitetura Back-end para Front-end Pattern (BFF), é um termo criado em 2015 por <a href="https://philcalcado.com/2015/09/18/the_back_end_for_front_end_pattern_bff.html">Phil Calçado</a>, é um padrão para API que permite equipes a iterarem recursos mais rapidamente e terem controle sobre o backend, sem afetar o frontend e também gerar experiências específicas de acordo com cada pessoa usuária de um determinado produto.</p><h3>Introdução</h3><p>Desde o surgimento das aplicações web e móveis, a comunicação entre o front-end e o back-end tem sido um desafio contínuo para os desenvolvedores. Em resposta a essa necessidade, surgiu a Arquitetura Back-end para Front-end Pattern (BFF), uma abordagem inovadora que visa otimizar essa comunicação e melhorar a experiência do usuário.</p><h3><strong>Origem</strong></h3><p>O termo “Backend for Frontend” foi cunhado pela primeira vez pelo time de desenvolvimento do SoundCloud em 2014. Eles perceberam a necessidade de ter endpoints específicos para cada aplicação cliente, para que pudessem fornecer dados sob medida para cada interface de usuário.</p><h3>Descrição da Arquitetura</h3><p>A Arquitetura Back-end para Front-end Pattern (BFF) envolve a criação de camadas adicionais no lado do servidor para cada aplicação cliente. Essas camadas atuam como intermediárias entre o front-end e o back-end principal, permitindo que os dados sejam adaptados às necessidades específicas de cada interface de usuário.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/522/0*c2JR6Z-bDy-QZpu0.png" /></figure><p>Para exemplicar a camada Pattern (BFF) utilizando JAVA (spring-boot) e Python (FastApi)</p><h3>JAVA</h3><p>Aqui está um exemplo de como você poderia implementar um BFF em Java 17 e Sprinb-boot para uma aplicação que se comunica com um front-end mobile/browser/cachebank e uma camada de serviço:</p><pre>import org.springframework.boot.SpringApplication;<br>import org.springframework.boot.autoconfigure.SpringBootApplication;<br>import org.springframework.web.bind.annotation.PostMapping;<br>import org.springframework.web.bind.annotation.RequestBody;<br>import org.springframework.web.bind.annotation.RestController;<br><br>import org.json.JSONObject;<br><br>@SpringBootApplication<br>public class BFFApplication {<br><br>    public static void main(String[] args) {<br>        SpringApplication.run(BFFApplication.class, args);<br>    }<br>}<br><br>@RestController<br>class BFFController {<br><br>    @PostMapping(&quot;/api/mobile&quot;)<br>    public JSONObject handleMobileRequest(@RequestBody JSONObject requestBody) {<br>        return processRequest(requestBody);<br>    }<br><br>    @PostMapping(&quot;/api/browser&quot;)<br>    public JSONObject handleBrowserRequest(@RequestBody JSONObject requestBody) {<br>        return processRequest(requestBody);<br>    }<br><br>    @PostMapping(&quot;/api/cachebank&quot;)<br>    public JSONObject handleCacheBankRequest(@RequestBody JSONObject requestBody) {<br>        return processRequest(requestBody);<br>    }<br><br>    private JSONObject processRequest(JSONObject requestBody) {<br>        // Extrair os dados do corpo da requisição<br>        String endpoint = requestBody.getString(&quot;endpoint&quot;);<br>        JSONObject dados = requestBody.getJSONObject(&quot;dados&quot;);<br><br>        // Simular a comunicação com a camada de serviço<br>        JSONObject response = new JSONObject();<br>        response.put(&quot;mensagem&quot;, &quot;Requisição recebida pela camada de serviço: &quot; + endpoint);<br><br>        return response;<br>    }<br>}</pre><h3>Python</h3><p>Aqui está uma versão do código em Python usando o framework Flask:</p><pre>from flask import Flask, request, jsonify<br><br>app = Flask(__name__)<br><br>@app.route(&#39;/api/mobile&#39;, methods=[&#39;POST&#39;])<br>def handle_mobile_request():<br>    return process_request(request.json)<br><br>@app.route(&#39;/api/browser&#39;, methods=[&#39;POST&#39;])<br>def handle_browser_request():<br>    return process_request(request.json)<br><br>@app.route(&#39;/api/cachebank&#39;, methods=[&#39;POST&#39;])<br>def handle_cachebank_request():<br>    return process_request(request.json)<br><br>def process_request(request_data):<br>    # Extrair os dados do corpo da requisição<br>    endpoint = request_data.get(&#39;endpoint&#39;)<br>    dados = request_data.get(&#39;dados&#39;)<br><br>    # Simular a comunicação com a camada de serviço<br>    response = {&#39;mensagem&#39;: f&#39;Requisição recebida pela camada de serviço: {endpoint}&#39;}<br><br>    return jsonify(response)<br><br>if __name__ == &#39;__main__&#39;:<br>    app.run(debug=True)</pre><h3>Benefícios</h3><ul><li>Melhora a performance, pois reduz a quantidade de dados transmitidos entre o front-end e o back-end.</li><li>Permite uma maior flexibilidade no design da interface do usuário, pois os dados podem ser formatados de acordo com os requisitos específicos de cada aplicação cliente.</li><li>Facilita a manutenção, pois as alterações no back-end não afetam diretamente o front-end, desde que os contratos entre o BFF e o cliente sejam mantidos.</li></ul><h3>Limitações</h3><ul><li>Aumenta a complexidade do sistema, pois requer a criação e manutenção de camadas adicionais no lado do servidor.</li><li>Pode resultar em duplicação de código, caso os BFFs tenham funcionalidades semelhantes.</li><li>Exige uma cuidadosa definição dos contratos entre o BFF e o front-end, para evitar inconsistências nos dados.</li></ul><h3>Conclusão</h3><p>A Arquitetura Back-end para Front-end Pattern (BFF) representa uma evolução significativa na maneira como front-end e back-end se comunicam. No futuro, é provável que essa abordagem seja cada vez mais adotada, à medida que as aplicações se tornam mais complexas e a necessidade de uma comunicação eficiente entre as camadas aumenta.</p><p><strong>Para Saber +</strong></p><ol><li>Arquitetura BFF — Back-end for Front-end. Disponível em: <a href="https://medium.com/digitalproductsdev/arquitetura-bff-back-end-for-front-end-13e2cbfbcda2">https://medium.com/digitalproductsdev/arquitetura-bff-back-end-for-front-end-13e2cbfbcda2</a></li><li>Arquitetura BFF. Disponível em: <a href="https://www.linkedin.com/pulse/arquitetura-bff-ederson-melo/?originalSubdomain=pt">https://www.linkedin.com/pulse/arquitetura-bff-ederson-melo/?originalSubdomain=pt</a></li><li>O que é BFF?. Disponível em: <a href="https://www.treinaweb.com.br/blog/o-que-e-bff">https://www.treinaweb.com.br/blog/o-que-e-bff</a></li><li>Desvendando o BFF — Backend para Frontend. Disponível em :<a href="https://www.linkedin.com/pulse/desvendando-o-bff-backend-para-frontend-uma-na-de-bruno-oehef/">https://www.linkedin.com/pulse/desvendando-o-bff-backend-para-frontend-uma-na-de-bruno-oehef/</a></li><li>Backend For Frontend: Uma estratégia sob medida para a entrega de microsserviços. Disponível em: <a href="https://medium.com/jeitosanar/backend-for-frontend-uma-estrat%C3%A9gia-sob-demanda-para-a-entrega-de-microsservi%C3%A7os-2f12d4cb9e3f">https://medium.com/jeitosanar/backend-for-frontend-uma-estrat%C3%A9gia-sob-demanda-para-a-entrega-de-microsservi%C3%A7os-2f12d4cb9e3f</a></li><li>Phil Calçado. Disponível em: <a href="https://philcalcado.com/2015/09/18/the_back_end_for_front_end_pattern_bff.html">https://philcalcado.com/2015/09/18/the_back_end_for_front_end_pattern_bff.html</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=17ae9d60f65b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Afinal, o que é Spark Micro Framework ?]]></title>
            <link>https://medium.com/@alexjosesilva/afinal-o-que-%C3%A9-spark-micro-framework-0aec1a674a49?source=rss-8fb0e05e386e------2</link>
            <guid isPermaLink="false">https://medium.com/p/0aec1a674a49</guid>
            <category><![CDATA[framework]]></category>
            <category><![CDATA[spark]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[java]]></category>
            <dc:creator><![CDATA[Alex José Silva]]></dc:creator>
            <pubDate>Sun, 31 Mar 2024 15:25:01 GMT</pubDate>
            <atom:updated>2024-03-31T15:25:01.081Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/532/1*hqInIcq5UDvx9FbxNJnJjA.png" /><figcaption>Spark</figcaption></figure><h3>Afinal, o que é Spark Micro Framework ?</h3><p><strong>Explorando o Spark Micro Framework: Potencialidades e Desafios</strong></p><p>O Spark Micro Framework é uma criação da Perwendel Solutions, uma empresa dedicada ao desenvolvimento de soluções de software inovadoras. Este framework web, lançado em 2011, foi concebido para simplificar o desenvolvimento de aplicativos web em Java com sua abordagem minimalista e focada na simplicidade.</p><h3>Introdução</h3><p>Com a popularidade dos microservices onde a maioria utilizar Spring Boot para desenvolver os apis RestFull ou até mesmo soluções Java EE com Jersey/RestEasy. O Spark não criar grandes obstaculos porque fornece uma API REST pronta para atender a JSON em menos de dez linhas de código!</p><p><strong>Benefícios</strong></p><ol><li><strong>Simplicidade de Uso</strong>: Com uma sintaxe clara e concisa, o Spark torna o desenvolvimento web em Java acessível até mesmo para iniciantes.</li><li><strong>Desempenho Aprimorado</strong>: Sua leveza e eficiência garantem um desempenho ágil, ideal para aplicações que exigem alta velocidade de processamento.</li><li><strong>Flexibilidade</strong>: Apesar de sua simplicidade, o Spark oferece uma variedade de recursos para atender às necessidades de diferentes projetos.</li></ol><p><strong>Limitações</strong></p><ol><li><strong>Escalabilidade Limitada</strong>: Para projetos de grande escala, o Spark pode enfrentar dificuldades em lidar com cargas de trabalho pesadas devido à sua abordagem minimalista.</li><li><strong>Ecossistema Menos Desenvolvido</strong>: Comparado a outros frameworks mais estabelecidos, o Spark pode ter uma comunidade e um ecossistema de plugins menos desenvolvidos.</li></ol><h3>Exemplo de Uso</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vtMk5NjTjXtRJxdk7t23gg.png" /></figure><p>Checando no navegador na url <a href="http://localhost:4567/hello">http://localhost:4567/hello</a> receberemos a mensagem: “Hello World”</p><h3>Desenvolvendo um ToDo em Spark Framework</h3><p>A estrutura do projeto deve ficar nesse formato:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/318/1*LH_LuX6tDiAs3r90eLFTvA.png" /></figure><p>Crie um projeto <strong>Maven </strong>com seguinte <strong>pom.xml</strong> :</p><pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br>&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;<br>         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;<br>         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;<br>    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;<br><br>    &lt;groupId&gt;org.example&lt;/groupId&gt;<br>    &lt;artifactId&gt;demo&lt;/artifactId&gt;<br>    &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;<br><br>    &lt;properties&gt;<br>        &lt;maven.compiler.source&gt;17&lt;/maven.compiler.source&gt;<br>        &lt;maven.compiler.target&gt;17&lt;/maven.compiler.target&gt;<br>        &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;<br>    &lt;/properties&gt;<br><br>    &lt;dependencies&gt;<br>        &lt;!-- Dependência do Spark --&gt;<br>        &lt;dependency&gt;<br>            &lt;groupId&gt;com.sparkjava&lt;/groupId&gt;<br>            &lt;artifactId&gt;spark-core&lt;/artifactId&gt;<br>            &lt;version&gt;2.9.4&lt;/version&gt; &lt;!-- ou a versão mais recente --&gt;<br>        &lt;/dependency&gt;<br><br>        &lt;dependency&gt;<br>            &lt;groupId&gt;com.google.code.gson&lt;/groupId&gt;<br>            &lt;artifactId&gt;gson&lt;/artifactId&gt;<br>            &lt;version&gt;2.8.8&lt;/version&gt;<br>        &lt;/dependency&gt;<br><br>        &lt;dependency&gt;<br>            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br>            &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;<br>            &lt;version&gt;3.8.1&lt;/version&gt;<br>            &lt;type&gt;maven-plugin&lt;/type&gt;<br>        &lt;/dependency&gt;<br><br>    &lt;/dependencies&gt;<br><br>&lt;/project&gt;</pre><p>Apos a criação o pom.xml devemos criar arquivo <strong>ToDoSpark.java</strong></p><pre>import static spark.Spark.*;<br><br>import com.google.gson.Gson;<br><br>import java.util.ArrayList;<br>import java.util.List;<br><br>public class ToDoSpark {<br>    // Classe de modelo para um item<br>    public static class Item {<br>        int id;<br>        String nome;<br><br>        public Item(int id, String nome) {<br>            this.id = id;<br>            this.nome = nome;<br>        }<br>    }<br><br>    // Usaremos um array para simular um banco de dados simples<br>    static List&lt;Item&gt; itens = new ArrayList&lt;&gt;();<br>    static int proximoId = 1;<br>    public static void main(String[] args) {<br><br>        get(&quot;/crud&quot;, (req, res) -&gt; &quot;ToDo indeveloping using spark framework&quot;);<br><br>        // Rota para listar todos os itens<br>        get(&quot;/items&quot;, (req, res) -&gt; {<br>            res.type(&quot;application/json&quot;);<br>            return new Gson().toJson(itens);<br>        });<br><br>        // Rota para obter um item específico<br>        get(&quot;/items/:id&quot;, (req, res) -&gt; {<br>            int id = Integer.parseInt(req.params(&quot;:id&quot;));<br>            Item item = encontrarItem(id);<br>            if (item != null) {<br>                res.type(&quot;application/json&quot;);<br>                return new Gson().toJson(item);<br>            } else {<br>                res.status(404);<br>                return &quot;Item não encontrado&quot;;<br>            }<br>        });<br><br>        // Rota para adicionar um novo item<br>        post(&quot;/items&quot;, (req, res) -&gt; {<br>            String body = req.body();<br>            Item novoItem = new Gson().fromJson(body, Item.class);<br>            novoItem.id = proximoId++;<br>            itens.add(novoItem);<br>            res.status(201); // Código de status 201 para recurso criado<br>            return &quot;Novo item adicionado com ID &quot; + novoItem.id;<br>        });<br><br>        // Rota para atualizar um item existente<br>        put(&quot;/items/:id&quot;, (req, res) -&gt; {<br>            int id = Integer.parseInt(req.params(&quot;:id&quot;));<br>            String body = req.body();<br>            Item itemAtualizado = new Gson().fromJson(body, Item.class);<br>            Item itemExistente = encontrarItem(id);<br>            if (itemExistente != null) {<br>                itemExistente.nome = itemAtualizado.nome;<br>                return &quot;Item com ID &quot; + id + &quot; atualizado&quot;;<br>            } else {<br>                res.status(404);<br>                return &quot;Item não encontrado&quot;;<br>            }<br>        });<br><br>        // Rota para excluir um item<br>        delete(&quot;/items/:id&quot;, (req, res) -&gt; {<br>            int id = Integer.parseInt(req.params(&quot;:id&quot;));<br>            Item item = encontrarItem(id);<br>            if (item != null) {<br>                itens.remove(item);<br>                return &quot;Item com ID &quot; + id + &quot; excluído&quot;;<br>            } else {<br>                res.status(404);<br>                return &quot;Item não encontrado&quot;;<br>            }<br>        });<br><br>    }<br><br>    // Método auxiliar para encontrar um item pelo ID<br>    static Item encontrarItem(int id) {<br>        for (Item item : itens) {<br>            if (item.id == id) {<br>                return item;<br>            }<br>        }<br>        return null;<br>    }<br>}</pre><h3>Resultado</h3><p>Adicionar item:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qHUvzBPDmZyw0Pa5NjPSZw.png" /></figure><p>Exibir item:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WIGpRDPRhBopvKzvqClVyQ.png" /></figure><p>Alterar item:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fdbCxxGwu3tQZIqEi3hqYw.png" /></figure><p>Deletar item:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3xUoD8sBwgURd3nljVYz8w.png" /></figure><h3>Conclusão</h3><p>O Spark Micro Framework continua a ser uma escolha popular para desenvolvedores que buscam simplicidade e desempenho em seus projetos web em Java. Embora apresente algumas limitações em termos de escalabilidade e ecossistema, sua abordagem minimalista o torna uma opção atraente para projetos menores e iniciativas de desenvolvimento rápido. Com a evolução da tecnologia e o aprimoramento contínuo do framework, é provável que o Spark continue a desempenhar um papel significativo no panorama do desenvolvimento web.</p><h3>Pra Saber ++</h3><ol><li>Spark. Disponível em: <a href="https://sparkjava.com/">https://sparkjava.com/</a></li><li>Building an API With the Spark Java Framework. Disponível em: <a href="https://www.baeldung.com/spark-framework-rest-api">https://www.baeldung.com/spark-framework-rest-api</a></li><li>Criando uma aplicação REST com Spark Java. Disponível em: <a href="https://medium.com/danieldiasjava/criando-uma-aplica%C3%A7%C3%A3o-rest-com-sparkjava-4d68737fd9b2">https://medium.com/danieldiasjava/criando-uma-aplica%C3%A7%C3%A3o-rest-com-sparkjava-4d68737fd9b2</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0aec1a674a49" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Explorando os API Gateway Pattern: Simplificando a Integração de Serviços]]></title>
            <link>https://medium.com/@alexjosesilva/explorando-os-api-gateway-pattern-simplificando-a-integra%C3%A7%C3%A3o-de-servi%C3%A7os-b30190f129b5?source=rss-8fb0e05e386e------2</link>
            <guid isPermaLink="false">https://medium.com/p/b30190f129b5</guid>
            <category><![CDATA[api-gateway]]></category>
            <category><![CDATA[api]]></category>
            <category><![CDATA[patterns]]></category>
            <category><![CDATA[desing]]></category>
            <category><![CDATA[api-development]]></category>
            <dc:creator><![CDATA[Alex José Silva]]></dc:creator>
            <pubDate>Tue, 19 Mar 2024 14:02:26 GMT</pubDate>
            <atom:updated>2024-03-19T14:02:26.894Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/728/1*YvoDq8HS2scWHjnGUP-R4Q.png" /></figure><p>Nos ecossistemas modernos de desenvolvimento de software, a integração de serviços é fundamental para a construção de sistemas escaláveis e robustos. Os API Gateways emergem como uma solução central para simplificar esse processo complexo, oferecendo uma camada de entrada unificada para diversos serviços de backend.</p><p>Vamos explorar os padrões de API Gateway mais comuns, destacando seus benefícios e limitações:</p><h3><strong>1 .Single Entry Point (Ponto de Entrada Único)</strong></h3><p><em>O Design Patterns de API Single Entry Point fornece um ponto central para direcionar solicitações a diferentes endpoints de serviços.</em></p><p>✳️<strong>Benefícios</strong>: Simplifica a integração ao fornecer um único ponto de acesso para clientes. Facilita o roteamento de solicitações para serviços de backend específicos.</p><p>⛔<strong>Limitações</strong>: Pode se tornar um ponto único de falha se não dimensionado adequadamente. Requer uma boa gestão de roteamento para garantir que as solicitações sejam direcionadas corretamente.</p><p><a href="https://gist.github.com/alexjosesilva/5629286cecb4284fc656d990146a0fc5">Implementação no meu GIT</a> 💾</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/818/1*QB_0FTyvKHfQunxitbWOMA.gif" /></figure><h3><strong>2. Aggregator (Agregador)</strong></h3><p><em>O padrão de design Agregador de serviços recebe uma solicitação do cliente e busca dados de vários serviços, combinando-os em uma única resposta.</em></p><p>✳️Benefícios: Permite a composição de múltiplos serviços em uma única resposta para o cliente. Reduz a complexidade para os clientes ao fornecer uma visão unificada dos dados.</p><p>⛔Limitações: Pode introduzir latência adicional devido à necessidade de buscar e combinar dados de várias fontes. Requer cuidado na sincronização de dados para evitar inconsistências.</p><p><a href="https://gist.github.com/alexjosesilva/e78f78f56440c454b5dddaba0cbe61c1">Implementação no meu GIT</a> 💾</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/818/1*4a8iX8JAtV3qV-N53BdIFw.gif" /></figure><h3>3. Authentication and Authorization (Autenticação e Autorização)</h3><p><em>O cliente envia uma solicitação ao servidor com suas credenciais. O servidor autentica o cliente, verificando as credenciais. Em seguida, o servidor autoriza a solicitação, garantindo que o cliente tenha permissão para acessar os recursos solicitados com base em suas credenciais.</em></p><p>✳️Benefícios: Centraliza a gestão de autenticação e autorização, garantindo a segurança das APIs. Facilita a implementação de políticas de segurança consistentes.</p><p>⛔Limitações: Pode introduzir overhead devido à validação de tokens e chamadas a serviços de autorização. Requer uma configuração cuidadosa para evitar falhas de segurança.</p><p><a href="https://gist.github.com/alexjosesilva/b53d2322c2dc91bd5c89477d9b20d77b">Implementação no meu GIT</a> 💾</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/818/1*BAT-jpjT_VaatebILCADbQ.gif" /></figure><h3><strong>4. Rate Limiting (Limitação de Taxa)</strong></h3><p><em>O cliente envia uma solicitação ao servidor. O servidor verifica a taxa de solicitações do cliente. Se estiver dentro do limite, o servidor processa a solicitação normalmente. Se exceder o limite, o servidor retorna um código de erro, impedindo a sobrecarga dos recursos.</em></p><p>✳️Benefícios: Protege os serviços de backend contra sobrecarga e abusos, garantindo uma experiência consistente para todos os clientes. Ajuda a manter a disponibilidade dos serviços.</p><p>⛔Limitações: Pode limitar a escalabilidade do sistema se as taxas forem configuradas muito baixas. Requer monitoramento constante para ajustar as taxas conforme necessário.</p><ul><li>Para implementar a limitação de taxa, você pode usar bibliotecas como Guava ou Spring Cloud Gateway.</li></ul><p>Aqui está um exemplo básico de como configurar a limitação de taxa para um roteamento específico:</p><pre>spring:<br>  cloud:<br>    gateway:<br>      routes:<br>      - id: rota-exemplo<br>        uri: http://exemplo.com<br>        predicates:<br>        - Path=/exemplo<br>        filters:<br>        - name: RequestRateLimiter<br>          args:<br>            key-resolver: &quot;#{@apiKeyResolver}&quot;<br>            redis-rate-limiter.replenishRate: 10<br>            redis-rate-limiter.burstCapacity: 20</pre><p><a href="https://gist.github.com/alexjosesilva/d25ebcc4ad6b17c2ffa702e11c84dbec">Implementação no meu GIT</a> 💾</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/818/1*v9TLb6HLbG64IgQRW_RJkg.gif" /></figure><h3>4. Caching (Armazenamento em Cache)</h3><p><em>Quando o cliente envia uma solicitação, o servidor verifica se há dados em cache para essa solicitação. Se os dados estiverem em cache, o servidor retorna a resposta diretamente do cache, economizando tempo e recursos. Caso contrário, o servidor processa a solicitação normalmente e armazena a resposta em cache para futuras solicitações semelhantes.</em></p><p>✳️Benefícios: Melhora o desempenho ao armazenar em cache respostas de serviços de backend frequentemente acessados. Reduz a carga nos serviços, aumentando a escalabilidade.</p><p>⛔Limitações: Requer políticas de invalidação de cache eficazes para garantir a consistência dos dados. Pode levar a respostas desatualizadas se não gerenciado corretamente.</p><ul><li>Recomendado implementar o armazenamento em cache com o Redis. O <a href="https://redis.com/">Redis </a>é um armazenamento de estrutura de dados em memória que é amplamente utilizado para caching devido à sua velocidade e capacidade de lidar com grandes volumes de dados. Para implementar o armazenamento em cache com o Redis em um projeto Java, você pode usar a biblioteca Jedis ou Lettuce, que são clientes Redis populares para Java.</li></ul><p><a href="https://gist.github.com/alexjosesilva/a43dc6412c42bafb61ed21cc092fbdbc">Implementação no meu GIT</a> 💾</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/818/1*UOa6a3Dc9TlXzjnctNHazg.gif" /></figure><h3>Conclusão</h3><p>Ao adotar os padrões de API Gateway, os desenvolvedores podem criar sistemas mais flexíveis, seguros e eficientes. No entanto, é crucial entender as nuances de cada padrão e avaliar cuidadosamente os benefícios e limitações em relação aos requisitos específicos do projeto.</p><h3>Pra Saber +</h3><ol><li><strong>Microservices Design — API Gateway Pattern.</strong> Disponível em: <a href="https://blog.apilayer.com/microservices-design-api-gateway-pattern/">https://blog.apilayer.com/microservices-design-api-gateway-pattern/</a></li><li><strong>What is the Gateway Pattern?</strong> Disponível em: <a href="https://www.c-sharpcorner.com/article/microservices-design-using-gateway-pattern/">https://www.c-sharpcorner.com/article/microservices-design-using-gateway-pattern/</a></li><li><strong>Pattern: API Gateway / Backends for Frontends</strong>. Disponível em: <a href="https://microservices.io/patterns/apigateway.html">https://microservices.io/patterns/apigateway.html</a></li><li><strong>Centralized Authentication and Authorization API Gateway</strong>. Disponível em: <a href="https://engineering.bigshyft.com/centralized-authentication-and-authorization-api-gateway/">https://engineering.bigshyft.com/centralized-authentication-and-authorization-api-gateway/</a></li><li><strong>API Gateway Design Pattern</strong>. Disponível em: <a href="https://medium.com/@wahyubagus1910/api-gateway-design-pattern-implement-rate-limiting-and-circuit-breaker-on-microservices-9d777c778272">https://medium.com/@wahyubagus1910/api-gateway-design-pattern-implement-rate-limiting-and-circuit-breaker-on-microservices-9d777c778272</a></li><li><strong>Service Aggregator Pattern</strong>. Disponível em: <a href="https://medium.com/design-microservices-architecture-with-patterns/service-aggregator-pattern-e87561a47ac6">https://medium.com/design-microservices-architecture-with-patterns/service-aggregator-pattern-e87561a47ac6</a></li><li><strong>API Gateway Pattern e BFF (Backend For Frontend)</strong>. Disponível em: <a href="https://www.youtube.com/watch?v=OnHdzM93IOU">https://www.youtube.com/watch?v=OnHdzM93IOU</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b30190f129b5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[7 principais padrões de Projeto em JAVA]]></title>
            <link>https://medium.com/@alexjosesilva/7-principais-padr%C3%B5es-de-projeto-em-java-25bc054eb4ac?source=rss-8fb0e05e386e------2</link>
            <guid isPermaLink="false">https://medium.com/p/25bc054eb4ac</guid>
            <category><![CDATA[desing-pattern]]></category>
            <category><![CDATA[java17]]></category>
            <category><![CDATA[java11]]></category>
            <category><![CDATA[java21]]></category>
            <category><![CDATA[java]]></category>
            <dc:creator><![CDATA[Alex José Silva]]></dc:creator>
            <pubDate>Mon, 18 Mar 2024 00:30:56 GMT</pubDate>
            <atom:updated>2024-03-18T00:31:32.884Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*rEKHCatcCxdaQPCuad0Xvw.png" /></figure><blockquote>Padrões de projeto são soluções reutilizáveis para problemas comuns de design de software, promovendo boas práticas e eficiência no desenvolvimento.</blockquote><p>Existem várias ferramentas que podem ajudar na identificação de padrões de projeto em código, como o <a href="https://www.sonarsource.com/products/sonarqube/">SonarQube</a>, o Design Pattern Detector e o Design Pattern Recognition Tool. Suuuuuuuuuuuuuper recomendo!</p><p>Os tipos de padrões de projeto geralmente são categorizados em três grupos principais:</p><ul><li>Padrões de Criação,</li><li>Padrões Estruturais e</li><li>Padrões Comportamentais.</li></ul><p>Abaixo descrevo alguns:</p><p><strong>Singleton</strong></p><p>Garante que uma classe tenha apenas uma instância e fornece um ponto de acesso global a essa instância. (<a href="https://gist.github.com/alexjosesilva/acb3cedebda67afefb95f0a3d53b31ff">Exemplo em meu Git</a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/220/0*oS6Htly9K_stvvGw" /></figure><p><strong>Factory Method</strong></p><p>Define uma interface para criar um objeto, permitindo que subclasses alterem o tipo de objetos criados. (<a href="https://gist.github.com/alexjosesilva/9e9e9ff4b9e99e63683fb16c7a3c29fa">Exemplo em meu Git</a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/0*5TnDdUVrgWIWdK19" /></figure><p><strong>Observer</strong></p><p>Permite que objetos observadores sejam notificados e atualizados sobre mudanças em um objeto observado. (<a href="https://gist.github.com/alexjosesilva/6defae626947a5ed51d0a5b2defe81d1">Exemplo em meu Git</a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/0*Xsw4jZMpsNN5IcR-" /></figure><p><strong>Strategy</strong></p><p>Define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis.(<a href="https://gist.github.com/alexjosesilva/bd0fb4891ffe1d947bd7d65a08f0a454">Exemplo em meu Git</a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/501/0*KPR7Ir3wF_VhN2GL" /></figure><p><strong>Adapter</strong></p><p>Permite que objetos com interfaces incompatíveis trabalhem juntos, convertendo a interface de um objeto para outra esperada.(<a href="https://gist.github.com/alexjosesilva/bf419b5d57bfc54ad6aa5dab63648c93">Exemplo em meu Git</a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/777/0*8QRfeSukHvf1cDL4" /></figure><p><strong>Decorator</strong></p><p>Adiciona responsabilidades a objetos de forma dinâmica, permitindo extensões de funcionalidades sem alterar a estrutura.(<a href="https://gist.github.com/alexjosesilva/35cf3684fdedcfc09dfda152990ff2da">Exemplo em meu Git</a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*WE_bpCOfgAO3gHDQ" /></figure><p><strong>Composite</strong></p><p>Permite tratar objetos individuais e composições de objetos de maneira uniforme, simplificando a manipulação de estruturas hierárquicas.(<a href="https://gist.github.com/alexjosesilva/c3b47871f19984d5dc7015cb47fce8ab">Exemplo em meu Git</a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/609/0*apOkOvlWpqWWW3g0" /></figure><p><strong>Para Saber +</strong></p><ol><li>Singleton: <a href="https://pt.wikipedia.org/wiki/Singleton">https://pt.wikipedia.org/wiki/Singleton</a></li><li>Factory Method: <a href="https://pt.wikipedia.org/wiki/Factory_Method">https://pt.wikipedia.org/wiki/Factory_Method</a></li><li>Observer: <a href="https://pt.wikipedia.org/wiki/Observer">https://pt.wikipedia.org/wiki/Observer</a></li><li>Strategy: <a href="https://pt.wikipedia.org/wiki/Strategy">https://pt.wikipedia.org/wiki/Strategy</a></li><li>Adapter: <a href="https://pt.wikipedia.org/wiki/Adapter">https://pt.wikipedia.org/wiki/Adapter</a></li><li>Decorator: <a href="https://pt.wikipedia.org/wiki/Decorator">https://pt.wikipedia.org/wiki/Decorator</a></li><li>Composite: <a href="https://pt.wikipedia.org/wiki/Composite">https://pt.wikipedia.org/wiki/Composite</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=25bc054eb4ac" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Afinal, o que é IA Generativa ?]]></title>
            <link>https://medium.com/@alexjosesilva/afinal-o-que-%C3%A9-ia-generativa-324aa39c3a44?source=rss-8fb0e05e386e------2</link>
            <guid isPermaLink="false">https://medium.com/p/324aa39c3a44</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[ia-generativa]]></category>
            <category><![CDATA[deep-learning]]></category>
            <dc:creator><![CDATA[Alex José Silva]]></dc:creator>
            <pubDate>Fri, 15 Mar 2024 07:44:20 GMT</pubDate>
            <atom:updated>2024-03-15T07:44:20.899Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kiILCaLl8p9UpfXT_npgPQ.jpeg" /></figure><h3>Afinal, o que é IA Generativa ?</h3><blockquote>A nova revolução industrial</blockquote><p>A IA Generativa teve suas raízes na década de 1950, com os primeiros experimentos em redes neurais. Sua essência reside na capacidade de criar conteúdo novo e único, desde textos, imagens, músicas até soluções de problemas complexos. Este artigo explora sua origem, inovações, impactos e o futuro promissor dessa tecnologia revolucionária.</p><p>Ian Goodfellow é frequentemente destacado por sua invenção das Redes Generativas Adversariais (GANs) em 2014, muitos outros contribuíram significativamente para o campo antes e depois dele. Aqui estão alguns dos cientistas e suas contribuições notáveis:</p><ol><li><a href="https://en.wikipedia.org/wiki/Ian_Goodfellow">Ian Goodfellow </a>— Inventou as GANs (Redes Generativas Adversariais) em 2014, um marco na IA Generativa, que permitiu a geração de imagens realistas e outros dados.</li><li><a href="https://sh-tsang.medium.com/deep-learning-for-ai-by-yoshua-bengio-yann-lecun-and-geoffrey-hinton-23c16a479300">Yoshua Bengio, Geoffrey Hinton, e Yann LeCun</a> — Frequentemente referidos como os “padrinhos da IA” por seus trabalhos fundamentais em redes neurais profundas, que formam a base para muitos sistemas de IA Generativa.</li><li><a href="https://scholar.google.com/citations?hl=en&amp;user=dOad5HoAAAAJ">Alec Radford</a> — Trabalhou em várias inovações em IA Generativa, incluindo a aplicação de GANs para gerar imagens e texto.</li><li><a href="https://scholar.google.com/citations?user=NMS69lQAAAAJ&amp;hl=en">Jeff Dean</a> — Como líder da <a href="https://ai.google/">Google AI</a>, Jeff Dean supervisionou o desenvolvimento de várias tecnologias de IA, incluindo aquelas relacionadas à geração de conteúdo.</li><li><a href="https://en.wikipedia.org/wiki/Demis_Hassabis">Demis Hassabis</a> — Co-fundador da <a href="https://deepmind.google/">DeepMind</a>, que desenvolveu o <a href="https://deepmind.google/technologies/alphago/">AlphaGo </a>e outras tecnologias de IA que aprendem e melhoram de forma generativa.</li></ol><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F6ho_x93MHhA%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D6ho_x93MHhA&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F6ho_x93MHhA%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/1606b90750b0c712427810ecfedcb155/href">https://medium.com/media/1606b90750b0c712427810ecfedcb155/href</a></iframe><p><strong>Principais Produtos no Mercado</strong></p><ul><li><a href="https://chat.openai.com/">GPT-3</a> e <a href="https://openai.com/research/gpt-4">GPT-4</a> da OpenAI: Modelos de linguagem avançados para geração de texto.</li><li><a href="https://davinci.ai/">DAVINCI</a>: Ferramenta de design assistido por IA para criações gráficas.</li><li><a href="https://github.com/NVlabs/stylegan">StyleGAN</a>: Uma variante de GAN conhecida por gerar imagens hiper-realistas.</li><li><a href="https://www.perplexity.ai/">PerPlexity.ai</a>: inteligência artificial generativa similar ao GPT da OpenAi</li><li><a href="https://gemini.google.com/app">Gemini.ai</a>: inteligência artificial generativa das Google</li><li><a href="https://github.com/features/copilot">GitHub Copilot</a>: Essa ferramenta de inteligência artificial auxilia programadores na escrita de código, sugerindo automaticamente linhas de código e funções</li><li><a href="https://copilot.microsoft.com/">Copilot</a>: é uma ferramenta de inteligência artificial (IA) que auxilia usuários em tarefas diária.</li><li><a href="https://www.oracle.com/br/artificial-intelligence/generative-ai/">Oracle Generative AI</a>: IA generativa da Oracle (em desenvolvimento)</li><li><a href="https://aws.amazon.com/pt/q/">Amazon Q</a>: A generativa da Amazon</li></ul><h3><strong>Olhando para o Futuro</strong></h3><p>O futuro da IA Generativa é extraordinariamente promissor, com potencial para transformar indústrias inteiras e a maneira como vivemos. À medida que estas tecnologias se tornam mais sofisticadas, surgem também questões éticas e desafios, especialmente relacionados à autenticidade e propriedade intelectual. No entanto, a capacidade de gerar ideias, soluções e criações novas coloca a IA Generativa na vanguarda da próxima grande revolução tecnológica, prometendo um mundo de possibilidades ilimitadas.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=324aa39c3a44" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Afinal, o que é Pytorch ?]]></title>
            <link>https://medium.com/@alexjosesilva/afinal-o-que-%C3%A9-pytorch-a1e90c00ed12?source=rss-8fb0e05e386e------2</link>
            <guid isPermaLink="false">https://medium.com/p/a1e90c00ed12</guid>
            <category><![CDATA[aprendizado-de-maquina]]></category>
            <category><![CDATA[pytorch]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[deep-learning]]></category>
            <dc:creator><![CDATA[Alex José Silva]]></dc:creator>
            <pubDate>Fri, 15 Mar 2024 05:58:47 GMT</pubDate>
            <atom:updated>2024-03-15T05:58:47.227Z</atom:updated>
            <content:encoded><![CDATA[<h3>Afinal, o que é Pytorch ?</h3><p>O Poder do PyTorch: Transformando Ideias em Realidade</p><p><strong>Introdução</strong></p><p>Desenvolvido inicialmente pelo <a href="https://ai.meta.com/research/">Facebook AI Research (FAIR)</a> em 2016, o <a href="https://pytorch.org/">PyTorch </a>surgiu como uma estrutura de código aberto para facilitar a pesquisa e o desenvolvimento em IA e ML. Sua arquitetura dinâmica e intuitiva rapidamente o tornou popular entre pesquisadores e desenvolvedores.</p><p><strong>Comunidade</strong></p><p>O PyTorch é mantido pela comunidade de desenvolvedores, com contribuições significativas de empresas como Nvidia, Facebook, Google, Microsoft e Uber. Podendo ser encontrado nas maiores Cloud: Azure, AWS, Google. Atualmente, o projeto é liderado pela <a href="https://pytorch.org/docs/stable/community/governance.html">PyTorch Core Team</a>, que garante sua evolução contínua e suporte técnico.</p><p><strong>Impacto na Vida das Pessoas</strong></p><p>A tecnologia PyTorch tem revolucionado diversos setores, desde medicina e finanças até entretenimento e automação industrial. Com modelos mais precisos e rápidos de treinar, podemos criar sistemas de diagnóstico médico mais precisos, sistemas de recomendação mais inteligentes e robôs autônomos mais seguros.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/551/1*Vo9JT5Tl65w8EsphMcyk9A.png" /></figure><p><strong>Aplicação no mundo real</strong></p><p>Super recomendo a utilizar <a href="https://colab.research.google.com/">https://colab.research.google.com/</a></p><p>devido a alguns algoritmos utilizarem muito o processador o que exige muito de notebook e a google possui o serviço da colab apropriado para desenvolver esse algoritmos.</p><p><a href="https://colab.research.google.com/drive/1jYOHdOMbleMbDF3RQ5Urya0ZgnCrALYg?usp=sharing">Codigo no Colab</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*BzBgdDxlkinimdrI" /></figure><p>Abaixo, vou fornecer um exemplo simples de uma aplicação usando PyTorch. Este exemplo consistirá em criar e treinar uma rede neural simples para classificar imagens do conjunto de dados MNIST, que contém dígitos escritos à mão:</p><p>Certifique-se de ter o PyTorch instalado em seu ambiente Python antes de executar este código. Se não estiver instalado, você pode instalar usando o pip:</p><pre>pip install torch torchvision</pre><p>Aqui está o código:</p><pre>import torch<br>import torchvision<br>import torchvision.transforms as transforms<br>import torch.nn as nn<br>import torch.optim as optim</pre><pre># Transformações para pré-processar os dados<br>transform = transforms.Compose([<br>    transforms.ToTensor(),  # Converte a imagem PIL para tensor<br>    transforms.Normalize((0.5,), (0.5,))  # Normaliza os pixels para o intervalo [-1, 1]<br>])</pre><pre># Baixando e carregando o conjunto de dados MNIST<br>trainset = torchvision.datasets.MNIST(root=&#39;./data&#39;, train=True, download=True, transform=transform)<br>trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)</pre><pre># Definindo uma rede neural simples<br>class SimpleNN(nn.Module):<br>    def __init__(self):<br>        super(SimpleNN, self).__init__()<br>        self.fc1 = nn.Linear(28*28, 128)<br>        self.fc2 = nn.Linear(128, 64)<br>        self.fc3 = nn.Linear(64, 10)</pre><pre>    def forward(self, x):<br>        x = x.view(-1, 28*28)<br>        x = torch.relu(self.fc1(x))<br>        x = torch.relu(self.fc2(x))<br>        x = self.fc3(x)<br>        return x</pre><pre># Instanciando o modelo, função de perda e otimizador<br>net = SimpleNN()<br>criterion = nn.CrossEntropyLoss()<br>optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)</pre><pre># Treinando a rede neural<br>for epoch in range(5):  # loop over the dataset multiple times<br>    running_loss = 0.0<br>    for i, data in enumerate(trainloader, 0):<br>        inputs, labels = data<br>        optimizer.zero_grad()  # zero the parameter gradients<br>        outputs = net(inputs)<br>        loss = criterion(outputs, labels)<br>        loss.backward()<br>        optimizer.step()  # Does the update<br>        running_loss += loss.item()<br>        if i % 2000 == 1999:  # Printa a cada 2000 mini-batches<br>            print(&#39;[%d, %5d] loss: %.3f&#39; % (epoch + 1, i + 1, running_loss / 2000))<br>            running_loss = 0.0</pre><pre>print(&#39;Finished Training&#39;)</pre><p>Este código cria uma rede neural simples com três camadas totalmente conectadas. Em seguida, ele treina a rede usando o conjunto de dados MNIST para classificação de dígitos escritos à mão. Você pode expandir este exemplo adicionando mais camadas à rede, ajustando os hiperparâmetros ou usando conjuntos de dados diferentes.</p><p><strong>Resultado no Colab</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PhtZy6gmMv8FrbEU7PEhnw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*F6VpSYO9lgqSIpe3TsZ1BQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eXKAmeR6z8y4xYCteW8jpA.png" /></figure><p><strong>Para Sabe +</strong></p><ol><li>PyTorch. Disponível em: <a href="https://www.nvidia.com/en-us/glossary/pytorch/">https://www.nvidia.com/en-us/glossary/pytorch/</a></li><li>Pytorch. Disponível em: <a href="https://pytorch.org/ecosystem/">https://pytorch.org/ecosystem/</a></li><li>Image classification (American Sign language) using PyTorch. Disponível em: <a href="https://medium.com/@sachinsom507/image-classification-american-sign-language-using-pytorch-7bef9d7e8a25">https://medium.com/@sachinsom507/image-classification-american-sign-language-using-pytorch-7bef9d7e8a25</a></li><li>Pytorch Neural Network example. Disponível em: <a href="https://www.youtube.com/watch?v=Jy4wM2X21u0">https://www.youtube.com/watch?v=Jy4wM2X21u0</a></li><li>Pytorch Neural Network Tutorial. Disponível em: <a href="https://aladdinpersson.medium.com/pytorch-neural-network-tutorial-7e871d6be7c4">https://aladdinpersson.medium.com/pytorch-neural-network-tutorial-7e871d6be7c4</a></li><li>What is PyTorch? (Machine/Deep Learning). Disponível em: <a href="https://www.youtube.com/watch?v=fJ40w_2h8kk">https://www.youtube.com/watch?v=fJ40w_2h8kk</a></li><li>Introdução ao PyTorch | Redes Neurais | Primeiros passos com Pytorch | Deep Learning. Disponível em: <a href="https://www.youtube.com/watch?v=cGxv8tOaA7I">https://www.youtube.com/watch?v=cGxv8tOaA7I</a></li><li>Meta revela o PyTorch 2.0. Disponível em: <a href="https://www.youtube.com/watch?v=nwVyeUV03OQ">https://www.youtube.com/watch?v=nwVyeUV03OQ</a></li></ol><blockquote>Gratidão por ter lido até o fim…</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a1e90c00ed12" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introdução a Machine Learning]]></title>
            <link>https://medium.com/@alexjosesilva/introdu%C3%A7%C3%A3o-a-machine-learning-1283428e2da9?source=rss-8fb0e05e386e------2</link>
            <guid isPermaLink="false">https://medium.com/p/1283428e2da9</guid>
            <category><![CDATA[aprendizagem-de-máquina]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[deep-learning]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Alex José Silva]]></dc:creator>
            <pubDate>Fri, 15 Mar 2024 05:17:39 GMT</pubDate>
            <atom:updated>2024-03-15T05:17:39.586Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/638/0*b0TxendMOWfBIQkm" /></figure><p>Esse artigo foi desenvolvido apartir das aulas no curso de especialização Deep Learning da UFPE no ano de 2023. Meu objetivo é desenvolver um livro afim de consolidar meu estudos e projetos profissionais. Então vamos lá…</p><p><strong>Explorando o Universo do Machine Learning 🌟</strong></p><p>No vasto cosmos da tecnologia, Machine Learning (ML) surge como uma estrela brilhante, iluminando o caminho para inovações sem precedentes. Originário do desejo humano de criar máquinas inteligentes, o ML floresceu e se tornou uma força poderosa no mundo digital.</p><p><strong>Origem Celestial 🚀</strong></p><p>O conceito de Machine Learning não é novo; suas raízes remontam ao século XX, quando os primeiros pioneiros da computação sonhavam com máquinas capazes de aprender e se adaptar. No entanto, foi apenas nas últimas décadas que o ML começou a decolar, impulsionado por avanços em algoritmos e poder computacional.</p><p><strong>Criador Visionário 🧠</strong></p><p>Alan Turing, o gênio por trás da máquina de Turing, é frequentemente considerado um dos precursores do Machine Learning. Sua visão revolucionária sobre a inteligência artificial lançou as bases para o que hoje conhecemos como ML. Desde então, muitos outros cientistas e pesquisadores contribuíram para moldar esse campo fascinante.</p><p><strong>Benefícios Cósmicos 🌌</strong></p><p>Os benefícios do Machine Learning são tão vastos quanto o universo. Desde a automação de tarefas rotineiras até a análise de dados complexos, o ML tem o potencial de revolucionar praticamente todas as áreas da vida humana. Ele capacita sistemas a aprender com experiências passadas e tomar decisões inteligentes sem intervenção humana, aumentando a eficiência e a precisão.</p><p><strong>Limitações Terrenas 🛑</strong></p><p>No entanto, assim como qualquer tecnologia, o Machine Learning enfrenta limitações. Um dos desafios mais prementes é a necessidade de grandes conjuntos de dados de alta qualidade para treinar modelos eficazes. Além disso, questões éticas, como preconceitos nos dados ou decisões algorítmicas, exigem atenção cuidadosa para garantir um uso responsável do ML.</p><p><strong>Principais Tecnologias Estelares 🌠</strong></p><p>Dentro do vasto cosmos do Machine Learning, várias tecnologias estelares estão brilhando com intensidade. Redes Neurais Artificiais (RNAs), algoritmos de Árvores de Decisão, e Support Vector Machines (SVMs) são apenas algumas das ferramentas poderosas que impulsionam o avanço do ML. Além disso, frameworks como TensorFlow e PyTorch fornecem plataformas robustas para desenvolver e implementar modelos de ML em escala.</p><h3>Introdução sobre Machine Learning 🌟</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F_lozjlVx0KE%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D_lozjlVx0KE&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F_lozjlVx0KE%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/7302ce8ad59f98e3ef0288273ffa0225/href">https://medium.com/media/7302ce8ad59f98e3ef0288273ffa0225/href</a></iframe><h3>Existem três tipos principais de Machine Learning🚀🚀🚀</h3><ol><li><strong>Aprendizado Supervisionado (Supervised Learning)</strong>:Nesse tipo de aprendizado, o algoritmo é treinado em um conjunto de dados rotulados, ou seja, dados que têm as entradas e as saídas desejadas.O objetivo é aprender uma função que mapeia entradas para saídas, de forma que o modelo possa prever a saída correspondente para novas entradas que não foram vistas durante o treinamento.Exemplos incluem classificação (como identificar se um e-mail é spam ou não) e regressão (como prever o preço de uma casa com base em suas características).</li><li><strong>Aprendizado Não Supervisionado (Unsupervised Learning)</strong>:Nesse tipo de aprendizado, o algoritmo é treinado em um conjunto de dados não rotulados, ou seja, dados que não têm saídas explicitamente definidas.O objetivo é explorar a estrutura oculta nos dados para encontrar padrões ou agrupamentos interessantes.Exemplos incluem clustering (agrupamento de documentos semelhantes em um conjunto de dados de texto) e redução de dimensionalidade (como encontrar uma representação de baixa dimensão dos dados enquanto mantém o máximo de informação possível).</li><li><strong>Aprendizado por Reforço (Reinforcement Learning)</strong>:Nesse tipo de aprendizado, o agente aprende a tomar decisões sequenciais interagindo com um ambiente.O agente recebe feedback na forma de recompensas ou penalidades, com base nas ações que realiza.O objetivo é aprender uma política que maximize a recompensa cumulativa ao longo do tempo.Exemplos incluem jogos de tabuleiro (como xadrez ou Go) e controle de robôs.</li></ol><h3>Conclusão: A Jornada Continua 🌌</h3><p>À medida que exploramos as vastas fronteiras do Machine Learning, somos lembrados de que estamos apenas começando nossa jornada. Com cada avanço, novos horizontes se abrem, revelando possibilidades infinitas para a aplicação dessa tecnologia transformadora. Enquanto continuamos nossa busca pelo conhecimento cósmico do ML, devemos sempre lembrar de usar esse poder com sabedoria e responsabilidade, guiados pela busca eterna pela compreensão e pelo progresso.</p><h3>Aplicação prática da ML 🌠</h3><p>Um exemplo simples de um algoritmo de Machine Learning para classificação de flores usando o conjunto de dados Iris e o algoritmo KNeighborsClassifier. Este exemplo é minimalista e utiliza a biblioteca scikit-learn em Python:</p><pre># Importando as bibliotecas necessárias<br>from sklearn.datasets import load_iris<br>from sklearn.model_selection import train_test_split<br>from sklearn.neighbors import KNeighborsClassifier<br><br># Carregando o conjunto de dados Iris<br>iris = load_iris()<br>X = iris.data<br>y = iris.target<br><br># Dividindo os dados em conjunto de treinamento e conjunto de teste<br>X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)<br><br># Inicializando o classificador KNN<br>knn = KNeighborsClassifier(n_neighbors=3)<br><br># Treinando o modelo<br>knn.fit(X_train, y_train)<br><br># Testando o modelo<br>accuracy = knn.score(X_test, y_test)<br>print(&quot;Acurácia do modelo: {:.2f}%&quot;.format(accuracy * 100))</pre><p>Este código carrega o conjunto de dados Iris, divide-o em um conjunto de treinamento e um conjunto de teste, inicializa um classificador KNN com k=3, treina o modelo com os dados de treinamento e testa o modelo com os dados de teste. Em seguida, exibe a acurácia do modelo.</p><p>Este é apenas um exemplo básico para ilustrar o uso de Machine Learning com Python. Dependendo do problema que você está tentando resolver, diferentes algoritmos e técnicas podem ser mais adequados.</p><h3>Referencias</h3><ol><li><a href="http://www.inf.ufpr.br/menotti/ci171-182/slides/ci171-intro.pdf">http://www.inf.ufpr.br/menotti/ci171-182/slides/ci171-intro.pdf</a></li><li><a href="https://www.slideshare.net/SandroMoreira8/introduo-a-machine-learning-179875333">https://www.slideshare.net/SandroMoreira8/introduo-a-machine-learning-179875333</a></li><li><a href="https://www.youtube.com/watch?v=ZTX1K2OyqMk">https://www.youtube.com/watch?v=ZTX1K2OyqMk</a></li><li><a href="https://www.amazon.com.br/Machine-Learning-Introdu%C3%A7%C3%A3o-">https://www.amazon.com.br/Machine-Learning-Introdu%C3%A7%C3%A3o-</a></li><li><a href="https://pt.slideshare.net/MorvanaBonin/introduo-a-machine-learning-93968410%C3%A0-classifica%C3%A7%C3%A3o-ebook/dp/B076MFC96R">https://pt.slideshare.net/MorvanaBonin/introduo-a-machine-learning-93968410%C3%A0-classifica%C3%A7%C3%A3o-ebook/dp/B076MFC96R</a></li><li><a href="https://www.youtube.com/watch?v=_lozjlVx0KE">https://www.youtube.com/watch?v=_lozjlVx0KE</a></li><li><a href="https://medium.com/@morvanabonin/uma-introdu%C3%A7%C3%A3o-a-machine-learning-2c70e915873a">https://medium.com/@morvanabonin/uma-introdu%C3%A7%C3%A3o-a-machine-learning-2c70e915873a</a></li><li><a href="https://www.datageeks.com.br/aprendizado-de-maquina/">https://www.datageeks.com.br/aprendizado-de-maquina/</a></li><li><a href="https://www2.slideshare.net/MarceloOliveira529/introduo-a-machine-learning">https://www2.slideshare.net/MarceloOliveira529/introduo-a-machine-learning</a></li><li><a href="https://link.springer.com/article/10.1023/A:1020281327116">https://link.springer.com/article/10.1023/A:1020281327116</a></li><li><a href="https://www.coursera.org/learn/machine-learning">https://www.coursera.org/learn/machine-learning</a></li><li><a href="https://docs.google.com/presentation/d/1kSuQyW5DTnkVaZEjGYCkfOxvzCqGEFzWBy4e9Uedd9k/mobilepresent?slide=id.g1e301fae90_1_568">https://docs.google.com/presentation/d/1kSuQyW5DTnkVaZEjGYCkfOxvzCqGEFzWBy4e9Uedd9k/mobilepresent?slide=id.g1e301fae90_1_568</a></li><li><a href="http://www.cs.cmu.edu/~tom/">http://www.cs.cmu.edu/~tom/</a></li><li><a href="https://www.saagie.com/blog/machine-learning-for-grandmas/">https://www.saagie.com/blog/machine-learning-for-grandmas/</a></li><li><a href="https://machinelearningmastery.com/master-machine-learning-algorithms/">https://machinelearningmastery.com/master-machine-learning-algorithms/</a></li></ol><p>Por Alex José Silva</p><p>Sou Analista de Sistemas e especialista em desenvolvimento de software com tecnologias abertas. Ao longo da minha carreira contribui na manutenção de sistemas para gestão empresarial em diversos tipos de segmentos: Hospitais, Mineradoras, Transportadoras e empresas de Logística em Cadeia de Mantimentos. Atuante em grupos de desenvolvedores no estado de Pernambuco: SalesForce, Chatbot Pernambuco, JUG-PE/Usuários Java de Pernambuco, Facebook Developer Circle Recife, GDG Recife, FEMUGPE — Front-End, IA_PE. Sou um experiente participante de <a href="https://app.shawee.io/@alexjosesilva">Hackathons</a>, <a href="https://alexjosesilva.itch.io/">GameJans</a> e <a href="https://brazil.startupweekend.directory/#/directory/person/iGrvLbYqUwqKjmjC">Startup Weekend.</a> Acredito na cultura de inovação e empreendedorismo.</p><p>Gratidão por ter lido até o fim…</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1283428e2da9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Afinal, o que é Deep Learning ?]]></title>
            <link>https://medium.com/@alexjosesilva/afinal-o-que-%C3%A9-deep-learning-243d82cb0c50?source=rss-8fb0e05e386e------2</link>
            <guid isPermaLink="false">https://medium.com/p/243d82cb0c50</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[deep-learning]]></category>
            <category><![CDATA[inteligencia-artificial]]></category>
            <category><![CDATA[aprendizado-de-maquina]]></category>
            <dc:creator><![CDATA[Alex José Silva]]></dc:creator>
            <pubDate>Fri, 15 Mar 2024 04:29:50 GMT</pubDate>
            <atom:updated>2024-03-15T04:29:50.116Z</atom:updated>
            <content:encoded><![CDATA[<h3>Afinal, o que é Deep Learning ?</h3><p>Deep Learning: Transformando o Futuro com Inteligência Artificial</p><h3>Origem e Evolução</h3><p>O conceito de Deep Learning ou Aprendizado Profundo tem suas raízes no desenvolvimento de redes neurais artificiais inspiradas pela estrutura e função do cérebro humano. Emergiu como um campo distinto dentro da inteligência artificial (IA) na última década, ganhando impulso com o avanço do poder computacional e a disponibilidade de grandes conjuntos de dados.</p><h3>Tecnologias Envolvidas</h3><p>Deep Learning utiliza algoritmos complexos conhecidos como redes neurais profundas, que são compostas por camadas de nós ou “neurônios”. Tecnologias chave incluem <a href="https://www.tensorflow.org/?hl=pt-br">TensorFlow</a>, <a href="https://pytorch.org/">PyTorch</a>, e <a href="https://keras.io/">Keras</a>, que facilitam a construção e treinamento de modelos de IA robustos.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/560/0*nd7mhVkbjGQeMDkp" /><figcaption>redes neurais profundas</figcaption></figure><h3>Propósito da Tecnologia</h3><p>O principal objetivo do Deep Learning é automatizar a tomada de decisão, interpretar grandes volumes de dados e reconhecer padrões complexos que seriam impossíveis ou impraticáveis para uma pessoa identificar.</p><h3>Exemplos de Uso</h3><ul><li><strong>Reconhecimento </strong>de Voz: Assistente virtual como Siri e Alexa.</li><li><strong>Visão Computacional</strong>: Sistemas de reconhecimento facial em smartphones e aeroportos.</li><li><strong>Diagnósticos Médicos</strong>: Melhoria na precisão de diagnósticos através da análise de imagens médicas.</li></ul><h3>Abaixo uma representação de uma figura através da Deep Learning</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*s1ttZdXtTPBIDbsN" /></figure><h3>Funcionamento</h3><p>As redes neurais profundas aprendem automaticamente a representar dados ao passar por múltiplas camadas de processamento, ajustando seus pesos através de um processo conhecido como backpropagation. Abaixo uma representação de uma figura através da Deep Learning:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1006/0*HvoSpfwGQy833Lo5" /></figure><h3>Os métodos de Deep Learning</h3><p>Os métodos de Deep Learning abrangem uma variedade de arquiteturas de redes neurais, cada uma adaptada a tipos específicos de tarefas e dados. Aqui estão alguns dos métodos mais significativos e suas aplicações:</p><ol><li><a href="https://www.youtube.com/watch?v=zAfBy74c2AI">Redes Neurais Convolucionais (CNNs)</a></li><li><a href="https://www.youtube.com/watch?v=ZvBJxh5O3H0">Redes Neurais Recorrentes (RNNs)</a></li><li><a href="https://www.youtube.com/watch?v=ADbPhK5-bvE">Autoencoders</a></li><li><a href="https://www.youtube.com/watch?v=Qutg3srXSiU">Redes Generativas Adversariais (GANs)</a></li><li><a href="https://www.youtube.com/watch?v=ZXiruGOCn9s">Redes de Atenção e Transformadores</a></li><li><a href="https://www.youtube.com/watch?v=vXtfdGphr3c">Deep Reinforcement Learning</a></li></ol><h3>Futuro e Impacto</h3><p>O futuro do Deep Learning promete uma era de inovações disruptivas, desde veículos autônomos até a personalização da educação. A capacidade de analisar e interpretar complexidades humanas e naturais está pavimentando o caminho para soluções mais eficazes e personalizadas.</p><p>Empresas como Google, Amazon, e Facebook lideram a adoção do Deep Learning, buscando melhorar a experiência do usuário, otimizar operações e abrir novos campos de negócios.</p><h3>Diferença entre Machine Learning X Deep Learning</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/693/0*zV7MP42FDeIjfVcG" /></figure><ul><li>Machine Learning é um campo da inteligência artificial que permite que sistemas aprendam e melhorem a partir de experiências sem serem explicitamente programados.</li><li>Deep Learning, um subconjunto de Machine Learning, utiliza redes neurais profundas para analisar grandes conjuntos de dados, aprendendo características complexas automaticamente, aprofundando-se progressivamente na análise dos dados.</li></ul><h3>Conclusão</h3><p>À medida que avançamos, o Deep Learning continua a ser um motor de inovação, prometendo revolucionar indústrias e impactar positivamente a vida cotidiana. A integração cada vez maior desta tecnologia sinaliza um futuro onde a IA é fundamental na resolução de desafios complexos da humanidade.</p><h3>Parte Prática</h3><p>Aqui está um exemplo minimalista, mas funcional, de um modelo de Deep Learning usando Keras com TensorFlow como backend. Este exemplo constrói e treina uma rede neural simples para o conjunto de dados MNIST, que consiste em imagens de dígitos manuscritos (0 a 9). O objetivo é classificar essas imagens em uma das 10 categorias de dígitos.</p><p>Antes de começar, certifique-se de ter instalado o TensorFlow. Você pode instalá-lo via pip:</p><pre>pip install tensorflow</pre><p>Agora, veja o código:</p><pre># Importações necessárias<br>import tensorflow as tf<br>from tensorflow.keras import layers, models<br>from tensorflow.keras.datasets import mnist<br>from tensorflow.keras.utils import to_categorical</pre><pre># Carregar os dados<br>(train_images, train_labels), (test_images, test_labels) = mnist.load_data()</pre><pre># Pré-processamento dos dados<br>train_images = train_images.reshape((60000, 28, 28, 1)).astype(&#39;float32&#39;) / 255<br>test_images = test_images.reshape((10000, 28, 28, 1)).astype(&#39;float32&#39;) / 255</pre><pre># Converter os rótulos em one-hot encoding<br>train_labels = to_categorical(train_labels)<br>test_labels = to_categorical(test_labels)</pre><pre># Construir o modelo<br>model = models.Sequential()<br>model.add(layers.Conv2D(32, (3, 3), activation=&#39;relu&#39;, input_shape=(28, 28, 1)))<br>model.add(layers.MaxPooling2D((2, 2)))<br>model.add(layers.Conv2D(64, (3, 3), activation=&#39;relu&#39;))<br>model.add(layers.MaxPooling2D((2, 2)))<br>model.add(layers.Conv2D(64, (3, 3), activation=&#39;relu&#39;))<br>model.add(layers.Flatten())<br>model.add(layers.Dense(64, activation=&#39;relu&#39;))<br>model.add(layers.Dense(10, activation=&#39;softmax&#39;))</pre><pre># Compilar o modelo<br>model.compile(optimizer=&#39;adam&#39;,<br>              loss=&#39;categorical_crossentropy&#39;,<br>              metrics=[&#39;accuracy&#39;])</pre><pre># Treinar o modelo<br>model.fit(train_images, train_labels, epochs=5, batch_size=64)</pre><pre># Avaliar o modelo<br>test_loss, test_acc = model.evaluate(test_images, test_labels)<br>print(f&#39;Test accuracy: {test_acc}&#39;)</pre><p>Este código realiza o seguinte:</p><ol><li>Carrega o conjunto de dados MNIST.</li><li>Pré-processa os dados redimensionando as imagens e convertendo os rótulos para one-hot encoding.</li><li>Constrói uma rede neural convolucional (CNN) simples, que inclui camadas de convolução e max pooling, seguidas por camadas densas para classificação.</li><li>Compila o modelo, especificando o otimizador, a função de perda e as métricas.</li><li>Treina o modelo nos dados de treinamento.</li><li>Avalia a precisão do modelo nos dados de teste.</li></ol><p>Este exemplo fornece uma base sólida para começar a experimentar com Deep Learning em Python, permitindo ajustes no modelo, no processo de treinamento e na preparação dos dados para explorar a eficácia em diferentes problemas.</p><h3>Testando o código com suas próprias imagens</h3><p>Para testar o código acima com suas próprias imagens de números escritos manualmente, você precisa seguir alguns passos. Primeiro, certifique-se de que suas imagens estejam no formato adequado (preferencialmente PNG ou JPG) e tenham as dimensões esperadas pelo modelo, que, no caso do exemplo fornecido, são 28x28 pixels. Aqui está um guia passo a passo sobre como fazer isso:</p><h3>1. Preparar a Imagem</h3><ul><li>Redimensionar a Imagem: Use um editor de imagens para redimensionar suas imagens para 28x28 pixels, que é o tamanho esperado pelo modelo.</li><li>Converter para Escala de Cinza: O modelo espera uma única camada de profundidade de cor (escala de cinza), então sua imagem deve ser convertida para escala de cinza se já não estiver.</li><li>Salvar como PNG ou JPG: Garanta que sua imagem esteja em um formato que possa ser lido facilmente por bibliotecas de manipulação de imagens em Python, como PNG ou JPG.</li></ul><h3>2. Carregar e Preprocessar a Imagem com Python</h3><p>Você pode usar a biblioteca PIL (Python Imaging Library) para carregar e preprocessar sua imagem. Se você não tem a PIL instalada, pode instalar a biblioteca Pillow, que é um fork ativo da PIL, usando pip:</p><pre>pip install Pillow</pre><p>Aqui está um exemplo de como carregar sua imagem, preprocessá-la e prepará-la para ser classificada pelo modelo:</p><pre>from tensorflow.keras.preprocessing import image<br>import numpy as np<br>from PIL import Image</pre><pre># Caminho para sua imagem<br>image_path = &#39;caminho/para/sua/imagem.png&#39;</pre><pre># Carregar a imagem<br>img = Image.open(image_path).convert(&quot;L&quot;)<br>img = img.resize((28, 28), Image.ANTIALIAS)</pre><pre># Converter a imagem para um array numpy e normalizar<br>img_array = np.array(img)<br>img_array = img_array.reshape((1, 28, 28, 1))<br>img_array = img_array.astype(&#39;float32&#39;) / 255</pre><pre># Previsão<br>predictions = model.predict(img_array)</pre><pre># Obter a classe com a maior probabilidade<br>predicted_class = np.argmax(predictions, axis=1)<br>print(f&#39;Classe prevista: {predicted_class[0]}&#39;)</pre><p>Esse código carrega sua imagem, converte para escala de cinza, redimensiona para 28x28 pixels, transforma em um array numpy adequado para o modelo (incluindo ajuste de forma e normalização), e finalmente, faz uma previsão usando o modelo treinado.</p><p>Lembre-se de substituir &#39;caminho/para/sua/imagem.png&#39; pelo caminho real da sua imagem.</p><h3>Notas Importantes</h3><ul><li><strong>Qualidade da Imagem</strong>: A qualidade e clareza do seu número manuscrito podem afetar a precisão da previsão. Tente fazer o número ocupar a maior parte da imagem e centralizá-lo bem para resultados ótimos.</li><li><strong>Consistência dos Dados</strong>: O modelo foi treinado com imagens em um fundo branco e números em preto. Tente manter suas imagens consistentes com essas características para melhor desempenho.</li></ul><h3>Pra saber +</h3><ol><li>Deep Learning. Disponível em: <a href="https://www.youtube.com/watch?v=7EpQsB225vs">https://www.youtube.com/watch?v=7EpQsB225vs</a></li><li>que é o Deep Learning? Disponível em: <a href="https://www.ibm.com/br-pt/topics/deep-learning">https://www.ibm.com/br-pt/topics/deep-learning</a></li><li>O que é Deep Learning. Disponível em: <a href="https://www.oracle.com/br/artificial-intelligence/machine-learning/what-is-deep-learning/">https://www.oracle.com/br/artificial-intelligence/machine-learning/what-is-deep-learning/</a></li><li>Deep learning. Disponível em: <a href="https://en.wikipedia.org/wiki/Deep_learning#cite_note-1">https://en.wikipedia.org/wiki/Deep_learning#cite_note-1</a></li><li>Deep Learning. Disponível em: <a href="https://aws.amazon.com/pt/what-is/deep-learning/">https://aws.amazon.com/pt/what-is/deep-learning/</a></li><li>Deep Learning. Disponível em: <a href="https://www.linkedin.com/pulse/ai-atlas-5-deep-learning-rudina-seseri/">https://www.linkedin.com/pulse/ai-atlas-5-deep-learning-rudina-seseri/</a></li><li>Livro sobre Deep Learning. Disponível em : <a href="https://www.amazon.com.br/Deep-Learning-Ian-Goodfellow/dp/0262035618">https://www.amazon.com.br/Deep-Learning-Ian-Goodfellow/dp/0262035618</a></li><li>Deep Learning with Python, Second Edition (English Edition). Disponível em: <a href="https://www.amazon.com.br/Deep-Learning-Python-Second-English-ebook/dp/B09K81XLN1">https://www.amazon.com.br/Deep-Learning-Python-Second-English-ebook/dp/B09K81XLN1</a></li><li>Deep Learning: Foundations and Concepts. Disponível em: <a href="https://www.amazon.com.br/Deep-Learning-Foundations-Christopher-Bishop/dp/3031454677">https://www.amazon.com.br/Deep-Learning-Foundations-Christopher-Bishop/dp/3031454677</a></li><li>Deep Learning em Python: Versão Estendida. Disponível em: <a href="https://www.amazon.com.br/Deep-Learning-Python-Vers%C3%A3o-Estendida-ebook/dp/B0C1TJ3VZC">https://www.amazon.com.br/Deep-Learning-Python-Vers%C3%A3o-Estendida-ebook/dp/B0C1TJ3VZC</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=243d82cb0c50" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>