Publicidade

Conheça mais produtos iMastersDeploys

Canal iMasters

Canal iMasters

Conheça o TOTVS DEVELOPERS, um canal exclusivo da TOTVS para dar suporte e criar relacionamento com os desenvolvedores.

Saiba mais
Newsletter iMasters

Newsletter iMasters

Conheça a Syngenta Digital, a vertente digital do Grupo Syngenta, líder mundial em desenvolvimento de produtos digitais para o agro.

Saiba mais
TOTVS Developers Podcast #70   Qual o futuro do Desenvolvimento FrontEnd

TOTVS Developers Podcast #70 Qual o futuro do Desenvolvimento FrontEnd

Neste episódio do TOTVS Developers
TOTVS Developers Podcast #69   Ferramentas de desenvolvimento

TOTVS Developers Podcast #69 Ferramentas de desenvolvimento

Nesse episódio
TOTVS Developers Podcast #42   CI CD

TOTVS Developers Podcast #42 CI CD

Olá
TOTVS Developers Podcast #43   Microsserviços x Monolitos

TOTVS Developers Podcast #43 Microsserviços x Monolitos

Olá
TOTVS Developers Podcast #67 -  Presença Feminina no Mercado Tech

TOTVS Developers Podcast #67 - Presença Feminina no Mercado Tech

Presença Feminina no Mercado Tech
TOTVS Developers Podcast #66 - Cultura e Agilidade

TOTVS Developers Podcast #66 - Cultura e Agilidade

Cultura e Agilidade
GeekMasters | Criando um chatbot para sua live do youtube com PHP

GeekMasters | Criando um chatbot para sua live do youtube com PHP

PHP
GeekMasters - Melhores do ano!

GeekMasters - Melhores do ano!

Melhores do ano!
TOTVS DEVELOPERS #56 - Explorando o mundo do Protheus

TOTVS DEVELOPERS #56 - Explorando o mundo do Protheus

Explorando o mundo do Protheus
TOTVS DEVELOPERS #55 - Design e desenvolvimento de Software

TOTVS DEVELOPERS #55 - Design e desenvolvimento de Software

Design e desenvolvimento de Software
TOTVS DEVELOPERS #54 - Como a IA pode aumentar a produtividade

TOTVS DEVELOPERS #54 - Como a IA pode aumentar a produtividade

Como a IA pode aumentar a produtividade
Divulgue seu talento na maior comunidade dev

Divulgue seu talento na maior comunidade dev

Reinaldo Silotto e Rafael Chinaglia do time iMasters explicam como divulgar seus talentos e suas skills para a maior comunidade Dev do Brasil

Publicidade
)).required(),\r\n});\r\n\r\napp.post(\"\u002Fusers\", (req, res) => { \r\n const user = req.body; \r\n if(!username || !email || !year || !password) {\r\n return res.status(422).send(\"Incomplete data.\");\r\n }\r\n \r\n \u002F\u002F restante do código \r\n});\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"340f\" class=\"my mz ho na b nb nc nd ne nf ng nh ni fk nj nk nl fn nm nn no fq np nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EUsamos o \u003Ccode class=\"cx qa qb qc pr b\"\u003Ejoi.object()\u003C\u002Fcode\u003E para definir o schema e então usamos o \u003Ccode class=\"cx qa qb qc pr b\"\u003Estring()\u003C\u002Fcode\u003E, \u003Ccode class=\"cx qa qb qc pr b\"\u003Eemail()\u003C\u002Fcode\u003E, \u003Ccode class=\"cx qa qb qc pr b\"\u003Emin()\u003C\u002Fcode\u003E, \u003Ccode class=\"cx qa qb qc pr b\"\u003Emax()\u003C\u002Fcode\u003E, e assim por diante para fazer as validações necessárias.\u003C\u002Fli\u003E\n\u003Cli id=\"3e63\" class=\"my mz ho na b nb pl nd ne nf pm nh ni fk pn nk nl fn po nn no fq pp nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EAgora, ao invés de ficar encadeando ifs e elses, simplesmente usamos esse objeto de referência para validar a informação que o usuário nos enviou:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003Eimport joi from \"joi\";\r\n\r\nconst userSchema = joi.object({\r\n username: joi.string().min(3).max(10).required(),\r\n email: joi.string().email().required(),\r\n year: joi.number().integer().min(1900).max(2024).required(),\r\n password: joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30} window.__SERVER_VARS__ = {"applicationRestUrl":"https:\u002F\u002Fadmin.imasters.com.br\u002Fwp-json","applicationBaseUrl":"https:\u002F\u002Fadmin.imasters.com.br"} )).required(),\r\n});\r\n\r\napp.post(\"\u002Fusers\", (req, res) => { \r\n const user = req.body; \r\n const validation = userSchema.validate(user, { abortEarly: false });\r\n if (validation.error) {\r\n const errors = validation.error.details.map(detail => detail.message)\r\n return res.status(422).send(errors)\r\n }\r\n \r\n \u002F\u002F restante do código \r\n});\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch3 id=\"1192\" class=\"qd os ho bf ot qe qf qg fg qh qi qj fj qk ql qm qn qo qp qq qr qs qt qu qv qw bk\"\u003ERepositório\u003C\u002Fh3\u003E\n\u003Cp id=\"b72d\" class=\"pw-post-body-paragraph my mz ho na b nb pa nd ne nf pb nh ni fk pc nk nl fn pd nn no fq pe nq nr ns gp bk\" data-selectable-paragraph=\"\"\u003E\u003Ca class=\"ag pz\" href=\"https:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fvalidacao-joi\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003Ehttps:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fvalidacao-joi\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EPara garantir o funcionamento correto das nossas APIs e evitar problemas é super importante sempre validar a entrada dos nossos usuários. No entanto…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos\u002Fvalidacoes-mais-eficazes-na-sua-api-com-a-biblioteca-joi","date":"7 jul, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26183954\u002FAPIs.jpg","externalMention":null,"author":{"id":144418,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30171243\u002Fdiego-pinho.jpg","name":"Diego Pinho","description":"Bacharel em Ciência da Computação pela PUCSP e MBA em Gestão da Tecnologia da Informação na FIAP. Autor do livro ECMAScript 6 - Entre de cabeça no futuro do JavaScript. Cofundador da Code Prestige e Community Manager no iMasters.","slug":"diegopinho","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdiegopinho","registered":"2013-08-13 18:00:53","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002FDiegoPinho","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.diegopinho.com.br","mail":"diego.pinho@imasters.com.br"},"articles_count":113,"views_count":1276900,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"APIs e Microsserviços","slug":"apis-microsservicos","id":4257,"link":"https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos"},{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"api","slug":"api","id":187,"link":"https:\u002F\u002Fimasters.com.br\u002Fapi"},{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"},{"title":"node","slug":"node","id":236,"link":"https:\u002F\u002Fimasters.com.br\u002Fnode"},{"title":"nodejs","slug":"nodejs","id":3153,"link":"https:\u002F\u002Fimasters.com.br\u002Fnodejs"}],"seo":{"open_graph":{"title":"Validações mais felizes na sua API com a biblioteca Joi","description":"Para garantir o funcionamento correto das nossas APIs e evitar problemas é super importante sempre validar a entrada dos nossos usuários. No entanto...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26183954\u002FAPIs.jpg","width":800,"height":533},"modified_time":"2025-07-07T13:15:10-03:00","published_time":"2025-07-07T09:24:22-03:00"},"twitter":{"title":"Validações mais felizes na sua API com a biblioteca Joi","description":"Para garantir o funcionamento correto das nossas APIs e evitar problemas é super importante sempre validar a entrada dos nossos usuários. No entanto...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26183954\u002FAPIs.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos\u002Fvalidacoes-mais-eficazes-na-sua-api-com-a-biblioteca-joi","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos\u002Fvalidacoes-mais-eficazes-na-sua-api-com-a-biblioteca-joi","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos\u002Fvalidacoes-mais-eficazes-na-sua-api-com-a-biblioteca-joi"},"type":"post"},{"id":163836,"title":"OWASP SAMM: O Guia Prático para Integrar DevSecOps ao seu SDLC","content":"\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EA integração da segurança ao ciclo de vida de desenvolvimento de software (SDLC) não é mais uma opção, mas uma necessidade estratégica. Em um cenário onde vulnerabilidades geram riscos crescentes, o OWASP SAMM (Software Assurance Maturity Model) surge como um guia essencial para estruturar, executar e medir a evolução da segurança de forma contínua.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEste artigo demonstra como aplicar o modelo de maturidade do OWASP SAMM de forma prática e incremental, permitindo que as equipes adotem o DevSecOps de maneira sustentável e eficaz.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPor que adotar um modelo de maturidade?\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EIniciativas de segurança em DevSecOps, quando isoladas — uma análise de código aqui, um teste de penetração ali — carecem de consistência e não garantem uma evolução real do processo. Reconhecendo esse desafio aqui na Facti, entendemos que adotar o DevSecOps é, antes de tudo, uma mudança de cultura que exige um norte claro. É exatamente por isso que um modelo de maturidade como o SAMM resolve o problema, ao fornecer:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EDirecionamento Estratégico:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Define metas claras de curto e longo prazo.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EEvolução Gradual:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Estrutura a jornada em etapas progressivas, do manual ao automatizado.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EMétricas Objetivas:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Permite acompanhar o progresso e demonstrar o valor das ações de segurança dentro da adoção de metodologias ágeis para orquestração das atividades.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EO OWASP SAMM organiza as práticas de segurança em cinco funções de negócio, com cada uma sendo avaliada em três níveis de maturidade.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F01153114\u002Fowasp-1.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-163837\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F01153114\u002Fowasp-1.png\" alt=\"\" width=\"512\" height=\"341\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAplicação Prática: Integrando o SAMM ao seu dia a dia\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EA implementação bem-sucedida do OWASP SAMM depende do seu mapeamento direto no ciclo de vida dos projetos.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EMapeamento com o Processo de Desenvolvimento\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Integração de cada função do SAMM às fases do seu SDLC:\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EGovernança:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Alinhe as políticas de segurança a normas como a LGPD e a ISO\u002FIEC 27001.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EDesign:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Realize a modelagem de ameaças e defina requisitos de segurança desde a fase de concepção.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EImplementação:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Adote padrões de arquitetura segura e automatize builds com verificações de segurança.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EVerificação:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Integre ferramentas SAST, DAST e SCA (como SonarQube, OWASP ZAP e Trivy) aos pipelines de CI\u002FCD.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EOperações:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Automatize a gestão de infraestrutura (Infrastructure as Code – IaC) e mantenha um plano proativo de resposta a incidentes.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Col\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EAs Fases da Maturidade: Uma Jornada Incremental\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E O avanço pode ser estruturado em quatro fases:\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EFase 1: Fundacional\u003C\u002Fb\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"2\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EImplementação inicial de SAST e \u003C\u002Fspan\u003E\u003Ci\u003E\u003Cspan style=\"font-weight: 400;\"\u003Elinting\u003C\u002Fspan\u003E\u003C\u002Fi\u003E\u003Cspan style=\"font-weight: 400;\"\u003E no CI\u002FCD.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"2\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EDefinição de requisitos mínimos de segurança.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EFase 2: Expansão\u003C\u002Fb\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"2\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EIntrodução de DAST (análise dinâmica) e SCA (análise de componentes).\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"2\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003ECriação de políticas de qualidade (\u003C\u002Fspan\u003E\u003Ci\u003E\u003Cspan style=\"font-weight: 400;\"\u003EQuality Gates\u003C\u002Fspan\u003E\u003C\u002Fi\u003E\u003Cspan style=\"font-weight: 400;\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EFase 3: Fortalecimento\u003C\u002Fb\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"2\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EExecução periódica de testes de penetração (\u003C\u002Fspan\u003E\u003Ci\u003E\u003Cspan style=\"font-weight: 400;\"\u003Epentests\u003C\u002Fspan\u003E\u003C\u002Fi\u003E\u003Cspan style=\"font-weight: 400;\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"2\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EColeta e análise de métricas de segurança.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"2\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EFormalização do processo de gestão de incidentes.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EFase 4: Otimização\u003C\u002Fb\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"2\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EIntegração da segurança na arquitetura como padrão.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"2\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAutomação da conformidade com frameworks (NIST SSDF, ISO 27034).\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"2\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EProvisionamento de ambientes totalmente via IaC.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F01153259\u002Fowasp-2.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-163838\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F01153259\u002Fowasp-2.png\" alt=\"\" width=\"512\" height=\"274\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EFerramentas Essenciais\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Para apoiar essa jornada, considere ferramentas como:\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EAnálise de Código e Qualidade:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E SonarQube (SAST).\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EAnálise de Aplicação em Execução:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E OWASP ZAP (DAST).\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EAnálise de Dependências:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Trivy (SCA).\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EGestão de Segredos:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E HashiCorp Vault.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EInfraestrutura como Código:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Terraform, Ansible (com validação de segurança via \u003C\u002Fspan\u003E\u003Cb\u003E\u003Ci\u003Etfsec\u003C\u002Fi\u003E\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EMonitoramento:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Grafana.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch2\u003E\u003Cspan style=\"font-weight: 400;\"\u003EMedindo o progresso\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EA grande vantagem de um modelo de maturidade é a capacidade de medir o avanço com indicadores-chave de desempenho (KPIs), como:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPercentual de \u003C\u002Fspan\u003E\u003Ci\u003E\u003Cspan style=\"font-weight: 400;\"\u003Ebuilds\u003C\u002Fspan\u003E\u003C\u002Fi\u003E\u003Cspan style=\"font-weight: 400;\"\u003E com verificação SCA \u003C\u002Fspan\u003E\u003Cb\u003E> 95% (nível ideal: 100% para builds de produção).\u003C\u002Fb\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003ETempo médio para correção de vulnerabilidades (MTTR) \u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cb\u003ECríticas: < 7 dias\u003C\u002Fb\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cb\u003EAltas: < 14 dias\u003C\u002Fb\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cb\u003EMédias: < 30 dias\u003C\u002Fb\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cb\u003EBaixas: < 60 dias\u003C\u002Fb\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003ENível de aderência aos padrões de arquitetura segura.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cb\u003ENovos projetos:\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E > \u003C\u002Fspan\u003E\u003Cb\u003E90%\u003C\u002Fb\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cb\u003ELegados (críticos\u002Fmodernizados):\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E > \u003C\u002Fspan\u003E\u003Cb\u003E70%\u003C\u002Fb\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cb\u003EGlobal (em maturidade avançada):\u003C\u002Fb\u003E \u003Cb\u003E80-100%\u003C\u002Fb\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003ETaxa de sucesso na resposta a incidentes \u003C\u002Fspan\u003E\u003Cb\u003E>\u003C\u002Fb\u003E \u003Cb\u003E80%\u003C\u002Fb\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EIsso permite não apenas justificar investimentos, mas também ajustar prioridades de forma inteligente através do que chamamos de Shift Left, ou seja, antecipar as atividades de segurança e testes para as fases iniciais do ciclo de vida de desenvolvimento de software (SDLC).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cspan style=\"font-weight: 400;\"\u003EConclusão\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EConstruir um SDLC seguro é uma jornada contínua, não um projeto com data de término. Ao adotar um modelo como o OWASP SAMM, as equipes transformam o DevSecOps em um processo estruturado e mensurável. A segurança deixa de ser um “freio” e se torna um pilar de confiança e uma vantagem competitiva.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EO segredo é começar: escolha as práticas mais críticas para o seu contexto, integre-as ao seu pipeline e evolua com consistência e visibilidade.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EOWASP SAMM | A integração da segurança ao ciclo de vida de desenvolvimento de software (SDLC) não é mais uma opção, mas uma necessidade estratégica.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fowasp-samm-o-guia-pratico-para-integrar-devsecops-ao-seu-sdlc","date":"3 jul, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F01154105\u002FDevSecOps.jpg","externalMention":null,"author":{"id":149295,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F01154926\u002Frafael-lucas.jpg","name":"Rafael Lucas","description":"Profissional com mais de 15 anos de experiência em Tecnologia da Informação, Rafael Lucas é pós-graduado pela Royal Holloway, University of London em Cyber Security - Technology and Governance. Ao longo de sua carreira, tem se destacado na implementação de práticas DevSecOps, integrando segurança desde as fases iniciais do desenvolvimento de software. Atualmente, atua como membro de comitês públicos, contribuindo para a definição de políticas e estratégias na área de tecnologia, além de especialista na área de cybersec pela Facti.","slug":"rafaellucas","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Frafaellucas","registered":"2025-07-01 18:49:57","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"rafaellucas@imasters.com.br"},"articles_count":1,"views_count":100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"DevSecOps","slug":"devsecops","id":1,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops"},{"title":"Segurança","slug":"seguranca","id":7269,"link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca"}],"tags":[{"title":"Desenvolvimento de software","slug":"desenvolvimento-de-software","id":1225,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento-de-software"},{"title":"devsecops","slug":"devsecops","id":8102,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops"},{"title":"OWASP","slug":"owasp","id":721,"link":"https:\u002F\u002Fimasters.com.br\u002Fowasp"},{"title":"OWASP SAMM","slug":"owasp-samm","id":9255,"link":"https:\u002F\u002Fimasters.com.br\u002Fowasp-samm"},{"title":"SDLC","slug":"sdlc","id":9256,"link":"https:\u002F\u002Fimasters.com.br\u002Fsdlc"},{"title":"segurança","slug":"seguranca-2","id":298,"link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca-2"}],"seo":{"open_graph":{"title":"OWASP SAMM: O Guia Prático para Integrar DevSecOps ao seu SDLC","description":"OWASP SAMM | A integração da segurança ao ciclo de vida de desenvolvimento de software (SDLC) não é mais uma opção, mas uma necessidade estratégica.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F01154105\u002FDevSecOps.jpg","width":800,"height":533},"modified_time":"2025-07-01T15:56:04-03:00","published_time":"2025-07-03T09:15:20-03:00"},"twitter":{"title":"OWASP SAMM: O Guia Prático para Integrar DevSecOps ao seu SDLC","description":"OWASP SAMM | A integração da segurança ao ciclo de vida de desenvolvimento de software (SDLC) não é mais uma opção, mas uma necessidade estratégica.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F01154105\u002FDevSecOps.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fowasp-samm-o-guia-pratico-para-integrar-devsecops-ao-seu-sdlc","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fowasp-samm-o-guia-pratico-para-integrar-devsecops-ao-seu-sdlc","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fowasp-samm-o-guia-pratico-para-integrar-devsecops-ao-seu-sdlc"},"type":"post"},{"id":163808,"title":"Cibersegurança no Brasil: 6 passos para sair da estagnação","content":"\u003Cp\u003EO Brasil está parado quando o assunto é maturidade em Cibersegurança, ou segurança digital. Segundo uma recente pesquisa da Cisco, apenas 5% das empresas brasileiras atingem esse nível, o mesmo percentual de 2023. Enquanto isso, países emergentes como Vietnã e Singapura deram saltos significativos mesmo com menos recursos.\u003C\u002Fp\u003E\n\u003Ch2\u003ECibersegurança no Brasil: 6 passos para sair da estagnação\u003C\u002Fh2\u003E\n\u003Cp\u003EDiante disso, chegou a hora de sair da estabilidade e buscar uma evolução real. O Brasil tem potencial, mas precisa agir com mais rapidez e visão de futuro para alcançar os próximos patamares. A maturidade cibernética será um diferencial competitivo e quem se mexer agora, sairá na frente.\u003C\u002Fp\u003E\n\u003Cp\u003EMas como virar esse jogo? Veja abaixo seis passos que o Brasil pode adotar para acelerar sua evolução em cibersegurança.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cb\u003E1. Digitalizar as PMEs com segurança desde o início\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EBoa parte das pequenas e médias empresas ainda não investe em medidas básicas de proteção digital. Criar soluções simples, acessíveis e de fácil adoção é fundamental para evitar que esse setor continue vulnerável e arraste a média nacional para baixo.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cb\u003E2. Formar profissionais rapidamente\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EO déficit de talentos em cibersegurança no Brasil é enorme. É preciso acelerar a formação com cursos técnicos de curta duração, programas de certificação e parcerias com empresas que topem treinar novos profissionais em vez de esperar especialistas prontos no mercado.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cb\u003E3. Transformar segurança em política pública\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EOutros países avançaram porque fizeram da cibersegurança uma prioridade estratégica nacional. O Brasil precisa seguir o mesmo caminho: estabelecer metas, destinar orçamento, criar um plano integrado e incentivar a cooperação entre empresas, governo e sociedade.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cb\u003E4. Incluir segurança na cultura das empresas\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003ENão basta investir em tecnologia se os colaboradores continuam clicando em links suspeitos. Treinamentos frequentes, campanhas internas e apoio da liderança são essenciais para que a segurança se torne parte do dia a dia corporativo e não um item esquecido na TI.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cb\u003E5. Apoiar o ecossistema nacional de cibersegurança\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EStartups brasileiras oferecem soluções competitivas, mas ainda são pouco valorizadas por empresas médias e governos locais. Fortalecer esse ecossistema impulsiona inovação, reduz custos e cria uma rede de proteção mais conectada à realidade do país.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cb\u003E6. Observar e adaptar os bons exemplos\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EVietnã e Singapura mostraram que é possível avançar com foco e decisões assertivas. O Brasil pode – e deve – estudar o que esses países fizeram, adaptar as práticas que funcionaram e criar ambientes colaborativos para troca de experiências entre setores.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EO Brasil está parado quando o assunto é maturidade em Cibersegurança, ou segurança digital. Segundo uma recente pesquisa da Cisco, apenas 5% das empresas…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca\u002Fciberseguranca-no-brasil-6-passos-para-sair-da-estagnacao","date":"2 jul, 2025","thumbnail":"","externalMention":null,"author":{"id":149294,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26115221\u002Fciberseguran%C3%A7a-1.png","name":"Daniel Skaba","description":"Daniel Skaba, CEO da CyberGate","slug":"danielskaba","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdanielskaba","registered":"2025-06-26 14:52:34","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"danielskaba@imasters.com.br"},"articles_count":1,"views_count":100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Segurança","slug":"seguranca","id":7269,"link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca"}],"tags":[{"title":"Cibersegurança","slug":"ciberseguranca","id":6293,"link":"https:\u002F\u002Fimasters.com.br\u002Fciberseguranca"},{"title":"cyber security","slug":"cyber-security","id":8741,"link":"https:\u002F\u002Fimasters.com.br\u002Fcyber-security"},{"title":"cybersecurity","slug":"cybersecurity","id":8974,"link":"https:\u002F\u002Fimasters.com.br\u002Fcybersecurity"},{"title":"Cybersegurança","slug":"cyberseguranca","id":8892,"link":"https:\u002F\u002Fimasters.com.br\u002Fcyberseguranca"}],"seo":{"open_graph":{"title":"Cibersegurança no Brasil: 6 passos para sair da estagnação","description":"O Brasil está parado quando o assunto é maturidade em Cibersegurança, ou segurança digital. Segundo uma recente pesquisa da Cisco, apenas 5% das empresas...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":false,"modified_time":"2025-06-26T11:55:00-03:00","published_time":"2025-07-02T09:15:44-03:00"},"twitter":{"title":"Cibersegurança no Brasil: 6 passos para sair da estagnação","description":"O Brasil está parado quando o assunto é maturidade em Cibersegurança, ou segurança digital. Segundo uma recente pesquisa da Cisco, apenas 5% das empresas...","type":"summary_large_image","image":false}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fseguranca\u002Fciberseguranca-no-brasil-6-passos-para-sair-da-estagnacao","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fseguranca\u002Fciberseguranca-no-brasil-6-passos-para-sair-da-estagnacao","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fseguranca\u002Fciberseguranca-no-brasil-6-passos-para-sair-da-estagnacao"},"type":"post"},{"id":163773,"title":"Ciclos de Similaridade Web: como identificar padrões e rupturas na era dos dados","content":"\u003Ch3 id=\"ember343\" class=\"ember-view reader-text-block__heading-3\"\u003EA Nova Fronteira da Análise Digital\u003C\u002Fh3\u003E\n\u003Cp id=\"ember344\" class=\"ember-view reader-text-block__paragraph\"\u003EImagine um mundo onde cada website que surge na internet é automaticamente comparado com milhões de outros sites, identificando não apenas suas semelhanças visuais, mas também seus padrões de comportamento, estrutura de conteúdo e performance. Essa realidade já existe, e está transformando como entendemos os ciclos de inovação digital.\u003C\u002Fp\u003E\n\u003Ch2 id=\"ember345\" class=\"ember-view reader-text-block__heading-3\"\u003EO Que São Ciclos de Similaridade Web?\u003C\u002Fh2\u003E\n\u003Cp id=\"ember346\" class=\"ember-view reader-text-block__paragraph\"\u003EOs ciclos de similaridade web representam períodos onde múltiplos websites seguem padrões similares de design, funcionalidade ou estratégia de conteúdo. Tradicionalmente, identificar esses padrões exigia análise manual extensiva e muito tempo. Hoje, através da combinação de tecnologias como Apache Flink, Large Language Models (LLMs) e sistemas de busca vetorial como Qdrant, podemos detectar essas tendências em tempo real.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember347\" class=\"ember-view reader-text-block__heading-3\"\u003EComo Funciona a Detecção Inteligente de Padrões\u003C\u002Fh3\u003E\n\u003Cp id=\"ember348\" class=\"ember-view reader-text-block__paragraph\"\u003ENeste artigo vou pegar por exemplo o Apache Flink 2.0 como o sistema nervoso central, processando milhões de eventos de campanha e interações de website simultaneamente. Cada clique, scroll, tempo de permanência e conversão é capturado e analisado instantaneamente.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember349\" class=\"ember-view reader-text-block__heading-3\"\u003E2. Extração Semântica de Conteúdo\u003C\u002Fh3\u003E\n\u003Cp id=\"ember350\" class=\"ember-view reader-text-block__paragraph\"\u003EAqui entra a magia dos LLMs integrados ao Flink CDC 3.3. Esses modelos não apenas “leem” o conteúdo das páginas, mas compreendem seu contexto, extraindo insights sobre títulos, estrutura narrativa, tom de comunicação e proposta de valor. É como ter um analista de conteúdo que nunca dorme, examinando cada novo site que surge.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember351\" class=\"ember-view reader-text-block__heading-3\"\u003E3. Armazenamento Vetorial Inteligente\u003C\u002Fh3\u003E\n\u003Cp id=\"ember352\" class=\"ember-view reader-text-block__paragraph\"\u003EO Qdrant funciona como uma memória coletiva da internet, armazenando não apenas os dados brutos, mas representações vetoriais que capturam a “essência” de cada website. Quando um novo site é analisado, o sistema pode instantaneamente identificar suas similaridades com milhares de outros sites.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember353\" class=\"ember-view reader-text-block__heading-3\"\u003EIdentificando Rupturas de Padrão\u003C\u002Fh3\u003E\n\u003Cp id=\"ember354\" class=\"ember-view reader-text-block__paragraph\"\u003EO verdadeiro valor desta arquitetura emerge quando ela identifica websites que quebram padrões estabelecidos. O agente de IA realiza uma análise tridimensional:\u003C\u002Fp\u003E\n\u003Cp id=\"ember355\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003EConsulta Histórica\u003C\u002Fstrong\u003E: Examina sites similares em estrutura e segmento \u003Cstrong\u003EAnálise de Performance\u003C\u002Fstrong\u003E: Compara métricas de engajamento e conversão \u003Cstrong\u003EDetecção de Gaps\u003C\u002Fstrong\u003E: Identifica lacunas entre performance esperada versus real\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember356\" class=\"ember-view reader-text-block__heading-3\"\u003EO Poder da Otimização Preditiva\u003C\u002Fh3\u003E\n\u003Cp id=\"ember357\" class=\"ember-view reader-text-block__paragraph\"\u003EDiferentemente das abordagens tradicionais que esperam dados de performance se acumularem, esta arquitetura permite otimização desde o primeiro dia. Baseando-se em conhecimento de contextos similares, o sistema pode:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003EPrever quais elementos de design terão maior impacto\u003C\u002Fli\u003E\n\u003Cli\u003ESugerir estratégias de conteúdo baseadas em sucessos similares\u003C\u002Fli\u003E\n\u003Cli\u003EIdentificar oportunidades de diferenciação antes da concorrência\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember359\" class=\"ember-view reader-text-block__heading-3\"\u003EImplicações para o Futuro Digital\u003C\u002Fh3\u003E\n\u003Cp id=\"ember360\" class=\"ember-view reader-text-block__paragraph\"\u003EEsta abordagem representa uma mudança fundamental: da análise reativa para a inteligência preditiva. Em vez de esperar meses para entender o que funciona, podemos iniciar com hipóteses baseadas em milhares de casos similares, acelerando exponencialmente os ciclos de feedback e inovação.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember361\" class=\"ember-view reader-text-block__heading-3\"\u003EInsights em Tempo Real: O Novo Padrão\u003C\u002Fh3\u003E\n\u003Cp id=\"ember362\" class=\"ember-view reader-text-block__paragraph\"\u003EA capacidade de obter insights imediatos sobre padrões de mercado transforma como pensamos sobre competitividade digital. Empresas podem identificar tendências emergentes antes que se tornem mainstream, posicionando-se como pioneiras em novos padrões de experiência digital.\u003C\u002Fp\u003E\n\u003Ch2 id=\"ember363\" class=\"ember-view reader-text-block__heading-3\"\u003EArquitetura para essa captura, analise e otimização preditiva\u003C\u002Fh2\u003E\n\u003Ch3 id=\"ember364\" class=\"ember-view reader-text-block__heading-3\"\u003EVisão Geral da Arquitetura\u003C\u002Fh3\u003E\n\u003Cp id=\"ember365\" class=\"ember-view reader-text-block__paragraph\"\u003EEsta arquitetura implementa um sistema completo de detecção de padrões web usando exclusivamente tecnologias open source, dividida em 7 camadas principais que trabalham em conjunto para oferecer análise inteligente em tempo real. Preferi montar open source não só por que sou facionado pela comunidade como também a infinidade de produtos sensacionais que temos hoje que vieram da Apache Foundation.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember366\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E1. Camada de Coleta de Dados (Data Ingestion Layer)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember367\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Kafka + Kafka Connect\u003C\u002Fh3\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Hub central de eventos e streaming de dados.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EConectores\u003C\u002Fstrong\u003E: \u003Cstrong\u003EDebezium\u003C\u002Fstrong\u003E: Captura mudanças (CDC) de bases de dados.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EHTTP Source Connector\u003C\u002Fstrong\u003E: Ingere dados de APIs web.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EFile Connector\u003C\u002Fstrong\u003E: Processa logs de servidores web.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember369\" class=\"ember-view reader-text-block__heading-3\"\u003EScrapy Cluster\u003C\u002Fh3\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Web scraping distribuído e escalável\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EComponentes\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp id=\"ember371\" class=\"ember-view reader-text-block__paragraph\"\u003E– Redis: Fila de URLs para scraping.\u003C\u002Fp\u003E\n\u003Cp id=\"ember372\" class=\"ember-view reader-text-block__paragraph\"\u003E-Kafka: Pipeline de dados extraídos.\u003C\u002Fp\u003E\n\u003Cp id=\"ember373\" class=\"ember-view reader-text-block__paragraph\"\u003E– Scrapyd: Gestão de spiders distribuídos.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember374\" class=\"ember-view reader-text-block__heading-3\"\u003EFluentd – É Sensacional\u003C\u002Fh3\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Coleta e roteamento de logs\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EIntegrações\u003C\u002Fstrong\u003E: Nginx, Apache, aplicações web\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EOutput\u003C\u002Fstrong\u003E: Kafka tópicos estruturados\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember376\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E2. Camada de Processamento em Tempo Real (Stream Processing)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember377\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Flink\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Processamento de stream principal\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EJobs\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003EWeb Content Analyzer\u003C\u002Fstrong\u003E: Extrai metadados de HTML\u002FCSS\u002FJS.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EPerformance Metrics Calculator: \u003C\u002Fstrong\u003ECalcula métricas de UX em tempo real.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EPattern Detector:\u003C\u002Fstrong\u003E Identifica similaridades estruturais.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EAnomaly Detector:\u003C\u002Fstrong\u003E Detecta desvios de padrões.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember380\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Storm (alternativa\u002Fcomplemento)\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Processamento de eventos complexos\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ETopologias\u003C\u002Fstrong\u003E: Análise de comportamento de usuário em tempo real.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember383\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E3. Camada de Inteligência Artificial (AI Layer)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember384\" class=\"ember-view reader-text-block__heading-3\"\u003EOllama + Modelos Open Source\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EModelos sugeridos\u003C\u002Fstrong\u003E: \u003Cstrong\u003ECodeLlama\u003C\u002Fstrong\u003E: Análise de código HTML\u002FCSS\u002FJavaScript\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ELlama 2\u002F3\u003C\u002Fstrong\u003E: Análise semântica de conteúdo\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EMistral 7B\u003C\u002Fstrong\u003E: Classificação e categorização\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EDeployment\u003C\u002Fstrong\u003E: Kubernetes com GPU support\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember386\" class=\"ember-view reader-text-block__heading-3\"\u003EHugging Face Transformers\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EModelos especializados\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EBERT\u003C\u002Fstrong\u003E: Embeddings de texto para similaridade semântica\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ECLIP\u003C\u002Fstrong\u003E: Análise de imagens e layouts visuais\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ET5\u003C\u002Fstrong\u003E: Geração de insights e resumos\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember388\" class=\"ember-view reader-text-block__heading-3\"\u003EspaCy + Custom Models\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: NLP especializado para conteúdo web\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EPipelines\u003C\u002Fstrong\u003E: Extração de entidades, análise de sentimento, classificação de tópicos\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember390\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E4. Camada de Armazenamento Vetorial (Vector Storage)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember391\" class=\"ember-view reader-text-block__heading-3\"\u003EQdrant\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Armazenamento e busca de embeddings\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ECollections\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003Ewebsite_content\u003C\u002Fstrong\u003E: Embeddings de conteúdo textual\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Evisual_layouts\u003C\u002Fstrong\u003E: Representações visuais de layouts\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Euser_behavior\u003C\u002Fstrong\u003E: Padrões de interação do usuário\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Eperformance_profiles\u003C\u002Fstrong\u003E: Perfis de performance técnica\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember394\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E5. Camada de Dados Estruturados (Structured Data Layer)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember395\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Cassandra\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Armazenamento de séries temporais\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ETables\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003Ewebsite_metrics\u003C\u002Fstrong\u003E: Métricas de performance por timestamp.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Ecrawl_history\u003C\u002Fstrong\u003E: Histórico de crawling.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Epattern_evolution\u003C\u002Fstrong\u003E: Evolução de padrões ao longo do tempo.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember399\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E6. Camada de Orquestração e Workflow (Orchestration Layer)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember400\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Airflow\u003C\u002Fh3\u003E\n\u003Cp id=\"ember401\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003EDAGs principais\u003C\u002Fstrong\u003E:\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003Edaily_pattern_analysis\u003C\u002Fstrong\u003E: Análise diária de novos padrões.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Emodel_retraining\u003C\u002Fstrong\u003E: Retreino de modelos ML.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Edata_quality_checks\u003C\u002Fstrong\u003E: Validação de qualidade dos dados.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Ecompetitive_analysis\u003C\u002Fstrong\u003E: Análise competitiva automatizada.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember403\" class=\"ember-view reader-text-block__heading-3\"\u003EKubernetes + Helm (ou Docker\u002FSwarm):\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Orquestração de containers\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EOperators\u003C\u002Fstrong\u003E: Flink, Kafka, Spark para gestão declarativa\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember406\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E7. Camada de API e Interface (API & Interface Layer)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember407\" class=\"ember-view reader-text-block__heading-3\"\u003EFastAPI\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EEndpoints\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003Cli\u003E\u002Fanalyze\u002Fwebsite: Análise de um website específico\u003C\u002Fli\u003E\n\u003Cli\u003E\u002Fpatterns\u002Fsimilar: Busca por websites similares\u003C\u002Fli\u003E\n\u003Cli\u003E\u002Finsights\u002Ftrends: Tendências emergentes\u003C\u002Fli\u003E\n\u003Cli\u003E\u002Fcompare\u002Fwebsites: Comparação entre múltiplos sites\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember409\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Superset\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Dashboards e visualizações\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EDashboards\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EReal-time Pattern Detection\u003C\u002Fstrong\u003E: Padrões em tempo real\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ECompetitive Intelligence\u003C\u002Fstrong\u003E: Inteligência competitiva\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EPerformance Benchmarks\u003C\u002Fstrong\u003E: Benchmarks de performance\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember411\" class=\"ember-view reader-text-block__heading-3\"\u003EGrafana + Prometheus\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Monitoramento da infraestrutura\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EMétricas\u003C\u002Fstrong\u003E: Latência, throughput, saúde dos componentes\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch2 id=\"ember414\" class=\"ember-view reader-text-block__heading-3\"\u003EAgora saindo do técnico esse assunto é realmente relevante: qual seu peso? qual seu ganho?\u003C\u002Fh2\u003E\n\u003Cp id=\"ember415\" class=\"ember-view reader-text-block__paragraph\"\u003EOlhando para o mercado de web, mais especificamente a parte de experiência de usuário e de buscas por AI movimentou USD 56,82 bilhões em 2024 e deve crescer para USD 109,12 bilhões até 2032, com CAGR de 8,5% segundo fontes (\u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fwww.businessresearchinsights.com\u002Fmarket-reports\u002Fweb-design-market-117595\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003Ehttps:\u002F\u002Fwww.businessresearchinsights.com\u002Fmarket-reports\u002Fweb-design-market-117595\u003C\u002Fa\u003E e \u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fwww.wiseguyreports.com\u002Freports\u002Fweb-design-market\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003Ehttps:\u002F\u002Fwww.wiseguyreports.com\u002Freports\u002Fweb-design-market\u003C\u002Fa\u003E)\u003C\u002Fp\u003E\n\u003Cp id=\"ember416\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003EIA em Marketing: ROI Comprovado:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"ember417\" class=\"ember-view reader-text-block__paragraph\"\u003E49% dos líderes de tecnologia já integraram IA totalmente na estratégia de negócios das empresas, com ganhos de 20% a 30% em produtividade, velocidade de mercado e receita \u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fwww.pwc.com\u002Fus\u002Fen\u002Ftech-effect\u002Fai-analytics\u002Fai-predictions.html\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003E2025 AI Business Predictions: PwC\u003C\u002Fa\u003E. Empresas que fazem IA corretamente alcançam 13% de ROI em projetos de IA, comparado à média de 5,9% \u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fwww.v7labs.com\u002Fblog\u002Fhow-to-secure-the-best-roi-from-your-ai-investment\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003EHow to Secure the Best ROI from Your AI Investment in 2024\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember418\" class=\"ember-view reader-text-block__heading-3\"\u003EVantagem Competitiva Comprovada\u003C\u002Fh3\u003E\n\u003Cp id=\"ember419\" class=\"ember-view reader-text-block__paragraph\"\u003EO mercado de Revenue Intelligence Platform cresceu para USD 2,18 bilhões em 2024 e deve atingir USD 3,95 bilhões até 2033 \u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fsuperagi.com\u002Ftop-10-revenue-intelligence-tools-to-boost-your-sales-strategy-in-2024\u002F\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003ETop 10 Revenue Intelligence Tools to Boost Your Sales Strategy in 2024 – SuperAGI\u003C\u002Fa\u003E. Empresas que usam arquiteturas cloud de próxima geração e IA têm maior probabilidade de melhorar lucratividade, produtividade e time-to-market \u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fwww.pwc.com\u002Fus\u002Fen\u002Ftech-effect\u002Fai-analytics\u002Fcompeting-in-age-of-ai.html\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003EIn the age of AI: Speed matters more, scale matters less, innovation matters most\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp id=\"ember420\" class=\"ember-view reader-text-block__paragraph\"\u003EO conceito não é apenas relevante – é \u003Cstrong\u003Einevitável\u003C\u002Fstrong\u003E para empresas que querem manter vantagem competitiva no ambiente digital de 2025+.\u003C\u002Fp\u003E\n\u003Cp id=\"ember422\" class=\"ember-view reader-text-block__paragraph\"\u003EMe sigam no \u003Ca href=\"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fairton-lira-junior-6b81a661\u002F\"\u003ELinkedin\u003C\u002Fa\u003E para dúvidas ou acompanhar mais artigos\u002Fpost sobre temas desse tipo. E quem é AI Engineer & Data Engineer e quer ver uma POC da arquitetura montada conforme mencionado no artigo, deixa nos comentários para eu fazer um parte 2 só da construção da arquitetura.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EOs ciclos de similaridade web representam períodos onde múltiplos websites seguem padrões similares de design, funcionalidade ou estratégia de conteúdo.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fciclos-de-similaridade-web-como-identificar-padroes-e-rupturas-na-era-dos-dados","date":"30 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16114723\u002Fdados-e-IA.jpg","externalMention":null,"author":{"id":148428,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F12\u002F10111133\u002Fairton.png","name":"Airton Lira Junior","description":"Airton Lira Junior é um profissional de Tecnologia da Informação com mais de 10 anos de experiência, especializado em Big Data, Engenharia de Dados e Arquitetura de Soluções em nuvem. Atualmente atua como Engenheiro Sênior de Dados e Analytics na Dock, liderando melhorias em plataformas de dados, orquestração de pipelines com Databricks e otimização de workloads em AWS (EC2, EMR, SageMaker). Com passagens por empresas como iFood e Bemobi, destacou-se na concepção de soluções inovadoras, como modelos LLM para chatbots, integrações de IA em pipelines de áudio e projetos de conciliação financeira regulatória, utilizando tecnologias como Golang, Python, Apache Spark e Kubernetes. Possui certificações em AWS, Databricks e Power BI, além de formação em Análise de Sistemas pela FIA e especialização em Banco de Dados. Reconhecido por sua proatividade e expertise técnica, contribui ativamente para a comunidade tech como colunista no iMasters, compartilhando conhecimentos em automação, engenharia de prompts e arquitetura de dados escaláveis.","slug":"airtonlirajr","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fairtonlirajr","registered":"2017-10-10 13:17:26","social":{"linkedin":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fairton-lira-junior-6b81a661\u002F","youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"airtonlirajr@gmail.com"},"articles_count":26,"views_count":70200,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Data","slug":"data","id":16,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"Design","slug":"design","id":8663,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesign"},{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"}],"tags":[{"title":"AI","slug":"ai","id":451,"link":"https:\u002F\u002Fimasters.com.br\u002Fai"},{"title":"apache kafka","slug":"apache-kafka","id":4966,"link":"https:\u002F\u002Fimasters.com.br\u002Fapache-kafka"},{"title":"ciclo de Similaridade Web","slug":"ciclo-de-similaridade-web","id":9252,"link":"https:\u002F\u002Fimasters.com.br\u002Fciclo-de-similaridade-web"},{"title":"dados","slug":"dados","id":374,"link":"https:\u002F\u002Fimasters.com.br\u002Fdados"},{"title":"Data","slug":"data","id":626,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"IA","slug":"ia","id":4660,"link":"https:\u002F\u002Fimasters.com.br\u002Fia"},{"title":"inteligência artificial","slug":"inteligencia-artificial","id":2663,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Kafka","slug":"kafka","id":5134,"link":"https:\u002F\u002Fimasters.com.br\u002Fkafka"},{"title":"Large Language Model","slug":"large-language-model","id":9250,"link":"https:\u002F\u002Fimasters.com.br\u002Flarge-language-model"},{"title":"Large Language Models","slug":"large-language-models","id":9249,"link":"https:\u002F\u002Fimasters.com.br\u002Flarge-language-models"},{"title":"LLM","slug":"llm","id":9026,"link":"https:\u002F\u002Fimasters.com.br\u002Fllm"},{"title":"LLMs","slug":"llms","id":9234,"link":"https:\u002F\u002Fimasters.com.br\u002Fllms"},{"title":"Similaridade Web","slug":"similaridade-web","id":9251,"link":"https:\u002F\u002Fimasters.com.br\u002Fsimilaridade-web"}],"seo":{"open_graph":{"title":"Ciclos de Similaridade Web: como identificar padrões e rupturas","description":"Os ciclos de similaridade web representam períodos onde múltiplos websites seguem padrões similares de design, funcionalidade ou estratégia de conteúdo.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16114723\u002Fdados-e-IA.jpg","width":800,"height":533},"modified_time":"2025-06-16T11:48:10-03:00","published_time":"2025-06-30T09:15:15-03:00"},"twitter":{"title":"Ciclos de Similaridade Web: como identificar padrões e rupturas","description":"Os ciclos de similaridade web representam períodos onde múltiplos websites seguem padrões similares de design, funcionalidade ou estratégia de conteúdo.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16114723\u002Fdados-e-IA.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fciclos-de-similaridade-web-como-identificar-padroes-e-rupturas-na-era-dos-dados","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fciclos-de-similaridade-web-como-identificar-padroes-e-rupturas-na-era-dos-dados","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fciclos-de-similaridade-web-como-identificar-padroes-e-rupturas-na-era-dos-dados"},"type":"post"},{"id":163833,"title":"IA generativa e a urgência de reconstruir nossa relação com a verdade","content":"\u003Cp dir=\"ltr\"\u003EA inteligência artificial generativa já deixou de ser uma promessa futurista. Ela está aqui, moldando a forma como nos comunicamos, consumimos conteúdo e, principalmente, como percebemos o que é real. Ferramentas como Sora, da OpenAI, e Veo 3, da Google DeepMind, são demonstrações claras do quão longe já chegamos na produção de vídeos realistas, com gestos, ambientes e emoções que beiram o indistinguível.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EO avanço é impressionante, mas carrega um dilema central: quando tudo pode ser simulado, em que ainda podemos confiar? Em tempos de algoritmos que replicam vozes e expressões com perfeição, a autenticidade dos registros audiovisuais, que por décadas foi nossa âncora da realidade, entra em xeque.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EO mais recente levantamento da OCDE, Truth Quest, revela que apenas 60% das pessoas no mundo conseguem identificar conteúdos falsos. No Brasil, esse índice é ainda menor (54%). E o dado mais alarmante talvez seja este: somos o país que mais confia nas redes sociais como principal fonte de informação.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EEssa combinação entre hiperconectividade e pouca capacidade de checagem nos torna alvos fáceis para a desinformação automatizada. Vídeos falsos com forte apelo emocional, criados com IA, têm sido disseminados com o objetivo de polarizar, manipular e confundir. E muitas vezes, até profissionais da tecnologia têm dificuldade em reconhecer essas simulações.\u003C\u002Fp\u003E\n\u003Ch3 dir=\"ltr\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EPrecisamos desenvolver o ceticismo crítico\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp dir=\"ltr\"\u003EA desinformação via IA vai muito além da política. Ela compromete o papel do jornalismo, fragiliza a ciência e abre brechas na segurança digital. Uma pesquisa da Ipsos mostra que 51% dos brasileiros já acreditam que a IA tornará a propagação de fake news ainda mais grave, um medo justificado, e que precisa ser levado a sério.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EDiante desse novo cenário, é urgente investirmos em educação digital robusta. Uma habilidade que será cada vez mais essencial é o que chamo de ceticismo crítico: aprender a questionar o que vemos, a buscar fontes, a desconfiar da fluidez do conteúdo antes de aceitar sua veracidade.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EEmpresas de tecnologia têm parte fundamental nessa equação. O Veo, por exemplo, já possui salvaguardas que evitam o uso de imagens ou vozes de personalidades públicas sem autorização. Além disso, seus vídeos também são criados com marcas d’água invisíveis que podem ser detectadas por sistemas verificadores. É bem possível que em breve as próprias redes sociais tenham seus verificadores de marcas d’água digitais para nos indicar se um vídeo foi criado por IA. Mas esse tipo de controle ainda está longe de ser universal e pode não ser suficiente.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EPrecisamos evoluir para um modelo de governança internacional da IA, que equilibre inovação com responsabilidade. Isso não significa limitar o progresso, mas garantir transparência, segurança e prestação de contas em cada nova aplicação desenvolvida.\u003C\u002Fp\u003E\n\u003Ch3 dir=\"ltr\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EAvanço inevitável, maturidade indispensável\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp dir=\"ltr\"\u003ESegundo projeções da Grand View Research, o mercado global de IA generativa deve ultrapassar US$ 109 bilhões até 2030, com uma taxa de crescimento superior a 35% ao ano. O crescimento é exponencial e inevitável. O que está ao nosso alcance é como escolhemos lidar com ele.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EO medo não pode ser a resposta. O que precisamos é de preparo. Isso envolve capacitar a sociedade para detectar manipulações, interpretar sinais de distorção, checar fontes confiáveis e buscar evidências. Só assim conseguiremos transformar o caos informacional em consciência crítica.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EO fato é que a verdade já foi desfigurada por palavras, agora pode ser fabricada com som e imagem. Mas isso não precisa nos imobilizar. Pelo contrário: pode ser o ponto de partida para construirmos uma sociedade mais analítica, responsável e tecnicamente equipada.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EA IA, por si só, não é vilã. Ela pode, sim, ser uma aliada poderosa na resolução de problemas, na personalização da educação, na produtividade e até no combate à própria desinformação. Tudo depende da forma como a integramos à nossa vida, que deve ser com clareza, ética e discernimento.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003ENossa maior proteção diante da era da desinformação não será um algoritmo nem uma legislação, será nossa capacidade de refletir antes de acreditar. Devemos estar preparados para essa nova realidade onde a dúvida é um sinal de sabedoria.\u003C\u002Fp\u003E\n\u003Chr \u002F\u003E\n\u003Cp dir=\"ltr\"\u003ELEIA TAMBÉM\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli dir=\"ltr\"\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Fvibe-coding-futuro-da-programacao-pode-ser-mais-conversado-do-que-escrito\"\u003EVibe coding: futuro da programação pode ser mais conversado do que escrito\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli dir=\"ltr\"\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Fia-machine-learning-e-deep-learning-estao-moldando-o-futuro\"\u003EIA: Machine Learning e Deep Learning estão moldando o futuro\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli dir=\"ltr\"\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Fciberseguranca-anda-lado-a-lado-dos-avancos-na-era-da-ia\"\u003ECibersegurança anda lado a lado dos avanços na era da IA\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli dir=\"ltr\"\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai\u002Fagentes-de-ia-provam-que-ja-chegamos-no-proximo-nivel-da-tecnologia\"\u003EAgentes de IA provam que já chegamos no próximo nível da tecnologia\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli dir=\"ltr\"\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Fia-e-a-privacidade-protegendo-nossos-dados-no-mundo-digital\"\u003EIA e a privacidade: protegendo nossos dados no mundo digital\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n","excerpt":"\u003Cp\u003EA inteligência artificial generativa já deixou de ser uma promessa futurista. Ela está aqui, moldando a forma como nos comunicamos, consumimos conteúdo\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai\u002Fia-generativa-e-a-urgencia-de-reconstruir-nossa-relacao-com-a-verdade","date":"27 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F27101632\u002FIA-generativa-capa.jpg","externalMention":null,"author":{"id":149261,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F07\u002F23145152\u002FFabricio-Carraro-Program-Manager-da-Alura-1.png","name":"Fabricio Carraro","description":"Program Manager na Alura, maior ecossistema de educação em tecnologia do Brasil. Graduado em Engenharia da Computação pela Universidade Estadual de Campinas (UNICAMP) e com especialização em Dados e Machine Learning pela FIAP, o executivo possui uma sólida experiência no mercado de tecnologia, em que atua há mais de 12 anos. Carraro é um dos principais nomes em Inteligência Artificial no Brasil, além de autor publicado e co-host do podcast Hipsters: Fora de Controle, ambos sobre o tema.","slug":"fabriciocarraro","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Ffabriciocarraro","registered":"2024-07-23 17:53:37","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"fabriciocarraro@imasters.com.br"},"articles_count":14,"views_count":19600,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Generative AI","slug":"generative-ai","id":8941,"link":"https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai"},{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"}],"tags":[{"title":"agentes de IA","slug":"agentes-de-ia","id":9176,"link":"https:\u002F\u002Fimasters.com.br\u002Fagentes-de-ia"},{"title":"Cibersegurança","slug":"ciberseguranca","id":6293,"link":"https:\u002F\u002Fimasters.com.br\u002Fciberseguranca"},{"title":"cybersecurity","slug":"cybersecurity","id":8974,"link":"https:\u002F\u002Fimasters.com.br\u002Fcybersecurity"},{"title":"Gen AI","slug":"gen-ai","id":9254,"link":"https:\u002F\u002Fimasters.com.br\u002Fgen-ai"},{"title":"IA","slug":"ia","id":4660,"link":"https:\u002F\u002Fimasters.com.br\u002Fia"},{"title":"IA generativa","slug":"ia-generativa","id":9062,"link":"https:\u002F\u002Fimasters.com.br\u002Fia-generativa"},{"title":"inteligência artificial","slug":"inteligencia-artificial","id":2663,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"privacidade","slug":"privacidade","id":2072,"link":"https:\u002F\u002Fimasters.com.br\u002Fprivacidade"},{"title":"Vibe coding","slug":"vibe-coding","id":9236,"link":"https:\u002F\u002Fimasters.com.br\u002Fvibe-coding"}],"seo":{"open_graph":{"title":"IA generativa e a urgência de reconstruir nossa relação com a verdade","description":"A inteligência artificial generativa já deixou de ser uma promessa futurista. Ela está aqui, moldando a forma como nos comunicamos, consumimos conteúdo","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F27101632\u002FIA-generativa-capa.jpg","width":800,"height":533},"modified_time":"2025-06-27T10:19:03-03:00","published_time":"2025-06-27T10:19:03-03:00"},"twitter":{"title":"IA generativa e a urgência de reconstruir nossa relação com a verdade","description":"A inteligência artificial generativa já deixou de ser uma promessa futurista. Ela está aqui, moldando a forma como nos comunicamos, consumimos conteúdo","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F27101632\u002FIA-generativa-capa.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai\u002Fia-generativa-e-a-urgencia-de-reconstruir-nossa-relacao-com-a-verdade","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai\u002Fia-generativa-e-a-urgencia-de-reconstruir-nossa-relacao-com-a-verdade","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai\u002Fia-generativa-e-a-urgencia-de-reconstruir-nossa-relacao-com-a-verdade"},"type":"post"},{"id":163756,"title":"Protegendo credenciais e configurações com contêiner criptografado","content":"\u003Cp\u003EEu uso um pequeno computador de bolso na mochila. Esse dispositivo serve para testes e desenvolvimento, e armazena informações sensíveis como credenciais, senhas e chaves de acesso. Eu não quero que esses dados caiam em mãos erradas. Diferentemente do notebook, que tem o HD criptografado, meu computador de bolso não usa criptografia no HD. A criptografia consome muito processamento e requer desativar o TRIM do SSD, o que prejudica o desempenho.\u003C\u002Fp\u003E\n\u003Cp\u003EEntão para contornar o problema resolvi criar um contêiner criptografado para guardar apenas as informações sensíveis. Esse contêiner é montado somente quando necessário, o que aumenta a segurança do sistema.\u003C\u002Fp\u003E\n\u003Ch2 id=\"criando-um-contêiner-criptografado\"\u003ECriando um contêiner criptografado\u003C\u002Fh2\u003E\n\u003Cp\u003EVocê precisa instalar o pacote \u003Ccode\u003Ecryptsetup\u003C\u002Fcode\u003E. Para isso, execute como root:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Esudo apt install cryptsetup\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EDepois, crie o contêiner criptografado. Primeiro, gere um arquivo de 200MB (como exemplo):\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Edd \u003Cspan class=\"k\"\u003Eif\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E\u002Fdev\u002Furandom \u003Cspan class=\"nv\"\u003Eof\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003Esecure_container.img \u003Cspan class=\"nv\"\u003Ebs\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E1M \u003Cspan class=\"nv\"\u003Ecount\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"m\"\u003E200\u003C\u002Fspan\u003E\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EInicialize o LUKS:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Ecryptsetup luksFormat secure_container.img\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EAbra o contêiner:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Ecryptsetup open secure_container.img secure_container\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EFormate (ext4 como exemplo):\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Emkfs.ext4 \u002Fdev\u002Fmapper\u002Fsecure_container\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EMonte o contêiner:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Emkdir -p \u002Fmnt\u002Fsecure_container\r\nmount \u002Fdev\u002Fmapper\u002Fsecure_container \u002Fmnt\u002Fsecure_container\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EAgora o diretório \u003Ccode\u003E\u002Fmnt\u002Fsecure_container\u003C\u002Fcode\u003E está pronto para uso. Você pode mover seus arquivos sensíveis para lá e criar links simbólicos (por exemplo, do diretório \u003Ccode\u003E~\u002F.ssh\u003C\u002Fcode\u003E ou de chaves de acesso \u003Ccode\u003E~\u002F.aws\u003C\u002Fcode\u003E).\u003C\u002Fp\u003E\n\u003Ch3 id=\"desmontando-o-contêiner\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EDesmontando o contêiner\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EPara desmontar, desmonte o diretório e feche o contêiner:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Eumount \u002Fmnt\u002Fsecure_container\r\ncryptsetup close secure_container\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"automatizando-a-montagem-e-desmontagem\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EAutomatizando a montagem e desmontagem\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EComo montar e desmontar o contêiner é muito repetitivo vale a pena crie scripts e automatizandor essa tarefa. Os scripts precisam de permissão de root para funcionar. Você pode configurar o sudo para não pedir senha para esses scripts, facilitando o uso.\u003C\u002Fp\u003E\n\u003Ch3 id=\"script-de-montagem-mount_secure_containersh\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EScript de montagem (mount_secure_container.sh)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003E\u003Cspan class=\"cp\"\u003E#!\u002Fbin\u002Fsh\r\n\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"o\"\u003E[\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"root\"\u003C\u002Fspan\u003E !\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$USER\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E&&\u003C\u002Fspan\u003E \u003Cspan class=\"nb\"\u003Eexec\u003C\u002Fspan\u003E sudo \u003Cspan class=\"nv\"\u003E$0\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$@\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\r\n\r\n\u003Cspan class=\"c1\"\u003E# Caminhos de exemplo.\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"nv\"\u003EIMAGE_PATH\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u002Fhome\u002Fuser\u002Fsecure_container.img\"\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"nv\"\u003EMAPPER_NAME\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"secure_container\"\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"nv\"\u003EMOUNT_POINT\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u002Fmnt\u002Fsecure_container\"\u003C\u002Fspan\u003E\r\n\r\n\u003Cspan class=\"c1\"\u003E# Abre o contêiner.\u003C\u002Fspan\u003E\r\ncryptsetup open \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$IMAGE_PATH\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$MAPPER_NAME\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E||\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E{\u003C\u002Fspan\u003E\r\n \u003Cspan class=\"nb\"\u003Eecho\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"Falha ao abrir o contêiner.\"\u003C\u002Fspan\u003E\r\n \u003Cspan class=\"nb\"\u003Eexit\u003C\u002Fspan\u003E \u003Cspan class=\"m\"\u003E1\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"o\"\u003E}\u003C\u002Fspan\u003E\r\n\r\n\u003Cspan class=\"c1\"\u003E# Monta o contêiner.\u003C\u002Fspan\u003E\r\nmount \u003Cspan class=\"s2\"\u003E\"\u002Fdev\u002Fmapper\u002F\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$MAPPER_NAME\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$MOUNT_POINT\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E||\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E{\u003C\u002Fspan\u003E\r\n \u003Cspan class=\"nb\"\u003Eecho\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"Falha ao montar o contêiner.\"\u003C\u002Fspan\u003E\r\n cryptsetup close \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$MAPPER_NAME\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\r\n \u003Cspan class=\"nb\"\u003Eexit\u003C\u002Fspan\u003E \u003Cspan class=\"m\"\u003E1\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"o\"\u003E}\u003C\u002Fspan\u003E\r\n\r\n\u003Cspan class=\"nb\"\u003Eecho\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"Contêiner montado em: \u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$MOUNT_POINT\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"nb\"\u003Eexit\u003C\u002Fspan\u003E \u003Cspan class=\"m\"\u003E0\u003C\u002Fspan\u003E\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"script-de-desmontagem-umount_secure_containersh\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EScript de desmontagem (umount_secure_container.sh)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003E\u003Cspan class=\"cp\"\u003E#!\u002Fbin\u002Fsh\r\n\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"o\"\u003E[\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"root\"\u003C\u002Fspan\u003E !\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$USER\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E&&\u003C\u002Fspan\u003E \u003Cspan class=\"nb\"\u003Eexec\u003C\u002Fspan\u003E sudo \u003Cspan class=\"nv\"\u003E$0\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$@\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\r\n\r\n\u003Cspan class=\"nv\"\u003EIMAGE_PATH\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u002Fhome\u002Fuser\u002Fsecure_container.img\"\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"nv\"\u003EMAPPER_NAME\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"secure_container\"\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"nv\"\u003EMOUNT_POINT\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u002Fmnt\u002Fsecure_container\"\u003C\u002Fspan\u003E\r\n\r\n\u003Cspan class=\"c1\"\u003E# Desmonta o contêiner.\u003C\u002Fspan\u003E\r\numount \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$MOUNT_POINT\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E||\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E{\u003C\u002Fspan\u003E\r\n \u003Cspan class=\"nb\"\u003Eecho\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"Falha ao desmontar. Verifique se algum arquivo ainda está em uso.\"\u003C\u002Fspan\u003E\r\n \u003Cspan class=\"nb\"\u003Eexit\u003C\u002Fspan\u003E \u003Cspan class=\"m\"\u003E1\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"o\"\u003E}\u003C\u002Fspan\u003E\r\n\r\n\u003Cspan class=\"c1\"\u003E# Fecha o contêiner.\u003C\u002Fspan\u003E\r\ncryptsetup close \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$MAPPER_NAME\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E||\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E{\u003C\u002Fspan\u003E\r\n \u003Cspan class=\"nb\"\u003Eecho\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"Falha ao fechar o contêiner LUKS.\"\u003C\u002Fspan\u003E\r\n \u003Cspan class=\"nb\"\u003Eexit\u003C\u002Fspan\u003E \u003Cspan class=\"m\"\u003E1\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"o\"\u003E}\u003C\u002Fspan\u003E\r\n\r\n\u003Cspan class=\"nb\"\u003Eecho\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"Contêiner desmontado e fechado.\"\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"nb\"\u003Eexit\u003C\u002Fspan\u003E \u003Cspan class=\"m\"\u003E0\u003C\u002Fspan\u003E\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"script-para-desligar-off\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EScript para desligar (off)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003ECrie um script chamado \u003Ccode\u003Eoff\u003C\u002Fcode\u003E para garantir que o contêiner seja desmontado antes de desligar:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003E\u003Cspan class=\"cp\"\u003E#!\u002Fbin\u002Fsh\r\n\u003C\u002Fspan\u003E\r\n\u003Cspan class=\"o\"\u003E[\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"root\"\u003C\u002Fspan\u003E !\u003Cspan class=\"o\"\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$USER\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\"o\"\u003E&&\u003C\u002Fspan\u003E \u003Cspan class=\"nb\"\u003Eexec\u003C\u002Fspan\u003E sudo \u003Cspan class=\"nv\"\u003E$0\u003C\u002Fspan\u003E \u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\u003Cspan class=\"nv\"\u003E$@\u003C\u002Fspan\u003E\u003Cspan class=\"s2\"\u003E\"\u003C\u002Fspan\u003E\r\n\r\nsync\r\n\u002Fhome\u002Fuser\u002Fbin\u002Fumount_encrypted.sh\r\npoweroff\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EEm seguida, configure o sudo para não pedir senha ao executar esses scripts:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Esudo visudo\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003EAdicione as linhas:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Euser \u003Cspan class=\"nv\"\u003EALL\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=(\u003C\u002Fspan\u003EALL\u003Cspan class=\"o\"\u003E)\u003C\u002Fspan\u003E NOPASSWD: \u002Fhome\u002Fuser\u002Fbin\u002Fmount_encrypted.sh\r\nuser \u003Cspan class=\"nv\"\u003EALL\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=(\u003C\u002Fspan\u003EALL\u003Cspan class=\"o\"\u003E)\u003C\u002Fspan\u003E NOPASSWD: \u002Fhome\u002Fuser\u002Fbin\u002Fumount_encrypted.sh\r\nuser \u003Cspan class=\"nv\"\u003EALL\u003C\u002Fspan\u003E\u003Cspan class=\"o\"\u003E=(\u003C\u002Fspan\u003EALL\u003Cspan class=\"o\"\u003E)\u003C\u002Fspan\u003E NOPASSWD: \u002Fhome\u002Fuser\u002Fbin\u002Foff\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003ELembre de substituir \u003Ccode\u003Euser\u003C\u002Fcode\u003E nos scripts pelo seu nome de usuário.\u003C\u002Fp\u003E\n\u003Ch3 id=\"conclusão\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EConclusão\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EEsse método mantém dados sensíveis seguros e acessíveis apenas quando necessário. O contêiner criptografado simplifica backups e facilita a transferência para outro computador. Assim, você combina segurança e praticidade no seu sistema.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EEntão para contornar o problema resolvi criar um contêiner criptografado para guardar apenas as informações sensíveis. Esse contêiner é montado somente…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias\u002Fprotegendo-credenciais-e-configuracoes-com-conteiner-criptografado-2","date":"26 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16111818\u002Fcont%C3%AAiner.jpg","externalMention":null,"author":{"id":148141,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30180934\u002Fcesar-gimenes-128x128.jpg","name":"Cesar Gimenes","description":"Trabalha com tecnologia desde a década de 90. Já atuou na área de educação e participou de projetos de mobilidade de grande volume para laboratórios farmacêuticos. Criou games tanto para PC, como para iOS. Hoje está direcionando seus esforços em plataformas de Sistemas Embarcados, IoT, microservices e cloud computing. É um entusiasta de tecnologias como Golang e Docker.","slug":"cesargimenes","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fcesargimenes","registered":"2017-03-23 14:25:13","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Ffacebook.com\u002Fcrgimenes","twitter":"https:\u002F\u002Ftwitter.com\u002Fcrgimenes","instagram":null,"github":null,"url":"","mail":"crg@crg.eti.br"},"articles_count":26,"views_count":67600,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Tendências","slug":"tendencias","id":7264,"link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias"}],"tags":[{"title":"ambientes conteinerizados","slug":"ambientes-conteinerizados","id":8148,"link":"https:\u002F\u002Fimasters.com.br\u002Fambientes-conteinerizados"},{"title":"conteiner","slug":"conteiner","id":5637,"link":"https:\u002F\u002Fimasters.com.br\u002Fconteiner"},{"title":"contêiner criptografado","slug":"conteiner-criptografado","id":9192,"link":"https:\u002F\u002Fimasters.com.br\u002Fconteiner-criptografado"},{"title":"contêineres","slug":"conteineres","id":8802,"link":"https:\u002F\u002Fimasters.com.br\u002Fconteineres"},{"title":"conteinerização","slug":"conteinerizacao","id":7460,"link":"https:\u002F\u002Fimasters.com.br\u002Fconteinerizacao"}],"seo":{"open_graph":{"title":"Protegendo credenciais e configurações com contêiner criptografado","description":"Então para contornar o problema resolvi criar um contêiner criptografado para guardar apenas as informações sensíveis. Esse contêiner é montado somente...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16111818\u002Fcont%C3%AAiner.jpg","width":800,"height":533},"modified_time":"2025-06-16T11:20:02-03:00","published_time":"2025-06-26T09:15:09-03:00"},"twitter":{"title":"Protegendo credenciais e configurações com contêiner criptografado","description":"Então para contornar o problema resolvi criar um contêiner criptografado para guardar apenas as informações sensíveis. Esse contêiner é montado somente...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16111818\u002Fcont%C3%AAiner.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Ftendencias\u002Fprotegendo-credenciais-e-configuracoes-com-conteiner-criptografado-2","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Ftendencias\u002Fprotegendo-credenciais-e-configuracoes-com-conteiner-criptografado-2","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Ftendencias\u002Fprotegendo-credenciais-e-configuracoes-com-conteiner-criptografado-2"},"type":"post"},{"id":163789,"title":"Como hostear seu site HTML gratuitamente com GitHub Pages","content":"\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EVocê já conhece o GitHub Pages? Esse serviço oferece hospedagem gratuita para websites estáticos. Essa ferramenta usa Fluxos de trabalho personalizáveis ​​do GitHub Action para criar e implantar seu código.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EO GitHub Pages é uma opção poderosa para armazenar conteúdo estático pelos seguintes motivos:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EÉ grátis.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EFacilita a colaboração. Qualquer um pode abrir um pull request para atualizar o site.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003ESeu repositório sincroniza com todas as alterações feitas em seu site.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEmbora o GitHub Pages venha com um nome de domínio padrão como \u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fseu-username.github.io\u002F\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003Ehttps:\u002F\u002FSEU-USERNAME.github.io\u002F\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan style=\"font-weight: 400;\"\u003E , ele oferece suporte a domínios personalizados.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEle usa fluxos de trabalho personalizáveis ​​do GitHub Action para compilações e implantações.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch2\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cb\u003EVamos aprender como hospedar sites estáticos criados com HTML no GitHub Pages!\u003C\u002Fb\u003E\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEscolha algum repositório seu que contenha código HTML, navegue até a aba de configurações desse repositório.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAgora na coluna esquerda, procure e clique em Pages\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAqui você pode escolher entre fazer Deploy por um branch ou com GitHub Actions. Para usar a primeira opção você só tem que escolher o o branch main e clicar em Save.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003ENesse tutorial vamos escolher a opção GitHub Actions. Essa opção irá sugerir alguns fluxos de trabalho para você com base no código em seu repositório. Você pode escolher HTML estático e clicar em configurar.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EClicar em configurar levará você a um fluxo de trabalho pré-criado. Sinta-se à vontade para revisar o YAML, ajustá-lo de acordo com sua preferência e confirmar o código. Eu não vou mudar nada no template para esse tutorial e vou fazer o commit.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEm alguns segundos, a Action começará a ser executada. Ela gerará um URL e implantará seu site estático no GitHub Pages se for bem-sucedido. Você pode ver o status da sua Action, clicando na aba actions.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003ESe tudo deu certo, seu site vai estar hospedado em uma URL nesse formato: \u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fpachicodes.github.io\u002Ftalks\u002F\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003Ehttps:\u002FSEU_USERNAME.github.io\u002FNOME_DO_REPOSITORIO\u002F\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EExemplo: \u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fpachicodes.github.io\u002Ftalks\u002F\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003Ehttps:\u002F\u002Fpachicodes.github.io\u002Ftalks\u002F\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan style=\"font-weight: 400;\"\u003E – Onde pachicodes é meu username e talks é o nome do repositório.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EE ta dã, seu site está no ar! Lembrando que isso só vale para páginas em HTML estático e GitHub Pages em Jekyll.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cb\u003EDica:\u003C\u002Fb\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ESe você tiver imagens no seu site, pode ser que elas não carreguem no seu site, e isso é por uma mudança de PATHs que o GitHub Pages cria. Para corrigir isso precisamos mudar o endereço da imagem da seguinte maneira:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ESe o endereço da imagem é \u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003Eassets\u002Fimagens\u002Ffoto.jpg\u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003E, quando hospedado no GitHub Pages, mude o endereço para \u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003E{“NOME DO REPOSITORIO”}\u002Fassets\u002Fimagens\u002Ffoto.jpg\u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003E e assim que for feito de deploy, suas imagens devem aparecer.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EIsso também serve para PDFs.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cb\u003EConclusão\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEu adoro o GitHub pages, quase todos meus repos tem um site, porque é super prático!\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EVocê já conhecia o GitHub pages?\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EComenta aí com um site que você tem hospedado esse serviço!\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EE se você não tem um ainda, o que está esperando? ♦\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Chr \u002F\u003E\n\u003Cp\u003E\u003Cstrong\u003ELEIA TAMBÉM\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Ftendencias\u002Fcomo-usar-o-github-copilot-para-debuggar-codigo-mais-rapido\"\u003EComo usar o GitHub Copilot para debuggar código mais rápido\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Fdescubra-o-modo-agente-do-github-copilot\"\u003EDescubra o Modo Agente do GitHub Copilot\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Ftendencias\u002Fleia-me-ou-te-devoro-como-escrever-um-bom-readme\"\u003ELEIA-ME ou te devoro: Como escrever um bom README\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai\u002Fentenda-seu-codigo-com-a-ajuda-do-github-copilot-chat\"\u003EEntenda seu código com a ajuda do GitHub Copilot Chat\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Fgithub-co-pilot-pair-programming-com-inteligencia-artificial\"\u003EGithub Co-Pilot: Pair Programming com Inteligência Artificial\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EHTML | Você já conhece o GitHub Pages? Esse serviço oferece hospedagem gratuita para websites estáticos. Essa ferramenta usa Fluxos de trabalho…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fhtml\u002Fcomo-hostear-seu-site-html-gratuitamente-com-github-pages","date":"25 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F25171020\u002FHTML-1.jpg","externalMention":null,"author":{"id":149285,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F03\u002F13091859\u002Fpachiparra1.jpg","name":"Pachi Parra","description":"Pachi Parra atua como Developer Advocate no GitHub, focada na comunidade de pessoas desenvolvedoras no Brasil. Especialista em Developer Relations, gerenciamento de comunidades e eventos tech, e criação de conteúdo técnico, ela é fundadora da Abacate Tech, pioneira em consultoria DevRel no Brasil, e co-fundadora da Feministech, comunidade que fortalece a presença de mulheres e pessoas LGBTQIAP+ na tecnologia.\r\n\r\nPalestrante, mentora e apaixonada por construir relações que nutrem o ecossistema tech, Pachi está sempre em busca de maneiras de democratizar o acesso à tecnologia e promover um ambiente mais inclusivo e colaborativo. 🚀💚\r\n","slug":"pachiparra","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fpachiparra","registered":"2025-03-13 12:20:01","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"pachicodes@gmail.com"},"articles_count":6,"views_count":3600,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"HTML","slug":"html","id":7221,"link":"https:\u002F\u002Fimasters.com.br\u002Fhtml"},{"title":"Tendências","slug":"tendencias","id":7264,"link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias"}],"tags":[{"title":"github","slug":"github","id":572,"link":"https:\u002F\u002Fimasters.com.br\u002Fgithub"},{"title":"GitHub Actions","slug":"github-actions","id":8730,"link":"https:\u002F\u002Fimasters.com.br\u002Fgithub-actions"},{"title":"html","slug":"html-2","id":405,"link":"https:\u002F\u002Fimasters.com.br\u002Fhtml-2"},{"title":"PAGES","slug":"pages","id":9253,"link":"https:\u002F\u002Fimasters.com.br\u002Fpages"}],"seo":{"open_graph":{"title":"Como hostear seu site HTML gratuitamente com GitHub Pages","description":"HTML | Você já conhece o GitHub Pages? Esse serviço oferece hospedagem gratuita para websites estáticos. Essa ferramenta usa Fluxos de trabalho...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F25171020\u002FHTML-1.jpg","width":800,"height":533},"modified_time":"2025-06-25T17:14:21-03:00","published_time":"2025-06-25T17:14:21-03:00"},"twitter":{"title":"Como hostear seu site HTML gratuitamente com GitHub Pages","description":"HTML | Você já conhece o GitHub Pages? Esse serviço oferece hospedagem gratuita para websites estáticos. Essa ferramenta usa Fluxos de trabalho...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F25171020\u002FHTML-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fhtml\u002Fcomo-hostear-seu-site-html-gratuitamente-com-github-pages","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fhtml\u002Fcomo-hostear-seu-site-html-gratuitamente-com-github-pages","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fhtml\u002Fcomo-hostear-seu-site-html-gratuitamente-com-github-pages"},"type":"post"},{"id":163539,"title":"Error Handling em Node.js com Express","content":"\u003Cp\u003ETodo mundo projeta as suas aplicações para que funcionem, certo?\u003C\u002Fp\u003E\n\u003Cp\u003EMas elas funcionam sempre?\u003C\u002Fp\u003E\n\u003Cp\u003EÉ claro que não!\u003C\u002Fp\u003E\n\u003Cp\u003EAí mora uma falha de design de software muito comum: raramente os programadores pensem na manipulação dos erros das aplicações nas quais trabalham, o que gera dores de cabeça enormes no médio e longo prazo, quando o sistema já está em produção e precisamos fazer troubleshooting, mudar \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Flogging-de-aplicacoes-node-js-com-winston\u002F\"\u003Etecnologia de logging\u003C\u002Fa\u003E ou até mesmo manipular os erros de forma mais eficiente.\u003C\u002Fp\u003E\n\u003Cp\u003EQue tal aprender a fazer error handling em Express de forma elegante e que te permita evoluir a sua aplicação com qualidade ao longo do tempo?\u003C\u002Fp\u003E\n\u003Cp\u003EEsse é o assunto do tutorial de hoje!\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003EAtenção:\u003C\u002Fstrong\u003E este tutorial é para quem já sabe programar ao menos o básico de Node.js com Express. \u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cstrong\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E#1 – Voltando ao Básico\u003C\u002Fspan\u003E\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EO primeiro passo é obviamente revisitar o assunto manipulação de erro em JavaScript. Basicamente quando queremos capturar um erro que possa ser lançado em certo bloco de código, usamos try\u002Fcatch, certo?\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\ntry{\r\n \u002F\u002Fseu código aqui\r\n}\r\ncatch(error){\r\n \u002F\u002Fseu tratamento de erro aqui\r\n}\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003ESe um erro acontecer dentro do bloco try, o fluxo será redirecionado para o bloco catch onde você terá acesso a um objeto error com os dados do erro, permitindo que você trate, registre e devolva ao usuário uma resposta mais amigável.\u003C\u002Fp\u003E\n\u003Cp\u003EO grande problema do try\u002Fcatch é…bem, que você tem de escrevê-lo em todos os pontos da sua aplicação onde não quer que um erro possa estourar e com isso prejudicar a experiência do usuário.\u003C\u002Fp\u003E\n\u003Cp\u003ENão fosse o bastante, se você estiver com uma web API em Node.js feita com Express, se você tiver o estouro de um erro sem o devido tratamento, o seu webserver pode cair! Sim, porque erros não tratados no \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fentendendo-o-nodejs-event-loop\u002F\"\u003EEvent Loop\u003C\u002Fa\u003E simplesmente podem derrubar o Event Loop! E isso não é uma característica exclusiva do Node.js ou do JavaScript, programas de computador em geral são encerrados automaticamente se der uma exceção não tratada no seu fluxo principal!\u003C\u002Fp\u003E\n\u003Cdiv class=\"mailmunch-forms-in-post-middle\"\u003E\n\u003Cp class=\"mailmunch-forms-widget-643629\"\u003EAssim, vamos considerar um pequeno exemplo de webapi Express onde temos três rotas, uma que funciona, uma que dá erro mas o mesmo é tratado e outra que dá erro e o mesmo não é tratado.\u003C\u002Fp\u003E\n\u003Cdiv\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\nconst express = require('express');\r\nconst app = express();\r\n\r\napp.get('\u002Fteste1', (req, res, next) => {\r\n res.send('teste1');\r\n})\r\n\r\napp.get('\u002Fteste2', (req, res, next) => {\r\n try {\r\n throw new Error('teste2 deu erro');\r\n } catch (error) {\r\n console.log(error);\r\n res.sendStatus(500);\r\n }\r\n})\r\n\r\napp.get('\u002Fteste3', (req, res, next) => {\r\n throw new Error('teste3 deu erro');\r\n})\r\n\r\napp.listen(3000, () => {\r\n console.log('Server running at 3000');\r\n})\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003ENão esqueça de instalar a dependência do express antes de rodar este projeto com “npm install”.\u003C\u002Fp\u003E\n\u003Cp\u003ETeste as 3 rotas usando Postman ou mesmo no seu navegador. Consegue perceber a diferença entre as 3? Em especial a 2 e 3, pois na 2 conseguimos tratar o erro e dar algum destino diferente para a requisição, enquanto que na 3 estoura um erro grosseiro e que não temos controle, inclusive expondo nosso servidor ao requisitante.\u003C\u002Fp\u003E\n\u003Cp\u003EJamais deixe suas rotas desta forma!\u003C\u002Fp\u003E\n\u003Ch3 id=\"2-error-middleware\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E#2 – Error Middleware\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EUma forma de fazer o gerenciamento de erros de forma mais profissional é centralizando-o através de um error middleware.\u003C\u002Fp\u003E\n\u003Cp\u003EO Express é todo organizado através de middlewares de processamento e existe um middleware especial que chamamos de Error Middleware que serve como destino default para todos os erros gerados e não tratados no event loop.\u003C\u002Fp\u003E\n\u003Cp\u003EEnquanto que um middleware normal possui 3 parâmetros (req, res e next), o Error Middleware é criado passando um parâmetro a mais, que na verdade deve ser o primeiro: error. Além disso, ele deve ser o último middleware na sua cadeia de processamento.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\napp.get('\u002Fteste3', (req, res, next) => {\r\n throw new Error('teste3 deu erro');\r\n})\r\n\r\napp.use((error, req, res, next) => {\r\n console.log('error middleware');\r\n res.sendStatus(500);\r\n})\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003ENo exemplo acima, criei o error middleware logo após a última rota. Experimente subir novamente sua aplicação e testar a rota 3. Verá que apesar de ela não possuir try\u002Fcatch, seu fluxo será redirecionado para o error middleware automaticamente quando o erro estourar, simplificando bastante o tratamento de erros pois agora ele estará centralizado.\u003C\u002Fp\u003E\n\u003Cp\u003EAinda assim, nas rotas que você desejar ainda ter um try\u002Fcatch personalizado, você pode mantê-lo e redirecionar para o error middleware opcionalmente, com a função next, passando o erro como único argumento.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\napp.get('\u002Fteste2', (req, res, next) => {\r\n try {\r\n throw new Error('teste2 deu erro');\r\n } catch (error) {\r\n console.log(error);\r\n next(error);\r\n }\r\n})\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EA partir da v5 do Express você também tem suporte a captura de erros assíncronos, então pode testar o código abaixo que também vai funcionar.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\napp.get('\u002Fteste3', async (req, res, next) => {\r\n throw new Error('teste3 deu erro');\r\n})\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EComo próximos passos, que eu não vou abordar hoje pois este tutorial já está se tornando extenso, você pode utilizar Custom Errors na sua aplicação para que o Error Middleware consiga identificar os tipos de erro e dar retornos apropriados.\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EQue tal aprender a fazer error handling em Express de forma elegante e que te permita evoluir a sua aplicação com qualidade ao longo do tempo?\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Ferror-handling-em-node-js-com-express","date":"25 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04140925\u002Fjavascript-2.jpg","externalMention":null,"author":{"id":148188,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2022\u002F10\u002F11183022\u002FLuizTools.jpg","name":"Luiz Fernando Duarte Junior","description":"Pós-graduado em computação, trabalha com software desde 2006 nas mais variadas tecnologias. Empreendedor, autor e professor, quando não está ocupado programando, está escrevendo ou gravando sobre programação para seu canal e blog LuizTools.","slug":"luizfernando","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fluizfernando","registered":"2017-04-28 19:43:26","social":{"linkedin":null,"youtube":null,"facebook":"http:\u002F\u002Ffb.com\u002Fluiztools","twitter":"https:\u002F\u002Ftwitter.com\u002Fluiztools","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.luiztools.com.br\u002F","mail":"contato@luiztools.com.br"},"articles_count":98,"views_count":960400,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Design","slug":"design","id":8663,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesign"},{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"error handling","slug":"error-handling","id":9247,"link":"https:\u002F\u002Fimasters.com.br\u002Ferror-handling"},{"title":"Express","slug":"express","id":6685,"link":"https:\u002F\u002Fimasters.com.br\u002Fexpress"},{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"},{"title":"node.js","slug":"node-js","id":1032,"link":"https:\u002F\u002Fimasters.com.br\u002Fnode-js"}],"seo":{"open_graph":{"title":"Error Handling em Node.js com Express | Falha de design de software","description":"Que tal aprender a fazer error handling em Express de forma elegante e que te permita evoluir a sua aplicação com qualidade ao longo do tempo?","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04140925\u002Fjavascript-2.jpg","width":800,"height":533},"modified_time":"2025-06-04T14:30:13-03:00","published_time":"2025-06-25T09:15:08-03:00"},"twitter":{"title":"Error Handling em Node.js com Express | Falha de design de software","description":"Que tal aprender a fazer error handling em Express de forma elegante e que te permita evoluir a sua aplicação com qualidade ao longo do tempo?","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04140925\u002Fjavascript-2.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Ferror-handling-em-node-js-com-express","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Ferror-handling-em-node-js-com-express","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Ferror-handling-em-node-js-com-express"},"type":"post"},{"id":163616,"title":"Arquitetura de Microsserviços em Node com o MoleculerJS","content":"\u003Cp id=\"618f\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EMontar um projeto na arquitetura de Microsserviços não é tão trivial e nem tão necessário quanto a maior parte das pessoas desenvolvedoras iniciantes imaginam que seja.\u003C\u002Fp\u003E\n\u003Cp id=\"c011\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EMuitos escutam o termo e, por ele estar na moda, já acham que precisam sair aplicando sem mesmo entender o que ela é, pra que serve e porque faria sentido (ou não) usá-la. Na vida real não é bem assim que funciona.\u003C\u002Fp\u003E\n\u003Cp id=\"4768\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EA arquitetura de microsserviços é incrível e pode resolver vários complexos. Mas aí é que está o X da questão: quais problemas complexos que ele resolve? Dificilmente um projeto pessoal pequeno terá qualquer tipo desses problemas.\u003C\u002Fp\u003E\n\u003Cp id=\"b8cd\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EO caminho natural das nossas aplicações é ser construída em um monolito até que faça sentido mudar a sua arquitetura. Isso se fizer sentido. Você sabia que o próprio \u003Ca class=\"ag or\" href=\"https:\u002F\u002Fstackoverflow.com\u002F\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"ny hp\"\u003EStack Overflow\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E é um monolito?\u003C\u002Fp\u003E\n\u003Cp id=\"3c04\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EDito isso, estudar esse tipo de arquitetura e aplicá-la para aprender seus conceitos e detalhes é sim muito interessante. Experimentar um pouco dessa arquitetura te ajudará a ganhar experiência para então tomar melhores decisões no futuro.\u003C\u002Fp\u003E\n\u003Cp id=\"5472\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EComo então fazer para aplicar essa arquitetura dentro do ecossistema Node?\u003C\u002Fp\u003E\n\u003Cp id=\"c54b\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EComo tudo na tecnologia, há várias formas diferentes; no entanto, recentemente encontrei uma bem interessante por meio do framework \u003Ca class=\"ag or\" href=\"https:\u002F\u002Fmoleculer.services\u002Findex.html\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"ny hp\"\u003EMoleculer\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp id=\"1aaa\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EBora explorá-lo?\u003C\u002Fp\u003E\n\u003Cp id=\"1816\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E—\u003C\u002Fp\u003E\n\u003Ch2 id=\"5fed\" class=\"os ot ho bf ou ov ow ox fg oy oz pa fj pb pc pd pe pf pg ph pi pj pk pl pm pn bk\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EO Framework Moleculer\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"1b86\" class=\"nw nx ho ny b nz po ob oc od pp of og fk pq oi oj fn pr ol om fq ps oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EO Moleculer é um framework para Node.js que nos ajuda a criar aplicações usando a arquitetura de microsserviços.\u003C\u002Fli\u003E\n\u003Cli id=\"2375\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EAplicar a arquitetura de microsserviços não se resume a apenas quebrar a aplicação em várias menores. Existem conceitos e técnicas para conseguir fazer isso da melhor forma possível, e o framework já vem integrado com vários deles, como por exemplo:\u003C\u002Fli\u003E\n\u003Cli id=\"185e\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EAPI Gateway;\u003C\u002Fli\u003E\n\u003Cli id=\"4a5b\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003ELoad Balancer;\u003C\u002Fli\u003E\n\u003Cli id=\"b5be\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EFault Tolerance;\u003C\u002Fli\u003E\n\u003Cli id=\"d3d4\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EService Discovery;\u003C\u002Fli\u003E\n\u003Cli id=\"3499\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EEtc.\u003C\u002Fli\u003E\n\u003Cli id=\"1473\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003ENão vale a pena ficar explicando cada um desses pontos agora porque esse assunto é bem denso. Vamos tentar montar um projetinho na prática com essa arquitetura e naturalmente descobriremos o que eles são e como usá-los.\u003C\u002Fli\u003E\n\u003Cli id=\"9209\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003ECombinado?\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"06b7\" class=\"os ot ho bf ou ov ow ox fg oy oz pa fj pb pc pd pe pf pg ph pi pj pk pl pm pn bk\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EAplicação prática\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"073b\" class=\"nw nx ho ny b nz po ob oc od pp of og fk pq oi oj fn pr ol om fq ps oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EComo eu disse, o caminho natural de uma aplicação é nascer do monolito e, a medida que sua complexida se tornar muito grande, a “quebramos” em aplicações menores.\u003C\u002Fli\u003E\n\u003Cli id=\"effd\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EPartindo dessa ideia, vamos começar da seguinte aplicação:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cfigure class=\"pt pu pv pw px my nh ni paragraph-image\"\u003E\n\u003Cdiv class=\"nr ns ee nt bh nu\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"nh ni qj\"\u003E\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003Cimg class=\"bh er nv c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png\" alt=\"\" width=\"700\" height=\"442\" \u002F\u003E\u003C\u002Fpicture\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"66c2\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EPara a coisa não ficar muito complexa, existem apenas três rotas: uma para criação de usuário, outra para fazer o usuário entrar na aplicação e uma terceira rota protegida (exige autenticação).\u003C\u002Fli\u003E\n\u003Cli id=\"2d8a\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EVou propor separamos essa aplicação em dois microsserviços distintos, uma para cuidar da parte de criação, cadastro e login dos usuários; e o outra para lidar com os produtos.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cfigure class=\"pt pu pv pw px my nh ni paragraph-image\"\u003E\n\u003Cdiv class=\"nr ns ee nt bh nu\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"nh ni qk\"\u003E\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003Cimg class=\"bh er nv c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png\" alt=\"\" width=\"700\" height=\"313\" \u002F\u003E\u003C\u002Fpicture\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"c8ab\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003ENote que em um arquitetura em microsserviços temos uma interface que centralizará todas as requisições e “distribuirá” para os respectivos serviços. Aqui ela está representada pelo app no diagrama. Esta peça é o que chamamos de \u003Cstrong class=\"ny hp\"\u003EGateway\u003C\u002Fstrong\u003E.\u003C\u002Fli\u003E\n\u003Cli id=\"a283\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003ERepare também que nesta organização, cada aplicação tem o seu próprio banco de dados. A ideia é que os serviços sejam independentes, até mesmo nos dados. Mas nada impede que essas aplicações se comuniquem.\u003C\u002Fli\u003E\n\u003Cli id=\"451a\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EEssa comunicação pode acontecer de várias formas, desde chamadas http (pouco usado) até serviços de mensageria (muito usado). Em nossa aplicação usaremos um serviço externo chamado \u003Ca class=\"ag or\" href=\"https:\u002F\u002Fnats.io\u002F\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"ny hp\"\u003ENATS\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E que vai nos ajudar com isso.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"1ee4\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EPara começar a implementação, faremos 3 projetos em node (farei na mesma pasta pra facilitar):\u003C\u002Fp\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"491e\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003Eapi-gateway: \u003Ccode class=\"cx ql qm qn qo b\"\u003Enpm i moleculer moleculer-web nats\u003C\u002Fcode\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"81c9\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003Eauth-service: \u003Ccode class=\"cx ql qm qn qo b\"\u003Enpm i moleculer moleculer-replt nats uuid\u003C\u002Fcode\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"e911\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003Eproduct-service: \u003Ccode class=\"cx ql qm qn qo b\"\u003Enpm i moleculer moleculer-replt nats\u003C\u002Fcode\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"185b\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EVamos começar a construção de cada uma das peças da nossa aplicação.\u003C\u002Fp\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"fa2f\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003E\u003Cstrong\u003EAPI Gateway\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Eimport { ServiceBroker } from \"moleculer\";\r\nimport ApiGatewayService from \"moleculer-web\";\r\n\r\nconst broker = new ServiceBroker({\r\n nodeID: \"gateway-node\",\r\n transporter: \"NATS\",\r\n});\r\n\r\nbroker.createService({\r\n name: \"gateway\",\r\n mixins: [ApiGatewayService],\r\n settings: {\r\n port: 5000,\r\n routes: [\r\n {\r\n path: \"\u002Fauth\",\r\n aliases: {\r\n \"POST \u002Fsign-up\": \"auth.signUp\",\r\n \"POST \u002Fsign-in\": \"auth.signIn\"\r\n }\r\n },\r\n {\r\n path: \"\u002Fapi\",\r\n bodyParsers: {\r\n json: true,\r\n urlencoded: { extended: true }\r\n },\r\n authorization: true,\r\n aliases: {\r\n \"GET \u002Fproducts\": \"product.getProducts\"\r\n }\r\n }\r\n ]\r\n },\r\n methods: {\r\n async authorize(ctx, route, req, res) {\r\n let auth = req.headers[\"authorization\"];\r\n if (auth && auth.startsWith(\"Bearer\")) {\r\n let token = auth.slice(7);\r\n\r\n const user = await ctx.call(\"auth.validateToken\", { token });\r\n if (!user.error) return Promise.resolve(ctx);\r\n\r\n return Promise.reject({ error: \"Token Inválido\" });\r\n\r\n } else {\r\n return Promise.reject({ error: \"Token Inválido\" });\r\n }\r\n }\r\n\r\n }\r\n});\r\n\r\nbroker.start();\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"6c57\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003E\u003Cstrong\u003EAuth Service\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Eimport { ServiceBroker } from \"moleculer\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nconst users = [];\r\n\r\nconst broker = new ServiceBroker({\r\n nodeID: \"auth-service-node\",\r\n transporter: \"NATS\"\r\n});\r\n\r\nbroker.createService({\r\n name: \"auth\",\r\n actions: {\r\n signUp(ctx) {\r\n const { username, password } = ctx.params;\r\n users.push({\r\n username,\r\n password\r\n });\r\n\r\n return \"User created.\"\r\n },\r\n\r\n signIn(ctx) {\r\n const { username, password } = ctx.params;\r\n const user = users.find(user => user.username === username);\r\n if (user && user.password === password) {\r\n const token = uuidv4();\r\n user.token = token;\r\n return {\r\n token\r\n }\r\n }\r\n\r\n return { error: \"Invalid credentials\" }\r\n },\r\n\r\n validateToken(ctx) {\r\n const { token } = ctx.params;\r\n const user = users.find(user => user.token === token);\r\n if (!user) return { error: \"Invalid token.\" }\r\n\r\n return user;\r\n }\r\n }\r\n});\r\n\r\nbroker.start().then(() => {\r\n broker.repl();\r\n})\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"6bc3\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003E\u003Cstrong\u003EProducts Service\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Eimport { ServiceBroker } from \"moleculer\";\r\n\r\nconst products = [\r\n { id: 1, name: \"PC da Xuxa\", price: 15000 }\r\n]\r\n\r\nconst broker = new ServiceBroker({\r\n nodeID: \"product-service-node\",\r\n transporter: \"NATS\"\r\n});\r\n\r\nbroker.createService({\r\n name: \"product\",\r\n actions: {\r\n getProducts(ctx) {\r\n return products;\r\n }\r\n }\r\n});\r\n\r\nbroker.start().then(() => {\r\n broker.repl();\r\n})\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"3f1e\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EPara conseguir fazer os microsserviços conversarem, precisaremos no NATS!\u003C\u002Fli\u003E\n\u003Cli id=\"abc4\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EA forma mais fácil de trazer ele pro jogo é por meio do Docker:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Edocker run --name nats -p 4222:4222 nats\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"7957\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EE pronto! Temos nossa solução em microsserviços! 😄\u003C\u002Fp\u003E\n\u003Ch3 id=\"20d3\" class=\"qx ot ho bf ou fe qy ff fg fh qz fi fj fk ra fl fm fn rb fo fp fq rc fr fs rd bk\"\u003E💻 Repositório\u003C\u002Fh3\u003E\n\u003Cp id=\"b6e0\" class=\"pw-post-body-paragraph nw nx ho ny b nz po ob oc od pp of og fk pq oi oj fn pr ol om fq ps oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E\u003Ca class=\"ag or\" href=\"https:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fnode-microservice-moleculer\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003Ehttps:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fnode-microservice-moleculer\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"812d\" class=\"qx ot ho bf ou fe qy ff fg fh qz fi fj fk ra fl fm fn rb fo fp fq rc fr fs rd bk\"\u003E🌐 Referências e outros materiais\u003C\u002Fh3\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"2a97\" class=\"nw nx ho ny b nz po ob oc od pp of og fk pq oi oj fn pr ol om fq ps oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003E🌐 \u003Ca class=\"ag or\" href=\"https:\u002F\u002Fmoleculer.services\u002Findex.html\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003EMoleculer — Progressive microservices framework for Node.js\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"439b\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003E🌐 \u003Ca class=\"ag or\" href=\"https:\u002F\u002Fnats.io\u002F\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003ENATS.io — Cloud Native, Open Source, High-performance Messaging\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"0bf8\" class=\"os ot ho bf ou ov ow ox fg oy oz pa fj pb pc pd pe pf pg ph pi pj pk pl pm pn bk\"\u003EVersão em vídeo\u003C\u002Fh3\u003E\n\u003Cp id=\"fa19\" class=\"pw-post-body-paragraph nw nx ho ny b nz po ob oc od pp of og fk pq oi oj fn pr ol om fq ps oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EConfira a versão em vídeo desse artigo!\u003C\u002Fp\u003E\n\u003Cfigure class=\"pt pu pv pw px my\"\u003E\n\u003Cdiv class=\"py es m ee\"\u003E\n\u003Cdiv class=\"pz qa m\"\u003E\u003Ciframe class=\"eo o he dz bh\" title=\"Microsserviços em Node com o Moleculer.js\" src=\"https:\u002F\u002Fcdn.embedly.com\u002Fwidgets\u002Fmedia.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FLT9_51k-gxM%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DLT9_51k-gxM&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FLT9_51k-gxM%2Fhqdefault.jpg&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=youtube\" width=\"854\" height=\"480\" frameborder=\"0\" scrolling=\"no\" allowfullscreen=\"allowfullscreen\" data-mce-fragment=\"1\"\u003E\u003C\u002Fiframe\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cp id=\"e663\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E—\u003C\u002Fp\u003E\n\u003Ch1 id=\"5fed\" class=\"os ot ho bf ou ov ow ox fg oy oz pa fj pb pc pd pe pf pg ph pi pj pk pl pm pn bk\" data-selectable-paragraph=\"\"\u003E\u003C\u002Fh1\u003E\n","excerpt":"\u003Cp\u003EMontar um projeto na arquitetura de Microsserviços … ecossistema Node? Como tudo na tecnologia, há várias formas diferentes; no… framework Moleculer.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Farquitetura-de-microsservicos-em-node-com-o-moleculerjs","date":"23 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26181751\u002FMicrosservi%C3%A7os.jpg","externalMention":null,"author":{"id":144418,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30171243\u002Fdiego-pinho.jpg","name":"Diego Pinho","description":"Bacharel em Ciência da Computação pela PUCSP e MBA em Gestão da Tecnologia da Informação na FIAP. Autor do livro ECMAScript 6 - Entre de cabeça no futuro do JavaScript. Cofundador da Code Prestige e Community Manager no iMasters.","slug":"diegopinho","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdiegopinho","registered":"2013-08-13 18:00:53","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002FDiegoPinho","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.diegopinho.com.br","mail":"diego.pinho@imasters.com.br"},"articles_count":113,"views_count":1276900,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"},{"title":"microservices","slug":"microservices","id":4156,"link":"https:\u002F\u002Fimasters.com.br\u002Fmicroservices"},{"title":"microserviços","slug":"microservicos","id":5632,"link":"https:\u002F\u002Fimasters.com.br\u002Fmicroservicos"},{"title":"MoleculerJS","slug":"moleculerjs","id":9240,"link":"https:\u002F\u002Fimasters.com.br\u002Fmoleculerjs"},{"title":"node","slug":"node","id":236,"link":"https:\u002F\u002Fimasters.com.br\u002Fnode"},{"title":"web","slug":"web","id":327,"link":"https:\u002F\u002Fimasters.com.br\u002Fweb"}],"seo":{"open_graph":{"title":"Arquitetura de Microsserviços em Node com o MoleculerJS","description":"Montar um projeto na arquitetura de Microsserviços ... ecossistema Node? Como tudo na tecnologia, há várias formas diferentes; no... framework Moleculer.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26181751\u002FMicrosservi%C3%A7os.jpg","width":800,"height":533},"modified_time":"2025-05-26T18:31:02-03:00","published_time":"2025-06-23T09:21:06-03:00"},"twitter":{"title":"Arquitetura de Microsserviços em Node com o MoleculerJS","description":"Montar um projeto na arquitetura de Microsserviços ... ecossistema Node? Como tudo na tecnologia, há várias formas diferentes; no... framework Moleculer.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26181751\u002FMicrosservi%C3%A7os.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Farquitetura-de-microsservicos-em-node-com-o-moleculerjs","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Farquitetura-de-microsservicos-em-node-com-o-moleculerjs","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Farquitetura-de-microsservicos-em-node-com-o-moleculerjs"},"type":"post"},{"id":163733,"title":"sftpdav: Acesso Remoto via SSH com WebDAV","content":"\u003Cp\u003ERecentemente, enfrentei um desafio ao tentar acessar arquivos de uma máquina que só permite conexão via SSH. Abrir portas adicionais ou instalar extensões de terceiros não eram opções viáveis por questões de segurança e compatibilidade, especialmente no macOS.\u003C\u002Fp\u003E\n\u003Cp\u003EFoi assim que surgiu a ideia de criar o \u003Cstrong\u003Esftpdav\u003C\u002Fstrong\u003E, um programa que combina um cliente SFTP com um servidor WebDAV, permitindo acessar um diretório remoto via SSH e montá-lo localmente como se fosse um compartilhamento WebDAV.\u003C\u002Fp\u003E\n\u003Cp\u003ENa prática, estou usando o rsync e mantendo os arquivos sincronizados entre a máquina local e o servidor remoto. O \u003Cstrong\u003Esftpdav\u003C\u002Fstrong\u003E é uma solução interessante, mas o desempenho não é tão bom. Ainda assim, foi muito proveitoso desenvolver essa solução e aprender mais sobre o protocolo WebDAV e SSH.\u003C\u002Fp\u003E\n\u003Cp\u003EO código-fonte do \u003Cstrong\u003Esftpdav\u003C\u002Fstrong\u003E está disponível no GitHub: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcrgimenes\u002Fsftpdav\"\u003Esftpdav\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Ch2 id=\"requisitos\"\u003ERequisitos\u003C\u002Fh2\u003E\n\u003Cp\u003EA necessidade surgiu porque:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EAmbiente Restrito:\u003C\u002Fstrong\u003E O servidor só permite conexão via SSH.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ESegurança:\u003C\u002Fstrong\u003E Não posso expor outras portas no servidor.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ECompatibilidade:\u003C\u002Fstrong\u003E O \u003Ccode\u003Esshfs\u003C\u002Fcode\u003E não tem suporte nativo no macOS, e não desejo instalar softwares adicionais.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ELock de Arquivos:\u003C\u002Fstrong\u003E O servidor WebDAV deve suportar bloqueio de arquivos (lock), necessário para meu caso de uso (o NFS também possui, mas não é tão simples de configurar).\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Euser-space:\u003C\u002Fstrong\u003E A solução deve ser executada em user-space, sem necessidade de privilégios de administrador.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003ECom o \u003Cstrong\u003Esftpdav\u003C\u002Fstrong\u003E, é possível aproveitar a robustez do SSH e, ao mesmo tempo, oferecer a flexibilidade do WebDAV, que pode ser montado em sistemas Linux e macOS com comandos simples e em user-space.\u003C\u002Fp\u003E\n\u003Ch2 id=\"como-funciona-o-sftpdav\"\u003EComo Funciona o sftpdav\u003C\u002Fh2\u003E\n\u003Cp\u003EO programa realiza os seguintes passos:\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003ELeitura da Configuração SSH:\u003C\u002Fstrong\u003E Utiliza o arquivo \u003Ccode\u003E~\u002F.ssh\u002Fconfig\u003C\u002Fcode\u003E para obter informações como usuário, hostname, porta e arquivo de identidade.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EConexão SFTP:\u003C\u002Fstrong\u003E Estabelece uma conexão SSH e, a partir dela, cria um cliente SFTP para acesso ao diretório remoto.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EServidor WebDAV Local:\u003C\u002Fstrong\u003E Inicializa um servidor WebDAV com a biblioteca padrão do Go, expondo o diretório remoto via SFTP para ser montado localmente.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EMontagem do Compartilhamento:\u003C\u002Fstrong\u003E Com o servidor WebDAV em execução, o compartilhamento pode ser montado usando os comandos nativos do sistema.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch2 id=\"exemplos-práticos\"\u003EExemplos Práticos\u003C\u002Fh2\u003E\n\u003Ch3 id=\"executando-o-sftpdav\"\u003EExecutando o sftpdav\u003C\u002Fh3\u003E\n\u003Cp\u003EPara iniciar o servidor WebDAV com acesso SFTP, execute:\u003C\u002Fp\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003E.\u002Fsftpdav -port \u003Cspan class=\"m\"\u003E8811\u003C\u002Fspan\u003E -host sshserver\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EParâmetros suportados:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003E-host:\u003C\u002Fstrong\u003E Nome do host conforme configurado no \u003Ccode\u003E~\u002F.ssh\u002Fconfig\u003C\u002Fcode\u003E.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003E-port:\u003C\u002Fstrong\u003E Porta local para o servidor WebDAV (padrão: \u003Ccode\u003E8811\u003C\u002Fcode\u003E).\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003E-remoteDir:\u003C\u002Fstrong\u003E Diretório remoto a ser exposto (padrão: \u003Ccode\u003E\".\"\u003C\u002Fcode\u003E).\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"montando-o-compartilhamento\"\u003EMontando o Compartilhamento\u003C\u002Fh3\u003E\n\u003Ch4 id=\"no-linux\"\u003ENo Linux\u003C\u002Fh4\u003E\n\u003Cp\u003EUse o comando \u003Ccode\u003Emount\u003C\u002Fcode\u003E com o tipo \u003Ccode\u003Edavfs\u003C\u002Fcode\u003E:\u003C\u002Fp\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Esudo mount -t davfs http:\u002F\u002Flocalhost:8811 \u002Fmnt\u002Fsftp\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch4 id=\"no-macos\"\u003ENo macOS\u003C\u002Fh4\u003E\n\u003Cp\u003EUse o comando \u003Ccode\u003Emount_webdav\u003C\u002Fcode\u003E:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Esudo mount_webdav http:\u002F\u002Flocalhost:8811 \u002Fmnt\u002Fsftp\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch4 id=\"para-desmontar\"\u003EPara Desmontar\u003C\u002Fh4\u003E\n\u003Cp\u003EEm ambos os sistemas, para desmontar o compartilhamento, execute:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Esudo umount \u002Fmnt\u002Fsftp\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch3 id=\"limpando-arquivos-de-dados-estendidos-macos\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003ELimpando Arquivos de Dados Estendidos (macOS)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EComo o WebDAV não suporta dados estendidos no macOS, podem ser criados arquivos iniciados por \u003Ccode\u003E._\u003C\u002Fcode\u003E. Para removê-los, use:\u003C\u002Fp\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Edot_clean \u002Fcaminho\u002Fdo\u002Fdiretorio\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Ch2 id=\"a-versão-original\"\u003EA Versão Original\u003C\u002Fh2\u003E\n\u003Cp\u003EA versão original era mais simples, consistindo em poucas linhas de código para criar um servidor WebDAV. No entanto, ela precisava ser executada no servidor remoto:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Epackage main\r\n\r\nimport (\r\n \"flag\"\r\n \"log\"\r\n \"net\u002Fhttp\"\r\n \"time\"\r\n\r\n \"golang.org\u002Fx\u002Fnet\u002Fwebdav\"\r\n)\r\n\r\nfunc main() {\r\n localPortFlag := flag.String(\"port\", \"8811\", \"Local port for WebDAV server\")\r\n dirFlag := flag.String(\"dir\", \".\u002F\", \"Directory to share\")\r\n flag.Parse()\r\n\r\n handler := &webdav.Handler{\r\n Prefix: \"\u002F\",\r\n FileSystem: webdav.Dir(*dirFlag),\r\n LockSystem: webdav.NewMemLS(),\r\n }\r\n\r\n s := &http.Server{\r\n Handler: handler,\r\n Addr: \":\" + *localPortFlag,\r\n ReadTimeout: 15 * time.Second,\r\n WriteTimeout: 15 * time.Second,\r\n MaxHeaderBytes: 1 << 20,\r\n }\r\n\r\n if err := s.ListenAndServe(); err != nil {\r\n log.Fatal(err)\r\n }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EEntão, criava-se um túnel SSH para acessar o servidor remoto e montar o compartilhamento WebDAV localmente.\u003C\u002Fp\u003E\n\u003Ch2 id=\"criando-um-túnel-ssh\"\u003ECriando um Túnel SSH\u003C\u002Fh2\u003E\n\u003Cdiv class=\"highlight\"\u003E\n\u003Cpre class=\"chroma\"\u003E\u003Ccode class=\"language-bash\" data-lang=\"bash\"\u003Essh -L 8811:localhost:8811 sshserver\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003ENeste exemplo, a porta \u003Ccode\u003E8811\u003C\u002Fcode\u003E da máquina local é redirecionada para a porta \u003Ccode\u003E8811\u003C\u002Fcode\u003E do servidor remoto, permitindo acesso local ao serviço WebDAV. Essa abordagem simples funcionava bem e é mais rápida que a versão atual.\u003C\u002Fp\u003E\n\u003Ch2 id=\"considerações-finais\"\u003EConsiderações Finais\u003C\u002Fh2\u003E\n\u003Cp\u003EO \u003Cstrong\u003Esftpdav\u003C\u002Fstrong\u003E é uma solução experimental, mas funcional. Apesar de apresentar alguma lentidão, cumpre o objetivo de fornecer acesso remoto via WebDAV usando apenas a porta SSH, mantendo a segurança e a simplicidade do ambiente.\u003C\u002Fp\u003E\n\u003Cp\u003EA experiência com este projeto reforçou como é possível combinar diferentes protocolos para superar limitações e criar soluções interessantes e seguras.\u003C\u002Fp\u003E\n\u003Cp\u003ECaso tenha dúvidas ou sugestões, fique à vontade para entrar em contato ou abrir uma \u003Cem\u003Eissue\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fcrg.eti.br\u002Fpt-br\u002Fcesar-gimenes\u002F\"\u003ECesar Gimenes\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EFoi assim que surgiu a ideia de criar o sftpdav, um programa que combina… remoto via SSH e montá-lo localmente como se fosse um compartilhamento WebDAV.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fsftpdav-acesso-remoto-via-ssh-com-webdav","date":"17 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04145047\u002FGolang.jpg","externalMention":null,"author":{"id":148141,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30180934\u002Fcesar-gimenes-128x128.jpg","name":"Cesar Gimenes","description":"Trabalha com tecnologia desde a década de 90. Já atuou na área de educação e participou de projetos de mobilidade de grande volume para laboratórios farmacêuticos. Criou games tanto para PC, como para iOS. Hoje está direcionando seus esforços em plataformas de Sistemas Embarcados, IoT, microservices e cloud computing. É um entusiasta de tecnologias como Golang e Docker.","slug":"cesargimenes","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fcesargimenes","registered":"2017-03-23 14:25:13","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Ffacebook.com\u002Fcrgimenes","twitter":"https:\u002F\u002Ftwitter.com\u002Fcrgimenes","instagram":null,"github":null,"url":"","mail":"crg@crg.eti.br"},"articles_count":26,"views_count":67600,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Go Golang","slug":"go-golang","id":8896,"link":"https:\u002F\u002Fimasters.com.br\u002Fgo-golang"}],"tags":[{"title":"go","slug":"go","id":3239,"link":"https:\u002F\u002Fimasters.com.br\u002Fgo"},{"title":"golang","slug":"golang","id":4556,"link":"https:\u002F\u002Fimasters.com.br\u002Fgolang"},{"title":"webdav","slug":"webdav","id":9248,"link":"https:\u002F\u002Fimasters.com.br\u002Fwebdav"}],"seo":{"open_graph":{"title":"sftpdav: Acesso Remoto via SSH com WebDAV | Go \u002F Golang","description":"Foi assim que surgiu a ideia de criar o sftpdav, um programa que combina... remoto via SSH e montá-lo localmente como se fosse um compartilhamento WebDAV.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04145047\u002FGolang.jpg","width":800,"height":533},"modified_time":"2025-06-04T14:54:30-03:00","published_time":"2025-06-17T09:15:39-03:00"},"twitter":{"title":"sftpdav: Acesso Remoto via SSH com WebDAV | Go \u002F Golang","description":"Foi assim que surgiu a ideia de criar o sftpdav, um programa que combina... remoto via SSH e montá-lo localmente como se fosse um compartilhamento WebDAV.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04145047\u002FGolang.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fsftpdav-acesso-remoto-via-ssh-com-webdav","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fsftpdav-acesso-remoto-via-ssh-com-webdav","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fsftpdav-acesso-remoto-via-ssh-com-webdav"},"type":"post"},{"id":163758,"title":"Gestão de Projetos em 2030: como eu vejo o futuro","content":"\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ETenho refletido bastante sobre para onde está indo a gestão de projetos. Talvez eu erre em alguns pontos e tudo bem, o futuro tem dessas surpresas, mas acredito que alguns sinais já estão visíveis.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ENos últimos anos, o próprio desenvolvimento de software vem mudando de forma acelerada: ciclos mais curtos, plataformas low-code\u002Fno-code, IA generativa ajudando em código, produtos sendo ajustados em tempo real com base em dados de uso. Isso, naturalmente, muda o terreno onde o gerente de projetos sempre atuou.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ENão é mais (ou cada vez menos será) aquele modelo sequencial de “grandes escopos fechados, longos cronogramas e checkpoints mensais”. Mesmo projetos grandes começam a ser quebrados em entregas menores, adaptáveis e com times altamente autônomos.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cb\u003EE o que acontece com a profissão?\u003C\u002Fb\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EMinha visão é que a profissão de gerente de projetos não vai desaparecer, mas está mudando de pele. Teremos espaço para menos gerentes que “controlam tarefas” e mais profissionais que orquestram, facilitam, integram visões e criam alinhamento entre múltiplas áreas, parceiros e tecnologias.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EA quantidade de oportunidades? Pode ser que diminua para quem atuar de forma tradicional, mas aumente para quem se adaptar. Alguns números globais mostram crescimento ainda sólido da profissão (PMI estima milhões de novas vagas), mas com novas exigências de perfil.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cb\u003EComo eu me prepararia hoje (e estou tentando fazer isso)\u003C\u002Fb\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EDominar o básico, mas ir além da certificação\u003C\u002Fb\u003E\u003Cb\u003E\u003Cbr \u002F\u003E\n\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Sim, PMP, PMBOK, Agile, Scrum, tudo isso ainda conta. Mas é só o chão firme. Cada vez mais, o gerente de projetos precisará também entender de produto, de negócios, de tecnologia (sem ser dev, mas falando bem com devs), de finanças e de métricas de impacto.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EFocar nas habilidades humanas\u003C\u002Fb\u003E\u003Cb\u003E\u003Cbr \u002F\u003E\n\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Negociação, comunicação, alinhamento de interesses, gestão de expectativas, conversas difíceis. Soft skills são cada vez mais o diferencial.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EEntender tecnologia como parceiro, não ameaça\u003C\u002Fb\u003E\u003Cb\u003E\u003Cbr \u002F\u003E\n\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E A IA vai ajudar a planejar, prever riscos, alocar recursos. Quem souber trabalhar bem com essas ferramentas terá vantagem competitiva.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003EPensar ESG desde o início\u003C\u002Fb\u003E\u003Cb\u003E\u003Cbr \u002F\u003E\n\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Projetos já nascem com compromissos ambientais, sociais e éticos. Entender frameworks de sustentabilidade passa a ser obrigatório.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cb\u003ESer global (mesmo no bairro)\u003C\u002Fb\u003E\u003Cb\u003E\u003Cbr \u002F\u003E\n\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Mesmo atuando no Brasil, as interações multiculturais aumentam. Falar outros idiomas, entender outras culturas de trabalho e saber lidar com equipes distribuídas já é quase pré-requisito.\u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Cbr \u002F\u003E\n\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Outro dia mesmo, eu estava em uma call com três fusos horários diferentes, percebi que metade da minha função ali não era falar de escopo, mas ajustar expectativas culturais, interpretar silêncios e, claro, garantir que todos estavam mesmo falando da mesma coisa. Esse tipo de habilidade não está em nenhum cronograma mas muda o projeto inteiro.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EO futuro da gestão de projetos não é fim da profissão. É fim de um jeito antigo de fazer, mas abertura para um papel ainda mais estratégico e relevante para quem souber se atualizar.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEssa é, ao menos, a minha leitura de agora (e posso errar muito, voltarei aqui em 20230 para ler). E, no mais, sigo estudando, porque o futuro já começou.♦\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Chr \u002F\u003E\n\u003Cp\u003E\u003Cstrong\u003ELEIA TAMBÉM\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fcaminho-critico-a-conexao-que-segura-todos-os-projetos\"\u003ECaminho Crítico: a conexão que segura todos os projetos\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fgestao-de-riscos-em-projetos-sua-trava-de-seguranca-na-montanha-russa-da-execucao\"\u003EGestão de riscos em projetos: sua trava de segurança na montanha-russa da execução\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fgerenciar-varios-projetos-tech-ao-mesmo-tempo-e-como-viver-numa-sequencia-de-montanhas-russas\"\u003EGerenciar vários projetos tech ao mesmo tempo é como viver numa sequência de montanhas-russas\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fda-pressao-dos-prazos-ao-controle-do-orcamento-como-simplificar-a-gestao-de-projetos-para-desenvolvedores\"\u003EDa pressão dos prazos ao controle do orçamento: como simplificar a gestão de projetos para desenvolvedores\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002F3-licoes-sobre-ia-e-desenvolvimento-o-futuro-e-colaborativo\"\u003E3 Lições Sobre IA e Desenvolvimento: O Futuro é Colaborativo\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n","excerpt":"\u003Cp\u003ETenho refletido bastante sobre para onde está indo a gestão de projetos. Talvez eu erre em alguns pontos e tudo bem, o futuro tem dessas surpresas, mas…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fgerencia-de-projetos-dev-e-ti\u002Fgestao-de-projetos-em-2030-como-eu-vejo-o-futuro","date":"16 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F13114344\u002FGest%C3%A3o.jpg","externalMention":null,"author":{"id":148986,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F03\u002F17113527\u002FDiego-Lima.jpeg","name":"Diego Lima","description":"","slug":"lima-diego","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Flima-diego","registered":"2020-07-27 14:17:05","social":{"linkedin":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Ffontx\u002F","youtube":"http:\u002F\u002Fwww.youtube.com\u002F@Fontx","facebook":"","twitter":"","instagram":"https:\u002F\u002Fwww.instagram.com\u002Ffontx\u002F","github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"diego.lima@imasters.com.br"},"articles_count":6,"views_count":3600,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Carreira Dev","slug":"carreira-dev","id":7265,"link":"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev"},{"title":"Gerência de Projetos Dev & TI","slug":"gerencia-de-projetos-dev-e-ti","id":7246,"link":"https:\u002F\u002Fimasters.com.br\u002Fgerencia-de-projetos-dev-e-ti"},{"title":"Gestão","slug":"gestao","id":9224,"link":"https:\u002F\u002Fimasters.com.br\u002Fgestao"}],"tags":[{"title":"dev","slug":"dev","id":954,"link":"https:\u002F\u002Fimasters.com.br\u002Fdev"},{"title":"developers","slug":"developers","id":8239,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevelopers"},{"title":"gerência de projetos","slug":"gerencia-de-projetos-2","id":416,"link":"https:\u002F\u002Fimasters.com.br\u002Fgerencia-de-projetos-2"},{"title":"gerente de projetos","slug":"gerente-de-projetos","id":5758,"link":"https:\u002F\u002Fimasters.com.br\u002Fgerente-de-projetos"},{"title":"Gestão","slug":"gestao","id":4262,"link":"https:\u002F\u002Fimasters.com.br\u002Fgestao"},{"title":"Gestão de Projetos","slug":"gestao-de-projetos","id":3015,"link":"https:\u002F\u002Fimasters.com.br\u002Fgestao-de-projetos"},{"title":"projetos","slug":"projetos","id":454,"link":"https:\u002F\u002Fimasters.com.br\u002Fprojetos"}],"seo":{"open_graph":{"title":"Gestão de Projetos em 2030: como eu vejo o futuro","description":"Tenho refletido bastante sobre para onde está indo a gestão de projetos. Talvez eu erre em alguns pontos e tudo bem, o futuro tem dessas surpresas, mas...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F13114344\u002FGest%C3%A3o.jpg","width":800,"height":533},"modified_time":"2025-06-13T11:55:11-03:00","published_time":"2025-06-16T09:15:50-03:00"},"twitter":{"title":"Gestão de Projetos em 2030: como eu vejo o futuro","description":"Tenho refletido bastante sobre para onde está indo a gestão de projetos. Talvez eu erre em alguns pontos e tudo bem, o futuro tem dessas surpresas, mas...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F13114344\u002FGest%C3%A3o.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fgerencia-de-projetos-dev-e-ti\u002Fgestao-de-projetos-em-2030-como-eu-vejo-o-futuro","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fgerencia-de-projetos-dev-e-ti\u002Fgestao-de-projetos-em-2030-como-eu-vejo-o-futuro","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fgerencia-de-projetos-dev-e-ti\u002Fgestao-de-projetos-em-2030-como-eu-vejo-o-futuro"},"type":"post"},{"id":163543,"title":"ASP .NET Core – Apresentando Fast Endpoints","content":"\u003Cp\u003ENeste artigo vou apresentar a biblioteca \u003Cstrong\u003EFastEndpoints,\u003C\u002Fstrong\u003E um framework minimalista usado para criar Web Apis na plataforma .NET\u003C\u002Fp\u003E\n\u003Cp\u003EO \u003Cstrong\u003EFastEndpoints\u003C\u002Fstrong\u003E é uma biblioteca que tem a proposta de simplificar a criação de \u003Cstrong\u003Eendpoints de Web API\u003C\u002Fstrong\u003E no .NET, utilizando uma abordagem baseada em classes e métodos declarativos. Ele elimina a necessidade de configurar controladores (\u003Ccode\u003E\u003Cspan class=\"auto-style25\"\u003EControllers\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E) e roteamentos de maneira tradicional, tornando o desenvolvimento mais rápido e com menos código.\u003C\u002Fp\u003E\n\u003Ch2\u003E.NET\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EA criação de APIs da Web com o ASP.NET Core pode envolver muito código repetitivo, especialmente ao lidar com controladores, roteamento e vinculação de modelos. O \u003Cstrong\u003EFastEndpoints\u003C\u002Fstrong\u003E é uma biblioteca leve que simplifica esse processo, permitindo que você defina endpoints com o mínimo de código e ótimo desempenho. \u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EEla segue o padrão \u003Cstrong\u003EREPR\u003C\u002Fstrong\u003E –\u003Cem\u003E Request-Endpoint-Response\u003C\u002Fem\u003E –  e oferece os seguintes vantagens :\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cstrong\u003EMenos código boilerplate:\u003C\u002Fstrong\u003E \u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003ENão há necessidade de criar controllers, actions e configurar roteamentos manualmente.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cstrong\u003EDesempenho otimizado\u003C\u002Fstrong\u003E: \u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EMenor sobrecarga em comparação ao MVC padrão da ASP.NET Core.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cstrong\u003EDesenvolvimento mais rápido\u003C\u002Fstrong\u003E: \u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003ECriação de endpoints de maneira declarativa, com validações e\u003C\u002Fspan\u003E \u003Cspan style=\"font-family: Segoe UI;\"\u003Einjeção de dependência simplificados.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cstrong\u003EValidações integradas\u003C\u002Fstrong\u003E:\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003ESuporte embutido para validação de modelos usando \u003Cstrong\u003EFluentValidation\u003C\u002Fstrong\u003E.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cstrong\u003EOpenAPI\u002FSwagger\u003C\u002Fstrong\u003E: \u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003ESuporte nativo para gerar documentação da API\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-family: 'Segoe UI'; font-size: 18pt;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"auto-style33\"\u003E\u003Cstrong\u003EUsando FastEndpoints\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EPara usar o FastEndpoints basta criar um projeto ASP.NET Core e incluir o pacote FastEndpoints: \u003Cspan class=\"auto-style29\"\u003E\u003Cstrong\u003Edotnet add package FastEndpoints\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EO \u003Cstrong\u003EFastEndpoints\u003C\u002Fstrong\u003E adota uma abordagem \u003Cstrong\u003EHandler-Based\u003C\u002Fstrong\u003E (baseada em manipuladores) em vez de usar controladores convencionais do \u003Cstrong\u003EASP.NET Core MVC\u003C\u002Fstrong\u003E, para simplificar a criação de APIs REST.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EO FastEndpoints utiliza a middleware pipeline do ASP.NET Core e o recurso de routing endpoint introduzido no .NET Core 3.0. Em vez de registrar rotas em controladores, ele registra diretamente as classes que implementam a lógica dos endpoints.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003ECada classe que herda de\u003Cstrong\u003E Endpoint<TRequest, TResponse> \u003C\u002Fstrong\u003Eou \u003Cstrong\u003EEndpoint<TRequest>\u003C\u002Fstrong\u003E é automaticamente registrada como um endpoint na aplicação.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EDurante a inicialização, o FastEndpoints escaneia o assembly e registra dinamicamente as classes que implementam a interface de endpoint.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-family: 'Segoe UI'; font-size: 18pt;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"auto-style26\"\u003E\u003Cstrong\u003ERecursos utilizados pelo FastEndpoints:\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cstrong\u003EMiddleware Pipeline: \u003C\u002Fstrong\u003E \u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EO FastEndpoints registra os endpoints na pipeline HTTP usando \u003Cstrong\u003Eapp.UseRouting() e app.UseEndpoints().\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cstrong\u003EReflection (Reflexão)\u003C\u002Fstrong\u003E:  \u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EEle usa reflection para encontrar todas as classes que herdam de \u003Cstrong\u003EEndpoint<> \u003C\u002Fstrong\u003Ee registrá-las como endpoints HTTP.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cstrong\u003EMinimal APIs (Introduzidas no .NET 6)\u003C\u002Fstrong\u003E:  \u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EEle usa a API de rotas simplificada do Minimal APIs, mas oferece uma abordagem mais estruturada com base em classes.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E♦\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EAssim, o FastEndoints não usa Controllers pois um controlador geralmente lida com várias ações (GET, POST, PUT, DELETE), o que pode dificultar a organização e manutenção do código.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EAlém disso, Controladores dependem de atributos para mapear rotas, enquanto o FastEndpoints elimina essa necessidade, permitindo declarar rotas diretamente nas classes de endpoint.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EDesta forma ele\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E usa classes separadas em vez de controladores pois cada classe de endpoint tem uma única responsabilidade (por exemplo, \u003Ccode\u003E\u003Cstrong\u003E\u003Cspan class=\"auto-style25\"\u003ECreateProdutoEndpoint\u003C\u002Fspan\u003E\u003C\u002Fstrong\u003E\u003C\u002Fcode\u003E só lida com a criação de produtos).\u003C\u002Fspan\u003E \u003Cspan style=\"font-family: Segoe UI;\"\u003ECom classes separadas, o código fica mais limpo e fácil de manter. Não há necessidade de lidar com controladores inchados.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EAs rotas são definidas diretamente dentro dos endpoints, tornando o mapeamento mais explícito e flexível e ainda possui suporte integrado para validações, resposta de erros padronizada e filtros de autenticação\u002Fautorização.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-family: 'Segoe UI'; font-size: 18pt;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"auto-style26\"\u003E\u003Cstrong\u003ETipos de endpoint no FastEndpoints\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EO FastEndpoints oferece 4 tipos de endpoints base, que você pode herdar de:\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E• \u003Cstrong\u003EEndpoint<TRequest>\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EUse este tipo se houver apenas um DTO de solicitação. No entanto, você pode enviar qualquer objeto ao cliente que possa ser serializado como uma resposta com essa sobrecarga genérica.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E•\u003Cstrong\u003E Endpoint<TRequest,TResponse>\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EUse este tipo se você tiver DTOs de solicitação e resposta. O benefício dessa sobrecarga genérica é que você obtém acesso fortemente tipado às propriedades do DTO ao fazer testes de integração e validações.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E•\u003Cstrong\u003E EndpointWithoutRequest\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EUse este tipo se não houver DTO de solicitação nem resposta. Você também pode enviar qualquer objeto serializável como resposta aqui.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E•\u003Cstrong\u003E EndpointWithoutRequest<TResponse>\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EUse este tipo se não houver DTO de solicitação, mas houver um DTO de resposta.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E♦\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003ETambém é possível definir endpoints com \u003Cstrong\u003EEmptyRequest\u003C\u002Fstrong\u003E e \u003Cstrong\u003EEmptyResponse\u003C\u002Fstrong\u003E, se necessário:\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"auto-style27\"\u003E\u003Cstrong\u003Epublic classEndpoint : Endpoint<EmptyRequest,EmptyResponse> { }\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"auto-style28\"\u003E\u003Cstrong\u003EExemplo prático usando FastEndpoints\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003ENeste nosso primeiro contato com o FastEndpoints vejamos como criar uma Web API para realizar o CRUD básico em \u003Cstrong\u003EProduto\u003C\u002Fstrong\u003E.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003ECrie um novo projeto no VS 2022 usando o template ASP.NET Core Web API com o nome \u003Cstrong\u003EApiFastEndpointsCrud\u003C\u002Fstrong\u003E sem usar Controllers. Neste exemplo vou usar um banco de dados  SQL Server.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EA seguir inclua no projeto os seguintes pacotse nuget :  \u003Cspan class=\"auto-style29\"\u003E\u003Cstrong\u003E \u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E\u003Cspan class=\"auto-style29\"\u003E\u003Cstrong\u003Edotnet add package FastEndpoints\u003Cbr \u002F\u003E\ndotnet add package Microsoft.EntityFrameworkCore.SqlServer\u003Cbr \u002F\u003E\ndotnet add package Microsoft.EntityFrameworkCore.Tools\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EAgora configure o FastEndpoints na classe \u003Cstrong\u003EProgram\u003C\u002Fstrong\u003E:\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003Evar builder = WebApplication.CreateBuilder(args);\r\nbuilder.Services.AddOpenApi();\r\n\r\n\u002F\u002F Registrando o FastEndpoints \r\nbuilder.Services.AddFastEndpoints();\r\nvar app = builder.Build();\r\n\u002F\u002F Ativando FastEndpoints\r\napp.UseFastEndpoints();\r\n...\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003ECrie a pasta \u003Cstrong\u003EEntities\u003C\u002Fstrong\u003E no projeto e nesta pasta cria a classe \u003Cstrong\u003EProduto\u003C\u002Fstrong\u003E:\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-aspnet\"\u003Epublic class Produto\r\n{\r\n public int Id { get; set; }\r\n public string Nome { get; set; } = string.Empty;\r\n public decimal Preco { get; set; }\r\n public int Estoque { get; set; }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EVamos criar uma pasta chamada \u003Cstrong\u003EContext\u003C\u002Fstrong\u003E no projeto e incluir nesta pasta a classe \u003Cstrong\u003EAppDbContext\u003C\u002Fstrong\u003E que herda de \u003Cstrong\u003EDbContext\u003C\u002Fstrong\u003E:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-aspnet\"\u003E\r\nppublic class AppDbContext : DbContext\r\n{\r\n public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }\r\n\r\n public DbSet<Produto> Produtos { get; set; }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAgora adicione na classe \u003Cstrong\u003EProgram\u003C\u002Fstrong\u003E o código para registrar o serviço do contexto definindo o provedor do banco e obtendo a string de conexão:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003E...\r\nbuilder.Services.AddDbContext<AppDbContext>(options =>\r\noptions.UseSqlServer(builder.Configuration.GetConnectionString(\"DefaultConnection\")));\r\n...\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EA seguir defina no arquivo \u003Cstrong\u003Eappsettings.json\u003C\u002Fstrong\u003E a string de conexão usada para acessar o SQL Sever local:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003E\r\n...\r\n \"ConnectionStrings\": {\r\n\"DefaultConnection\": \"Server=Macoratti\\\\SqlExpress;Database=FastEndpointsDB;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=true;\"\r\n},\r\n...\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-family: 'Segoe UI'; font-size: 18pt;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"auto-style26\"\u003E\u003Cstrong\u003ECriando os endpoints\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EAgora vamos criar as classes para cada Endpoint. Para isso vamos criar a pasta \u003Cstrong\u003EProdutos\u003C\u002Fstrong\u003E no projeto e nesta pasta vamos criar as seguintes classes:\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003E📄 \u003Cstrong\u003ECriarProdutoEndpoint\u003C\u002Fstrong\u003E.cs – Para criar um produto (POST).\u003Cbr \u002F\u003E\n📄 \u003Cstrong\u003ECriarProdutoRequest\u003C\u002Fstrong\u003E.cs – DTO usado para fornecer os dados de entrada do produto\u003Cbr \u002F\u003E\n📄 \u003Cstrong\u003EObterProdutosEndpoint\u003C\u002Fstrong\u003E.cs – Para listar todos os produtos (GET).\u003Cbr \u002F\u003E\n📄 \u003Cstrong\u003EObterProdutoEndpoint\u003C\u002Fstrong\u003E.cs – Para obter um produto pelo seu id (GET).\u003Cbr \u002F\u003E\n📄 \u003Cstrong\u003EAtualizarProdutoEndpoint\u003C\u002Fstrong\u003E.cs – Para atualizar um produto  (PUT).\u003Cbr \u002F\u003E\n📄 \u003Cstrong\u003EDeletarProdutoEndpoint\u003C\u002Fstrong\u003E.cs – Para deletar um produto por ID (DELETE).\u003Cbr \u002F\u003E\n📄 \u003Cstrong\u003EAtualizarProdutoRequest\u003C\u002Fstrong\u003E.cs – DTO usado para fornecer os dados de entrada.\u003Cbr \u002F\u003E\n📄 \u003Cstrong\u003EObterProdutoIdRequest\u003C\u002Fstrong\u003E.cs – DTO usado para fornecer o Id do Produto\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan class=\"auto-style24\"\u003EEssa \u003C\u002Fspan\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003Eestrutura mantém o código separado e organizado, facilitando a manutenção. Aseguir temos o código de cada classew\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-family: 'Segoe UI'; font-size: 18pt;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"auto-style29\"\u003E\u003Cstrong\u003E1- Listar todos os produtos\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-aspnet\"\u003Epublic class ObterProdutosEndpoint : EndpointWithoutRequest<List<Produto>> \r\n{\r\n private readonly AppDbContext _context;\r\n public ObterProdutosEndpoint(AppDbContext context)\r\n {\r\n _context = context;\r\n }\r\n public override void Configure()\r\n {\r\n Verbs(Http.GET);\r\n Routes(\"\u002Fprodutos\");\r\n Get(\"\u002Fprodutos\");\r\n AllowAnonymous();\r\n }\r\n public override async Task HandleAsync(CancellationToken ct)\r\n {\r\n var produtos = await _context.Produtos.ToListAsync(ct); \r\n if (produtos.IsNullOrEmpty())\r\n {\r\n \u002F\u002F Retorna 404 se não houver produtos.\r\n await SendNotFoundAsync();\r\n return;\r\n }\r\n await SendOkAsync(produtos); \u002F\u002F Retorna 200 OK com a lista de produtos\r\n \u002F\u002F Ou, para melhor performance em alguns casos (dependendo do tamanho da lista):\r\n \u002F\u002F await SendAsync(produtos); \u002F\u002F Envia diretamente a lista, \r\n \u002F\u002F sem serialização extra (pode precisar de configuração no Program.cs)\r\n }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EVamos entender o código :\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EA classe herda de \u003Cstrong\u003EEndpointWithoutRequest<List<Produto>>\u003C\u002Fstrong\u003E, o que significa que:\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EEndpointWithoutRequest\u003C\u002Fstrong\u003E → Indica que não recebe nenhum dado na requisição (\u003Cstrong\u003EBody\u003C\u002Fstrong\u003E).\u003Cbr \u002F\u003E\n\u003Cstrong\u003EList<Produto>\u003C\u002Fstrong\u003E → O endpoint retorna uma lista de produtos.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EO \u003Cstrong\u003Econtexto é injetado via construtor\u003C\u002Fstrong\u003E (injeção de dependência), permitindo que o endpoint acesse os métodos para manipular dados.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EO método \u003Cstrong\u003EConfigure\u003C\u002Fstrong\u003E configura as propriedades do endopint:\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ctable class=\"auto-style23\"\u003E\n\u003Ctbody\u003E\n\u003Ctr\u003E\n\u003Ctd class=\"auto-style31\"\u003E\u003Cstrong\u003EMétodo\u003C\u002Fstrong\u003E\u003C\u002Ftd\u003E\n\u003Ctd class=\"auto-style41\"\u003E\u003Cstrong\u003EDescrição\u003C\u002Fstrong\u003E\u003C\u002Ftd\u003E\n\u003C\u002Ftr\u003E\n\u003Ctr\u003E\n\u003Ctd class=\"auto-style32\"\u003E\u003Cstrong\u003EVerbs()\u003C\u002Fstrong\u003E\u003C\u002Ftd\u003E\n\u003Ctd class=\"auto-style39\"\u003EDefine o verbo HTTP usado pelo endpoint (GET).\u003C\u002Ftd\u003E\n\u003C\u002Ftr\u003E\n\u003Ctr\u003E\n\u003Ctd class=\"auto-style32\"\u003E\u003Cstrong\u003ERoutes()\u003C\u002Fstrong\u003E\u003C\u002Ftd\u003E\n\u003Ctd class=\"auto-style21\"\u003E\u003Cspan class=\"auto-style37\"\u003EDefine a \u003C\u002Fspan\u003E\u003Cstrong\u003E\u003Cspan class=\"auto-style37\"\u003Erota do endpoint\u003C\u002Fspan\u003E\u003C\u002Fstrong\u003E\u003Cspan class=\"auto-style37\"\u003E (\u003C\u002Fspan\u003E\u003Ccode\u003E\u003Cspan class=\"auto-style40\"\u003E\u002Fprodutos\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003Cspan class=\"auto-style37\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Ftd\u003E\n\u003C\u002Ftr\u003E\n\u003Ctr\u003E\n\u003Ctd class=\"auto-style32\"\u003E\u003Cstrong\u003EAllowAnonymous\u003C\u002Fstrong\u003E\u003C\u002Ftd\u003E\n\u003Ctd class=\"auto-style39\"\u003EPermite que o endpoint seja acessado sem autenticação.\u003C\u002Ftd\u003E\n\u003C\u002Ftr\u003E\n\u003C\u002Ftbody\u003E\n\u003C\u002Ftable\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EO método \u003Cstrong\u003EHandleAsync\u003C\u002Fstrong\u003E é o método principal do endpoint, que será chamado quando uma requisição for feita para \u003Cstrong\u003E\u002Fprodutos.\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003E__context.Produtos.ToListAsync(ct)\u003C\u002Fstrong\u003E→ Chama o método para buscar todos os produtos da base de dados.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003ESendOkAsync\u003C\u002Fstrong\u003E(produtos) → Envia a resposta ao cliente com a lista de produtos (status HTTP 200 OK).\u003C\u002Fp\u003E\n\u003Cp class=\"auto-style24\"\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003ESe o produto não for encontrado usando o método \u003Cstrong\u003ESendNotFoundAsync()\u003C\u002Fstrong\u003E para enviar um status code 404.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-family: 'Segoe UI'; font-size: 18pt;\"\u003E\u003Cspan class=\"HwtZe\" lang=\"pt\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"auto-style29\"\u003E\u003Cstrong\u003E2- Criar um novo produto\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003Epublic class CriarProdutoEndpoint : Endpoint<CriarProdutoRequest, Produto> \r\n{\r\n private readonly AppDbContext _context;\r\n public CriarProdutoEndpoint(AppDbContext context)\r\n {\r\n _context = context;\r\n }\r\n public override void Configure()\r\n {\r\n Post(\"\u002Fprodutos\");\r\n AllowAnonymous();\r\n }\r\n public override async Task \r\n HandleAsync(CriarProdutoRequest req,\r\n CancellationToken ct)\r\n {\r\n var produto = new Produto\r\n {\r\n Nome = req.Nome,\r\n Preco = req.Preco,\r\n Estoque = req.Estoque\r\n };\r\n _context.Produtos.Add(produto);\r\n await _context.SaveChangesAsync(ct);\r\n await SendCreatedAtAsync<CriarProdutoEndpoint>($\"\u002Fprodutos\u002F{produto.Id}\", \r\n produto);\r\n }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EEsta classe usa o DTO \u003Cspan class=\"auto-style25\"\u003E\u003Cspan class=\"auto-style27\"\u003ECriarProdutoRequest \u003C\u002Fspan\u003E\u003C\u002Fspan\u003Epara fornecer os dados do produto que será criado:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003Epublic class CriarProdutoRequest\r\n{\r\n public string Nome { get; set; } = string.Empty;\r\n public decimal Preco { get; set; }\r\n public int Estoque { get; set; }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003E3- Lista um produto pelo seu id\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003Epublic class ObterProdutoEndpoint : Endpoint<ObterProdutoIdRequest> \r\n{\r\n private readonly AppDbContext _context;\r\n public ObterProdutoEndpoint(AppDbContext context)\r\n {\r\n _context = context;\r\n }\r\n public override void Configure()\r\n {\r\n \u002F\u002F {Id} deve corresponder à propriedade do DTO (case-sensitive)\r\n Get(\"\u002Fprodutos\u002F{Id}\"); \r\n AllowAnonymous();\r\n }\r\n public override async Task \r\n HandleAsync(ObterProdutoIdRequest req,\r\n CancellationToken ct)\r\n {\r\n \u002F\u002F Acessa o ID através do DTO\r\n var produto = await _context.Produtos.FindAsync(req.Id, ct); \r\n if (produto == null)\r\n {\r\n await SendNotFoundAsync();\r\n return;\r\n }\r\n await SendOkAsync(produto);\r\n }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EEsta classe usa o DTO \u003Cspan class=\"auto-style25\"\u003E\u003Cspan class=\"auto-style27\"\u003EObterProdutoIdRequest \u003C\u002Fspan\u003E\u003C\u002Fspan\u003Epara fornecer id do produto  que será obtido.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003Epublic class ObterProdutoIdRequest\r\n{\r\n public int Id { get; set; }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003E\u003Cstrong\u003E4- Atualiza um produto\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003Epublic class AtualizarProdutoEndpoint : Endpoint<AtualizarProdutoRequest>\r\n{\r\n private readonly AppDbContext _context;\r\n public AtualizarProdutoEndpoint(AppDbContext context)\r\n {\r\n _context = context;\r\n }\r\n public override void Configure()\r\n {\r\n Put(\"\u002Fprodutos\u002F{id}\");\r\n AllowAnonymous();\r\n }\r\n public override async Task HandleAsync(AtualizarProdutoRequest req, \r\n CancellationToken ct)\r\n {\r\n var produto = await _context.Produtos.FindAsync(req.Id, ct);\r\n if (produto == null)\r\n {\r\n await SendNotFoundAsync();\r\n return;\r\n }\r\n produto.Nome = req.Nome;\r\n produto.Preco = req.Preco;\r\n produto.Estoque = req.Estoque;\r\n await _context.SaveChangesAsync(ct);\r\n await SendOkAsync(produto);\r\n }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EEsta classe usa o DTO \u003Cspan class=\"auto-style25\"\u003E\u003Cspan class=\"auto-style27\"\u003EAtualizarProdutoIdRequest \u003C\u002Fspan\u003E\u003C\u002Fspan\u003Epara fornecer o id do produto  que será atualizado e os dados do produto que são herdados de \u003Cstrong\u003ECriarProdutoRequest\u003C\u002Fstrong\u003E:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003Epublic class AtualizarProdutoRequest : CriarProdutoRequest \r\n{\r\n public int Id { get; set; }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003E5- Excluir um produto\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003Epublic class DeletarProdutoEndpoint : Endpoint<ObterProdutoIdRequest>\r\n{\r\n private readonly AppDbContext _context;\r\n public DeletarProdutoEndpoint(AppDbContext context)\r\n {\r\n _context = context;\r\n }\r\n public override void Configure()\r\n {\r\n Delete(\"\u002Fprodutos\u002F{id}\");\r\n AllowAnonymous();\r\n }\r\n public override async Task HandleAsync(ObterProdutoIdRequest req,\r\n CancellationToken ct)\r\n {\r\n var produto = await _context.Produtos.FindAsync(req.Id, ct);\r\n if (produto == null)\r\n {\r\n await SendNotFoundAsync();\r\n return;\r\n }\r\n _context.Produtos.Remove(produto);\r\n await _context.SaveChangesAsync(ct);\r\n await SendNoContentAsync(); \u002F\u002F Retorna 204 No Content\r\n }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EEsta classe também usa o DTO \u003Cspan class=\"auto-style25\"\u003E\u003Cspan class=\"auto-style27\"\u003EObterProdutoIdRequest \u003C\u002Fspan\u003E\u003C\u002Fspan\u003Epara fornecer id do produto  que será excluído.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"language-aspnet\"\u003Epublic class ObterProdutoIdRequest\r\n{\r\n public int Id { get; set; }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003ECom isso temos os endpoints definidos e eles serão exibidos na interface do Swagger da seguinte forma:\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg src=\"https:\u002F\u002Fmacoratti.net\u002F25\u002F01\u002Faspnc_fastendpoints11.jpg\" width=\"610\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003E\u003Cspan class=\"jCAhz ChMk0b\"\u003E\u003Cspan class=\"ryNqvb\"\u003EPara realizar os testes nestes endpoints de forma mais fácil podemos usar o Postman.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp class=\"auto-style24\"\u003EPegue o projeto aqui: \u003Cimg src=\"https:\u002F\u002Fmacoratti.net\u002Fdownl.gif\" width=\"16\" \u002F\u003E \u003Cspan class=\"auto-style27\"\u003E\u003Cstrong\u003E\u003Ca href=\"https:\u002F\u002Fmacoratti.net\u002F25\u002F01\u002FApiFastEndpointsCrud\"\u003EApiFastEndpointsCrud.zip\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-family: Segoe UI;\"\u003EE estamos conversados… \u003Cimg src=\"https:\u002F\u002Fmacoratti.net\u002F1_legal.gif\" width=\"20\" height=\"18\" border=\"0\" \u002F\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ENeste artigo vou apresentar a biblioteca FastEndpoints, um framework minimalista usado para criar Web Apis na plataforma .NET\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdotnet\u002Fasp-net-core-apresentando-fast-endpoints","date":"12 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04135530\u002FFramework-1.jpg","externalMention":null,"author":{"id":341,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30172759\u002Fmacoratti-128x128.jpeg","name":"José Carlos Macoratti","description":"é referência em Visual Basic no Brasil e autor dos livros \"Aprenda Rápido: ASP\" e \"ASP, ADO e Banco de Dados na Internet\". Mantenedor do site macoratti.net.","slug":"jose_carlos_macoratti","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fjose_carlos_macoratti","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002Fmacorati","instagram":null,"github":null,"url":"","mail":"macoratti@yahoo.com"},"articles_count":596,"views_count":35594365,"certifications":null,"conquests":null,"office":null},"categories":[{"title":".NET","slug":"dotnet","id":7291,"link":"https:\u002F\u002Fimasters.com.br\u002Fdotnet"},{"title":"Framework","slug":"framework","id":7290,"link":"https:\u002F\u002Fimasters.com.br\u002Fframework"}],"tags":[{"title":".NET","slug":"net","id":209,"link":"https:\u002F\u002Fimasters.com.br\u002Fnet"},{"title":"asp.net core","slug":"asp-net-core","id":5241,"link":"https:\u002F\u002Fimasters.com.br\u002Fasp-net-core"},{"title":"dotnet","slug":"dotnet-2","id":1718,"link":"https:\u002F\u002Fimasters.com.br\u002Fdotnet-2"},{"title":"FastEndpoints","slug":"fastendpoints","id":9246,"link":"https:\u002F\u002Fimasters.com.br\u002Ffastendpoints"},{"title":"framework","slug":"framework-2","id":495,"link":"https:\u002F\u002Fimasters.com.br\u002Fframework-2"}],"seo":{"open_graph":{"title":"ASP .NET Core - Apresentando Fast Endpoints framework","description":"Neste artigo vou apresentar a biblioteca FastEndpoints, um framework minimalista usado para criar Web Apis na plataforma .NET","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04135530\u002FFramework-1.jpg","width":800,"height":533},"modified_time":"2025-06-04T13:59:43-03:00","published_time":"2025-06-12T09:12:32-03:00"},"twitter":{"title":"ASP .NET Core - Apresentando Fast Endpoints framework","description":"Neste artigo vou apresentar a biblioteca FastEndpoints, um framework minimalista usado para criar Web Apis na plataforma .NET","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04135530\u002FFramework-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdotnet\u002Fasp-net-core-apresentando-fast-endpoints","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdotnet\u002Fasp-net-core-apresentando-fast-endpoints","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdotnet\u002Fasp-net-core-apresentando-fast-endpoints"},"type":"post"},{"id":163608,"title":"Dica de ouro: Saiba como fazer uma navbar responsiva","content":"\u003Cp id=\"7c4b\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EHoje é praticamente impossível ter um site que não seja responsivo.\u003C\u002Fp\u003E\n\u003Cp id=\"2d82\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EExistem várias formas criativas e técnicas de lidar com responsividade (ex: Flexbox, Media Queries, CSS Grid, etc.) nos mais diferentes contextos, mas há algumas adaptações que são praticamente padrões em todos os projetos.\u003C\u002Fp\u003E\n\u003Cp id=\"27d9\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EUm claro exemplo é a navbar responsiva. Quando ela possui muitos itens, inevitavelmente se torna imprópria para o ambiente mobile, pois os itens literalmente não cabem no espaço disponível.\u003C\u002Fp\u003E\n\u003Cp id=\"1f21\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003ENessas situações, precisamos pensar em técnicas criativas. Hoje vamos aprender como fazer uma navbar responsiva minimalista e elegante usando apenas o básico HTML, CSS e um pouquinho de nada de JavaScript.\u003C\u002Fp\u003E\n\u003Cp id=\"53d7\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EPara aprendemos como fazer isso, tomaremos como exemplo a solução que apliquei no meu próprio site pessoal. Sou suspeito pra falar, mas acho que ela atendeu bem ao seu objetivo 😄\u003C\u002Fp\u003E\n\u003Cfigure class=\"os ot ou ov ow my nh ni paragraph-image\"\u003E\n\u003Cdiv class=\"nr ns ee nt bh nu\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"nh ni or\"\u003E\n\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003C\u002Fpicture\u003E\n\u003Cfigure style=\"width: 700px\" class=\"wp-caption alignnone\"\u003E\u003Cimg class=\"bh er nv c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif\" alt=\"\" width=\"700\" height=\"405\" \u002F\u003E\u003Cfigcaption class=\"wp-caption-text\"\u003Efuncionamento da navbar responsiva\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cp id=\"f015\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EVamos começar criando a estrutura básica do site para desktop. Neste caso, precisamos essencialmente de três elementos HTML: uma tag <nav> para a barra de navegação, uma tag <img> para o logotipo e tags <ul> e <li> para a lista de links:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-html\"\u003E<!DOCTYPE html>\r\n<html lang=\"pt-br\">\r\n\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>Menu Responsivo<\u002Ftitle>\r\n <link rel=\"stylesheet\" href=\"style.css\">\r\n<\u002Fhead>\r\n\r\n<body>\r\n <nav class=\"navbar\">\r\n <img src=\"logo.png\" alt=\"logo\">\r\n <div class=\"navbar-links\">\r\n <ul>\r\n <li><a href=\"#\">Home<\u002Fa><\u002Fli>\r\n <li><a href=\"#\">Sobre<\u002Fa><\u002Fli>\r\n <li><a href=\"#\">Contato<\u002Fa><\u002Fli>\r\n <\u002Ful>\r\n <\u002Fdiv>\r\n <\u002Fnav>\r\n<\u002Fbody>\r\n\r\n<\u002Fhtml>\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EVamos aplicar o CSS básico para que ele funcione bem no desktop:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-css\"\u003E@import url('https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');\r\n\r\n* {\r\n box-sizing: border-box;\r\n}\r\n\r\nbody {\r\n font-family: \"Poppins\", sans-serif;\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\n.navbar {\r\n display: flex;\r\n position: relative;\r\n justify-content: space-around;\r\n align-items: center;\r\n border-bottom-color: rgb(234, 236, 243);\r\n border-bottom-style: solid;\r\n border-bottom-width: 1px;\r\n}\r\n\r\n.navbar img {\r\n width: 220px;\r\n}\r\n\r\n.navbar-links {\r\n height: 100%;\r\n}\r\n\r\n.navbar-links ul {\r\n display: flex;\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\n.navbar-links li {\r\n list-style: none;\r\n}\r\n\r\n.navbar-links li a {\r\n display: block;\r\n text-decoration: none;\r\n padding: 1rem;\r\n color: #333;\r\n font-weight: 500;\r\n}\r\n\r\n.navbar-links li:hover {\r\n background-color: #DBDBDB;\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"4485\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq pm pn po bk\" data-selectable-paragraph=\"\"\u003EAqui surge nosso primeiro problema: à medida que a tela fica menor, nossa navbar começa a transbordar horizontalmente. Esse comportamento não é desejável. Portanto, precisamos implementar o menu “hambúrguer”.\u003C\u002Fli\u003E\n\u003Cli id=\"9f60\" class=\"nw nx ho ny b nz pp ob oc od pq of og fk pr oi oj fn ps ol om fq pt oo op oq pm pn po bk\" data-selectable-paragraph=\"\"\u003EO primeiro passo para isso é adicionar no HTML o botão que corresponderá ao menu e as opções que ele oferecerá. Há diferentes maneiras de criamos esse botão, por ora, faremos ela na “mão”:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-html\"\u003E<!DOCTYPE html>\r\n<html lang=\"pt-br\">\r\n\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>Menu Responsivo<\u002Ftitle>\r\n <link rel=\"stylesheet\" href=\"style.css\">\r\n<\u002Fhead>\r\n\r\n<body>\r\n <nav class=\"navbar\">\r\n <img src=\"logo.png\" alt=\"logo\">\r\n <a href=\"#\" class=\"toggle-button\">\r\n <span class=\"bar\"><\u002Fspan>\r\n <span class=\"bar\"><\u002Fspan>\r\n <span class=\"bar\"><\u002Fspan>\r\n <\u002Fa>\r\n <div class=\"navbar-links\">\r\n <ul>\r\n <li><a href=\"#\">Home<\u002Fa><\u002Fli>\r\n <li><a href=\"#\">Sobre<\u002Fa><\u002Fli>\r\n <li><a href=\"#\">Contato<\u002Fa><\u002Fli>\r\n <\u002Ful>\r\n <\u002Fdiv>\r\n <\u002Fnav>\r\n\r\n <script src=\"script.js\"><\u002Fscript>\r\n<\u002Fbody>\r\n\r\n<\u002Fhtml>\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAgora vamos adicionar o CSS que vai construí-lo adequadamente na tela:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-css\"\u003E.toggle-button {\r\n position: absolute;\r\n top: .75rem;\r\n right: 1rem;\r\n display: none;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n width: 30px;\r\n height: 21px;\r\n}\r\n\r\n.toggle-button .bar {\r\n height: 3px;\r\n width: 100%;\r\n background-color: #333;\r\n border-radius: 10px;\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"c2d6\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq pm pn po bk\" data-selectable-paragraph=\"\"\u003EAgora temos que ajustar para que ele apareça somente quando o dispositivo tiver a tela pequena. Para isso, precisaremos das Media Queries.\u003C\u002Fli\u003E\n\u003Cli id=\"7579\" class=\"nw nx ho ny b nz pp ob oc od pq of og fk pr oi oj fn ps ol om fq pt oo op oq pm pn po bk\" data-selectable-paragraph=\"\"\u003EAs media queries funcionam como condicionais dentro do nosso código CSS. Desta forma, conseguimos trabalhar com condições para que um elemento apareça ou não. Vamos ver como fica nosso exemplo:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-css\"\u003E@media (max-width: 800px) {\r\n .navbar {\r\n flex-direction: column;\r\n align-items: center;\r\n }\r\n\r\n .toggle-button {\r\n display: flex;\r\n }\r\n\r\n .navbar-links {\r\n display: none;\r\n width: 100%;\r\n }\r\n\r\n .navbar-links ul {\r\n width: 100%;\r\n flex-direction: column;\r\n }\r\n\r\n .navbar-links ul li {\r\n text-align: center;\r\n }\r\n\r\n .navbar-links ul li a {\r\n padding: .5rem 1rem;\r\n }\r\n\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAgora temos mais um problema para resolver. Ao clicar no menu, queremos que os itens apareçam e quando clicarmos novamente, que eles sumam. É neste momento que precisaremos da ajuda do JavaScript!\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003Econst toggleButton = document.getElementsByClassName(\"toggle-button\")[0];\r\nconst navbarLinks = document.getElementsByClassName(\"navbar-links\")[0];\r\n\r\ntoggleButton.addEventListener(\"click\", () => {\r\n navbarLinks.classList.toggle(\"active\");\r\n});\r\n\r\n.navbar-links.active {\r\n display: flex;\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"f2c6\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EE pronto! Temos nossa navbar responsiva lindona! Basta adaptar os textos, opções, tamanhos e afins para melhor se adequar ao seu projeto! 😀\u003C\u002Fp\u003E\n\u003Cp id=\"03d4\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E—\u003C\u002Fp\u003E\n\u003Ch3 id=\"afc0\" class=\"pu ph ho bf pv pw px py fg pz qa qb fj qc qd qe qf qg qh qi qj qk ql qm qn qo bk\"\u003ERepositório\u003C\u002Fh3\u003E\n\u003Cp id=\"1648\" class=\"pw-post-body-paragraph nw nx ho ny b nz qp ob oc od qq of og fk qr oi oj fn qs ol om fq qt oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E\u003Ca class=\"ag qu\" href=\"https:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fmenu-responsivo\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003Ehttps:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fmenu-responsivo\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"f388\" class=\"pu ph ho bf pv pw px py fg pz qa qb fj qc qd qe qf qg qh qi qj qk ql qm qn qo bk\"\u003EAgradecimentos\u003C\u002Fh3\u003E\n\u003Cp id=\"932d\" class=\"pw-post-body-paragraph nw nx ho ny b nz qp ob oc od qq of og fk qr oi oj fn qs ol om fq qt oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EGostou deste conteúdo? Então curta e compartilhe! 👏\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EExistem várias formas criativas e técnicas de lidar com responsividade (ex: Flexbox, Media Queries, CSS Grid)… Um claro exemplo é a navbar responsiva.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-fazer-uma-navbar-responsiva","date":"11 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26163321\u002FDesenvolvimento.jpg","externalMention":null,"author":{"id":144418,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30171243\u002Fdiego-pinho.jpg","name":"Diego Pinho","description":"Bacharel em Ciência da Computação pela PUCSP e MBA em Gestão da Tecnologia da Informação na FIAP. Autor do livro ECMAScript 6 - Entre de cabeça no futuro do JavaScript. Cofundador da Code Prestige e Community Manager no iMasters.","slug":"diegopinho","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdiegopinho","registered":"2013-08-13 18:00:53","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002FDiegoPinho","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.diegopinho.com.br","mail":"diego.pinho@imasters.com.br"},"articles_count":113,"views_count":1276900,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Desenvolvimento","slug":"desenvolvimento","id":7234,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento"}],"tags":[{"title":"CSS","slug":"css","id":4250,"link":"https:\u002F\u002Fimasters.com.br\u002Fcss"},{"title":"desenvolvimento","slug":"desenvolvimento-2","id":186,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento-2"},{"title":"desenvolvimento web","slug":"desenvolvimento-web","id":5269,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento-web"},{"title":"html","slug":"html-2","id":405,"link":"https:\u002F\u002Fimasters.com.br\u002Fhtml-2"},{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"}],"seo":{"open_graph":{"title":"Dica de ouro: Saiba como fazer uma navbar responsiva","description":"Existem várias formas criativas e técnicas de lidar com responsividade (ex: Flexbox, Media Queries, CSS Grid)... Um claro exemplo é a navbar responsiva.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26163321\u002FDesenvolvimento.jpg","width":800,"height":533},"modified_time":"2025-05-26T17:20:04-03:00","published_time":"2025-06-11T09:21:48-03:00"},"twitter":{"title":"Dica de ouro: Saiba como fazer uma navbar responsiva","description":"Existem várias formas criativas e técnicas de lidar com responsividade (ex: Flexbox, Media Queries, CSS Grid)... Um claro exemplo é a navbar responsiva.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26163321\u002FDesenvolvimento.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-fazer-uma-navbar-responsiva","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-fazer-uma-navbar-responsiva","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-fazer-uma-navbar-responsiva"},"type":"post"},{"id":163567,"title":"Trabalhar com Azure ou AWS? Qual é a melhor?","content":"\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EOlá pessoal, hoje eu vou contar um pouco da experiência que passei ao trabalhar com duas ferramentas que fornecem o mesmo tipo de serviço, porém de maneiras diferentes. São duas plataformas que oferecem basicamente os mesmos serviços para desenvolvedores individuais e empresariais.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EÉ possível utilizar os dois serviços ao mesmo tempo e é de grande valia, um serviço pode compensar mais do que o outro, mas de antemão eu já digo que são duas grandes empresas que fornecem grandes serviços. Melhor do que essas pequenas empresas que oferecem hospedagem sem garantir backup ou suporte de alta qualidade.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22153026\u002Fazure-aws.jpg\"\u003E\u003Cimg class=\"alignnone size-full wp-image-163568\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22153026\u002Fazure-aws.jpg\" alt=\"\" width=\"512\" height=\"306\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003EAzure ou AWS\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAs duas empresas oferecem serviços de hospedagem de site, banco de dados e serviços móveis. Esses foram os serviços que utilizei no Azure da Microsoft e no AWS da Amazon. O banco de dados utilizado no Azure foi o SQL Server e no AWS foi o DynamoDB. Sei que são bancos de dados diferentes, mas eu fiquei realmente triste com o DynamoDB. Primeiro, eu preciso utilizar o framework da Amazon, isto é, tenho que baixar um pacote API, instalar no meu computador e, depois, chamar os métodos que a empresa disponibiliza para consumo. Alguns métodos bons e outros nem tanto, alguns ruins e outros nem existem.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPor quê é ruim utilizar uma API de terceiros para ter acesso ao banco de dados? Porque você está na mão das pessoas que desenvolvem essa API. Se algum método for retirado, você vai ter que alterar em seu sistema. Imagina que você tem mais de 30 mil linhas de código, veja o trabalho de procurar e alterar tudo. Se a empresa não dá mais suporte a API que você utiliza, você tem que criar uma ou mudar para outra e isso envolve trabalho, envolve tempo e dinheiro.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EFalando na parte do Azure, eu não precisei de API para inserir, alterar, pesquisar e excluir dados no banco de dados. Basta o drive de conexão que todos os banco precisam ao invés de API qualquer. Tome cuidado com elas, pois empresas criam do dia para noite e acaba não abordando todos os casos que você precisa. Sempre haverá um caso não construído ou sem algum método e isso resulta em fazer “gambiarra” que não é o perfil de um ótimo desenvolvedor ou analista de sistemas. No caso de banco de dados, eu prefiro hospedar no Microsoft Azure. Existem outras ferramentas de dados dentro do Azure, mas eu não tive a oportunidade de utilizar ainda.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EHospedagem\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPara a hospedagem de arquivo como imagem, arquivos pdf ou outras extensões, o Azure não possui esse serviço ainda. Você precisa criar uma máquina virtual ou coisa parecida, ao contrário do AWS que oferece o serviço S3 para colocar arquivos de qualquer extensão. O ruim é que você precisa utilizar a API deles para fazer upload dos arquivos via sistema, caso contrário é necessário utilizar o web site (não muito bom na minha opinião) para enviar arquivo, mas funciona razoavelmente. Na hospedagem do site, estou utilizando o Azure, mas para arquivos do site enviados e para o site. A imagem de usuário ou arquivos de artigos, utilizo o AWS S3. Funciona muito bem e nunca tive problema. É lógico que no banco de dados eu coloco apenas o nome do arquivo e no sistema coloco o endereço fixo do AWS S3 para que no caso de alguma mudança de serviço\u002Fendereço, eu mudo apenas no arquivo de configuração do sistema e tudo funciona sem muito trabalho.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E \u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003EFalando de hospedagem de site, as duas empresas são ótimas e funcionam muito bem. No AWS você precisa contratar o serviço chamado Elastic Beanstalk onde é criado um ambiente virtual com Windows ou outro sistema operacional, para hospedar a tecnologia .NET (que foi o meu caso). Basta informar a configuração da máquina que deseja e será montada. Acesso às configurações, Windows Explorer do ambiente você não tem acesso. Não é tratado como uma máquina virtual, é só um ambiente e para enviar o site ou sistema, é necessário instalar o plugin deles na ferramenta Visual Studio da Microsoft. Esse plugin não funciona para algumas versões do Windows ou Visual Studio, eu só consegui instalar no Windows 10, no 8.1 não instalou. Na verdade falava que estava instalado mas não aparecia no Visual Studio e pesquisando na Internet, eu vi vários relatos, muitos deram o mesmo problema.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E \u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPara hospedar no Azure é muito mais fácil, pois o Visual Studio já vem com a opção de enviar para o ambiente necessário. Você clica em um botão, digita o seu usuário e escolhe o endereço, em pouco tempo o site está no ar com endereço …azurewebsites.net. A configuração do site, memória e processamento pode ser feito pelo portal do Azure. Em questão de configuração, o Azure te dá opções para hospedar outras linguagens incluindo Java e no AWS você precisa criar outro ambiente por exemplo. Neste ponto, você paga dois endereços enquanto que o Azure você coloca tudo em um. A vantagem do AWS é que você pode ficar até 1 ano utilizando sem pagar, o Azure são alguns meses.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EConfiguração\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EConfiguração de SSL que é o famoso HTTPS para os sites, o Azure oferece um layout pelo próprio portal, simples e fácil; enquanto que no AWS não oferece um “faça você mesmo”. Isso eu achei ruim no AWS porque é um serviço muito simples de adicionar sem precisar de suporte. Em alguns pontos, o Amazon “peca” muito ou não pensa no desenvolvedor.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E \u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEu utilizei o sistema para analisar dados e web service dos dois, mas eu não vou me prolongar para o artigo não ficar grande.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E \u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEm resumo, eu vou continuar mesclando as duas tecnologias, pegando o melhor delas para desenvolver meus sistemas e softwares. O mais importante é deixar seu sistema funcionando com mais fluidez para o usuário utilizar. Espero que tenha gostado um pouco do que foi falado aqui e que sirva como experiência.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E \u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003EQualquer dúvida pode entrar em contato pelo site \u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fwww.mauriciojunior.net\"\u003E\u003Cb\u003Ewww.mauriciojunior.net\u003C\u002Fb\u003E\u003C\u002Fa\u003E\u003Cspan style=\"font-weight: 400;\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EAzure ou AWS ? | Olá pessoal, hoje eu vou contar um pouco da experiência que passei ao trabalhar com duas ferramentas que fornecem o mesmo tipo de serviço\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Ftecnologia\u002Ftrabalhar-com-azure-ou-aws-qual-e-a-melhor","date":"10 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F22161124\u002Ftecnologia.jpg","externalMention":null,"author":{"id":962,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F08\u002F31194149\u002FMauricio4.jpg","name":"Mauricio Junior","description":"Com mais de 20 anos trabalhando no mercado de tecnologia. Mestre em Engenharia Elétrica voltada para o mundo mobile, com mais de 20 livros publicados e cerca de 700 artigos publicados com intuito de ajudar àqueles que querem aprender a programar (site, software, desktop, serviços, api e mobile). Site pessoal: https:\u002F\u002Fwww.mauriciojunior.net - MVP, MCAD, MCP Microsoft","slug":"mauricio_junior","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fmauricio_junior","registered":"2009-03-31 12:18:44","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002Fecode10","instagram":null,"github":null,"url":"https:\u002F\u002Fwww.mauriciojunior.net","mail":"mauricio.junior@gmail.com"},"articles_count":102,"views_count":1030215,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Tecnologia","slug":"tecnologia","id":4254,"link":"https:\u002F\u002Fimasters.com.br\u002Ftecnologia"},{"title":"Tendências","slug":"tendencias","id":7264,"link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias"}],"tags":[{"title":"amazon","slug":"amazon","id":894,"link":"https:\u002F\u002Fimasters.com.br\u002Famazon"},{"title":"api","slug":"api","id":187,"link":"https:\u002F\u002Fimasters.com.br\u002Fapi"},{"title":"aws","slug":"aws-2","id":1068,"link":"https:\u002F\u002Fimasters.com.br\u002Faws-2"},{"title":"azure","slug":"azure","id":2238,"link":"https:\u002F\u002Fimasters.com.br\u002Fazure"},{"title":"banco de dados","slug":"banco-de-dados-2","id":189,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados-2"},{"title":"DynamoDB","slug":"dynamodb","id":5020,"link":"https:\u002F\u002Fimasters.com.br\u002Fdynamodb"},{"title":"microsoft","slug":"microsoft","id":2989,"link":"https:\u002F\u002Fimasters.com.br\u002Fmicrosoft"}],"seo":{"open_graph":{"title":"Dúvida: Trabalhar com Azure ou AWS? Qual é a melhor?","description":"Azure ou AWS ? | Olá pessoal, hoje eu vou contar um pouco da experiência que passei ao trabalhar com duas ferramentas que fornecem o mesmo tipo de serviço","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F22161124\u002Ftecnologia.jpg","width":800,"height":533},"modified_time":"2025-05-22T16:12:49-03:00","published_time":"2025-06-10T09:15:36-03:00"},"twitter":{"title":"Dúvida: Trabalhar com Azure ou AWS? Qual é a melhor?","description":"Azure ou AWS ? | Olá pessoal, hoje eu vou contar um pouco da experiência que passei ao trabalhar com duas ferramentas que fornecem o mesmo tipo de serviço","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F22161124\u002Ftecnologia.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Ftecnologia\u002Ftrabalhar-com-azure-ou-aws-qual-e-a-melhor","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Ftecnologia\u002Ftrabalhar-com-azure-ou-aws-qual-e-a-melhor","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Ftecnologia\u002Ftrabalhar-com-azure-ou-aws-qual-e-a-melhor"},"type":"post"},{"id":163536,"title":"Como criar um encurtador de URL com Node.js e Sequelize","content":"\u003Cp\u003ENo tutorial de hoje eu vou lhe mostrar como construir uma aplicação web em Node.js para encurtar URLs, tipo o que o Bit.ly faz. Para esta tarefa, usaremos além do Node.js, o Express, o EJS, o Sequelize, o Bootstrap e o SQLite.\u003C\u002Fp\u003E\n\u003Cp\u003EComo não quero ser repetitivo aqui, caso não conheça nada de alguma dessas tecnologias, recomendo que leia antes outros tutoriais, onde explico melhor cada uma delas.\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003EExpress + EJS\u003C\u002Fli\u003E\n\u003Cli\u003ESequelize + SQLite\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003EEste tutorial não é para completos iniciantes, ele parte do pressuposto que você já saiba o básico de como fazer um CRUD com essa stack, além de entender um pouco de HTML+CSS.\u003C\u002Fp\u003E\n\u003Cp\u003EAlém disso, optei aqui por uma abordagem bem simples, porém bem feita. Certamente existem outras formas ainda mais profissionais de criar um encurtador de URL, apenas dei uma abordagem.\u003C\u002Fp\u003E\n\u003Ch3 id=\"1-setup-do-projeto\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E#1 – Setup do Projeto\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EVamos começar criando o nosso projeto usando o meu fork do projeto \u003Ca href=\"https:\u002F\u002Fexpressjs.com\u002Fpt-br\u002Fstarter\u002Fgenerator.html\"\u003Eexpress-generator\u003C\u002Fa\u003E para ganhar velocidade rapidamente. Seu uso é opcional, você pode criar a mesma estrutura toda na mão se quiser.\u003C\u002Fp\u003E\n\u003Cp\u003ENo código abaixo, eu mando instalar o generator e executá-lo para criar o projeto pra gente. Note que para rodar o npm globalmente você terá de executar o terminal como administrador.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Enpm install -g https:\u002F\u002Fgithub.com\u002Fluiztools\u002Fexpress-generator.git\r\nexpress --git url-shortener\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EUsei as flags -e para definir o \u003Ca href=\"https:\u002F\u002Fejs.co\u002F\"\u003EEJS\u003C\u002Fa\u003E como nossa view-engine e –git para que o arquivo gitignore seja criado pra gente automaticamente.\u003C\u002Fp\u003E\n\u003Cp\u003EUma vez com a pasta criada e populada com o projeto de exemplo, acesse-a e mande instalar as dependências atuais e as novas que vamos precisar.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\ncd url-shortener\r\nnpm i\r\nnpm i dotenv sequelize sqlite3\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n\u003Cp\u003ECom as dependências instaladas, vamos ajustar o package.json para não apenas subir a nossa aplicação com os scripts como para deixá-la rodando e atualizando-se automaticamente conforme a gente for alterando os fontes da aplicação. Fazemos isso com o pacote \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fnodemon\"\u003Enodemon\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\n\"scripts\": {\r\n \"start\": \"node -r dotenv\u002Fconfig .\u002Fbin\u002Fwww\",\r\n \"dev\": \"npx nodemon -r dotenv\u002Fconfig .\u002Fbin\u002Fwww\"\r\n},\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAcima eu deixei configurado dois scripts, o start, que é para ser usado em produção e o dev, que é para ser usado em desenvolvimento.\u003C\u002Fp\u003E\n\u003Cp\u003EA diferença entre eles é o uso do nodemon, que em produção não é o que deve ser utilizado para manter a aplicação no ar. O mais comum é usarmos PM2 em produção, para esta finalidade.\u003C\u002Fp\u003E\n\u003Cp\u003ENote que usei ‘npx nodemon’ ao invés de apenas nodemon, para que ele seja baixado a versão mais recente quando for utilizado.\u003C\u002Fp\u003E\n\u003Cp\u003ETambém note que fiz chamadas ao dotenv nos scripts também, isso fará com nossas variáveis de ambiente sejam carregadas antes mesmo da aplicação subir, para garantir que elas estejam ok quando precisarmos.\u003C\u002Fp\u003E\n\u003Cp\u003EJá que falei em dotenv, vamos deixar criado o arquivo .env na raiz da nossa aplicação, precisaremos de apenas uma variável de ambiente nele, com a URL em que a aplicação estará rodando.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\n#.env\r\nDOMAIN=http:\u002F\u002Flocalhost:3000\u002F\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EEm produção, você irá alterar esse variável de acordo com o domínio que adquirir para o seu projeto (na \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fumbler\"\u003EUmbler\u003C\u002Fa\u003E você compra domínios a preço de custo). Usaremos mais tarde esta variável e ficará mais claro o porquê.\u003C\u002Fp\u003E\n\u003Cp\u003EAgora rode a aplicação com npm run dev e ela deve subir tranquilamente em uma página inicial de exemplo, indicando que o setup do nosso projeto terminou.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"size-full wp-image-7161 aligncenter lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working.png 666w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working-480x153.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working-150x48.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working-556x177.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working-450x143.png 450w\" alt=\"\" width=\"666\" height=\"212\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working.png 666w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working-480x153.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working-150x48.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working-556x177.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fexpress-working-450x143.png 450w\" data-sizes=\"auto\" data-eio-rwidth=\"666\" data-eio-rheight=\"212\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"2-criando-a-tela-inicial\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E#2 – Criando a tela inicial\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EAgora que temos o projeto minimamente configurado, vamos criar a tela inicial. Todas as views ficam na pasta views e a tela inicial é a index.ejs, vamos editá-la, a começar pelas dependências de front-end, onde usaremos o \u003Ca href=\"https:\u002F\u002Fgetbootstrap.com\u002F\"\u003EBootstrap\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EO head do seu index.ejs deve ficar assim.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\n<head>\r\n <meta charset=\"utf-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n <title>\r\n <%= title %>\r\n <\u002Ftitle>\r\n <link href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fbootstrap@5.0.0-beta1\u002Fdist\u002Fcss\u002Fbootstrap.min.css\" rel=\"stylesheet\"\r\n integrity=\"sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1\" crossorigin=\"anonymous\">\r\n <link rel='stylesheet' href='\u002Fstylesheets\u002Fstyle.css' \u002F>\r\n<\u002Fhead>\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAs duas tags meta são exigência do Bootstrap, enquanto que a tag link é para justamente carregar o CSS dele para estilizarmos nossa página mais facilmente. Já a segunda tag link é para outra folha de estilo com alguns estilos adicionais que vamos criar.\u003C\u002Fp\u003E\n\u003Cp\u003EJá o body do seu index.ejs deve ficar assim.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\n<body>\r\n <div class=\"container\">\r\n <div class=\"header\">\r\n <img src=\"\u002Fimages\u002Fweb_server.png\" alt=\"<%= title %>\" class=\"icon\" \u002F>\r\n <h1>\r\n <%= title %>\r\n <\u002Fh1>\r\n <p>Seu novo encurtador de URL!<\u002Fp>\r\n <\u002Fdiv>\r\n <div class=\"content\">\r\n <form method=\"POST\" action=\"\u002Fnew\">\r\n <div class=\"mb-3 input-group\">\r\n <input placeholder=\"Digite a URL a ser encurtada\" name=\"url\" class=\"form-control\" \u002F>\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-primary\" type=\"submit\">Encurtar<\u002Fbutton>\r\n <\u002Fdiv>\r\n <\u002Fdiv>\r\n <\u002Fform>\r\n <\u002Fdiv>\r\n <\u002Fdiv>\r\n <script src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fbootstrap@5.0.0-beta1\u002Fdist\u002Fjs\u002Fbootstrap.bundle.min.js\"\r\n integrity=\"sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7\u002Ft7LECLbyPA2x65Kgf80OJFdroafW\"\r\n crossorigin=\"anonymous\"><\u002Fscript>\r\n<\u002Fbody>\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAqui temos uma div container que é exigência de layout do Bootstrap, sendo que dentro eu estou usando uma imagem de ícone que baixei do site \u003Ca href=\"http:\u002F\u002Ffindicons.com\u002F\"\u003EFindIcons.com\u003C\u002Fa\u003E que tem muita coisa bacana e gratuita. Salve-o na pasta public\u002Fimages no seu projeto.\u003C\u002Fp\u003E\n\u003Cp\u003ECriei no body um HTML Form que servirá para enviar os dados da URL original para o backend, a fim de encurtarmos ela. Falarei mais disso mais tarde.\u003C\u002Fp\u003E\n\u003Cp\u003ENo fim do body, temos uma tag script para carregar o JS do Bootstrap, outra dependência necessária para que ele funcione de maneira plena.\u003C\u002Fp\u003E\n\u003Cp\u003EVale salientar também o uso de server tags com <%= %> que são características do EJS e servem para imprimir variáveis do back-end em nosso front-end.\u003C\u002Fp\u003E\n\u003Cp\u003EEsse body está usando algumas classes próprias, que não existem no Bootstrap e que devemos criar na nossa folha de estilos personalizada, que fica em public\u002Fstylesheets\u002Fstyle.css, abra esse arquivo, apague esse conteúdo e adicione o abaixo.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\n.header {\r\n padding: 3rem;\r\n text-align: center;\r\n}\r\n\r\n.icon {\r\n height: 42px;\r\n}\r\n\r\n.content {\r\n display: flex;\r\n justify-content: center !important;\r\n}\r\n\r\nform {\r\n flex: 0 0 80%;\r\n padding: 2rem 2rem 1rem 2rem;\r\n border: 1px solid #ccc;\r\n border-radius: .25rem;\r\n text-align: center;\r\n}\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003ENeste código CSS temos classes para o cabeçalho da página, para o ícone, para o conteúdo e para estilizar o próprio form dela.\u003C\u002Fp\u003E\n\u003Cp\u003EO resultado você confere na imagem abaixo (o título eu já mostrarei na sequência como mudar).\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"aligncenter wp-image-7162 lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-480x133.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-720x200.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-150x42.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-768x213.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-894x248.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-556x154.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-450x125.png 450w\" alt=\"\" width=\"720\" height=\"200\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-480x133.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-720x200.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-150x42.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-768x213.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-894x248.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-556x154.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fheader-encurtador-450x125.png 450w\" data-sizes=\"auto\" data-eio-rwidth=\"1024\" data-eio-rheight=\"284\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ESe você digitar uma URL e mandar encurtar ela, vai dar um erro 404 no browser, pois o form está enviando para uma rota \u002Fnew em nosso backend, que ainda não criamos. É o que iremos fazer na sequência.\u003C\u002Fp\u003E\n\u003Ch3 id=\"3-criando-o-backend\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E#3 – Criando o backend\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EO express-generator já criou alguns módulos de roteamento para gente e é eles que vamos usar como base. Dentro de routes\u002Findex.js temos as rotas que atendem à nossa view index.ejs, então abra-o para editarmos ele a fim de adicionarmos os ajustes necessários, a começar editando a rota GET \u002F para que ela devolva um título adequado à nossa aplicação.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\n\u002F* GET home page. *\u002F\r\nrouter.get('\u002F', function (req, res, next) {\r\n res.render('index', { title: 'Encurtador' });\r\n});\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAgora vamos criar uma função que vai gerar as urls encurtadas e que vai ser necessária para nossa aplicação fazer a sua principal funcionalidade. Coloque a função abaixo dentro da mesma index.js das rotas.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\nfunction generateCode() {\r\n let text = '';\r\n const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n for (let i = 0; i < 5; i++)\r\n text += possible.charAt(Math.floor(Math.random() * possible.length));\r\n return text;\r\n}\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003ENa função acima, eu gero uma string com 5 caracteres alfanuméricos. Essa string será concatenada mais tarde com o domínio da aplicação e isso irá gerar a URL curta em si.\u003C\u002Fp\u003E\n\u003Cp\u003EAgora, vamos criar a rota POST \u002Fnew que será usada pelo HTML Form da index.ejs, sempre no mesmo arquivo de rotas index.js.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\nrouter.post('\u002Fnew', async (req, res, next) => {\r\n const url = req.body.url;\r\n const code = generateCode();\r\n\r\n res.send(`${process.env.DOMAIN}${code}`);\r\n})\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EA rota acima é bem simples, ela recebe uma URL do corpo da requisição, gera o código randômico de url curta e devolve esse código concatenado com o domínio da aplicação, que deve estar configurado no seu arquivo .env, lembra? Isso vai nos ajudar a testar rapidamente e ver se os códigos estão sendo gerados corretamente e de maneira bem aleatória.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"size-full wp-image-7163 aligncenter lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fshort-url.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fshort-url.png 342w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fshort-url-150x37.png 150w\" alt=\"\" width=\"342\" height=\"84\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fshort-url.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fshort-url.png 342w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fshort-url-150x37.png 150w\" data-sizes=\"auto\" data-eio-rwidth=\"342\" data-eio-rheight=\"84\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENosso próximo passo envolve salvar esse código gerado, bem como a URL relacionada a ele, em um banco de dados, para que depois possamos fazer a funcionalidade de redirecionamento de também de estatísticas.\u003C\u002Fp\u003E\n\u003Ch3 id=\"4-criando-o-banco-de-dados\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E#4 – Criando o banco de dados\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EVamos usar nesta aplicação o banco SQLite, que é um banco em arquivo super leve e fácil de usar, tipo o Access. Ele não exige qualquer instalação e ele roda junto do processo da sua aplicação, sem necessidade de especificar porta e coisas do tipo. Para aplicações de pequeno porte, como essa, ele vai atender bem.\u003C\u002Fp\u003E\n\u003Cp\u003EO mais bacana é que, como vamos usar o ORM Sequelize, os detalhes do SQLite vão ficar completamente abstraído e caso você deseje utilizar outro banco SQL suportado pelo Sequelize no lugar do SQLite, basta instalar o pacote apropriado e mudar o dialect na configuração que faremos a seguir. Mais sobre Sequelize com outros bancos SQL nestes posts:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003ESequelize + MySQL\u003C\u002Fli\u003E\n\u003Cli\u003ESequelize + PostgreSQL\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003EVamos criar um arquivo db.js na raiz do projeto para configurar a conexão com o nosso banco de dados.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\nconst Sequelize = require('sequelize');\r\nconst sequelize = new Sequelize({\r\n dialect: 'sqlite',\r\n storage: '.\u002Fdatabase.sqlite'\r\n})\r\n\r\nmodule.exports = sequelize;\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003ENote que além da configuração dialect que diz ao Sequelize qual o banco de dados que ele vais e comunicar, definimos uma propriedade storage dizendo onde o arquivo do SQLite vai ser armazenado.\u003C\u002Fp\u003E\n\u003Cp\u003EAgora, o próximo passo é configurarmos o modelo da entidade do banco de dados que vamos querer persistir e retornar os dados. Chamarei esse modelo de Link e ele deve ficar salvo em uma pasta models\u002Flink.js como seguinte conteúdo.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\nconst Sequelize = require('sequelize');\r\nconst database = require('..\u002Fdb');\r\n\r\nconst Link = database.define('link', {\r\n id: {\r\n type: Sequelize.INTEGER,\r\n autoIncrement: true,\r\n allowNull: false,\r\n primaryKey: true\r\n },\r\n code: {\r\n type: Sequelize.STRING,\r\n allowNull: false\r\n },\r\n url: {\r\n type: Sequelize.STRING,\r\n allowNull: false\r\n },\r\n hits: {\r\n type: Sequelize.INTEGER,\r\n allowNull: true,\r\n defaultValue: 0\r\n }\r\n})\r\n\r\nmodule.exports = Link;\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAqui, além de carregarmos as dependências do Sequelize e da nossa db.js de configuração, definimos as colunas da tabela link do nosso banco de dados, usando sintaxe em JS ao invés de SQL. Aqui eu disse que a tabela deve ter um id inteiro auto incremental, um code que é uma string, uma url que é outra string e a coluna hits servirá para contabilizarmos quantas vezes esse link foi acessado pela versão encurtada. Usaremos ele na parte de estatísticas mais tarde.\u003C\u002Fp\u003E\n\u003Cp\u003EAgora temos de ajustar a inicialização da nossa aplicação para que ela carregue o banco de dados junto da aplicação e para que a tabela acima seja criada caso ela ainda não exista no banco, a fim de não termos erros durante a sua utilização posterior.\u003C\u002Fp\u003E\n\u003Cp\u003EFaremos isso no arquivo bin\u002Fwww onde acontece a subida inicial da aplicação, deixando-o como abaixo.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\n(async () => {\r\n const database = require('..\u002Fdb');\r\n const Link = require('..\u002Fmodels\u002Flink');\r\n\r\n await database.sync();\r\n\r\n\u002F\u002Frestante fica igual\r\n\r\n})();\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003ERepare que carrego o arquivo de configuração e o arquivo de modelo, mesmo que eu não vá usar este segundo, isso é necessário. Logo depois uso a função sync do database, para garantir que as tabelas necessárias existirão no nosso banco.\u003C\u002Fp\u003E\n\u003Cp\u003EComo eu usei a palavra reservada await para “aguardar” pelo retorno do database.sync, tive de colocar todo o conteúdo do bin\u002Fwww em um \u003Ca href=\"https:\u002F\u002Fdeveloper.mozilla.org\u002Fpt-BR\u002Fdocs\u002FGlossary\u002FIIFE\"\u003EIIFE\u003C\u002Fa\u003E async.\u003C\u002Fp\u003E\n\u003Cp\u003EAo rodar novamente a sua aplicação agora, a tabela links será criada e inclusive isso será avisado no console da sua aplicação, em uma mensagem parecida com a abaixo.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"size-large wp-image-7164 aligncenter lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-720x145.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-720x145.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-480x97.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-150x30.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-768x154.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-894x180.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-556x112.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-450x90.png 450w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal.png 1134w\" alt=\"\" width=\"660\" height=\"133\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-720x145.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-720x145.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-480x97.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-150x30.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-768x154.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-894x180.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-556x112.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal-450x90.png 450w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fsql-terminal.png 1134w\" data-sizes=\"auto\" data-eio-rwidth=\"720\" data-eio-rheight=\"145\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ESe tudo deu certo, você terá um arquivo .sqlite na raiz da sua aplicação, que inclusive pode ser aberto pela aplicação \u003Ca href=\"https:\u002F\u002Fsqlitebrowser.org\u002F\"\u003ESQLite Browser\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EE para finalizar esta seção, volte ao routes\u002Findex.js e modifique a rota de POST \u002Fnew para que agora salve o novo link no banco de dados usando o modelo que criamos e que depois disso redirecione para a view de estatísticas, que ainda não criamos.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\nrouter.post('\u002Fnew', async (req, res, next) => {\r\n const url = req.body.url;\r\n const code = generateCode();\r\n\r\n const resultado = await Link.create({\r\n url,\r\n code\r\n })\r\n res.render('stats', resultado.dataValues);\r\n})\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003ECom o código acima, você já deve conseguir ver os links sendo salvos no banco, mas deve dar error 404 no browser pela inexistência da view stats, que mandamos renderizar ao final do processo acima.\u003C\u002Fp\u003E\n\u003Ch3 id=\"5-criando-a-view-de-estatisticas\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E#5 – Criando a view de estatísticas\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EAgora vá na sua pasta views e crie uma stats.ejs, com o conteúdo abaixo no topo do HTML.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-html\"\u003E\r\n<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n <meta charset=\"utf-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n <title>\r\n Encurtador\r\n <\u002Ftitle>\r\n <link href=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fbootstrap@5.3.5\u002Fdist\u002Fcss\u002Fbootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-SgOJa3DmI69IUzQ2PVdRZhwQ+dy64\u002FBUtbMJw1MZ8t5HZApcHrRKUc4W0kG879m7\" crossorigin=\"anonymous\">\r\n <link rel='stylesheet' href='\u002Fstylesheets\u002Fstyle.css' \u002F>\r\n<\u002Fhead>\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAqui não há nenhuma novidade em relação à view index.ejs e se você quiser evitar repetição de código, pode dar uma estudada em \u003Ca href=\"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F5404830\u002Fnode-js-ejs-including-a-partial\"\u003Epartial-views\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EIndo para o body do HTML, temos.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-html\"\u003E\r\n<body>\r\n <div class=\"container\">\r\n <div class=\"header\">\r\n <img src=\"\u002Fimages\u002Fweb_server.png\" alt=\"Encurtador\" class=\"icon\" \u002F>\r\n <h1>\r\n Encurtador\r\n <\u002Fh1>\r\n <p>Estatísticas de acesso<\u002Fp>\r\n <\u002Fdiv>\r\n <div class=\"stats\">\r\n <p>\r\n <b>\r\n <%= process.env.DOMAIN %><%= code %>\r\n <\u002Fb>\r\n <\u002Fp>\r\n <p>\r\n Redireciona para:<br \u002F>\r\n <%= url %>\r\n <\u002Fp>\r\n <div class=\"statsRow\">\r\n <div class=\"statsBox\">\r\n <b>\r\n <%= hits %>\r\n <\u002Fb>\r\n <p>Visitas<\u002Fp>\r\n <\u002Fdiv>\r\n <div class=\"statsBox\">\r\n <b>\r\n <%= updatedAt %>\r\n <\u002Fb>\r\n <p>\r\n Última Visita\r\n <\u002Fp>\r\n <\u002Fdiv>\r\n <\u002Fdiv>\r\n <a href=\"\u002F\" class=\"btn btn-primary\">Encurtar nova URL<\u002Fa>\r\n <\u002Fdiv>\r\n <\u002Fdiv>\r\n <script src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fbootstrap@5.3.5\u002Fdist\u002Fjs\u002Fbootstrap.bundle.min.js\" integrity=\"sha384-k6d4wzSIapyDyv1kpU366\u002FPK5hCdSbCRGRCMv+eplOQJWyd1fbcAu9OCUj5zNLiq\" crossorigin=\"anonymous\"><\u002Fscript>\r\n<\u002Fbody>\r\n\r\n<\u002Fhtml>\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003ENesta tela, nós apresentaremos o link que acabou de ser gerado (encurtado), o link original e estatísticas de quantos acessos ele já teve (campo hits da tabela links) e quando foi o último acesso (tem um campo updatedAt que o Sequelize gera automaticamente pra gente, usaremos ele).\u003C\u002Fp\u003E\n\u003Cp\u003EPara essa tela ficar com uma boa aparência, serão necessárias algumas classes CSS novas, que devem ser adicionadas no public\u002Fstylesheets\u002Fstyle.css, no final dele.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-css\"\u003E\r\n.stats{\r\n text-align: center;\r\n}\r\n\r\n.statsBox{\r\n flex: 0 0 25%;\r\n padding: 2rem;\r\n border: 1px solid #ccc;\r\n border-radius: .25rem;\r\n text-align: center;\r\n margin: .5rem;\r\n}\r\n\r\n.statsRow{\r\n display: flex;\r\n justify-content: center !important;\r\n}\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAgora ao testar novamente a aplicação, você pode encurtar URLs corretamente, no entanto o redirecionamento delas ainda não irá funcionar e consequentemente as estatísticas em si, também não. Mas já está ficando bem bacana.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"aligncenter wp-image-7165 lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-480x207.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-720x310.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-150x65.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-768x331.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-894x385.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-556x239.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-450x194.png 450w\" alt=\"\" width=\"720\" height=\"310\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-480x207.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-720x310.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-150x65.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-768x331.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-894x385.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-556x239.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-450x194.png 450w\" data-sizes=\"auto\" data-eio-rwidth=\"1024\" data-eio-rheight=\"441\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"6-fazendo-funcionar-a-url-curta\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E#6 – Fazendo funcionar a URL curta\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EO nosso próximo desafio do nosso encurtador de URL é que quando alguém acesse a URL curta, que o acesso seja contabilizado e a pessoa seja redirecionada para a URL original.\u003C\u002Fp\u003E\n\u003Cp\u003EPara isso, vamos em routes\u002Findex.js e vamos criar uma rota para tratar os acessos nas URLs encurtadas. Essa rota deve ser a primeira do arquivo.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\nrouter.get('\u002F:code', async (req, res, next) => {\r\n const code = req.params.code;\r\n\r\n const resultado = await Link.findOne({ where: { code } });\r\n if (!resultado) return res.sendStatus(404);\r\n\r\n resultado.hits++;\r\n await resultado.save();\r\n\r\n res.redirect(resultado.url);\r\n})\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAqui nós temos uma rota GET \u002Fcode onde code é um código qualquer que virá na url, representando a versão encurtada da URL original. Com esse código, nós vamos no banco de dados através da função findOne, pegamos o link, incrementamos e atualizamos esse link e depois redirecionamos o usuário para a URL original.\u003C\u002Fp\u003E\n\u003Cp\u003EApesar de todos esses passos no backend, para o usuário vai ser instantâneo, como se a URL curta tivesse levado ele para o site original em um único passo.\u003C\u002Fp\u003E\n\u003Cp\u003EE para finalizar, agora que temos o funcionamento principal 100% e os hits sendo contabilizados, é hora de criarmos uma última rota, para que o dono do link possa acessar as estatísticas do mesmo, através de uma rota GET \u002Fcode\u002Fstats. Essa rota deve ser a primeira do arquivo, antes mesmo da rota que criamos anteriormente.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003E\r\nrouter.get('\u002F:code\u002Fstats', async (req, res, next) => {\r\n const code = req.params.code;\r\n const resultado = await Link.findOne({ where: { code } });\r\n if (!resultado) return res.sendStatus(404);\r\n res.render('stats', resultado.dataValues);\r\n})\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAqui a ideia é muito próxima da rota anterior, mas nessa não incrementamos os hits e ao invés de redirecionar o usuário, renderizamos a view stats passando os dados do banco pra ela.\u003C\u002Fp\u003E\n\u003Cp\u003ESe você testar a aplicação agora, encurte uma URL, acesse ela algumas vezes através da versão encurtada e depois finalize os testes acessando a URL curta mas com \u002Fstats ao final, você verá algo semelhante como abaixo.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"aligncenter wp-image-7166 lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-480x207.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-720x310.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-150x65.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-768x331.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-894x385.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-556x239.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-450x194.png 450w\" alt=\"\" width=\"720\" height=\"310\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-480x207.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-720x310.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-150x65.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-768x331.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-894x385.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-556x239.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002Fencurtador-funcionando-450x194.png 450w\" data-sizes=\"auto\" data-eio-rwidth=\"1024\" data-eio-rheight=\"441\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EE com isso finalizamos a nossa aplicação!\u003C\u002Fp\u003E\n\u003Cp\u003EPara hospedar esta aplicação, você pode usar a AWS ou a Heroku, só para citar dois exemplos que possuem tutoriais aqui no blog. Não esqueça de mudar o seu .env para o domínio que for usar para este projeto.\u003C\u002Fp\u003E\n\u003Cp\u003ESe quiser criar uma área logada, para que usuários possam ver os links que eles criaram, você pode adaptar o \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fautenticacao-em-node-js-com-passport\u002F\"\u003Etutorial de Passport\u003C\u002Fa\u003E e é claro criar mais uma tabela de usuários no banco de dados.\u003C\u002Fp\u003E\n\u003Cp\u003EEnfim, tem muita coisa bacana que você pode fazer para incrementar este projeto, então fique a vontade para seguir trabalhando nele!\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ENo tutorial de hoje eu vou lhe mostrar como construir uma aplicação web em Node.js para encurtar URLs, tipo o que o Bit.ly faz. Para esta tarefa, usaremos\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fcomo-criar-um-encurtador-de-url-com-node-js-e-sequelize","date":"5 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04122810\u002Fjavascript.jpg","externalMention":null,"author":{"id":148188,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2022\u002F10\u002F11183022\u002FLuizTools.jpg","name":"Luiz Fernando Duarte Junior","description":"Pós-graduado em computação, trabalha com software desde 2006 nas mais variadas tecnologias. Empreendedor, autor e professor, quando não está ocupado programando, está escrevendo ou gravando sobre programação para seu canal e blog LuizTools.","slug":"luizfernando","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fluizfernando","registered":"2017-04-28 19:43:26","social":{"linkedin":null,"youtube":null,"facebook":"http:\u002F\u002Ffb.com\u002Fluiztools","twitter":"https:\u002F\u002Ftwitter.com\u002Fluiztools","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.luiztools.com.br\u002F","mail":"contato@luiztools.com.br"},"articles_count":98,"views_count":960400,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"},{"title":"node.js","slug":"node-js","id":1032,"link":"https:\u002F\u002Fimasters.com.br\u002Fnode-js"},{"title":"Sequelize","slug":"sequelize","id":8264,"link":"https:\u002F\u002Fimasters.com.br\u002Fsequelize"}],"seo":{"open_graph":{"title":"Como criar um encurtador de URL com Node.js e Sequelize","description":"No tutorial de hoje eu vou lhe mostrar como construir uma aplicação web em Node.js para encurtar URLs, tipo o que o Bit.ly faz. Para esta tarefa, usaremos","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04122810\u002Fjavascript.jpg","width":800,"height":533},"modified_time":"2025-06-04T12:31:08-03:00","published_time":"2025-06-05T09:15:32-03:00"},"twitter":{"title":"Como criar um encurtador de URL com Node.js e Sequelize","description":"No tutorial de hoje eu vou lhe mostrar como construir uma aplicação web em Node.js para encurtar URLs, tipo o que o Bit.ly faz. Para esta tarefa, usaremos","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04122810\u002Fjavascript.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fcomo-criar-um-encurtador-de-url-com-node-js-e-sequelize","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fcomo-criar-um-encurtador-de-url-com-node-js-e-sequelize","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fcomo-criar-um-encurtador-de-url-com-node-js-e-sequelize"},"type":"post"},{"id":163700,"title":"Aplicação combinada dos padrões Flyweight e Composite em sistemas com muitos objetos","content":"\u003Ch2\u003EPadrões Flyweight e Composite | Introdução\u003C\u002Fh2\u003E\n\u003Cp\u003ENo desenvolvimento de software, a eficiência e o gerenciamento de recursos são cruciais, especialmente ao lidar com sistemas que apresentam um grande número de objetos.\u003C\u002Fp\u003E\n\u003Cp\u003ENesse contexto, a escolha de padrões de projeto adequados pode fazer uma diferença significativa na performance e na manutenibilidade do sistema.\u003C\u002Fp\u003E\n\u003Cp\u003EEntre os padrões estruturais, que se concentram na forma como classes e objetos são compostos, destacam-se os padrões Flyweight e Composite, ambos oferecendo soluções eficazes para esses desafios \u003Ca href=\"https:\u002F\u002Fleaders.tec.br\u002Fartigo\u002Faplicacao-combinada-dos-padroes-flyweight-e-composite-em-sistemas-com-muitos-objetos#references\"\u003E(SABBAG FILHO, 2024)\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EO padrão Flyweight é usado para minimizar o uso de memória ao compartilhar objetos, enquanto o padrão Composite permite tratar objetos individuais e composições de objetos de maneira uniforme.\u003C\u002Fp\u003E\n\u003Cp\u003EEste artigo explora em detalhes a aplicação combinada desses dois padrões, fornecendo exemplos práticos e explicações sobre como eles podem ser utilizados para otimizar o desempenho de sistemas complexos.\u003C\u002Fp\u003E\n\u003Cp\u003EA integração dos padrões Flyweight e Composite é especialmente benéfica em cenários onde a criação de muitos objetos é necessária, como em jogos, aplicações gráficas e sistemas de gerenciamento de dados.\u003C\u002Fp\u003E\n\u003Ch2\u003EO Padrão Flyweight\u003C\u002Fh2\u003E\n\u003Cp\u003EO padrão Flyweight é um padrão estrutural que busca otimizar o uso da memória ao compartilhar objetos que possuem estado comum, reduzindo a sobrecarga de instâncias redundantes \u003Ca href=\"https:\u002F\u002Fleaders.tec.br\u002Fartigo\u002Faplicacao-combinada-dos-padroes-flyweight-e-composite-em-sistemas-com-muitos-objetos#references\"\u003E(REFACTORING GURU, 2025)\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EEle é particularmente útil em sistemas onde muitos objetos precisam ser criados e mantidos, principalmente onde muitos desses objetos compartilham características comuns.\u003C\u002Fp\u003E\n\u003Cp\u003EO Flyweight permite que você crie um grande número de instâncias de objetos, economizando memória ao compartilhar os dados que permanecem constantes \u003Ca href=\"https:\u002F\u002Fleaders.tec.br\u002Fartigo\u002Faplicacao-combinada-dos-padroes-flyweight-e-composite-em-sistemas-com-muitos-objetos#references\"\u003E(SARCAR, 2022)\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EUm exemplo clássico do padrão Flyweight é a representação de caracteres em um editor de texto.\u003C\u002Fp\u003E\n\u003Cp\u003EAo invés de criar uma nova instância para cada letra, podemos ter instâncias compartilhadas para cada tipo de letra.\u003C\u002Fp\u003E\n\u003Cp\u003EEssa abordagem não só economiza memória, mas também melhora a performance ao minimizar o número de objetos na heap.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Eusing System;\r\nusing System.Collections.Generic;\r\n\u002F\u002F Flyweight\r\npublic interface ICharacter\r\n{\r\n void Display(int x, int y);\r\n}\r\npublic class Character : ICharacter\r\n{\r\n private readonly char _letter;\r\n public Character(char letter)\r\n {\r\n _letter = letter;\r\n }\r\n public void Display(int x, int y)\r\n {\r\n Console.WriteLine($\"Displaying letter '{_letter}' at position ({x}, {y})\");\r\n }\r\n}\r\npublic class CharacterFactory\r\n{\r\n private readonly Dictionary<char, ICharacter> _characters = new Dictionary<char, ICharacter>();\r\n public ICharacter GetCharacter(char letter)\r\n {\r\n if (!_characters.ContainsKey(letter))\r\n {\r\n _characters[letter] = new Character(letter);\r\n }\r\n return _characters[letter];\r\n }\r\n}\r\nclass Program\r\n{\r\n static void Main()\r\n {\r\n var factory = new CharacterFactory();\r\n var text = \"Hello, World!\";\r\n \r\n for (int i = 0; i < text.Length; i++)\r\n {\r\n var character = factory.GetCharacter(text[i]);\r\n character.Display(i * 10, 0);\r\n }\r\n }\r\n}\r\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch2\u003EO Padrão Composite\u003C\u002Fh2\u003E\n\u003Cp\u003EO padrão Composite é um padrão estrutural que permite compor objetos em estruturas de árvore para representar hierarquias parte-todo.\u003C\u002Fp\u003E\n\u003Cp\u003EEle permite que os clientes tratem objetos individuais e composições de objetos de maneira uniforme, facilitando a manipulação de estruturas complexas \u003Ca href=\"https:\u002F\u002Fleaders.tec.br\u002Fartigo\u002Faplicacao-combinada-dos-padroes-flyweight-e-composite-em-sistemas-com-muitos-objetos#references\"\u003E(MANCHANA, 2019)\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EEssa uniformidade é especialmente útil em sistemas onde é necessário realizar operações em grupos de objetos que têm relação hierárquica.\u003C\u002Fp\u003E\n\u003Cp\u003EUm exemplo prático do padrão Composite pode ser encontrado em sistemas de gerenciamento de arquivos, onde diretórios podem conter arquivos e outros diretórios.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso permite que a estrutura seja tratada como um único objeto, simplificando operações como exibição, remoção ou adição de elementos.\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Eusing System;\r\nusing System.Collections.Generic;\r\n\u002F\u002F Component\r\npublic abstract class Component\r\n{\r\n public abstract void Display(int depth);\r\n}\r\n\u002F\u002F Leaf\r\npublic class File : Component\r\n{\r\n private readonly string _name;\r\n public File(string name)\r\n {\r\n _name = name;\r\n }\r\n public override void Display(int depth)\r\n {\r\n Console.WriteLine(new string('-', depth) + _name);\r\n }\r\n}\r\n\u002F\u002F Composite\r\npublic class Directory : Component\r\n{\r\n private readonly string _name;\r\n private readonly List<Component> _components = new List<Component>();\r\n public Directory(string name)\r\n {\r\n _name = name;\r\n }\r\n public void Add(Component component)\r\n {\r\n _components.Add(component);\r\n }\r\n public override void Display(int depth)\r\n {\r\n Console.WriteLine(new string('-', depth) + _name);\r\n foreach (var component in _components)\r\n {\r\n component.Display(depth + 2);\r\n }\r\n }\r\n}\r\nclass Program\r\n{\r\n static void Main()\r\n {\r\n var root = new Directory(\"Root\");\r\n var folder1 = new Directory(\"Folder1\");\r\n var folder2 = new Directory(\"Folder2\");\r\n root.Add(folder1);\r\n root.Add(folder2);\r\n folder1.Add(new File(\"File1.txt\"));\r\n folder1.Add(new File(\"File2.txt\"));\r\n folder2.Add(new File(\"File3.txt\"));\r\n root.Display(1);\r\n }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch2\u003EIntegração dos Padrões Flyweight e Composite\u003C\u002Fh2\u003E\n\u003Cp\u003EA combinação dos padrões Flyweight e Composite oferece uma solução poderosa para sistemas que lidam com grandes quantidades de objetos que têm tanto um estado compartilhado quanto uma estrutura hierárquica.\u003C\u002Fp\u003E\n\u003Cp\u003EUm exemplo prático pode ser encontrado em jogos, onde múltiplos objetos de um mesmo tipo (como inimigos ou itens) devem ser gerenciados em uma cena, mas também organizados em uma hierarquia de níveis. Abaixo um exemplo prático:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04105344\u002FSVG-1.jpg\"\u003E\u003Cimg class=\"alignnone size-full wp-image-163701\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04105344\u002FSVG-1.jpg\" alt=\"\" width=\"1098\" height=\"527\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAo integrar esses padrões, conseguimos não apenas reduzir o uso de memória ao compartilhar instâncias de objetos comuns, mas também organizar esses objetos em uma estrutura hierárquica que facilita a manipulação e a interação entre eles.\u003C\u002Fp\u003E\n\u003Cp\u003EEssa abordagem é especialmente útil em cenários onde a performance é crítica, como em jogos em tempo real ou aplicações gráficas complexas. Abaixo um exemplo da sua aplicação:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Eusing System;\r\nusing System.Collections.Generic;\r\npublic interface IEnemy\r\n{\r\n void Attack();\r\n}\r\npublic class Enemy : IEnemy\r\n{\r\n private readonly string _type;\r\n public Enemy(string type)\r\n {\r\n _type = type;\r\n }\r\n public void Attack()\r\n {\r\n Console.WriteLine($\"Enemy of type {_type} attacking!\");\r\n }\r\n}\r\npublic class EnemyFactory\r\n{\r\n private readonly Dictionary<string, IEnemy> _enemies = new Dictionary<string, IEnemy>();\r\n public IEnemy GetEnemy(string type)\r\n {\r\n if (!_enemies.ContainsKey(type))\r\n {\r\n _enemies[type] = new Enemy(type);\r\n }\r\n return _enemies[type];\r\n }\r\n}\r\npublic class Level\r\n{\r\n private readonly List<IEnemy> _enemies = new List<IEnemy>();\r\n public void AddEnemy(IEnemy enemy)\r\n {\r\n _enemies.Add(enemy);\r\n }\r\n public void Attack()\r\n {\r\n foreach (var enemy in _enemies)\r\n {\r\n enemy.Attack();\r\n }\r\n }\r\n}\r\nclass Program\r\n{\r\n static void Main()\r\n {\r\n var factory = new EnemyFactory();\r\n var level1 = new Level();\r\n level1.AddEnemy(factory.GetEnemy(\"Orc\"));\r\n level1.AddEnemy(factory.GetEnemy(\"Orc\"));\r\n level1.AddEnemy(factory.GetEnemy(\"Goblin\"));\r\n level1.Attack();\r\n }\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch2\u003EVantagens da Abordagem Combinada\u003C\u002Fh2\u003E\n\u003Cp\u003EA aplicação dos padrões Flyweight e Composite em conjunto resulta em uma arquitetura que reduz significativamente o uso de memória, ao mesmo tempo que mantém uma estrutura clara e fácil de modificar.\u003C\u002Fp\u003E\n\u003Cp\u003EEssa abordagem é especialmente vantajosa em cenários de jogos, simulações e sistemas de gráficos complexos, onde a performance e a organização são essenciais.\u003C\u002Fp\u003E\n\u003Cp\u003EAlém disso, ao permitir a criação de uma hierarquia de objetos, facilita a extensão e a personalização do sistema, permitindo que novos tipos de objetos sejam adicionados sem alterar o comportamento existente.\u003C\u002Fp\u003E\n\u003Cp\u003EOutro ponto importante é a manutenção do código.\u003C\u002Fp\u003E\n\u003Cp\u003EA utilização desses padrões pode levar a um design mais limpo, onde as responsabilidades estão bem definidas, facilitando a identificação de problemas e a realização de alterações.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso é crucial em projetos de longo prazo, onde a adaptação e a evolução do software são inevitáveis.\u003C\u002Fp\u003E\n\u003Ch2\u003EConsiderações Finais\u003C\u002Fh2\u003E\n\u003Cp\u003EO uso combinado dos padrões Flyweight e Composite é uma estratégia eficaz para lidar com sistemas que possuem muitos objetos.\u003C\u002Fp\u003E\n\u003Cp\u003EAo permitir o compartilhamento de estados comuns e a criação de hierarquias de objetos, esses padrões proporcionam uma solução robusta e eficiente para desafios de desempenho e gerenciamento de memória.\u003C\u002Fp\u003E\n\u003Cp\u003EA compreensão e a aplicação correta desses padrões podem levar a um design de software mais limpo, eficiente e escalável.\u003C\u002Fp\u003E\n\u003Cp\u003EEm um mundo onde a complexidade dos sistemas de software continua a crescer, a adoção de práticas de design eficazes como estas se torna cada vez mais importante.\u003C\u002Fp\u003E\n\u003Ch2\u003EReferências\u003C\u002Fh2\u003E\n\u003Cul\u003E\n\u003Cli\u003ESABBAG FILHO, Nagib. Comparative Analysis of Patterns: Distinctions and Applications of Behavioral, Creational, and Structural Patterns. Leaders Tec, v. 1, n. 11, 2024.\u003C\u002Fli\u003E\n\u003Cli\u003ESARCAR, Vaskaran. Padrão Flyweight. Em: Padrões de Design Java: Uma Experiência Prática com Exemplos do Mundo Real . Berkeley, CA: Apress, 2022. p. 263-282.\u003C\u002Fli\u003E\n\u003Cli\u003EREFACTORING GURU. Flyweight. Disponível em: https:\u002F\u002Frefactoring.guru\u002Fdesign-patterns\u002Fflyweight. Acesso em: 28 mai. 2025.\u003C\u002Fli\u003E\n\u003Cli\u003EMANCHANA, Ramakrishna. Structural Design Patterns: Composing Efficient and Scalable Software Architectures. International Journal of Scientific Research and Engineering Trends, v. 5, p. 1483-1491, 2019.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n","excerpt":"\u003Cp\u003EPadrões Flyweight e Composite | Introdução aos Padrões de Projeto. No desenvolvimento de software, a eficiência e o gerenciamento de recursos são…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Faplicacao-combinada-dos-padroes-flyweight-e-composite-em-sistemas-com-muitos-objetos","date":"4 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04110318\u002FDesenvolvimento1.jpg","externalMention":null,"author":{"id":149266,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F12\u002F12092215\u002FNagib-1212.jpg","name":"Nagib Sabbag Filho","description":"Professor Universitário, Tech Manager e autor de dezenas de artigos técnicos, apresentados em eventos como o TDC e indexados em plataformas como o Google Scholar. Pós-Graduado em Gestão e Governança de TI pelo SENAC, MBA em Tecnologia de Software pela Escola Politécnica da USP e Pós-Graduando em IA e Data Science para Líderes na Mackenzie. Atuação em grandes projetos, incluindo o Open Finance do Bradesco e a Camada de Integração de Dados da Ágora Investimentos. Apresentação de um artigo científico sobre chatbots na Universidade de Barcelona, através da 12ª Conferência Internacional de Ciência da Computação e Tecnologia da Informação (ICCSIT). Participação de programas de extensão do MIT e da Universidade de Chicago, com foco em temas como Internet das Coisas e Gestão de Equipes.","slug":"nagibsabbagfilho","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fnagibsabbagfilho","registered":"2024-08-16 15:56:32","social":{"linkedin":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fnagib1\u002F","youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"https:\u002F\u002Fthedevconf.com\u002Fpalestrante\u002Fnagib-sabbag-filho","mail":"na.sabbag@gmail.com"},"articles_count":10,"views_count":10000,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Desenvolvimento","slug":"desenvolvimento","id":7234,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento"},{"title":"Tecnologia","slug":"tecnologia","id":4254,"link":"https:\u002F\u002Fimasters.com.br\u002Ftecnologia"},{"title":"Tendências","slug":"tendencias","id":7264,"link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias"}],"tags":[{"title":"Composite","slug":"composite","id":9245,"link":"https:\u002F\u002Fimasters.com.br\u002Fcomposite"},{"title":"Flyweight","slug":"flyweight","id":8142,"link":"https:\u002F\u002Fimasters.com.br\u002Fflyweight"},{"title":"Padrões Flyweight e Composite","slug":"padroes-flyweight-e-composite","id":9244,"link":"https:\u002F\u002Fimasters.com.br\u002Fpadroes-flyweight-e-composite"}],"seo":{"open_graph":{"title":"Padrões Flyweight e Composite em Sistemas com muitos objetos","description":"Padrões Flyweight e Composite | Introdução aos Padrões de Projeto. No desenvolvimento de software, a eficiência e o gerenciamento de recursos são...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04110318\u002FDesenvolvimento1.jpg","width":800,"height":533},"modified_time":"2025-06-04T11:20:41-03:00","published_time":"2025-06-04T11:05:17-03:00"},"twitter":{"title":"Padrões Flyweight e Composite em Sistemas com muitos objetos","description":"Padrões Flyweight e Composite | Introdução aos Padrões de Projeto. No desenvolvimento de software, a eficiência e o gerenciamento de recursos são...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04110318\u002FDesenvolvimento1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Faplicacao-combinada-dos-padroes-flyweight-e-composite-em-sistemas-com-muitos-objetos","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Faplicacao-combinada-dos-padroes-flyweight-e-composite-em-sistemas-com-muitos-objetos","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Faplicacao-combinada-dos-padroes-flyweight-e-composite-em-sistemas-com-muitos-objetos"},"type":"post"},{"id":163656,"title":"Habilite o Código de Segurança Azure DevOps","content":"\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EOi, meu nome é \u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fmauriciojunior.net\"\u003E\u003Cb\u003EMauricio Junior\u003C\u002Fb\u003E\u003C\u002Fa\u003E\u003Cspan style=\"font-weight: 400;\"\u003E, e hoje vou mostrar como habilitar o Azure DevOps em sua branch para verificar o código de segurança como agente. A Microsoft chamou isso de GitHub Advanced Security para Azure DevOps.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EBasicamente, o sistema permite a verificação de proteção dentro do código quando você envia um \u003C\u002Fspan\u003E\u003Ci\u003E\u003Cspan style=\"font-weight: 400;\"\u003Ecommit\u003C\u002Fspan\u003E\u003C\u002Fi\u003E\u003Cspan style=\"font-weight: 400;\"\u003E que inclui credenciais secretas. Ao mesmo tempo, verifica as vulnerabilidades no código aberto que você pode estar usando em seu sistema e usa o CodeQL para analisar o nível do código das vulnerabilidades, como injeção de SQL e desvio de autenticação.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEu criei muitos artigos e vídeos no Youtube \u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fyoutube.com\u002F@plataforma.academy\"\u003E\u003Cb\u003E@plataforma.academy\u003C\u002Fb\u003E\u003C\u002Fa\u003E\u003Cspan style=\"font-weight: 400;\"\u003E contando sobre a injeção de SQL, e você pode ver mais clicando no link.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ETem um ponto importante, a versão NET compatível para isso é .NET 8x ou maior, o que significa que não é possível usá-lo para verificar versões antigas como . NET 6x, . NET 2x, e . NET Framework 4xx.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPara habilitá-lo, é necessário ir para suas \u003C\u002Fspan\u003E\u003Cb\u003EConfigurações de projeto\u003C\u002Fb\u003E\u003Cspan style=\"font-weight: 400;\"\u003E dentro do projeto Azure DevOps, selecionar o Repos -> Repositórios, selecionar o repositório que deseja habilitar a segurança avançada e ativar a opção.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F28200503\u002Fazure-1.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-163657\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F28200503\u002Fazure-1.png\" alt=\"\" width=\"512\" height=\"320\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F28201043\u002Fazure-2.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-163658\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F28201043\u002Fazure-2.png\" alt=\"\" width=\"512\" height=\"273\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003Ehoje vou mostrar como habilitar o Azure DevOps em sua branch para verificar o código de segurança como agente: GitHub Advanced Security para Azure DevOps.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca\u002Fhabilite-o-codigo-de-seguranca-azure-devops","date":"3 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F28202039\u002FDevOps.jpg","externalMention":null,"author":{"id":962,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2021\u002F08\u002F31194149\u002FMauricio4.jpg","name":"Mauricio Junior","description":"Com mais de 20 anos trabalhando no mercado de tecnologia. Mestre em Engenharia Elétrica voltada para o mundo mobile, com mais de 20 livros publicados e cerca de 700 artigos publicados com intuito de ajudar àqueles que querem aprender a programar (site, software, desktop, serviços, api e mobile). Site pessoal: https:\u002F\u002Fwww.mauriciojunior.net - MVP, MCAD, MCP Microsoft","slug":"mauricio_junior","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fmauricio_junior","registered":"2009-03-31 12:18:44","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002Fecode10","instagram":null,"github":null,"url":"https:\u002F\u002Fwww.mauriciojunior.net","mail":"mauricio.junior@gmail.com"},"articles_count":102,"views_count":1030215,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Desenvolvimento","slug":"desenvolvimento","id":7234,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento"},{"title":"Segurança","slug":"seguranca","id":7269,"link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca"}],"tags":[{"title":"devops","slug":"devops","id":1925,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevops"}],"seo":{"open_graph":{"title":"Habilite o Código de Segurança Avançada do Azure DevOps","description":"hoje vou mostrar como habilitar o Azure DevOps em sua branch para verificar o código de segurança como agente: GitHub Advanced Security para Azure DevOps.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F28202039\u002FDevOps.jpg","width":800,"height":533},"modified_time":"2025-05-28T20:37:32-03:00","published_time":"2025-06-03T09:16:25-03:00"},"twitter":{"title":"Habilite o Código de Segurança Avançada do Azure DevOps","description":"hoje vou mostrar como habilitar o Azure DevOps em sua branch para verificar o código de segurança como agente: GitHub Advanced Security para Azure DevOps.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F28202039\u002FDevOps.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fseguranca\u002Fhabilite-o-codigo-de-seguranca-azure-devops","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fseguranca\u002Fhabilite-o-codigo-de-seguranca-azure-devops","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fseguranca\u002Fhabilite-o-codigo-de-seguranca-azure-devops"},"type":"post"}],"total":15970,"maxPages":888}},"featuredArticles":{"colunists":{"data":[{"id":163622,"title":"Validações mais eficazes na sua API com a biblioteca Joi","content":"\u003Cp\u003EPara garantir o funcionamento correto das nossas APIs e evitar problemas é super importante sempre validar a entrada dos nossos usuários. No entanto, encadear muitos ifs-elses não é uma estratégia muito eficaz. Será que não há uma forma mais interessante de fazer isso? 🤔\u003C\u002Fp\u003E\n\u003Ch2 id=\"0dea\" class=\"or os ho bf ot fe ou ff fg fh ov fi fj fk ow fl fm fn ox fo fp fq oy fr fs oz bk\" data-selectable-paragraph=\"\"\u003EValidações em APIs\u003C\u002Fh2\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"0f60\" class=\"my mz ho na b nb pa nd ne nf pb nh ni fk pc nk nl fn pd nn no fq pe nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EPara garantir o funcionamento correto das nossas APIs, é importante sempre validar a entrada dos nossos usuários.\u003C\u002Fli\u003E\n\u003Cli id=\"ff69\" class=\"my mz ho na b nb pl nd ne nf pm nh ni fk pn nk nl fn po nn no fq pp nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EÉ possível fazer isso de diferentes formas, como por exemplo, usando condicionais! Como no exemplo abaixo, onde queremos validar se o usuário enviou todos os dados e se eles são válidos:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003Eapp.post(\"\u002Fusers\", (req, res) => {\r\n const { username, email, year, password } = req.body;\r\n\r\n if(!username || !email || !year || !password) {\r\n return res.status(422).send(\"Incomplete data.\");\r\n }\r\n\r\n const regexEmail = \u002F^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\u002F;\r\n if(!regexEmail.test(email)){\r\n return res.status(422).send(\"Invalid e-mail.\");\r\n }\r\n \r\n if(isNaN(parseInt(year)) || parseInt(year) <= 1900) {\r\n return res.status(422).send(\"Incomplete year.\");\r\n }\r\n \r\n if(password.length < 6) {\r\n return res.status(422).send(\"Password too short.\");\r\n }\r\n\r\n users.push(req.body);\r\n return res.sendStatus(201);\r\n});\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"ff03\" class=\"my mz ho na b nb nc nd ne nf ng nh ni fk nj nk nl fn nm nn no fq np nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EIsso funciona? \u003Cstrong class=\"na hp\"\u003EFunciona!\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"d940\" class=\"my mz ho na b nb pl nd ne nf pm nh ni fk pn nk nl fn po nn no fq pp nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EMas… Quando o nosso código começa a crescer e as regras de valições se tornam mais complexas, facilmente essa solução se torna pouco eficaz. E não precisamos ir muito longe não… Por exemplo, e se eu também quisesse validar se o nome de usuário tem até 10 caracteres e se o e-mail é válido?\u003C\u002Fli\u003E\n\u003Cli id=\"c25b\" class=\"my mz ho na b nb pl nd ne nf pm nh ni fk pn nk nl fn po nn no fq pp nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EO suco já começa a azedar, né? 🧃\u003C\u002Fli\u003E\n\u003Cli id=\"fedc\" class=\"my mz ho na b nb pl nd ne nf pm nh ni fk pn nk nl fn po nn no fq pp nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EEntão como podemos melhorar? 🤔\u003C\u002Fli\u003E\n\u003Cli id=\"16e3\" class=\"my mz ho na b nb pl nd ne nf pm nh ni fk pn nk nl fn po nn no fq pp nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EPara isso, podemos usar a biblioteca \u003Ca class=\"ag pz\" href=\"https:\u002F\u002Fjoi.dev\u002F\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"na hp\"\u003EJoi\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E! Esta é uma biblioteca de validação através de esquemas (schemas) que permite fazer o trabalho acima de forma muito mais fácil e descritiva.\u003C\u002Fli\u003E\n\u003Cli id=\"a75b\" class=\"my mz ho na b nb pl nd ne nf pm nh ni fk pn nk nl fn po nn no fq pp nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EPara usá-la, o primeiro passo é instalar ela:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre class=\"of og oh oi oj pq pr ps bp pt bb bk\"\u003E\u003Ccode\u003E\u003Cspan id=\"7e92\" class=\"pu os ho pr b bg pv pw m px py\" data-selectable-paragraph=\"\"\u003Enpm i joi\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"6656\" class=\"my mz ho na b nb nc nd ne nf ng nh ni fk nj nk nl fn nm nn no fq np nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EFeito isso, precisamos definir um \u003Cstrong class=\"na hp\"\u003Eschema\u003C\u002Fstrong\u003E. Um schema nada mais será do que a representação da estrutura do que esperamos validar com suas respectivas regras.\u003C\u002Fli\u003E\n\u003Cli id=\"e3b7\" class=\"my mz ho na b nb pl nd ne nf pm nh ni fk pn nk nl fn po nn no fq pp nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EPara fazer isso, já faremos uso do Joi. Veja:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003Eimport joi from \"joi\";\r\n\r\nconst userSchema = joi.object({\r\n username: joi.string().min(3).max(10).required(),\r\n email: joi.string().email().required(),\r\n year: joi.number().integer().min(1900).max(2024).required(),\r\n password: joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30} window.__SERVER_VARS__ = {"applicationRestUrl":"https:\u002F\u002Fadmin.imasters.com.br\u002Fwp-json","applicationBaseUrl":"https:\u002F\u002Fadmin.imasters.com.br"} )).required(),\r\n});\r\n\r\napp.post(\"\u002Fusers\", (req, res) => { \r\n const user = req.body; \r\n if(!username || !email || !year || !password) {\r\n return res.status(422).send(\"Incomplete data.\");\r\n }\r\n \r\n \u002F\u002F restante do código \r\n});\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"340f\" class=\"my mz ho na b nb nc nd ne nf ng nh ni fk nj nk nl fn nm nn no fq np nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EUsamos o \u003Ccode class=\"cx qa qb qc pr b\"\u003Ejoi.object()\u003C\u002Fcode\u003E para definir o schema e então usamos o \u003Ccode class=\"cx qa qb qc pr b\"\u003Estring()\u003C\u002Fcode\u003E, \u003Ccode class=\"cx qa qb qc pr b\"\u003Eemail()\u003C\u002Fcode\u003E, \u003Ccode class=\"cx qa qb qc pr b\"\u003Emin()\u003C\u002Fcode\u003E, \u003Ccode class=\"cx qa qb qc pr b\"\u003Emax()\u003C\u002Fcode\u003E, e assim por diante para fazer as validações necessárias.\u003C\u002Fli\u003E\n\u003Cli id=\"3e63\" class=\"my mz ho na b nb pl nd ne nf pm nh ni fk pn nk nl fn po nn no fq pp nq nr ns pi pj pk bk\" data-selectable-paragraph=\"\"\u003EAgora, ao invés de ficar encadeando ifs e elses, simplesmente usamos esse objeto de referência para validar a informação que o usuário nos enviou:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003Eimport joi from \"joi\";\r\n\r\nconst userSchema = joi.object({\r\n username: joi.string().min(3).max(10).required(),\r\n email: joi.string().email().required(),\r\n year: joi.number().integer().min(1900).max(2024).required(),\r\n password: joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30} window.__SERVER_VARS__ = {"applicationRestUrl":"https:\u002F\u002Fadmin.imasters.com.br\u002Fwp-json","applicationBaseUrl":"https:\u002F\u002Fadmin.imasters.com.br"} )).required(),\r\n});\r\n\r\napp.post(\"\u002Fusers\", (req, res) => { \r\n const user = req.body; \r\n const validation = userSchema.validate(user, { abortEarly: false });\r\n if (validation.error) {\r\n const errors = validation.error.details.map(detail => detail.message)\r\n return res.status(422).send(errors)\r\n }\r\n \r\n \u002F\u002F restante do código \r\n});\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch3 id=\"1192\" class=\"qd os ho bf ot qe qf qg fg qh qi qj fj qk ql qm qn qo qp qq qr qs qt qu qv qw bk\"\u003ERepositório\u003C\u002Fh3\u003E\n\u003Cp id=\"b72d\" class=\"pw-post-body-paragraph my mz ho na b nb pa nd ne nf pb nh ni fk pc nk nl fn pd nn no fq pe nq nr ns gp bk\" data-selectable-paragraph=\"\"\u003E\u003Ca class=\"ag pz\" href=\"https:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fvalidacao-joi\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003Ehttps:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fvalidacao-joi\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EPara garantir o funcionamento correto das nossas APIs e evitar problemas é super importante sempre validar a entrada dos nossos usuários. No entanto…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos\u002Fvalidacoes-mais-eficazes-na-sua-api-com-a-biblioteca-joi","date":"7 jul, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26183954\u002FAPIs.jpg","externalMention":null,"author":{"id":144418,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30171243\u002Fdiego-pinho.jpg","name":"Diego Pinho","description":"Bacharel em Ciência da Computação pela PUCSP e MBA em Gestão da Tecnologia da Informação na FIAP. Autor do livro ECMAScript 6 - Entre de cabeça no futuro do JavaScript. Cofundador da Code Prestige e Community Manager no iMasters.","slug":"diegopinho","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdiegopinho","registered":"2013-08-13 18:00:53","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002FDiegoPinho","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.diegopinho.com.br","mail":"diego.pinho@imasters.com.br"},"articles_count":113,"views_count":1276900,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"APIs e Microsserviços","slug":"apis-microsservicos","id":4257,"link":"https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos"},{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"api","slug":"api","id":187,"link":"https:\u002F\u002Fimasters.com.br\u002Fapi"},{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"},{"title":"node","slug":"node","id":236,"link":"https:\u002F\u002Fimasters.com.br\u002Fnode"},{"title":"nodejs","slug":"nodejs","id":3153,"link":"https:\u002F\u002Fimasters.com.br\u002Fnodejs"}],"seo":{"open_graph":{"title":"Validações mais felizes na sua API com a biblioteca Joi","description":"Para garantir o funcionamento correto das nossas APIs e evitar problemas é super importante sempre validar a entrada dos nossos usuários. No entanto...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26183954\u002FAPIs.jpg","width":800,"height":533},"modified_time":"2025-07-07T13:15:10-03:00","published_time":"2025-07-07T09:24:22-03:00"},"twitter":{"title":"Validações mais felizes na sua API com a biblioteca Joi","description":"Para garantir o funcionamento correto das nossas APIs e evitar problemas é super importante sempre validar a entrada dos nossos usuários. No entanto...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26183954\u002FAPIs.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos\u002Fvalidacoes-mais-eficazes-na-sua-api-com-a-biblioteca-joi","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos\u002Fvalidacoes-mais-eficazes-na-sua-api-com-a-biblioteca-joi","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos\u002Fvalidacoes-mais-eficazes-na-sua-api-com-a-biblioteca-joi"},"type":"post"},{"id":163773,"title":"Ciclos de Similaridade Web: como identificar padrões e rupturas na era dos dados","content":"\u003Ch3 id=\"ember343\" class=\"ember-view reader-text-block__heading-3\"\u003EA Nova Fronteira da Análise Digital\u003C\u002Fh3\u003E\n\u003Cp id=\"ember344\" class=\"ember-view reader-text-block__paragraph\"\u003EImagine um mundo onde cada website que surge na internet é automaticamente comparado com milhões de outros sites, identificando não apenas suas semelhanças visuais, mas também seus padrões de comportamento, estrutura de conteúdo e performance. Essa realidade já existe, e está transformando como entendemos os ciclos de inovação digital.\u003C\u002Fp\u003E\n\u003Ch2 id=\"ember345\" class=\"ember-view reader-text-block__heading-3\"\u003EO Que São Ciclos de Similaridade Web?\u003C\u002Fh2\u003E\n\u003Cp id=\"ember346\" class=\"ember-view reader-text-block__paragraph\"\u003EOs ciclos de similaridade web representam períodos onde múltiplos websites seguem padrões similares de design, funcionalidade ou estratégia de conteúdo. Tradicionalmente, identificar esses padrões exigia análise manual extensiva e muito tempo. Hoje, através da combinação de tecnologias como Apache Flink, Large Language Models (LLMs) e sistemas de busca vetorial como Qdrant, podemos detectar essas tendências em tempo real.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember347\" class=\"ember-view reader-text-block__heading-3\"\u003EComo Funciona a Detecção Inteligente de Padrões\u003C\u002Fh3\u003E\n\u003Cp id=\"ember348\" class=\"ember-view reader-text-block__paragraph\"\u003ENeste artigo vou pegar por exemplo o Apache Flink 2.0 como o sistema nervoso central, processando milhões de eventos de campanha e interações de website simultaneamente. Cada clique, scroll, tempo de permanência e conversão é capturado e analisado instantaneamente.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember349\" class=\"ember-view reader-text-block__heading-3\"\u003E2. Extração Semântica de Conteúdo\u003C\u002Fh3\u003E\n\u003Cp id=\"ember350\" class=\"ember-view reader-text-block__paragraph\"\u003EAqui entra a magia dos LLMs integrados ao Flink CDC 3.3. Esses modelos não apenas “leem” o conteúdo das páginas, mas compreendem seu contexto, extraindo insights sobre títulos, estrutura narrativa, tom de comunicação e proposta de valor. É como ter um analista de conteúdo que nunca dorme, examinando cada novo site que surge.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember351\" class=\"ember-view reader-text-block__heading-3\"\u003E3. Armazenamento Vetorial Inteligente\u003C\u002Fh3\u003E\n\u003Cp id=\"ember352\" class=\"ember-view reader-text-block__paragraph\"\u003EO Qdrant funciona como uma memória coletiva da internet, armazenando não apenas os dados brutos, mas representações vetoriais que capturam a “essência” de cada website. Quando um novo site é analisado, o sistema pode instantaneamente identificar suas similaridades com milhares de outros sites.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember353\" class=\"ember-view reader-text-block__heading-3\"\u003EIdentificando Rupturas de Padrão\u003C\u002Fh3\u003E\n\u003Cp id=\"ember354\" class=\"ember-view reader-text-block__paragraph\"\u003EO verdadeiro valor desta arquitetura emerge quando ela identifica websites que quebram padrões estabelecidos. O agente de IA realiza uma análise tridimensional:\u003C\u002Fp\u003E\n\u003Cp id=\"ember355\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003EConsulta Histórica\u003C\u002Fstrong\u003E: Examina sites similares em estrutura e segmento \u003Cstrong\u003EAnálise de Performance\u003C\u002Fstrong\u003E: Compara métricas de engajamento e conversão \u003Cstrong\u003EDetecção de Gaps\u003C\u002Fstrong\u003E: Identifica lacunas entre performance esperada versus real\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember356\" class=\"ember-view reader-text-block__heading-3\"\u003EO Poder da Otimização Preditiva\u003C\u002Fh3\u003E\n\u003Cp id=\"ember357\" class=\"ember-view reader-text-block__paragraph\"\u003EDiferentemente das abordagens tradicionais que esperam dados de performance se acumularem, esta arquitetura permite otimização desde o primeiro dia. Baseando-se em conhecimento de contextos similares, o sistema pode:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003EPrever quais elementos de design terão maior impacto\u003C\u002Fli\u003E\n\u003Cli\u003ESugerir estratégias de conteúdo baseadas em sucessos similares\u003C\u002Fli\u003E\n\u003Cli\u003EIdentificar oportunidades de diferenciação antes da concorrência\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember359\" class=\"ember-view reader-text-block__heading-3\"\u003EImplicações para o Futuro Digital\u003C\u002Fh3\u003E\n\u003Cp id=\"ember360\" class=\"ember-view reader-text-block__paragraph\"\u003EEsta abordagem representa uma mudança fundamental: da análise reativa para a inteligência preditiva. Em vez de esperar meses para entender o que funciona, podemos iniciar com hipóteses baseadas em milhares de casos similares, acelerando exponencialmente os ciclos de feedback e inovação.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember361\" class=\"ember-view reader-text-block__heading-3\"\u003EInsights em Tempo Real: O Novo Padrão\u003C\u002Fh3\u003E\n\u003Cp id=\"ember362\" class=\"ember-view reader-text-block__paragraph\"\u003EA capacidade de obter insights imediatos sobre padrões de mercado transforma como pensamos sobre competitividade digital. Empresas podem identificar tendências emergentes antes que se tornem mainstream, posicionando-se como pioneiras em novos padrões de experiência digital.\u003C\u002Fp\u003E\n\u003Ch2 id=\"ember363\" class=\"ember-view reader-text-block__heading-3\"\u003EArquitetura para essa captura, analise e otimização preditiva\u003C\u002Fh2\u003E\n\u003Ch3 id=\"ember364\" class=\"ember-view reader-text-block__heading-3\"\u003EVisão Geral da Arquitetura\u003C\u002Fh3\u003E\n\u003Cp id=\"ember365\" class=\"ember-view reader-text-block__paragraph\"\u003EEsta arquitetura implementa um sistema completo de detecção de padrões web usando exclusivamente tecnologias open source, dividida em 7 camadas principais que trabalham em conjunto para oferecer análise inteligente em tempo real. Preferi montar open source não só por que sou facionado pela comunidade como também a infinidade de produtos sensacionais que temos hoje que vieram da Apache Foundation.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember366\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E1. Camada de Coleta de Dados (Data Ingestion Layer)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember367\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Kafka + Kafka Connect\u003C\u002Fh3\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Hub central de eventos e streaming de dados.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EConectores\u003C\u002Fstrong\u003E: \u003Cstrong\u003EDebezium\u003C\u002Fstrong\u003E: Captura mudanças (CDC) de bases de dados.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EHTTP Source Connector\u003C\u002Fstrong\u003E: Ingere dados de APIs web.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EFile Connector\u003C\u002Fstrong\u003E: Processa logs de servidores web.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember369\" class=\"ember-view reader-text-block__heading-3\"\u003EScrapy Cluster\u003C\u002Fh3\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Web scraping distribuído e escalável\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EComponentes\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp id=\"ember371\" class=\"ember-view reader-text-block__paragraph\"\u003E– Redis: Fila de URLs para scraping.\u003C\u002Fp\u003E\n\u003Cp id=\"ember372\" class=\"ember-view reader-text-block__paragraph\"\u003E-Kafka: Pipeline de dados extraídos.\u003C\u002Fp\u003E\n\u003Cp id=\"ember373\" class=\"ember-view reader-text-block__paragraph\"\u003E– Scrapyd: Gestão de spiders distribuídos.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember374\" class=\"ember-view reader-text-block__heading-3\"\u003EFluentd – É Sensacional\u003C\u002Fh3\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Coleta e roteamento de logs\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EIntegrações\u003C\u002Fstrong\u003E: Nginx, Apache, aplicações web\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EOutput\u003C\u002Fstrong\u003E: Kafka tópicos estruturados\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember376\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E2. Camada de Processamento em Tempo Real (Stream Processing)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember377\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Flink\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Processamento de stream principal\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EJobs\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003EWeb Content Analyzer\u003C\u002Fstrong\u003E: Extrai metadados de HTML\u002FCSS\u002FJS.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EPerformance Metrics Calculator: \u003C\u002Fstrong\u003ECalcula métricas de UX em tempo real.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EPattern Detector:\u003C\u002Fstrong\u003E Identifica similaridades estruturais.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EAnomaly Detector:\u003C\u002Fstrong\u003E Detecta desvios de padrões.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember380\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Storm (alternativa\u002Fcomplemento)\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Processamento de eventos complexos\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ETopologias\u003C\u002Fstrong\u003E: Análise de comportamento de usuário em tempo real.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember383\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E3. Camada de Inteligência Artificial (AI Layer)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember384\" class=\"ember-view reader-text-block__heading-3\"\u003EOllama + Modelos Open Source\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EModelos sugeridos\u003C\u002Fstrong\u003E: \u003Cstrong\u003ECodeLlama\u003C\u002Fstrong\u003E: Análise de código HTML\u002FCSS\u002FJavaScript\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ELlama 2\u002F3\u003C\u002Fstrong\u003E: Análise semântica de conteúdo\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EMistral 7B\u003C\u002Fstrong\u003E: Classificação e categorização\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EDeployment\u003C\u002Fstrong\u003E: Kubernetes com GPU support\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember386\" class=\"ember-view reader-text-block__heading-3\"\u003EHugging Face Transformers\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EModelos especializados\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EBERT\u003C\u002Fstrong\u003E: Embeddings de texto para similaridade semântica\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ECLIP\u003C\u002Fstrong\u003E: Análise de imagens e layouts visuais\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ET5\u003C\u002Fstrong\u003E: Geração de insights e resumos\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember388\" class=\"ember-view reader-text-block__heading-3\"\u003EspaCy + Custom Models\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: NLP especializado para conteúdo web\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EPipelines\u003C\u002Fstrong\u003E: Extração de entidades, análise de sentimento, classificação de tópicos\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember390\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E4. Camada de Armazenamento Vetorial (Vector Storage)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember391\" class=\"ember-view reader-text-block__heading-3\"\u003EQdrant\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Armazenamento e busca de embeddings\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ECollections\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003Ewebsite_content\u003C\u002Fstrong\u003E: Embeddings de conteúdo textual\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Evisual_layouts\u003C\u002Fstrong\u003E: Representações visuais de layouts\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Euser_behavior\u003C\u002Fstrong\u003E: Padrões de interação do usuário\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Eperformance_profiles\u003C\u002Fstrong\u003E: Perfis de performance técnica\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember394\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E5. Camada de Dados Estruturados (Structured Data Layer)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember395\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Cassandra\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Armazenamento de séries temporais\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ETables\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003Ewebsite_metrics\u003C\u002Fstrong\u003E: Métricas de performance por timestamp.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Ecrawl_history\u003C\u002Fstrong\u003E: Histórico de crawling.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Epattern_evolution\u003C\u002Fstrong\u003E: Evolução de padrões ao longo do tempo.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember399\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E6. Camada de Orquestração e Workflow (Orchestration Layer)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember400\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Airflow\u003C\u002Fh3\u003E\n\u003Cp id=\"ember401\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003EDAGs principais\u003C\u002Fstrong\u003E:\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003Edaily_pattern_analysis\u003C\u002Fstrong\u003E: Análise diária de novos padrões.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Emodel_retraining\u003C\u002Fstrong\u003E: Retreino de modelos ML.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Edata_quality_checks\u003C\u002Fstrong\u003E: Validação de qualidade dos dados.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003Ecompetitive_analysis\u003C\u002Fstrong\u003E: Análise competitiva automatizada.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3 id=\"ember403\" class=\"ember-view reader-text-block__heading-3\"\u003EKubernetes + Helm (ou Docker\u002FSwarm):\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Orquestração de containers\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EOperators\u003C\u002Fstrong\u003E: Flink, Kafka, Spark para gestão declarativa\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember406\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E7. Camada de API e Interface (API & Interface Layer)\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Ch3 id=\"ember407\" class=\"ember-view reader-text-block__heading-3\"\u003EFastAPI\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EEndpoints\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003Cli\u003E\u002Fanalyze\u002Fwebsite: Análise de um website específico\u003C\u002Fli\u003E\n\u003Cli\u003E\u002Fpatterns\u002Fsimilar: Busca por websites similares\u003C\u002Fli\u003E\n\u003Cli\u003E\u002Finsights\u002Ftrends: Tendências emergentes\u003C\u002Fli\u003E\n\u003Cli\u003E\u002Fcompare\u002Fwebsites: Comparação entre múltiplos sites\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember409\" class=\"ember-view reader-text-block__heading-3\"\u003EApache Superset\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Dashboards e visualizações\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EDashboards\u003C\u002Fstrong\u003E:\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EReal-time Pattern Detection\u003C\u002Fstrong\u003E: Padrões em tempo real\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ECompetitive Intelligence\u003C\u002Fstrong\u003E: Inteligência competitiva\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EPerformance Benchmarks\u003C\u002Fstrong\u003E: Benchmarks de performance\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember411\" class=\"ember-view reader-text-block__heading-3\"\u003EGrafana + Prometheus\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EFunção\u003C\u002Fstrong\u003E: Monitoramento da infraestrutura\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EMétricas\u003C\u002Fstrong\u003E: Latência, throughput, saúde dos componentes\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch2 id=\"ember414\" class=\"ember-view reader-text-block__heading-3\"\u003EAgora saindo do técnico esse assunto é realmente relevante: qual seu peso? qual seu ganho?\u003C\u002Fh2\u003E\n\u003Cp id=\"ember415\" class=\"ember-view reader-text-block__paragraph\"\u003EOlhando para o mercado de web, mais especificamente a parte de experiência de usuário e de buscas por AI movimentou USD 56,82 bilhões em 2024 e deve crescer para USD 109,12 bilhões até 2032, com CAGR de 8,5% segundo fontes (\u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fwww.businessresearchinsights.com\u002Fmarket-reports\u002Fweb-design-market-117595\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003Ehttps:\u002F\u002Fwww.businessresearchinsights.com\u002Fmarket-reports\u002Fweb-design-market-117595\u003C\u002Fa\u003E e \u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fwww.wiseguyreports.com\u002Freports\u002Fweb-design-market\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003Ehttps:\u002F\u002Fwww.wiseguyreports.com\u002Freports\u002Fweb-design-market\u003C\u002Fa\u003E)\u003C\u002Fp\u003E\n\u003Cp id=\"ember416\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003EIA em Marketing: ROI Comprovado:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"ember417\" class=\"ember-view reader-text-block__paragraph\"\u003E49% dos líderes de tecnologia já integraram IA totalmente na estratégia de negócios das empresas, com ganhos de 20% a 30% em produtividade, velocidade de mercado e receita \u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fwww.pwc.com\u002Fus\u002Fen\u002Ftech-effect\u002Fai-analytics\u002Fai-predictions.html\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003E2025 AI Business Predictions: PwC\u003C\u002Fa\u003E. Empresas que fazem IA corretamente alcançam 13% de ROI em projetos de IA, comparado à média de 5,9% \u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fwww.v7labs.com\u002Fblog\u002Fhow-to-secure-the-best-roi-from-your-ai-investment\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003EHow to Secure the Best ROI from Your AI Investment in 2024\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember418\" class=\"ember-view reader-text-block__heading-3\"\u003EVantagem Competitiva Comprovada\u003C\u002Fh3\u003E\n\u003Cp id=\"ember419\" class=\"ember-view reader-text-block__paragraph\"\u003EO mercado de Revenue Intelligence Platform cresceu para USD 2,18 bilhões em 2024 e deve atingir USD 3,95 bilhões até 2033 \u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fsuperagi.com\u002Ftop-10-revenue-intelligence-tools-to-boost-your-sales-strategy-in-2024\u002F\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003ETop 10 Revenue Intelligence Tools to Boost Your Sales Strategy in 2024 – SuperAGI\u003C\u002Fa\u003E. Empresas que usam arquiteturas cloud de próxima geração e IA têm maior probabilidade de melhorar lucratividade, produtividade e time-to-market \u003Ca class=\"PDuZgTTJniSbcpBCzeHjMlcFFsgCxLEhvw \" tabindex=\"0\" href=\"https:\u002F\u002Fwww.pwc.com\u002Fus\u002Fen\u002Ftech-effect\u002Fai-analytics\u002Fcompeting-in-age-of-ai.html\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003EIn the age of AI: Speed matters more, scale matters less, innovation matters most\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp id=\"ember420\" class=\"ember-view reader-text-block__paragraph\"\u003EO conceito não é apenas relevante – é \u003Cstrong\u003Einevitável\u003C\u002Fstrong\u003E para empresas que querem manter vantagem competitiva no ambiente digital de 2025+.\u003C\u002Fp\u003E\n\u003Cp id=\"ember422\" class=\"ember-view reader-text-block__paragraph\"\u003EMe sigam no \u003Ca href=\"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fairton-lira-junior-6b81a661\u002F\"\u003ELinkedin\u003C\u002Fa\u003E para dúvidas ou acompanhar mais artigos\u002Fpost sobre temas desse tipo. E quem é AI Engineer & Data Engineer e quer ver uma POC da arquitetura montada conforme mencionado no artigo, deixa nos comentários para eu fazer um parte 2 só da construção da arquitetura.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EOs ciclos de similaridade web representam períodos onde múltiplos websites seguem padrões similares de design, funcionalidade ou estratégia de conteúdo.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fciclos-de-similaridade-web-como-identificar-padroes-e-rupturas-na-era-dos-dados","date":"30 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16114723\u002Fdados-e-IA.jpg","externalMention":null,"author":{"id":148428,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F12\u002F10111133\u002Fairton.png","name":"Airton Lira Junior","description":"Airton Lira Junior é um profissional de Tecnologia da Informação com mais de 10 anos de experiência, especializado em Big Data, Engenharia de Dados e Arquitetura de Soluções em nuvem. Atualmente atua como Engenheiro Sênior de Dados e Analytics na Dock, liderando melhorias em plataformas de dados, orquestração de pipelines com Databricks e otimização de workloads em AWS (EC2, EMR, SageMaker). Com passagens por empresas como iFood e Bemobi, destacou-se na concepção de soluções inovadoras, como modelos LLM para chatbots, integrações de IA em pipelines de áudio e projetos de conciliação financeira regulatória, utilizando tecnologias como Golang, Python, Apache Spark e Kubernetes. Possui certificações em AWS, Databricks e Power BI, além de formação em Análise de Sistemas pela FIA e especialização em Banco de Dados. Reconhecido por sua proatividade e expertise técnica, contribui ativamente para a comunidade tech como colunista no iMasters, compartilhando conhecimentos em automação, engenharia de prompts e arquitetura de dados escaláveis.","slug":"airtonlirajr","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fairtonlirajr","registered":"2017-10-10 13:17:26","social":{"linkedin":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fairton-lira-junior-6b81a661\u002F","youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"airtonlirajr@gmail.com"},"articles_count":26,"views_count":70200,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Data","slug":"data","id":16,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"Design","slug":"design","id":8663,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesign"},{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"}],"tags":[{"title":"AI","slug":"ai","id":451,"link":"https:\u002F\u002Fimasters.com.br\u002Fai"},{"title":"apache kafka","slug":"apache-kafka","id":4966,"link":"https:\u002F\u002Fimasters.com.br\u002Fapache-kafka"},{"title":"ciclo de Similaridade Web","slug":"ciclo-de-similaridade-web","id":9252,"link":"https:\u002F\u002Fimasters.com.br\u002Fciclo-de-similaridade-web"},{"title":"dados","slug":"dados","id":374,"link":"https:\u002F\u002Fimasters.com.br\u002Fdados"},{"title":"Data","slug":"data","id":626,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"IA","slug":"ia","id":4660,"link":"https:\u002F\u002Fimasters.com.br\u002Fia"},{"title":"inteligência artificial","slug":"inteligencia-artificial","id":2663,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Kafka","slug":"kafka","id":5134,"link":"https:\u002F\u002Fimasters.com.br\u002Fkafka"},{"title":"Large Language Model","slug":"large-language-model","id":9250,"link":"https:\u002F\u002Fimasters.com.br\u002Flarge-language-model"},{"title":"Large Language Models","slug":"large-language-models","id":9249,"link":"https:\u002F\u002Fimasters.com.br\u002Flarge-language-models"},{"title":"LLM","slug":"llm","id":9026,"link":"https:\u002F\u002Fimasters.com.br\u002Fllm"},{"title":"LLMs","slug":"llms","id":9234,"link":"https:\u002F\u002Fimasters.com.br\u002Fllms"},{"title":"Similaridade Web","slug":"similaridade-web","id":9251,"link":"https:\u002F\u002Fimasters.com.br\u002Fsimilaridade-web"}],"seo":{"open_graph":{"title":"Ciclos de Similaridade Web: como identificar padrões e rupturas","description":"Os ciclos de similaridade web representam períodos onde múltiplos websites seguem padrões similares de design, funcionalidade ou estratégia de conteúdo.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16114723\u002Fdados-e-IA.jpg","width":800,"height":533},"modified_time":"2025-06-16T11:48:10-03:00","published_time":"2025-06-30T09:15:15-03:00"},"twitter":{"title":"Ciclos de Similaridade Web: como identificar padrões e rupturas","description":"Os ciclos de similaridade web representam períodos onde múltiplos websites seguem padrões similares de design, funcionalidade ou estratégia de conteúdo.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16114723\u002Fdados-e-IA.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fciclos-de-similaridade-web-como-identificar-padroes-e-rupturas-na-era-dos-dados","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fciclos-de-similaridade-web-como-identificar-padroes-e-rupturas-na-era-dos-dados","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fciclos-de-similaridade-web-como-identificar-padroes-e-rupturas-na-era-dos-dados"},"type":"post"},{"id":163616,"title":"Arquitetura de Microsserviços em Node com o MoleculerJS","content":"\u003Cp id=\"618f\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EMontar um projeto na arquitetura de Microsserviços não é tão trivial e nem tão necessário quanto a maior parte das pessoas desenvolvedoras iniciantes imaginam que seja.\u003C\u002Fp\u003E\n\u003Cp id=\"c011\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EMuitos escutam o termo e, por ele estar na moda, já acham que precisam sair aplicando sem mesmo entender o que ela é, pra que serve e porque faria sentido (ou não) usá-la. Na vida real não é bem assim que funciona.\u003C\u002Fp\u003E\n\u003Cp id=\"4768\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EA arquitetura de microsserviços é incrível e pode resolver vários complexos. Mas aí é que está o X da questão: quais problemas complexos que ele resolve? Dificilmente um projeto pessoal pequeno terá qualquer tipo desses problemas.\u003C\u002Fp\u003E\n\u003Cp id=\"b8cd\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EO caminho natural das nossas aplicações é ser construída em um monolito até que faça sentido mudar a sua arquitetura. Isso se fizer sentido. Você sabia que o próprio \u003Ca class=\"ag or\" href=\"https:\u002F\u002Fstackoverflow.com\u002F\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"ny hp\"\u003EStack Overflow\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E é um monolito?\u003C\u002Fp\u003E\n\u003Cp id=\"3c04\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EDito isso, estudar esse tipo de arquitetura e aplicá-la para aprender seus conceitos e detalhes é sim muito interessante. Experimentar um pouco dessa arquitetura te ajudará a ganhar experiência para então tomar melhores decisões no futuro.\u003C\u002Fp\u003E\n\u003Cp id=\"5472\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EComo então fazer para aplicar essa arquitetura dentro do ecossistema Node?\u003C\u002Fp\u003E\n\u003Cp id=\"c54b\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EComo tudo na tecnologia, há várias formas diferentes; no entanto, recentemente encontrei uma bem interessante por meio do framework \u003Ca class=\"ag or\" href=\"https:\u002F\u002Fmoleculer.services\u002Findex.html\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"ny hp\"\u003EMoleculer\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp id=\"1aaa\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EBora explorá-lo?\u003C\u002Fp\u003E\n\u003Cp id=\"1816\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E—\u003C\u002Fp\u003E\n\u003Ch2 id=\"5fed\" class=\"os ot ho bf ou ov ow ox fg oy oz pa fj pb pc pd pe pf pg ph pi pj pk pl pm pn bk\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EO Framework Moleculer\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"1b86\" class=\"nw nx ho ny b nz po ob oc od pp of og fk pq oi oj fn pr ol om fq ps oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EO Moleculer é um framework para Node.js que nos ajuda a criar aplicações usando a arquitetura de microsserviços.\u003C\u002Fli\u003E\n\u003Cli id=\"2375\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EAplicar a arquitetura de microsserviços não se resume a apenas quebrar a aplicação em várias menores. Existem conceitos e técnicas para conseguir fazer isso da melhor forma possível, e o framework já vem integrado com vários deles, como por exemplo:\u003C\u002Fli\u003E\n\u003Cli id=\"185e\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EAPI Gateway;\u003C\u002Fli\u003E\n\u003Cli id=\"4a5b\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003ELoad Balancer;\u003C\u002Fli\u003E\n\u003Cli id=\"b5be\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EFault Tolerance;\u003C\u002Fli\u003E\n\u003Cli id=\"d3d4\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EService Discovery;\u003C\u002Fli\u003E\n\u003Cli id=\"3499\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EEtc.\u003C\u002Fli\u003E\n\u003Cli id=\"1473\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003ENão vale a pena ficar explicando cada um desses pontos agora porque esse assunto é bem denso. Vamos tentar montar um projetinho na prática com essa arquitetura e naturalmente descobriremos o que eles são e como usá-los.\u003C\u002Fli\u003E\n\u003Cli id=\"9209\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003ECombinado?\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"06b7\" class=\"os ot ho bf ou ov ow ox fg oy oz pa fj pb pc pd pe pf pg ph pi pj pk pl pm pn bk\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EAplicação prática\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"073b\" class=\"nw nx ho ny b nz po ob oc od pp of og fk pq oi oj fn pr ol om fq ps oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EComo eu disse, o caminho natural de uma aplicação é nascer do monolito e, a medida que sua complexida se tornar muito grande, a “quebramos” em aplicações menores.\u003C\u002Fli\u003E\n\u003Cli id=\"effd\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EPartindo dessa ideia, vamos começar da seguinte aplicação:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cfigure class=\"pt pu pv pw px my nh ni paragraph-image\"\u003E\n\u003Cdiv class=\"nr ns ee nt bh nu\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"nh ni qj\"\u003E\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003Cimg class=\"bh er nv c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*1TQQGby6-h2XcRy6WKVG-Q.png\" alt=\"\" width=\"700\" height=\"442\" \u002F\u003E\u003C\u002Fpicture\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"66c2\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EPara a coisa não ficar muito complexa, existem apenas três rotas: uma para criação de usuário, outra para fazer o usuário entrar na aplicação e uma terceira rota protegida (exige autenticação).\u003C\u002Fli\u003E\n\u003Cli id=\"2d8a\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EVou propor separamos essa aplicação em dois microsserviços distintos, uma para cuidar da parte de criação, cadastro e login dos usuários; e o outra para lidar com os produtos.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cfigure class=\"pt pu pv pw px my nh ni paragraph-image\"\u003E\n\u003Cdiv class=\"nr ns ee nt bh nu\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"nh ni qk\"\u003E\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003Cimg class=\"bh er nv c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*WSIfVlPjzoM7c0V9IkWegQ.png\" alt=\"\" width=\"700\" height=\"313\" \u002F\u003E\u003C\u002Fpicture\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"c8ab\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003ENote que em um arquitetura em microsserviços temos uma interface que centralizará todas as requisições e “distribuirá” para os respectivos serviços. Aqui ela está representada pelo app no diagrama. Esta peça é o que chamamos de \u003Cstrong class=\"ny hp\"\u003EGateway\u003C\u002Fstrong\u003E.\u003C\u002Fli\u003E\n\u003Cli id=\"a283\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003ERepare também que nesta organização, cada aplicação tem o seu próprio banco de dados. A ideia é que os serviços sejam independentes, até mesmo nos dados. Mas nada impede que essas aplicações se comuniquem.\u003C\u002Fli\u003E\n\u003Cli id=\"451a\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EEssa comunicação pode acontecer de várias formas, desde chamadas http (pouco usado) até serviços de mensageria (muito usado). Em nossa aplicação usaremos um serviço externo chamado \u003Ca class=\"ag or\" href=\"https:\u002F\u002Fnats.io\u002F\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"ny hp\"\u003ENATS\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E que vai nos ajudar com isso.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"1ee4\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EPara começar a implementação, faremos 3 projetos em node (farei na mesma pasta pra facilitar):\u003C\u002Fp\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"491e\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003Eapi-gateway: \u003Ccode class=\"cx ql qm qn qo b\"\u003Enpm i moleculer moleculer-web nats\u003C\u002Fcode\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"81c9\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003Eauth-service: \u003Ccode class=\"cx ql qm qn qo b\"\u003Enpm i moleculer moleculer-replt nats uuid\u003C\u002Fcode\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"e911\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003Eproduct-service: \u003Ccode class=\"cx ql qm qn qo b\"\u003Enpm i moleculer moleculer-replt nats\u003C\u002Fcode\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"185b\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EVamos começar a construção de cada uma das peças da nossa aplicação.\u003C\u002Fp\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"fa2f\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003E\u003Cstrong\u003EAPI Gateway\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Eimport { ServiceBroker } from \"moleculer\";\r\nimport ApiGatewayService from \"moleculer-web\";\r\n\r\nconst broker = new ServiceBroker({\r\n nodeID: \"gateway-node\",\r\n transporter: \"NATS\",\r\n});\r\n\r\nbroker.createService({\r\n name: \"gateway\",\r\n mixins: [ApiGatewayService],\r\n settings: {\r\n port: 5000,\r\n routes: [\r\n {\r\n path: \"\u002Fauth\",\r\n aliases: {\r\n \"POST \u002Fsign-up\": \"auth.signUp\",\r\n \"POST \u002Fsign-in\": \"auth.signIn\"\r\n }\r\n },\r\n {\r\n path: \"\u002Fapi\",\r\n bodyParsers: {\r\n json: true,\r\n urlencoded: { extended: true }\r\n },\r\n authorization: true,\r\n aliases: {\r\n \"GET \u002Fproducts\": \"product.getProducts\"\r\n }\r\n }\r\n ]\r\n },\r\n methods: {\r\n async authorize(ctx, route, req, res) {\r\n let auth = req.headers[\"authorization\"];\r\n if (auth && auth.startsWith(\"Bearer\")) {\r\n let token = auth.slice(7);\r\n\r\n const user = await ctx.call(\"auth.validateToken\", { token });\r\n if (!user.error) return Promise.resolve(ctx);\r\n\r\n return Promise.reject({ error: \"Token Inválido\" });\r\n\r\n } else {\r\n return Promise.reject({ error: \"Token Inválido\" });\r\n }\r\n }\r\n\r\n }\r\n});\r\n\r\nbroker.start();\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"6c57\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003E\u003Cstrong\u003EAuth Service\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Eimport { ServiceBroker } from \"moleculer\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nconst users = [];\r\n\r\nconst broker = new ServiceBroker({\r\n nodeID: \"auth-service-node\",\r\n transporter: \"NATS\"\r\n});\r\n\r\nbroker.createService({\r\n name: \"auth\",\r\n actions: {\r\n signUp(ctx) {\r\n const { username, password } = ctx.params;\r\n users.push({\r\n username,\r\n password\r\n });\r\n\r\n return \"User created.\"\r\n },\r\n\r\n signIn(ctx) {\r\n const { username, password } = ctx.params;\r\n const user = users.find(user => user.username === username);\r\n if (user && user.password === password) {\r\n const token = uuidv4();\r\n user.token = token;\r\n return {\r\n token\r\n }\r\n }\r\n\r\n return { error: \"Invalid credentials\" }\r\n },\r\n\r\n validateToken(ctx) {\r\n const { token } = ctx.params;\r\n const user = users.find(user => user.token === token);\r\n if (!user) return { error: \"Invalid token.\" }\r\n\r\n return user;\r\n }\r\n }\r\n});\r\n\r\nbroker.start().then(() => {\r\n broker.repl();\r\n})\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"6bc3\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003E\u003Cstrong\u003EProducts Service\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Eimport { ServiceBroker } from \"moleculer\";\r\n\r\nconst products = [\r\n { id: 1, name: \"PC da Xuxa\", price: 15000 }\r\n]\r\n\r\nconst broker = new ServiceBroker({\r\n nodeID: \"product-service-node\",\r\n transporter: \"NATS\"\r\n});\r\n\r\nbroker.createService({\r\n name: \"product\",\r\n actions: {\r\n getProducts(ctx) {\r\n return products;\r\n }\r\n }\r\n});\r\n\r\nbroker.start().then(() => {\r\n broker.repl();\r\n})\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"3f1e\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EPara conseguir fazer os microsserviços conversarem, precisaremos no NATS!\u003C\u002Fli\u003E\n\u003Cli id=\"abc4\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003EA forma mais fácil de trazer ele pro jogo é por meio do Docker:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-c\"\u003Edocker run --name nats -p 4222:4222 nats\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"7957\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EE pronto! Temos nossa solução em microsserviços! 😄\u003C\u002Fp\u003E\n\u003Ch3 id=\"20d3\" class=\"qx ot ho bf ou fe qy ff fg fh qz fi fj fk ra fl fm fn rb fo fp fq rc fr fs rd bk\"\u003E💻 Repositório\u003C\u002Fh3\u003E\n\u003Cp id=\"b6e0\" class=\"pw-post-body-paragraph nw nx ho ny b nz po ob oc od pp of og fk pq oi oj fn pr ol om fq ps oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E\u003Ca class=\"ag or\" href=\"https:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fnode-microservice-moleculer\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003Ehttps:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fnode-microservice-moleculer\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"812d\" class=\"qx ot ho bf ou fe qy ff fg fh qz fi fj fk ra fl fm fn rb fo fp fq rc fr fs rd bk\"\u003E🌐 Referências e outros materiais\u003C\u002Fh3\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"2a97\" class=\"nw nx ho ny b nz po ob oc od pp of og fk pq oi oj fn pr ol om fq ps oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003E🌐 \u003Ca class=\"ag or\" href=\"https:\u002F\u002Fmoleculer.services\u002Findex.html\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003EMoleculer — Progressive microservices framework for Node.js\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"439b\" class=\"nw nx ho ny b nz qe ob oc od qf of og fk qg oi oj fn qh ol om fq qi oo op oq qb qc qd bk\" data-selectable-paragraph=\"\"\u003E🌐 \u003Ca class=\"ag or\" href=\"https:\u002F\u002Fnats.io\u002F\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003ENATS.io — Cloud Native, Open Source, High-performance Messaging\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"0bf8\" class=\"os ot ho bf ou ov ow ox fg oy oz pa fj pb pc pd pe pf pg ph pi pj pk pl pm pn bk\"\u003EVersão em vídeo\u003C\u002Fh3\u003E\n\u003Cp id=\"fa19\" class=\"pw-post-body-paragraph nw nx ho ny b nz po ob oc od pp of og fk pq oi oj fn pr ol om fq ps oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EConfira a versão em vídeo desse artigo!\u003C\u002Fp\u003E\n\u003Cfigure class=\"pt pu pv pw px my\"\u003E\n\u003Cdiv class=\"py es m ee\"\u003E\n\u003Cdiv class=\"pz qa m\"\u003E\u003Ciframe class=\"eo o he dz bh\" title=\"Microsserviços em Node com o Moleculer.js\" src=\"https:\u002F\u002Fcdn.embedly.com\u002Fwidgets\u002Fmedia.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FLT9_51k-gxM%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DLT9_51k-gxM&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FLT9_51k-gxM%2Fhqdefault.jpg&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=youtube\" width=\"854\" height=\"480\" frameborder=\"0\" scrolling=\"no\" allowfullscreen=\"allowfullscreen\" data-mce-fragment=\"1\"\u003E\u003C\u002Fiframe\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cp id=\"e663\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E—\u003C\u002Fp\u003E\n\u003Ch1 id=\"5fed\" class=\"os ot ho bf ou ov ow ox fg oy oz pa fj pb pc pd pe pf pg ph pi pj pk pl pm pn bk\" data-selectable-paragraph=\"\"\u003E\u003C\u002Fh1\u003E\n","excerpt":"\u003Cp\u003EMontar um projeto na arquitetura de Microsserviços … ecossistema Node? Como tudo na tecnologia, há várias formas diferentes; no… framework Moleculer.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Farquitetura-de-microsservicos-em-node-com-o-moleculerjs","date":"23 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26181751\u002FMicrosservi%C3%A7os.jpg","externalMention":null,"author":{"id":144418,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30171243\u002Fdiego-pinho.jpg","name":"Diego Pinho","description":"Bacharel em Ciência da Computação pela PUCSP e MBA em Gestão da Tecnologia da Informação na FIAP. Autor do livro ECMAScript 6 - Entre de cabeça no futuro do JavaScript. Cofundador da Code Prestige e Community Manager no iMasters.","slug":"diegopinho","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdiegopinho","registered":"2013-08-13 18:00:53","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002FDiegoPinho","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.diegopinho.com.br","mail":"diego.pinho@imasters.com.br"},"articles_count":113,"views_count":1276900,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"},{"title":"microservices","slug":"microservices","id":4156,"link":"https:\u002F\u002Fimasters.com.br\u002Fmicroservices"},{"title":"microserviços","slug":"microservicos","id":5632,"link":"https:\u002F\u002Fimasters.com.br\u002Fmicroservicos"},{"title":"MoleculerJS","slug":"moleculerjs","id":9240,"link":"https:\u002F\u002Fimasters.com.br\u002Fmoleculerjs"},{"title":"node","slug":"node","id":236,"link":"https:\u002F\u002Fimasters.com.br\u002Fnode"},{"title":"web","slug":"web","id":327,"link":"https:\u002F\u002Fimasters.com.br\u002Fweb"}],"seo":{"open_graph":{"title":"Arquitetura de Microsserviços em Node com o MoleculerJS","description":"Montar um projeto na arquitetura de Microsserviços ... ecossistema Node? Como tudo na tecnologia, há várias formas diferentes; no... framework Moleculer.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26181751\u002FMicrosservi%C3%A7os.jpg","width":800,"height":533},"modified_time":"2025-05-26T18:31:02-03:00","published_time":"2025-06-23T09:21:06-03:00"},"twitter":{"title":"Arquitetura de Microsserviços em Node com o MoleculerJS","description":"Montar um projeto na arquitetura de Microsserviços ... ecossistema Node? Como tudo na tecnologia, há várias formas diferentes; no... framework Moleculer.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26181751\u002FMicrosservi%C3%A7os.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Farquitetura-de-microsservicos-em-node-com-o-moleculerjs","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Farquitetura-de-microsservicos-em-node-com-o-moleculerjs","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Farquitetura-de-microsservicos-em-node-com-o-moleculerjs"},"type":"post"},{"id":163608,"title":"Dica de ouro: Saiba como fazer uma navbar responsiva","content":"\u003Cp id=\"7c4b\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EHoje é praticamente impossível ter um site que não seja responsivo.\u003C\u002Fp\u003E\n\u003Cp id=\"2d82\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EExistem várias formas criativas e técnicas de lidar com responsividade (ex: Flexbox, Media Queries, CSS Grid, etc.) nos mais diferentes contextos, mas há algumas adaptações que são praticamente padrões em todos os projetos.\u003C\u002Fp\u003E\n\u003Cp id=\"27d9\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EUm claro exemplo é a navbar responsiva. Quando ela possui muitos itens, inevitavelmente se torna imprópria para o ambiente mobile, pois os itens literalmente não cabem no espaço disponível.\u003C\u002Fp\u003E\n\u003Cp id=\"1f21\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003ENessas situações, precisamos pensar em técnicas criativas. Hoje vamos aprender como fazer uma navbar responsiva minimalista e elegante usando apenas o básico HTML, CSS e um pouquinho de nada de JavaScript.\u003C\u002Fp\u003E\n\u003Cp id=\"53d7\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EPara aprendemos como fazer isso, tomaremos como exemplo a solução que apliquei no meu próprio site pessoal. Sou suspeito pra falar, mas acho que ela atendeu bem ao seu objetivo 😄\u003C\u002Fp\u003E\n\u003Cfigure class=\"os ot ou ov ow my nh ni paragraph-image\"\u003E\n\u003Cdiv class=\"nr ns ee nt bh nu\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"nh ni or\"\u003E\n\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003C\u002Fpicture\u003E\n\u003Cfigure style=\"width: 700px\" class=\"wp-caption alignnone\"\u003E\u003Cimg class=\"bh er nv c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*Gzqr6rb7ZM4yV7ZmdQnghg.gif\" alt=\"\" width=\"700\" height=\"405\" \u002F\u003E\u003Cfigcaption class=\"wp-caption-text\"\u003Efuncionamento da navbar responsiva\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cp id=\"f015\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EVamos começar criando a estrutura básica do site para desktop. Neste caso, precisamos essencialmente de três elementos HTML: uma tag <nav> para a barra de navegação, uma tag <img> para o logotipo e tags <ul> e <li> para a lista de links:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-html\"\u003E<!DOCTYPE html>\r\n<html lang=\"pt-br\">\r\n\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>Menu Responsivo<\u002Ftitle>\r\n <link rel=\"stylesheet\" href=\"style.css\">\r\n<\u002Fhead>\r\n\r\n<body>\r\n <nav class=\"navbar\">\r\n <img src=\"logo.png\" alt=\"logo\">\r\n <div class=\"navbar-links\">\r\n <ul>\r\n <li><a href=\"#\">Home<\u002Fa><\u002Fli>\r\n <li><a href=\"#\">Sobre<\u002Fa><\u002Fli>\r\n <li><a href=\"#\">Contato<\u002Fa><\u002Fli>\r\n <\u002Ful>\r\n <\u002Fdiv>\r\n <\u002Fnav>\r\n<\u002Fbody>\r\n\r\n<\u002Fhtml>\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EVamos aplicar o CSS básico para que ele funcione bem no desktop:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-css\"\u003E@import url('https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');\r\n\r\n* {\r\n box-sizing: border-box;\r\n}\r\n\r\nbody {\r\n font-family: \"Poppins\", sans-serif;\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\n.navbar {\r\n display: flex;\r\n position: relative;\r\n justify-content: space-around;\r\n align-items: center;\r\n border-bottom-color: rgb(234, 236, 243);\r\n border-bottom-style: solid;\r\n border-bottom-width: 1px;\r\n}\r\n\r\n.navbar img {\r\n width: 220px;\r\n}\r\n\r\n.navbar-links {\r\n height: 100%;\r\n}\r\n\r\n.navbar-links ul {\r\n display: flex;\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\n.navbar-links li {\r\n list-style: none;\r\n}\r\n\r\n.navbar-links li a {\r\n display: block;\r\n text-decoration: none;\r\n padding: 1rem;\r\n color: #333;\r\n font-weight: 500;\r\n}\r\n\r\n.navbar-links li:hover {\r\n background-color: #DBDBDB;\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"4485\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq pm pn po bk\" data-selectable-paragraph=\"\"\u003EAqui surge nosso primeiro problema: à medida que a tela fica menor, nossa navbar começa a transbordar horizontalmente. Esse comportamento não é desejável. Portanto, precisamos implementar o menu “hambúrguer”.\u003C\u002Fli\u003E\n\u003Cli id=\"9f60\" class=\"nw nx ho ny b nz pp ob oc od pq of og fk pr oi oj fn ps ol om fq pt oo op oq pm pn po bk\" data-selectable-paragraph=\"\"\u003EO primeiro passo para isso é adicionar no HTML o botão que corresponderá ao menu e as opções que ele oferecerá. Há diferentes maneiras de criamos esse botão, por ora, faremos ela na “mão”:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-html\"\u003E<!DOCTYPE html>\r\n<html lang=\"pt-br\">\r\n\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>Menu Responsivo<\u002Ftitle>\r\n <link rel=\"stylesheet\" href=\"style.css\">\r\n<\u002Fhead>\r\n\r\n<body>\r\n <nav class=\"navbar\">\r\n <img src=\"logo.png\" alt=\"logo\">\r\n <a href=\"#\" class=\"toggle-button\">\r\n <span class=\"bar\"><\u002Fspan>\r\n <span class=\"bar\"><\u002Fspan>\r\n <span class=\"bar\"><\u002Fspan>\r\n <\u002Fa>\r\n <div class=\"navbar-links\">\r\n <ul>\r\n <li><a href=\"#\">Home<\u002Fa><\u002Fli>\r\n <li><a href=\"#\">Sobre<\u002Fa><\u002Fli>\r\n <li><a href=\"#\">Contato<\u002Fa><\u002Fli>\r\n <\u002Ful>\r\n <\u002Fdiv>\r\n <\u002Fnav>\r\n\r\n <script src=\"script.js\"><\u002Fscript>\r\n<\u002Fbody>\r\n\r\n<\u002Fhtml>\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAgora vamos adicionar o CSS que vai construí-lo adequadamente na tela:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-css\"\u003E.toggle-button {\r\n position: absolute;\r\n top: .75rem;\r\n right: 1rem;\r\n display: none;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n width: 30px;\r\n height: 21px;\r\n}\r\n\r\n.toggle-button .bar {\r\n height: 3px;\r\n width: 100%;\r\n background-color: #333;\r\n border-radius: 10px;\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"c2d6\" class=\"nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq pm pn po bk\" data-selectable-paragraph=\"\"\u003EAgora temos que ajustar para que ele apareça somente quando o dispositivo tiver a tela pequena. Para isso, precisaremos das Media Queries.\u003C\u002Fli\u003E\n\u003Cli id=\"7579\" class=\"nw nx ho ny b nz pp ob oc od pq of og fk pr oi oj fn ps ol om fq pt oo op oq pm pn po bk\" data-selectable-paragraph=\"\"\u003EAs media queries funcionam como condicionais dentro do nosso código CSS. Desta forma, conseguimos trabalhar com condições para que um elemento apareça ou não. Vamos ver como fica nosso exemplo:\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-css\"\u003E@media (max-width: 800px) {\r\n .navbar {\r\n flex-direction: column;\r\n align-items: center;\r\n }\r\n\r\n .toggle-button {\r\n display: flex;\r\n }\r\n\r\n .navbar-links {\r\n display: none;\r\n width: 100%;\r\n }\r\n\r\n .navbar-links ul {\r\n width: 100%;\r\n flex-direction: column;\r\n }\r\n\r\n .navbar-links ul li {\r\n text-align: center;\r\n }\r\n\r\n .navbar-links ul li a {\r\n padding: .5rem 1rem;\r\n }\r\n\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EAgora temos mais um problema para resolver. Ao clicar no menu, queremos que os itens apareçam e quando clicarmos novamente, que eles sumam. É neste momento que precisaremos da ajuda do JavaScript!\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003Econst toggleButton = document.getElementsByClassName(\"toggle-button\")[0];\r\nconst navbarLinks = document.getElementsByClassName(\"navbar-links\")[0];\r\n\r\ntoggleButton.addEventListener(\"click\", () => {\r\n navbarLinks.classList.toggle(\"active\");\r\n});\r\n\r\n.navbar-links.active {\r\n display: flex;\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"f2c6\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EE pronto! Temos nossa navbar responsiva lindona! Basta adaptar os textos, opções, tamanhos e afins para melhor se adequar ao seu projeto! 😀\u003C\u002Fp\u003E\n\u003Cp id=\"03d4\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E—\u003C\u002Fp\u003E\n\u003Ch3 id=\"afc0\" class=\"pu ph ho bf pv pw px py fg pz qa qb fj qc qd qe qf qg qh qi qj qk ql qm qn qo bk\"\u003ERepositório\u003C\u002Fh3\u003E\n\u003Cp id=\"1648\" class=\"pw-post-body-paragraph nw nx ho ny b nz qp ob oc od qq of og fk qr oi oj fn qs ol om fq qt oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E\u003Ca class=\"ag qu\" href=\"https:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fmenu-responsivo\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003Ehttps:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fmenu-responsivo\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"f388\" class=\"pu ph ho bf pv pw px py fg pz qa qb fj qc qd qe qf qg qh qi qj qk ql qm qn qo bk\"\u003EAgradecimentos\u003C\u002Fh3\u003E\n\u003Cp id=\"932d\" class=\"pw-post-body-paragraph nw nx ho ny b nz qp ob oc od qq of og fk qr oi oj fn qs ol om fq qt oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EGostou deste conteúdo? Então curta e compartilhe! 👏\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EExistem várias formas criativas e técnicas de lidar com responsividade (ex: Flexbox, Media Queries, CSS Grid)… Um claro exemplo é a navbar responsiva.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-fazer-uma-navbar-responsiva","date":"11 jun, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26163321\u002FDesenvolvimento.jpg","externalMention":null,"author":{"id":144418,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30171243\u002Fdiego-pinho.jpg","name":"Diego Pinho","description":"Bacharel em Ciência da Computação pela PUCSP e MBA em Gestão da Tecnologia da Informação na FIAP. Autor do livro ECMAScript 6 - Entre de cabeça no futuro do JavaScript. Cofundador da Code Prestige e Community Manager no iMasters.","slug":"diegopinho","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdiegopinho","registered":"2013-08-13 18:00:53","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002FDiegoPinho","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.diegopinho.com.br","mail":"diego.pinho@imasters.com.br"},"articles_count":113,"views_count":1276900,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Desenvolvimento","slug":"desenvolvimento","id":7234,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento"}],"tags":[{"title":"CSS","slug":"css","id":4250,"link":"https:\u002F\u002Fimasters.com.br\u002Fcss"},{"title":"desenvolvimento","slug":"desenvolvimento-2","id":186,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento-2"},{"title":"desenvolvimento web","slug":"desenvolvimento-web","id":5269,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento-web"},{"title":"html","slug":"html-2","id":405,"link":"https:\u002F\u002Fimasters.com.br\u002Fhtml-2"},{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"}],"seo":{"open_graph":{"title":"Dica de ouro: Saiba como fazer uma navbar responsiva","description":"Existem várias formas criativas e técnicas de lidar com responsividade (ex: Flexbox, Media Queries, CSS Grid)... Um claro exemplo é a navbar responsiva.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26163321\u002FDesenvolvimento.jpg","width":800,"height":533},"modified_time":"2025-05-26T17:20:04-03:00","published_time":"2025-06-11T09:21:48-03:00"},"twitter":{"title":"Dica de ouro: Saiba como fazer uma navbar responsiva","description":"Existem várias formas criativas e técnicas de lidar com responsividade (ex: Flexbox, Media Queries, CSS Grid)... Um claro exemplo é a navbar responsiva.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26163321\u002FDesenvolvimento.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-fazer-uma-navbar-responsiva","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-fazer-uma-navbar-responsiva","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-fazer-uma-navbar-responsiva"},"type":"post"},{"id":163600,"title":"Elementos Fantasmas: O truque de UX para carregamentos mais rápidos!","content":"\u003Cp id=\"a3ff\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003ENão tem nada pior para a experiência do usuário do que acessar um site e ter a tela vazia por vários segundos porque o conteúdo está sendo carregado.\u003C\u002Fp\u003E\n\u003Cp id=\"3013\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EÉ claro que há muitas situações em que mesmo com os nossos melhores esforços, o site vai demorar pra carregar. É o caso, por exemplo, de conexões rápidas.\u003C\u002Fp\u003E\n\u003Cp id=\"c8a2\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E\u003Cstrong class=\"ny hp\"\u003EO que fazer para nosso o usuário ter uma percepção de que o site está mais rápido mesmo para situações de lentidão?\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"9fcb\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EÉ nestas situações que usamos o elementos fantasmas! (bu!) 👻\u003C\u002Fp\u003E\n\u003Cp id=\"af33\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003ENeste artigo te explico passo a passo como você também pode implementar no seu site! É mais fácil do que parece 🙂\u003C\u002Fp\u003E\n\u003Ch2\u003EElementos Fantasmas\u003C\u002Fh2\u003E\n\u003Cp id=\"d5a7\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EOs elementos fantasmas nada mais são do que alguns placeholders com animação que substituem o verdadeiro conteúdo do site enquanto ele ainda não carregou.\u003C\u002Fp\u003E\n\u003Cp id=\"282a\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EVocê já deve ter visto isso inúmeras vezes nas redes sociais, por exemplo:\u003C\u002Fp\u003E\n\u003Cfigure class=\"ps pt pu pv pw my nh ni paragraph-image\"\u003E\n\u003Cdiv class=\"nh ni qf\"\u003E\n\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F0*X0SQ_nprcmbKt6Ad.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F0*X0SQ_nprcmbKt6Ad.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F0*X0SQ_nprcmbKt6Ad.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F0*X0SQ_nprcmbKt6Ad.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F0*X0SQ_nprcmbKt6Ad.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F0*X0SQ_nprcmbKt6Ad.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F0*X0SQ_nprcmbKt6Ad.png 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F0*X0SQ_nprcmbKt6Ad.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F0*X0SQ_nprcmbKt6Ad.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F0*X0SQ_nprcmbKt6Ad.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F0*X0SQ_nprcmbKt6Ad.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F0*X0SQ_nprcmbKt6Ad.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F0*X0SQ_nprcmbKt6Ad.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F0*X0SQ_nprcmbKt6Ad.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003C\u002Fpicture\u003E\n\u003Cfigure style=\"width: 700px\" class=\"wp-caption alignnone\"\u003E\u003Cimg class=\"bh er nv c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F0*X0SQ_nprcmbKt6Ad.png\" alt=\"\" width=\"700\" height=\"335\" \u002F\u003E\u003Cfigcaption class=\"wp-caption-text\"\u003EElementos fantasmas no LinkedIn\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cp id=\"4deb\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EEssas estratégia é muito boa porque dá percepção pro seu usuário de que o site já está carregando uma série de informações, diferente do que acontece quando não mostramos nada ou simplesmente mostramos uma rodinha de loading. Cria uma percepção de carregamento mais rápido.\u003C\u002Fp\u003E\n\u003Cp id=\"a101\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EFelizmente o processo para criarmos este efeito é relativamente simples. Primeiramente, precisamos entender como é o nosso conteúdo carregado. Neste exemplo, farei este post aqui:\u003C\u002Fp\u003E\n\u003Cp id=\"3e6f\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EO código que corresponde a este post é este:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-html\"\u003E<!DOCTYPE html>\r\n<html lang=\"pt-br\">\r\n\r\n<head>\r\n <meta charset=\"UTF-8\" \u002F>\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" \u002F>\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \u002F>\r\n <link rel=\"stylesheet\" href=\"styles.css\" \u002F>\r\n <title>Ghost Elements<\u002Ftitle>\r\n<\u002Fhead>\r\n\r\n<body>\r\n <div class=\"container\">\r\n <template id=\"card-template\">\r\n <a class=\"card\" id=\"card-link\" target=\"_blank\">\r\n <!-- header -->\r\n <div class=\"card-header\">\r\n <div>\r\n <img class=\"header-img\" id=\"logo-img\" alt=\"\" \u002F>\r\n <\u002Fdiv>\r\n <h3 class=\"card-header header-title\" id=\"card-title\">\r\n <\u002Fh3>\r\n <\u002Fdiv>\r\n\r\n <!-- body -->\r\n <div class=\"card-body\">\r\n <div class=\"card-body body-text\" id=\"card-details\">\r\n <\u002Fdiv>\r\n\r\n <div class=\"card-body body-img\">\r\n <img alt=\"\" id=\"cover-img\" \u002F>\r\n <\u002Fdiv>\r\n <\u002Fdiv>\r\n <\u002Fa>\r\n <\u002Ftemplate>\r\n <\u002Fdiv>\r\n\r\n <script src=\"script.js\"><\u002Fscript>\r\n<\u002Fbody>\r\n\r\n<\u002Fhtml>\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003EComo desejamos este conteúdo dinamicamente, vamos codar o nosso JavaScript:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-javascript\"\u003Edocument.addEventListener('DOMContentLoaded', () => {\r\n const QTD_POSTS = 1;\r\n const container = document.querySelector(\".container\");\r\n const cardTemplate = document.querySelector(\"#card-template\");\r\n for (let i = 0; i < QTD_POSTS; i++) {\r\n container.append(cardTemplate.content.cloneNode(true));\r\n }\r\n\r\n fetch(\"data.json\")\r\n .then((response) => response.json())\r\n .then((posts) => {\r\n container.innerHTML = \"\";\r\n posts.forEach((post) => {\r\n const { title, details, coverImage, logoImage, link } = post;\r\n\r\n const div = cardTemplate.content.cloneNode(true);\r\n div.querySelector(\"#card-link\").href = link;\r\n div.querySelector(\"#logo-img\").src = logoImage;\r\n div.querySelector(\"#card-title\").textContent = title;\r\n div.querySelector(\"#card-details\").textContent = details;\r\n div.querySelector(\"#cover-img\").src = coverImage;\r\n container.append(div);\r\n });\r\n });\r\n})\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"2ee2\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003ESe rodarmos o site localmente do jeito como está, é quase imperceptível o tempo de carregamento. Para ter uma melhor ideia da experiência do usuário, precisamos usar acessar a aba de Network e alterar o tipo de conexão. Usarei 3G.\u003C\u002Fp\u003E\n\u003Cfigure class=\"ps pt pu pv pw my nh ni paragraph-image\"\u003E\n\u003Cdiv class=\"nr ns ee nt bh nu\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"nh ni qq\"\u003E\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*k13Yd55r91zAIcZaMGoAKw.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*k13Yd55r91zAIcZaMGoAKw.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*k13Yd55r91zAIcZaMGoAKw.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*k13Yd55r91zAIcZaMGoAKw.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*k13Yd55r91zAIcZaMGoAKw.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*k13Yd55r91zAIcZaMGoAKw.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F1*k13Yd55r91zAIcZaMGoAKw.png 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*k13Yd55r91zAIcZaMGoAKw.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*k13Yd55r91zAIcZaMGoAKw.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*k13Yd55r91zAIcZaMGoAKw.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*k13Yd55r91zAIcZaMGoAKw.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*k13Yd55r91zAIcZaMGoAKw.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*k13Yd55r91zAIcZaMGoAKw.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F1*k13Yd55r91zAIcZaMGoAKw.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003Cimg class=\"bh er nv c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*k13Yd55r91zAIcZaMGoAKw.png\" alt=\"\" width=\"700\" height=\"404\" \u002F\u003E\u003C\u002Fpicture\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cp id=\"067f\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EA experiência atual é meio esquisita. Temos uma caixa vazia por um tempo e do nada o elemento do site é carregado. Não está bom assim. Vamos adicionar alguns elementos fantasmas para melhorar essa experiência.\u003C\u002Fp\u003E\n\u003Cp id=\"7201\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EVamos começar pensar nos elementos fantasmas que desejamos inserir com base no resultado final que teremos. Para este post, eu identifiquei quatro fantasminhas:\u003C\u002Fp\u003E\n\u003Cfigure class=\"ps pt pu pv pw my nh ni paragraph-image\"\u003E\n\u003Cdiv class=\"nr ns ee nt bh nu\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"nh ni qr\"\u003E\n\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003C\u002Fpicture\u003E\n\u003Cfigure style=\"width: 700px\" class=\"wp-caption alignnone\"\u003E\u003Cimg class=\"bh er nv c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*9-tS0RGtjI8wswnQ_rLs0A.png\" alt=\"\" width=\"700\" height=\"388\" \u002F\u003E\u003Cfigcaption class=\"wp-caption-text\"\u003EElementos fantasmas que substituem os elementos reais\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cp id=\"acd4\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EDentro do nosso HTML, vamos adicionar alguns destes elementos:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-html\"\u003E<!DOCTYPE html>\r\n<html lang=\"pt-br\">\r\n\r\n<head>\r\n <meta charset=\"UTF-8\" \u002F>\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" \u002F>\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \u002F>\r\n <link rel=\"stylesheet\" href=\"styles.css\" \u002F>\r\n <title>Ghost Elements<\u002Ftitle>\r\n<\u002Fhead>\r\n\r\n<body>\r\n <div class=\"container\">\r\n <template id=\"card-template\">\r\n <a class=\"card\" id=\"card-link\" target=\"_blank\">\r\n <!-- header -->\r\n <div class=\"card-header\">\r\n <div>\r\n <img class=\"header-img ghost\" id=\"logo-img\" alt=\"\" \u002F>\r\n <\u002Fdiv>\r\n <h3 class=\"card-header header-title\" id=\"card-title\">\r\n <div class=\"ghost ghost-text\"><\u002Fdiv>\r\n <div class=\"ghost ghost-text\"><\u002Fdiv>\r\n <\u002Fh3>\r\n <\u002Fdiv>\r\n\r\n <!-- body -->\r\n <div class=\"card-body\">\r\n <div class=\"card-body body-text\" id=\"card-details\">\r\n <div class=\"ghost ghost-text ghost-text-body\"><\u002Fdiv>\r\n <\u002Fdiv>\r\n\r\n <div class=\"card-body body-img\">\r\n <img class=\"ghost\" alt=\"\" id=\"cover-img\" \u002F>\r\n <\u002Fdiv>\r\n <\u002Fdiv>\r\n <\u002Fa>\r\n <\u002Ftemplate>\r\n <\u002Fdiv>\r\n\r\n <script src=\"script.js\"><\u002Fscript>\r\n<\u002Fbody>\r\n\r\n<\u002Fhtml>\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"da7c\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003ERepare em todos os lugares em que adicionar as classes \u003Cstrong class=\"ny hp\"\u003Eghost\u003C\u002Fstrong\u003E.\u003C\u002Fp\u003E\n\u003Cp id=\"51bd\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EVamos partir para o CSS:\u003C\u002Fp\u003E\n\u003Cpre\u003E\u003Ccode class=\"line-numbers language-css\"\u003E.ghost {\r\n animation: ghost-loading 1s linear infinite alternate;\r\n}\r\n\r\n@keyframes ghost-loading {\r\n 0% {\r\n background-color: #c2cfd6;\r\n }\r\n\r\n 100% {\r\n background-color: #f0f3f5;\r\n }\r\n}\r\n\r\n.ghost-text {\r\n width: 100%;\r\n height: 0.7rem;\r\n margin-bottom: 0.5rem;\r\n border-radius: 0.25rem;\r\n}\r\n\r\n.ghost-text-body {\r\n width: 75%;\r\n}\r\n\r\nimg[alt] {\r\n text-indent: -10000px;\r\n}\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"67fd\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EAo rodar o site em uma conexão lenta, agora teremos outra experiência:\u003C\u002Fp\u003E\n\u003Cfigure class=\"ps pt pu pv pw my nh ni paragraph-image\"\u003E\n\u003Cdiv class=\"nh ni qs\"\u003E\n\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1292\u002Fformat:webp\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 1292w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 646px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1292\u002F1*yKi0UJo4FootqNb1nWP7Lg.png 1292w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 646px\" data-testid=\"og\" \u002F\u003E\u003C\u002Fpicture\u003E\n\u003Cfigure style=\"width: 646px\" class=\"wp-caption alignnone\"\u003E\u003Cimg class=\"bh er nv c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:808\u002F1*yKi0UJo4FootqNb1nWP7Lg.png\" alt=\"\" width=\"646\" height=\"364\" \u002F\u003E\u003Cfigcaption class=\"wp-caption-text\"\u003EElemento fantasma em ação\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cp id=\"9a15\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EO segredo está na animação ghost-loading. Esta animação na caixinha onde o conteúdo será carregado chama a atenção do usuário e faz com que a percepção de tempo de carregamento seja menor!\u003C\u002Fp\u003E\n\u003Cp id=\"9a4d\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E—\u003C\u002Fp\u003E\n\u003Ch3 id=\"8568\" class=\"or os ho bf ot ou ov ow fg ox oy oz fj pa pb pc pd pe pf pg ph pi pj pk pl pm bk\"\u003ERepositório\u003C\u002Fh3\u003E\n\u003Cp id=\"eaca\" class=\"pw-post-body-paragraph nw nx ho ny b nz pn ob oc od po of og fk pp oi oj fn pq ol om fq pr oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E\u003Ca class=\"ag qt\" href=\"https:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fghost-elements-loader\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003Ehttps:\u002F\u002Fgithub.com\u002FProfessor-DiegoPinho\u002Fghost-elements-loader\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"1a75\" class=\"or os ho bf ot ou ov ow fg ox oy oz fj pa pb pc pd pe pf pg ph pi pj pk pl pm bk\"\u003EAgradecimentos\u003C\u002Fh3\u003E\n\u003Cp id=\"ec15\" class=\"pw-post-body-paragraph nw nx ho ny b nz pn ob oc od po of og fk pp oi oj fn pq ol om fq pr oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EGostou deste conteúdo? Então curta, compartilhe e se inscreva na publicação para não perder nada! 👏\u003C\u002Fp\u003E\n\u003Cp id=\"b404\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E—\u003C\u002Fp\u003E\n\u003Ch3 id=\"c526\" class=\"or os ho bf ot ou ov ow fg ox oy oz fj pa pb pc pd pe pf pg ph pi pj pk pl pm bk\"\u003EVersão em vídeo\u003C\u002Fh3\u003E\n\u003Cp id=\"bc26\" class=\"pw-post-body-paragraph nw nx ho ny b nz pn ob oc od po of og fk pp oi oj fn pq ol om fq pr oo op oq gp bk\" data-selectable-paragraph=\"\"\u003EConfira a versão em vídeo desse artigo!\u003C\u002Fp\u003E\n\u003Cfigure class=\"ps pt pu pv pw my\"\u003E\n\u003Cdiv class=\"px es m ee\"\u003E\n\u003Cdiv class=\"py pz m\"\u003E\u003Ciframe class=\"eo o he dz bh\" title=\"Elementos Fantasmas: O Truque de UX para Carregamentos Mais Rápidos!\" src=\"https:\u002F\u002Fcdn.embedly.com\u002Fwidgets\u002Fmedia.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FdklTHU9I48M%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DdklTHU9I48M&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FdklTHU9I48M%2Fhqdefault.jpg&type=text%2Fhtml&schema=youtube\" width=\"854\" height=\"480\" frameborder=\"0\" scrolling=\"no\" allowfullscreen=\"allowfullscreen\" data-mce-fragment=\"1\"\u003E\u003C\u002Fiframe\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\u003Cfigcaption class=\"qa qb qc nh ni qd qe bf b bg ab dx\"\u003EBu!\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cp id=\"f9ba\" class=\"pw-post-body-paragraph nw nx ho ny b nz oa ob oc od oe of og fk oh oi oj fn ok ol om fq on oo op oq gp bk\" data-selectable-paragraph=\"\"\u003E—\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ENão tem nada pior para a experiência do usuário do que acessar um site e ter a tela vazia… É nestas situações que usamos o elementos fantasmas! (bu!) 👻\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Felementos-fantasmas-o-truque-de-ux-para-carregamentos-mais-rapidos","date":"28 mai, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F26160514\u002FDesenvolvimento.jpg","externalMention":null,"author":{"id":144418,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30171243\u002Fdiego-pinho.jpg","name":"Diego Pinho","description":"Bacharel em Ciência da Computação pela PUCSP e MBA em Gestão da Tecnologia da Informação na FIAP. Autor do livro ECMAScript 6 - Entre de cabeça no futuro do JavaScript. Cofundador da Code Prestige e Community Manager no iMasters.","slug":"diegopinho","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdiegopinho","registered":"2013-08-13 18:00:53","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002FDiegoPinho","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.diegopinho.com.br","mail":"diego.pinho@imasters.com.br"},"articles_count":113,"views_count":1276900,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"CSS","slug":"css","id":7219,"link":"https:\u002F\u002Fimasters.com.br\u002Fcss"},{"title":"Desenvolvimento","slug":"desenvolvimento","id":7234,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento"},{"title":"HTML","slug":"html","id":7221,"link":"https:\u002F\u002Fimasters.com.br\u002Fhtml"},{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"desenvolvimento","slug":"desenvolvimento-2","id":186,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento-2"},{"title":"desenvolvimento web","slug":"desenvolvimento-web","id":5269,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento-web"},{"title":"Elementos Fantasmas","slug":"elementos-fantasmas","id":9237,"link":"https:\u002F\u002Fimasters.com.br\u002Felementos-fantasmas"},{"title":"ghost","slug":"ghost","id":3176,"link":"https:\u002F\u002Fimasters.com.br\u002Fghost"},{"title":"ghost-loading","slug":"ghost-loading","id":9238,"link":"https:\u002F\u002Fimasters.com.br\u002Fghost-loading"},{"title":"html","slug":"html-2","id":405,"link":"https:\u002F\u002Fimasters.com.br\u002Fhtml-2"},{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"},{"title":"placeholders","slug":"placeholders","id":9239,"link":"https:\u002F\u002Fimasters.com.br\u002Fplaceholders"}],"seo":{"open_graph":{"title":"Elementos Fantasmas: O truque de UX para carregamentos mais rápidos!","description":"Não tem nada pior para a experiência do usuário do que acessar um site e ter a tela vazia... É nestas situações que usamos o elementos fantasmas! (bu!) 👻","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F26160514\u002FDesenvolvimento.jpg","width":800,"height":533},"modified_time":"2025-05-26T16:06:23-03:00","published_time":"2025-05-28T09:35:38-03:00"},"twitter":{"title":"Elementos Fantasmas: O truque de UX para carregamentos mais rápidos!","description":"Não tem nada pior para a experiência do usuário do que acessar um site e ter a tela vazia... É nestas situações que usamos o elementos fantasmas! (bu!) 👻","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F26160514\u002FDesenvolvimento.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Felementos-fantasmas-o-truque-de-ux-para-carregamentos-mais-rapidos","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Felementos-fantasmas-o-truque-de-ux-para-carregamentos-mais-rapidos","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Felementos-fantasmas-o-truque-de-ux-para-carregamentos-mais-rapidos"},"type":"post"},{"id":163545,"title":"Como criar um fluxo de RAG utilizando 100% os recursos do Databricks","content":"\u003Cp id=\"ember51\" class=\"ember-view reader-text-block__paragraph\"\u003ETodo engenheiro de dados (Data Engineer) e desenvolvedor de software (Software Engineer) está ou vai estar muito “Harmonizado” e na minha visão deve estar engajado com o desenvolvimento de soluções de AI. Ok, tudo bem, neste artigo vou mirar mais no meu publico que são os Data Analytics Engineer, Data Architech, Data Engineer, DBRE etc.. mas você, desenvolvedor, vai precisar saber disso também. Mas, por que, então, vou escrever esse artigo mais para o publico de Data? Bom por que aqui no Brasil, o Databricks é massivamente utilizado para questões de Data e não desenvolvimento de software. Contudo, todos de tecnologia devem saber o conceito de RAG e, neste artigo, vou ensinar como fazer um fluxo de RAG completo utilizando 100% o Databricks e todos os recursos que ele já oferece para tornar isso possível.\u003C\u002Fp\u003E\n\u003Cp id=\"ember52\" class=\"ember-view reader-text-block__paragraph\"\u003EVamos nessa introdução clássica para conseguir aprofundar no tema: o que é RAG?\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember53\" class=\"ember-view reader-text-block__heading-3\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EO que é RAG?\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp id=\"ember54\" class=\"ember-view reader-text-block__paragraph\"\u003ERAG é uma arquitetura que combina um componente de recuperação de informação com um modelo generativo. Quando uma pergunta é feita, o sistema primeiro busca documentos ou trechos de texto relevantes de uma base de conhecimento. Em seguida, esses documentos recuperados são fornecidos como contexto adicional ao LLM, que então gera uma resposta mais informada e precisa.\u003C\u002Fp\u003E\n\u003Cp id=\"ember55\" class=\"ember-view reader-text-block__paragraph\"\u003EResumindo, ele alimenta uma AI com informações da sua empresa, o que digamos que é uma coisa MUITO NECESSARIA.\u003C\u002Fp\u003E\n\u003Ch3 id=\"ember56\" class=\"ember-view reader-text-block__heading-3\"\u003EPor que Databricks para RAG?\u003C\u002Fh3\u003E\n\u003Cp id=\"ember57\" class=\"ember-view reader-text-block__paragraph\"\u003EA Databricks Data Intelligence Platform oferece diversas vantagens para a construção de sistemas RAG:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EUnified Data Lakehouse:\u003C\u002Fstrong\u003E Armazene, processe e gerencie todos os tipos de dados (estruturados, semiestruturados e não estruturados) em um único local com Delta Lake.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EProcessamento Escalável:\u003C\u002Fstrong\u003E Utilize Apache Spark para processamento de dados em larga escala, essencial para lidar com grandes volumes de texto.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EGerenciamento de Modelos:\u003C\u002Fstrong\u003E MLflow e Databricks Model Serving simplificam o rastreamento, versionamento, implantação e monitoramento de modelos de embedding e LLMs.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EVector Search (Busca Vetorial):\u003C\u002Fstrong\u003E Databricks oferece soluções nativas para busca vetorial, permitindo a criação e consulta eficiente de índices de embeddings.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EUnity Catalog:\u003C\u002Fstrong\u003E Governança de dados, linhagem e descoberta de ativos em todo o seu pipeline de RAG.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EWorkflows:\u003C\u002Fstrong\u003E Orquestre pipelines complexos de RAG de forma programática.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ENotebooks e Colaboração:\u003C\u002Fstrong\u003E Ambiente interativo para desenvolvimento, experimentação e colaboração.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EModel serving Endpoint:\u003C\u002Fstrong\u003ERegistra seu modelo e provisiona como uma API com varias pequenas features como monitoria, threshold, Guardrails entre outras funcionalidades.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch2 id=\"ember59\" class=\"ember-view reader-text-block__heading-3\"\u003EEtapas para Construir um Pipeline RAG no Databricks\u003C\u002Fh2\u003E\n\u003Cp id=\"ember60\" class=\"ember-view reader-text-block__paragraph\"\u003EVamos detalhar as etapas envolvidas na criação de um sistema RAG no Databricks:\u003C\u002Fp\u003E\n\u003Cp id=\"ember61\" class=\"ember-view reader-text-block__paragraph\"\u003EBom, aqui eu espero que todos já saibam montar delta tables, tipos de arquitetura de dados, medalion etc… certo? Então, você tem lá várias tabelas gold que representam por exemplo, um sistema de chamados, algumas são comentários dos chamados, outras somente o que é o chamado, etc..\u003C\u002Fp\u003E\n\u003Cp id=\"ember62\" class=\"ember-view reader-text-block__paragraph\"\u003ESe você receber o desafio de construir uma AI que compreenda bem melhor os tipos e o que e como estão os chamados abertos para sua empresa, como devemos começar?\u003C\u002Fp\u003E\n\u003Cp id=\"ember63\" class=\"ember-view reader-text-block__paragraph\"\u003EPrimeiramente, uma Gold no estilo OBT – One big Table, que tenha todo o sistema de chamado em uma única tabela. Legal, a partir disso, é necessário fazer algumas analises exploratórias, principalmente nas colunas valiosas para sua AI, que são: titulo do chamado, tipo do chamado, data de abertura, data de resolução e comentários (iteração entre o solicitante e o atendente).\u003C\u002Fp\u003E\n\u003Cp class=\"ember-view reader-text-block__paragraph\"\u003EMas já não é uma Gold, por quê preciso fazer essa análise como uma espécie de limpeza de dados? Pois é, meu caro, AI não chegou a passos curtos…. Digo isso para empresas que já têm seu Datalake, Data warehouse, Data hub, enfim, para quem está nascendo, já pensa em AI. Como eu li recentemente sobre o Nubank “\u003Ca href=\"https:\u002F\u002Foglobo.globo.com\u002Frio\u002Fweb-summit-rio\u002Fpost\u002F2024\u002F04\u002Fnubank-diz-que-agora-e-ai-first-e-ve-ponto-de-inflexao-nos-usos-da-inteligencia-artificial.ghtml\"\u003ESomos uma empresa AI-First\u003C\u002Fa\u003E“.\u003C\u002Fp\u003E\n\u003Cp id=\"ember64\" class=\"ember-view reader-text-block__paragraph\"\u003EEntão, vamos lá entender os dados para ficar bonitinho para nosso banco vetorial.\u003C\u002Fp\u003E\n\u003Ch2 id=\"ember65\" class=\"ember-view reader-text-block__heading-2\"\u003EAnálises Exploratórias (EDA):\u003C\u002Fh2\u003E\n\u003Ch3 id=\"ember66\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003ECompreensão da Estrutura dos Dados:\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003EIdentifique os campos relevantes: Título do chamado, descrição, comentários, status (aberto, em andamento, resolvido, fechado), data de criação, data de resolução, prioridade, categoria, tags, logs de sistema, anexos.\u003C\u002Fli\u003E\n\u003Cli\u003EAnalise a distribuição de chamados por status, prioridade, categoria.\u003C\u002Fli\u003E\n\u003Cli\u003EVerifique a completude dos campos: Quais campos possuem muitos valores ausentes\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 id=\"ember68\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003EAnálise do Conteúdo Textual:\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003ETamanho do Texto:\u003C\u002Fstrong\u003E Verifique a distribuição do comprimento das descrições e comentários. Isso ajudará a definir estratégias de chunking.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ELinguagem:\u003C\u002Fstrong\u003E Identifique os idiomas presentes nos chamados. Se houver múltiplos idiomas, pode ser necessário traduzir ou usar modelos de embedding multilíngues.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EQualidade do Texto:\u003C\u002Fstrong\u003E Procure por erros de digitação, abreviações comuns, jargões específicos do domínio.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EPresença de Formatação Especial:\u003C\u002Fstrong\u003E Tickets frequentemente contêm HTML, Markdown, snippets de código, stack traces ou URLs. Decida como tratar esses elementos (remover, extrair, converter para texto puro).\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EIdentificação de PII (Informações de Identificação Pessoal):\u003C\u002Fstrong\u003E Busque por nomes, emails, telefones, CPFs, etc., que precisam ser anonimizados ou removidos.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"ember70\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003EAnálise Temporal:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003EComo o volume de chamados varia ao longo do tempo?\u003C\u002Fli\u003E\n\u003Cli\u003EExistem padrões sazonais ou tendências?\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"ember72\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003ERelações entre Chamados:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003EIdentifique chamados duplicados ou relacionados.\u003C\u002Fli\u003E\n\u003Cli\u003EAnalise o fluxo de resolução: Quais são as etapas comuns?\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"ember74\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003ELimpeza de Dados:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003ERemoção\u002FAnonimização de PII:\u003C\u002Fstrong\u003E Utilize técnicas como regex, bibliotecas de detecção de PII (ex: presidio) ou serviços cognitivos para identificar e mascarar\u002Fremover dados sensíveis.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ETratamento de HTML\u002FMarkdown:\u003C\u002Fstrong\u003E Use bibliotecas como BeautifulSoup (Python) para remover tags HTML e extrair o texto puro, ou converter Markdown para texto.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"ember76\" class=\"ember-view reader-text-block__paragraph\"\u003EConfesso que muitos não consigo tirar conclusões, mas sigo a receita. Feito isso, agora seus dados estão prontos para os termos que podem ser novos para você, como: chunking, embeding, vetorização. Mas antes disso é importante você fazer uma última coisa com os dados dessa tabela, unificar as informações importantes em uma única coluna, que normalmente chamamos de content. Ela, em nosso caso, terá na ordem titulo do chamado, descrição do chamado e depois toda iteração do chamado, identificando o que foi uma pergunta e o que foi uma resposta, ou seja, solicitante e atendente.\u003C\u002Fp\u003E\n\u003Cp id=\"ember77\" class=\"ember-view reader-text-block__paragraph\"\u003EAgora, sim, vamos para a codificação:\u003C\u002Fp\u003E\n\u003Ch2 id=\"ember78\" class=\"ember-view reader-text-block__heading-2\"\u003E1. Realizar o chunk da coluna content:\u003C\u002Fh2\u003E\n\u003Cp id=\"ember79\" class=\"ember-view reader-text-block__paragraph\"\u003EVou explicar rapidinho o que é chunk: “chunk” se refere a um segmento de texto menor e mais gerenciável, extraído de um documento maior, para facilitar a busca e recuperação de informações relevantes. Quer saber mais, vai no \u003Ca class=\"pcwxHzJDNtENtbMWLKRJNYNnhxmaIdvrpU \" tabindex=\"0\" href=\"http:\u002F\u002Fperplexity.ai\u002F\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003Eperplexity.ai\u003C\u002Fa\u003E e busca (\u003Cstrong\u003Egoogle não, virou Kodak\u003C\u002Fstrong\u003E).\u003C\u002Fp\u003E\n\u003Cp id=\"ember80\" class=\"ember-view reader-text-block__paragraph\"\u003EComo fazer o Chunk? Bom, existe um framework, que você vai ouvir falar muito, chamado langchain, que já tem diversos tipos de chunks prontinhos para realizarmos. Neste caso, o código será:\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\n\u003Cfigure style=\"width: 639px\" class=\"wp-caption alignnone\"\u003E\u003Cimg id=\"ember81\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQFSV4_x0EwRdA\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbbQdDSHsAU-\u002F0\u002F1747435248432?e=1753315200&v=beta&t=_irwrN-RiAdhkUiTvKfZtNVn9STT3rScmPanCF2OBFc\" alt=\"Conteúdo do artigo\" width=\"639\" height=\"1500\" \u002F\u003E\u003Cfigcaption class=\"wp-caption-text\"\u003EImagem gerada da minha função com langchain para Chunk\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\u003Cfigcaption class=\"reader-image-block__figure-image-caption display-block full-width text-body-small-open t-sans text-align-center t-black--light\"\u003E\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember82\" class=\"ember-view reader-text-block__paragraph\"\u003EBacana, não? E o mais bacana é que eu só escrevo bacana, mas não falo bacana, enfim. O que estamos fazendo aí, para quem não entendeu, além da enxurrada de comentários:\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003EValidação da Entrada:\u003C\u002Fstrong\u003E Primeiro, ele verifica se o texto fornecido (texto_concatenado) é válido (não é nulo, vazio ou de um tipo diferente de string). Se não for, retorna uma lista vazia.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ERemoção de Duplicações Iniciais:\u003C\u002Fstrong\u003E O código suspeita que o texto de entrada pode ter seções inteiras duplicadas, separadas por ” | “. Ele divide o texto por esse separador. Para cada parte, ele calcula um “hash” (uma espécie de impressão digital única do texto) usando o algoritmo MD5. Ele mantém apenas as partes com hashes únicos, eliminando assim as duplicações em nível de seção. O texto é reconstruído sem essas duplicações.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EDivisão Semântica (Chunking):\u003C\u002Fstrong\u003E Ele utiliza a biblioteca langchain com RecursiveCharacterTextSplitter. Esta ferramenta é projetada para quebrar textos grandes em pedaços menores, tentando manter o significado. Uma lista de separadores é definida (como “Pergunta:”, “Resposta:”, ” | “, etc.). O RecursiveCharacterTextSplitter tentará quebrar o texto nesses pontos prioritariamente. Parâmetros como chunk_size (tamanho máximo de cada pedaço) e chunk_overlap (quanto de texto se sobrepõe entre pedaços consecutivos para manter o contexto) são configurados. O texto (já sem as duplicações de seção) é então dividido nesses chunks.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EProcessamento e Filtragem dos Chunks:\u003C\u002Fstrong\u003E Cada chunk gerado passa por um processo de limpeza e validação: Espaços em branco no início e no fim são removidos. Chunks vazios são descartados. Chunks muito pequenos (menos de 20 caracteres) são ignorados, a menos que contenham termos chave como “Pergunta:”, “Resposta:” ou “Titulo”, indicando que podem ser importantes apesar do tamanho. \u003Cstrong\u003ERemoção de Duplicações em Nível de Chunk:\u003C\u002Fstrong\u003E Semelhante à etapa 2, um hash MD5 é calculado para cada chunk. Se um chunk com o mesmo conteúdo (mesmo hash) já foi processado, ele é descartado para evitar redundância na saída final.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ERetorno:\u003C\u002Fstrong\u003E A função retorna uma lista de chunks_processados, que são os pedaços de texto finais, limpos, sem duplicações e divididos semanticamente.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp id=\"ember84\" class=\"ember-view reader-text-block__paragraph\"\u003EEm resumo, o código é uma ferramenta de pré-processamento de texto que limpa e organiza comentários concatenados, tornando-os mais fáceis de serem processados por outras ferramentas ou modelos de linguagem, ao dividi-los em unidades menores e relevantes e removendo repetições.\u003C\u002Fp\u003E\n\u003Cp id=\"ember85\" class=\"ember-view reader-text-block__paragraph\"\u003EE agora com o resultado adivinha? Você vai criar uma nova coluna chamada chunk_content, ou chunk_text enfim. E por que fizemos o chunk? para seguirmos para o mais mirabolante que eu vou explicar bem pouco que não estudei afundo o embedding. Ah mas entender o embedding é simples, sim é simples o tipo mais comum sem se aprofundar no seus parametros ou nos outros tipos de embedding como\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003EDense Embeddings\u003C\u002Fli\u003E\n\u003Cli\u003ESparse Embeddings\u003C\u002Fli\u003E\n\u003Cli\u003EHybrid Embeddings\u002FSearch\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember88\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQGEg_N4F8CmtQ\u002Farticle-inline_image-shrink_1000_1488\u002FB4DZbbTm9pG0AQ-\u002F0\u002F1747436078135?e=1753315200&v=beta&t=cGCtleOMRedHXSOOmDOTJjy0ze2sXQV0NLij6c_fHOk\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\u003Cfigcaption class=\"reader-image-block__figure-image-caption display-block full-width text-body-small-open t-sans text-align-center t-black--light\"\u003E\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember89\" class=\"ember-view reader-text-block__paragraph\"\u003EEnfim, vamos no arroz com feijão que é bom e todo Brasileiro sabe disso. Portanto no databricks como posso fazer o embedding? Bom tem 2 formas:\u003C\u002Fp\u003E\n\u003Cp id=\"ember90\" class=\"ember-view reader-text-block__paragraph\"\u003E1.Usar modelos open-source do Hugging Face (via transformers ou MLflow) ou modelos proprietários.\u003C\u002Fp\u003E\n\u003Cp id=\"ember91\" class=\"ember-view reader-text-block__paragraph\"\u003E2.O Databricks Model Serving hospedar diversos modelos para embedding e conversação (Chat).\u003C\u002Fp\u003E\n\u003Cp id=\"ember92\" class=\"ember-view reader-text-block__paragraph\"\u003EComo hoje estou com preguiça vamos de Model Serving da databricks para facilitar a vida. E para ser mais fã da databricks vou escolher um modelo LLM de embedding que tem o nome databricks nele: \u003Cstrong\u003Edatabricks-bge-large-en. \u003C\u002Fstrong\u003EAgora como é feito o embedding, bom lembra que falei que estou com preguiça hoje? pois bem eu criei uma função que já retorna os embedding a partir de uma lista que neste caso nós passamos a coluna de chunk lembra?\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\n\u003Cfigure style=\"width: 937px\" class=\"wp-caption alignnone\"\u003E\u003Cimg id=\"ember93\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQGWPdEmlKALTg\u002Farticle-inline_image-shrink_1000_1488\u002FB4DZbbVcBoHEAQ-\u002F0\u002F1747436554621?e=1753315200&v=beta&t=avuSDeKNUwqVAFLxnFslarMiZIdnjk-MKL_F9c-nujk\" alt=\"Conteúdo do artigo\" width=\"937\" height=\"1000\" \u002F\u003E\u003Cfigcaption class=\"wp-caption-text\"\u003EFunção para realizar o Embedding da coluna Chu\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\u003Cfigcaption class=\"reader-image-block__figure-image-caption display-block full-width text-body-small-open t-sans text-align-center t-black--light\"\u003E\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember94\" class=\"ember-view reader-text-block__paragraph\"\u003EE agora só fazer o mesmo que fizemos para criar a coluna de chunk mas dessa vez essa coluna deve ser OBRIGATÓRIAMENTE chamada de embedding:\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember95\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQFb8nLTHKxdSQ\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbbWEjdIEAY-\u002F0\u002F1747436720524?e=1753315200&v=beta&t=ZN0dQCKeCx7TdXguaErCnjuaLjx9GY7sUCsOlu5Dv8s\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember96\" class=\"ember-view reader-text-block__paragraph\"\u003EClaro que no código acima eu já suponho né que sua variável df seja sua tabela completa com o chunk.\u003C\u002Fp\u003E\n\u003Cp id=\"ember97\" class=\"ember-view reader-text-block__paragraph\"\u003EOk, recapitulando o que foi feito até aqui:\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003EAnalise exploratória dos dados.\u003C\u002Fli\u003E\n\u003Cli\u003ELimpeza e normalização.\u003C\u002Fli\u003E\n\u003Cli\u003EJunção de colunas importantes em uma unica coluna.\u003C\u002Fli\u003E\n\u003Cli\u003ECriamos a coluna de chunk com base na coluna unica que chamamos de content.\u003C\u002Fli\u003E\n\u003Cli\u003ECriamos a coluna de embedding com base na coluna de chunk chamada de chunk_text.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp id=\"ember99\" class=\"ember-view reader-text-block__paragraph\"\u003EAgora estamos prontos para uma das facilidades do databricks que é tornar nossa tabela delta contendo os embeddings uma tabela com índice vetorial. Você pode configurar o tipo de índice (direto ou Delta Sync) e a métrica de similaridade (ex: cosseno, produto escalar).\u003C\u002Fp\u003E\n\u003Cp id=\"ember100\" class=\"ember-view reader-text-block__paragraph\"\u003EPrimeiramente você precisa habilitar o Change Data Feed da sua tabela:\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember101\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQGQI7SGQBo4MA\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbbYYxSGwAU-\u002F0\u002F1747437327911?e=1753315200&v=beta&t=SuJFE0F4hDMX_p9NQasRVFmUuU4c37LM0P9sA7UGpjU\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\u003Cfigcaption class=\"reader-image-block__figure-image-caption display-block full-width text-body-small-open t-sans text-align-center t-black--light\"\u003E\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember102\" class=\"ember-view reader-text-block__paragraph\"\u003EEste código verifica se esta habilitado a tabela, do contrario habilita a propriedade, agora precisamos criar um Vector Search, registrar o index da sua tabela e um endpoint para receber as predições. Vamos entender então mais sobre o Vector Search:\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember103\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQHV8p3ORafu2w\u002Farticle-inline_image-shrink_1000_1488\u002FB4DZbbY_JVHEAQ-\u002F0\u002F1747437483058?e=1753315200&v=beta&t=BZYPZ5JZM2BGt0A_a-34SHLBBQ1G_6xKWFnLVFI9uZw\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember104\" class=\"ember-view reader-text-block__paragraph\"\u003EO Databricks oferece o Vector Search, uma solução de banco de dados vetorial sem servidor e de baixa latência. Ele se integra perfeitamente com o Unity Catalog e o Model Serving.\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003ECriação do Endpoint:\u003C\u002Fstrong\u003E Crie um endpoint do Vector Search através da UI do Databricks ou da API.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ECriação do Índice:\u003C\u002Fstrong\u003E Crie um índice vetorial a partir da sua tabela Delta contendo os embeddings. Você pode configurar o tipo de índice (direto ou Delta Sync) e a métrica de similaridade (ex: cosseno, produto escalar).\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp id=\"ember106\" class=\"ember-view reader-text-block__paragraph\"\u003EA Databricks oferece dois modos principais de indexação: o Delta Sync Index, que sincroniza automaticamente com uma tabela Delta e pode calcular embeddings ou usar embeddings pré-existentes, e o Direct Vector Access Index, que permite inserção e atualização manual de vetores e metadados via API ou SDK. Por baixo dos panos ouvi dizer que é pgvector (\u003Ca class=\"pcwxHzJDNtENtbMWLKRJNYNnhxmaIdvrpU \" tabindex=\"0\" href=\"https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003Ehttps:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector\u003C\u002Fa\u003E), ou seja um PostgreSQL Vetorial.\u003C\u002Fp\u003E\n\u003Cp id=\"ember107\" class=\"ember-view reader-text-block__paragraph\"\u003EOk, agora vamos criar nosso Vector Search, o index, referenciar nossa tabela e o endpoint via python, tem como fazer via interface? sim tem, mas ai ficar tirando print e colocando aqui eu iria demorar muito e via código é mais rápido não é mesmo.\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember108\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQEAnALcY_wRow\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbbcGgJHsAw-\u002F0\u002F1747438310455?e=1753315200&v=beta&t=2uPBtLGD-Hr7S5oJx0hARwWwXhJB_CjrfFhDuuua3s0\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\u003Cfigcaption class=\"reader-image-block__figure-image-caption display-block full-width text-body-small-open t-sans text-align-center t-black--light\"\u003E\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember109\" class=\"ember-view reader-text-block__paragraph\"\u003EGrande o código não, mas ele já faz varias validações esta como Classe para incluir mais métodos como atualizar o index, realizar buscas etc.. Explicando melhor o código:\u003C\u002Fp\u003E\n\u003Cp id=\"ember110\" class=\"ember-view reader-text-block__paragraph\"\u003EEste código define uma classe Python chamada AiVectorSearch, projetada para gerenciar um processo de ETL (Extração, Transformação e Carga) focado na criação e sincronização de um índice de pesquisa vetorial. A pesquisa vetorial é comumente usada em aplicações de IA para encontrar itens semelhantes com base em \u003Cem\u003Eembeddings\u003C\u002Fem\u003E (representações vetoriais de dados).\u003C\u002Fp\u003E\n\u003Cp id=\"ember111\" class=\"ember-view reader-text-block__paragraph\"\u003EA seguir, uma análise hierárquica da classe e seus métodos:\u003C\u002Fp\u003E\n\u003Cp id=\"ember112\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003E1.Classe: \u003C\u002Fstrong\u003EAiVectorSearch Esta é a classe principal que encapsula toda a lógica para o processo de ETL da pesquisa vetorial.\u003C\u002Fp\u003E\n\u003Cp id=\"ember113\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003E1.1. Método Construtor: \u003C\u002Fstrong\u003E__init__(self, …) Objetivo: Inicializar uma nova instância da classe AISVectorSearchETL. Parâmetros Principais: source_table_name: Nome da tabela de origem dos dados. source_table_type: Tipo da tabela de origem (ex: “TABLE”, “VIEW”). vector_search_endpoint_name: Nome do \u003Cem\u003Eendpoint\u003C\u002Fem\u003E do serviço de pesquisa vetorial. embedding_column: Nome da coluna que contém os \u003Cem\u003Eembeddings\u003C\u002Fem\u003E vetoriais. text_column: Nome da coluna que contém o texto original (opcional, mas útil para referência). primary_key: Nome da coluna da chave primária na tabela de origem. id_column: Nome da coluna que será usada como ID no índice vetorial. Ações: Armazena os parâmetros recebidos como atributos da instância (ex: self.source_table_name). Inicializa outros atributos internos, como self.ws (provavelmente um cliente do workspace, ex: Databricks), self.vs_endpoint, self.index_name, self.index_info, self.pipeline_type. Define o nome do índice (self.index_name) combinando o nome do \u003Cem\u003Eendpoint\u003C\u002Fem\u003E e o nome da tabela de origem. Define o tipo de pipeline (self.pipeline_type), que parece ser “DELTA_SYNC” com base no código.\u003C\u002Fp\u003E\n\u003Cp id=\"ember114\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003E1.2. Método Privado: \u003C\u002Fstrong\u003E_get_vs_endpoint(self) Objetivo: Obter os detalhes do \u003Cem\u003Eendpoint\u003C\u002Fem\u003E da pesquisa vetorial especificado. Ações: Utiliza self.ws.vector_search.get_endpoint() para buscar as informações do \u003Cem\u003Eendpoint\u003C\u002Fem\u003E. Armazena o resultado em self.vs_endpoint. Imprime uma mensagem indicando se o \u003Cem\u003Eendpoint\u003C\u002Fem\u003E foi encontrado ou não.\u003C\u002Fp\u003E\n\u003Cp id=\"ember115\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003E1.3. Método Privado\u003C\u002Fstrong\u003E: _get_index_info(self) Objetivo: Obter informações sobre o índice de pesquisa vetorial, como seu status e tipo. Ações: Chama self._get_vs_endpoint() para garantir que as informações do \u003Cem\u003Eendpoint\u003C\u002Fem\u003E estejam disponíveis. Tenta obter o índice usando self.ws.vector_search.get_index(endpoint_name=self.vector_search_endpoint_name, index_name=self.index_name). Se o índice existir: Armazena as informações do índice em self.index_info. Imprime o nome, tipo e status do índice. Se o índice não existir (captura uma exceção, provavelmente HttpError com status 404): Define self.index_info como None. Imprime uma mensagem indicando que o índice não foi encontrado.\u003C\u002Fp\u003E\n\u003Cp id=\"ember116\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003E1.4. Método Privado\u003C\u002Fstrong\u003E: _create_index_if_not_exists(self) Objetivo: Criar o índice de pesquisa vetorial se ele ainda não existir. Ações: Chama self._get_index_info() para verificar o estado atual do índice. Se self.index_info for None (índice não existe): Imprime uma mensagem indicando que o índice será criado. Chama self.ws.vector_search.create_delta_sync_index(…) para criar um novo índice de sincronização Delta. Parâmetros para criação: endpoint_name: Nome do \u003Cem\u003Eendpoint\u003C\u002Fem\u003E. index_name: Nome do índice. source_table_name: Tabela de origem dos dados. pipeline_type: Tipo de pipeline (ex: “DELTA_SYNC”). primary_key: Chave primária da tabela de origem. embedding_vector_column (ou similar, o nome exato pode variar na imagem): Coluna de \u003Cem\u003Eembedding\u003C\u002Fem\u003E. embedding_dimension (ou similar): Dimensão dos vetores de \u003Cem\u003Eembedding\u003C\u002Fem\u003E. text_column (ou similar, se aplicável): Coluna de texto. Atualiza self.index_info chamando self._get_index_info() novamente. Se o índice já existir: Imprime uma mensagem indicando que o índice já existe e seu status.\u003C\u002Fp\u003E\n\u003Cp id=\"ember117\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003E1.5. Método Privado\u003C\u002Fstrong\u003E: _wait_for_index_online(self) Objetivo: Pausar a execução até que o índice de pesquisa vetorial esteja no estado “ONLINE” e pronto para uso. Ações: Chama self._get_index_info() para obter o status mais recente do índice. Entra em um loop while que continua enquanto o status do índice (self.index_info.status.detailed_state) não for “ONLINE”. Dentro do loop: Imprime o status atual do índice. Aguarda por um período fixo (ex: 30 segundos) usando time.sleep(30). Atualiza as informações do índice chamando self._get_index_info() novamente. Quando o loop terminar (índice está “ONLINE”): Imprime uma mensagem confirmando que o índice está online.\u003C\u002Fp\u003E\n\u003Cp id=\"ember118\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003E1.6. Método Privado\u003C\u002Fstrong\u003E: _sync_data(self) Objetivo: Orquestrar o processo de criação (se necessário), espera e sincronização de dados para o índice. Ações: Chama self._create_index_if_not_exists() para garantir que o índice exista. Chama self._wait_for_index_online() para garantir que o índice esteja pronto. Verifica se o tipo de índice é “DELTA_SYNC”. Se for, e se houver um self.index_info válido, ele tenta sincronizar os dados. A imagem mostra idx.sync(), onde idx seria self.index_info ou um objeto de índice obtido a partir dele. Isso sugere que o objeto index_info (ou o objeto retornado por get_index) tem um método sync(). Imprime mensagens sobre o início e a conclusão da sincronização. Se o tipo de índice não for “DELTA_SYNC” ou se self.index_info for inválido, imprime uma mensagem apropriada.\u003C\u002Fp\u003E\n\u003Cp id=\"ember119\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003E1.7. Método Público: \u003C\u002Fstrong\u003Erun(self) Objetivo: Ponto de entrada principal para executar todo o processo de ETL da pesquisa vetorial. Ações: Imprime uma mensagem indicando o início do processo de ETL. Chama o método self._sync_data() para realizar a sincronização. Imprime uma mensagem indicando a conclusão do processo de ETL.\u003C\u002Fp\u003E\n\u003Cp id=\"ember120\" class=\"ember-view reader-text-block__paragraph\"\u003EResumo da Hierarquia e Fluxo:\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003EUm objeto AiVectorSearch é instanciado com as configurações necessárias.\u003C\u002Fli\u003E\n\u003Cli\u003EO método run() é chamado para iniciar o processo.\u003C\u002Fli\u003E\n\u003Cli\u003Erun() chama _sync_data().\u003C\u002Fli\u003E\n\u003Cli\u003E_sync_data() primeiro chama _create_index_if_not_exists(): _create_index_if_not_exists() chama _get_index_info() para verificar se o índice existe. _get_index_info() chama _get_vs_endpoint() para obter detalhes do \u003Cem\u003Eendpoint\u003C\u002Fem\u003E. Se o índice não existir, _create_index_if_not_exists() o cria.\u003C\u002Fli\u003E\n\u003Cli\u003E_sync_data() então chama _wait_for_index_online(): _wait_for_index_online() chama repetidamente _get_index_info() para monitorar o status do índice até que ele esteja online.\u003C\u002Fli\u003E\n\u003Cli\u003EFinalmente, _sync_data() (se o índice for do tipo correto e estiver online) executa a operação de sincronização de dados (ex: idx.sync()).\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp id=\"ember122\" class=\"ember-view reader-text-block__paragraph\"\u003EAgora com toda parte do Vector Search realizada você terá visualmente no databricks:\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember123\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQH4x2965-6ZCQ\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbbfPyLIEAU-\u002F0\u002F1747439124093?e=1753315200&v=beta&t=9lP9C0t_AzO6IRN5WKaZD8WJSqdonXN5oeKcBam_hDU\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember124\" class=\"ember-view reader-text-block__paragraph\"\u003ERepare que agora você tem um banco de dados vetorial criado, com 1 index que é da sua tabela e o creator que ficara o seu e-mail.\u003C\u002Fp\u003E\n\u003Ch2 id=\"ember126\" class=\"ember-view reader-text-block__heading-2\"\u003EThe end: Registrando seu modelo com esse fluxo de RAG como uma API através do Model Serving endpoint da Databricks.\u003C\u002Fh2\u003E\n\u003Cp id=\"ember127\" class=\"ember-view reader-text-block__paragraph\"\u003ESe você se aventurar e ir na seção de Serving no databricks verá vários modelos da databricks que são de modelos proprietários e grande parte opensource:\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember128\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQF71chRcVk-Qw\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbbgJSvHEAU-\u002F0\u002F1747439359737?e=1753315200&v=beta&t=nl28VFSlpbYG-cD97mniYW4_1AsBWrw4a4kpnbESxT8\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember129\" class=\"ember-view reader-text-block__paragraph\"\u003EO que queremos é registrar seu modelo como um modelo Chat e que apareça aqui como disponível para uso como API para receber perguntas passar pelo banco vetorial, receber mais contexto, passar pelo pré-prompt e por ultimo enviar para a LLM de chat que vai nos devolver a resposta.\u003C\u002Fp\u003E\n\u003Cp id=\"ember130\" class=\"ember-view reader-text-block__paragraph\"\u003EPrimeiro ponto é criar o código que vai realizar toda essa orquestração que neste caso eu denominei de RagChatModel onde ela é responsável por fazer busca vetoriais, obter retorno do LLM de chat, realizar o processo de embedding da pergunta do usuário, definir temperatura do modelo do chat que basicamente define o quanto ele pode ser criativo ou não, qual é meu endpoint do vector search, qual o LLM de chat, que neste caso vamos utilizar o \u003Cstrong\u003Edatabricks-meta-llama-3-1-8b-instruct \u003C\u002Fstrong\u003Ee qual a tabela de origem.\u003C\u002Fp\u003E\n\u003Cp id=\"ember131\" class=\"ember-view reader-text-block__paragraph\"\u003ESoltar a bomba:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22102656\u002Farquivo-Airton-2.jpg\"\u003E\u003Cimg class=\"alignnone size-full wp-image-163562\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22102656\u002Farquivo-Airton-2.jpg\" alt=\"Conteúdo do artigo\" width=\"166\" height=\"1500\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n\u003Cp\u003ELegal e como registro essa classe no Model Serving Endpoint no databricks?\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg id=\"ember135\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQEm4ARM-o1b2g\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbbljXGG8AU-\u002F0\u002F1747440778866?e=1753315200&v=beta&t=2fFbsE0rNAkKMoDzNoYI07Vw3sO0y1wmTm1MYlwk75g\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"ember136\" class=\"ember-view reader-text-block__paragraph\"\u003EA saída será mais ou menos desta forma ao rodar no seu notebook Databricks:\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember137\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQG7WwTHdzI4nQ\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbblyGqG8AU-\u002F0\u002F1747440837685?e=1753315200&v=beta&t=zD1QrHiM3umnj1C_F4tHavkch--bwkk63sWvDPitB1c\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember138\" class=\"ember-view reader-text-block__paragraph\"\u003EAgora sim se olharmos no Serving endpoints veremos nosso modelo RAG com API registrado e gerenciado pela Databricks:\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember139\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQHzhW4pdYBQOQ\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbbmqCHHQAU-\u002F0\u002F1747441066692?e=1753315200&v=beta&t=4hRoD-d0rz0-tu0vmdEcAgPZAyBrd0jOXrVFOwtkZAY\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember140\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQHUOhC9sZgn0g\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbbm496G8Ac-\u002F0\u002F1747441127763?e=1753315200&v=beta&t=CvYquIavGtEFENAM_eS-bFJjwVWn3Igeqj0ZgbUe6L4\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember141\" class=\"ember-view reader-text-block__paragraph\"\u003EE por ultimo se você estiver construindo com mlflow e utilizara classe \u003Cstrong\u003Emlflow.pyfunc.ChatModel\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"ember142\" class=\"ember-view reader-text-block__paragraph\"\u003EVocê testar no Playground do databricks:\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--resize\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember143\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQG0KBpUTZeywA\u002Farticle-inline_image-shrink_1000_1488\u002FB4DZbbnlWCGwAQ-\u002F0\u002F1747441309503?e=1753315200&v=beta&t=fB7eRGnToqtifPQmxcEC8EKqMYJj6lXn31ZMNKEiW98\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember144\" class=\"ember-view reader-text-block__paragraph\"\u003EConclusão: o que criamos se resume nesta imagem abaixo:\u003C\u002Fp\u003E\n\u003Cdiv class=\"reader-image-block reader-image-block--full-width\"\u003E\n\u003Cfigure class=\"reader-image-block__figure\"\u003E\n\u003Cdiv class=\"ivm-image-view-model reader-image-block__img-container\"\u003E\n\u003Cdiv class=\"ivm-view-attr__img-wrapper \"\u003E\u003Cimg id=\"ember145\" class=\"ivm-view-attr__img--centered reader-image-block__img evi-image lazy-image ember-view\" src=\"https:\u002F\u002Fmedia.licdn.com\u002Fdms\u002Fimage\u002Fv2\u002FD4D12AQG9-ksAZ4qG4w\u002Farticle-inline_image-shrink_1500_2232\u002FB4DZbbodoRGYAU-\u002F0\u002F1747441540295?e=1753315200&v=beta&t=ZdGdS9Vno8aiUnMH8jzPSOHi1OvMAOvAA2xnPk1fGWo\" alt=\"Conteúdo do artigo\" \u002F\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp id=\"ember147\" class=\"ember-view reader-text-block__paragraph\"\u003EEspero que tenham curtido. Se sim, me sigam no \u003Ca href=\"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fairton-lira-junior-6b81a661\u002F\"\u003ELinkedin\u003C\u002Fa\u003E para ver meus post, artigos.\u003C\u002Fp\u003E\n\u003Cp id=\"ember148\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003EMeus demais artigos:\u003C\u002Fstrong\u003E \u003Ca class=\"pcwxHzJDNtENtbMWLKRJNYNnhxmaIdvrpU \" tabindex=\"0\" href=\"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fairtonlirajr\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003Ehttps:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fairtonlirajr\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"ember149\" class=\"ember-view reader-text-block__paragraph\"\u003E\u003Cstrong\u003EGithub\u003C\u002Fstrong\u003E: \u003Ca class=\"pcwxHzJDNtENtbMWLKRJNYNnhxmaIdvrpU \" tabindex=\"0\" href=\"https:\u002F\u002Fgithub.com\u002FAirtonLira\" target=\"_self\" rel=\"noopener noreferrer\" data-test-app-aware-link=\"\"\u003Ehttps:\u002F\u002Fgithub.com\u002FAirtonLira\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"ember150\" class=\"ember-view reader-text-block__paragraph\"\u003EValeu, abrs!!\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EBom por que aqui no Brasil, o Databricks é massivamente utilizado para questões de Data e não desenvolvimento de software. Contudo, todos de tecnologia…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fcomo-criar-um-fluxo-de-rag-utilizando-100-os-recursos-do-databricks","date":"22 mai, 2025","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22103847\u002FDados.jpg","externalMention":null,"author":{"id":148428,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F12\u002F10111133\u002Fairton.png","name":"Airton Lira Junior","description":"Airton Lira Junior é um profissional de Tecnologia da Informação com mais de 10 anos de experiência, especializado em Big Data, Engenharia de Dados e Arquitetura de Soluções em nuvem. Atualmente atua como Engenheiro Sênior de Dados e Analytics na Dock, liderando melhorias em plataformas de dados, orquestração de pipelines com Databricks e otimização de workloads em AWS (EC2, EMR, SageMaker). Com passagens por empresas como iFood e Bemobi, destacou-se na concepção de soluções inovadoras, como modelos LLM para chatbots, integrações de IA em pipelines de áudio e projetos de conciliação financeira regulatória, utilizando tecnologias como Golang, Python, Apache Spark e Kubernetes. Possui certificações em AWS, Databricks e Power BI, além de formação em Análise de Sistemas pela FIA e especialização em Banco de Dados. Reconhecido por sua proatividade e expertise técnica, contribui ativamente para a comunidade tech como colunista no iMasters, compartilhando conhecimentos em automação, engenharia de prompts e arquitetura de dados escaláveis.","slug":"airtonlirajr","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fairtonlirajr","registered":"2017-10-10 13:17:26","social":{"linkedin":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fairton-lira-junior-6b81a661\u002F","youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"airtonlirajr@gmail.com"},"articles_count":26,"views_count":70200,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Data","slug":"data","id":16,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"}],"tags":[{"title":"banco de dados","slug":"banco-de-dados-2","id":189,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados-2"},{"title":"dados","slug":"dados","id":374,"link":"https:\u002F\u002Fimasters.com.br\u002Fdados"},{"title":"Data","slug":"data","id":626,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"Databricks","slug":"databricks","id":8930,"link":"https:\u002F\u002Fimasters.com.br\u002Fdatabricks"},{"title":"RAG","slug":"rag","id":9045,"link":"https:\u002F\u002Fimasters.com.br\u002Frag"}],"seo":{"open_graph":{"title":"Como criar um fluxo de RAG utilizando 100% os recursos do Databricks","description":"Bom por que aqui no Brasil, o Databricks é massivamente utilizado para questões de Data e não desenvolvimento de software. Contudo, todos de tecnologia...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22103847\u002FDados.jpg","width":800,"height":533},"modified_time":"2025-05-23T02:43:41-03:00","published_time":"2025-05-22T10:37:25-03:00"},"twitter":{"title":"Como criar um fluxo de RAG utilizando 100% os recursos do Databricks","description":"Bom por que aqui no Brasil, o Databricks é massivamente utilizado para questões de Data e não desenvolvimento de software. Contudo, todos de tecnologia...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22103847\u002FDados.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fcomo-criar-um-fluxo-de-rag-utilizando-100-os-recursos-do-databricks","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fcomo-criar-um-fluxo-de-rag-utilizando-100-os-recursos-do-databricks","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fcomo-criar-um-fluxo-de-rag-utilizando-100-os-recursos-do-databricks"},"type":"post"}],"total":450,"maxPages":75},"most-viewed":{"data":[{"id":160514,"title":"Inteligência Artificial e Machine Learning: O que você precisa saber","content":"\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EOlá caro leitor, estou de volta depois de um hiato de quase 4 anos, e trago muitas novidades do mundo da tecnologia! \u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003EMuito tem se falado sobre a Inteligência Artificial, e é muito fácil cair na “pegadinha” de achar que Machine Learning é a mesma coisa que IA, e foi justamente isso que me motivou a trazer este artigo para vocês.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EHoje vamos falar sobre dois gigantes do mundo da tecnologia: Inteligência Artificial (IA) e Machine Learning (ML). Esses conceitos podem parecer complexos, mas prometo que vamos explorá-los de maneira simples e direta. Vamos lá entender o que são e como se diferenciam?\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cb\u003EEntendendo a Inteligência Artificial\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EA Inteligência Artificial (IA) é a capacidade de máquinas e sistemas computacionais de simular a inteligência humana. Isso inclui aprender, tomar decisões, e resolver problemas. Enquanto muitos associam IA a robôs de filmes futuristas, a realidade é mais presente e diversificada.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EUm exemplo cotidiano de IA é encontrado nos assistentes virtuais como Siri e Alexa. Eles representam a IA Fraca, especializada em tarefas específicas. Já a IA Forte, ainda em desenvolvimento, visa criar sistemas capazes de realizar uma ampla gama de tarefas de forma autônoma, imitando a inteligência humana mais amplamente.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAlém disso, a IA abrange áreas como processamento de linguagem natural e reconhecimento de padrões, impactando setores variados, desde a medicina até as finanças. A IA não é só sobre máquinas executando tarefas; é sobre sistemas que ‘aprendem’ e se adaptam. A IA Fraca já é uma realidade, enquanto a IA Forte representa uma fronteira emocionante e desafiadora no avanço tecnológico e ético.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cb\u003EMachine Learning (Aprendizado à Máquina)\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EMachine Learning (ML), um subconjunto fascinante da Inteligência Artificial, foca no desenvolvimento de sistemas que aprendem e melhoram a partir da experiência. Ao contrário da programação tradicional, onde as regras são definidas explicitamente, no ML, as máquinas aprendem a identificar padrões e tomar decisões a partir de dados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEssencialmente, o ML permite que computadores melhorem suas habilidades e conhecimento automaticamente, sem intervenção humana direta. Existem diferentes abordagens no ML, como o aprendizado supervisionado, onde o sistema aprende com exemplos previamente etiquetados, e o aprendizado não supervisionado, que encontra padrões em conjuntos de dados sem etiquetas.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EO impacto do ML é vasto, desde sistemas de recomendação, como os usados por serviços de streaming, até diagnósticos médicos avançados. Ao equipar as máquinas com a capacidade de aprender, o ML está não apenas transformando a maneira como interagimos com a tecnologia, mas também expandindo os limites do que as máquinas podem fazer por nós. Como um campo dinâmico e em constante evolução, o ML representa um elemento crucial da IA moderna, prometendo inovações e avanços contínuos.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cb\u003EDiferenciando IA e ML\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAlcance: Enquanto a IA é um campo amplo com o objetivo de simular a inteligência geral humana, o ML é mais específico, concentrando-se em desenvolver sistemas que aprendem e evoluem a partir de dados.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EFuncionalidades: IA abrange uma variedade de funções, incluindo processamento de linguagem natural, reconhecimento de voz, etc. O ML, por outro lado, é focado principalmente em algoritmos de aprendizado e adaptação.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EObjetivos: A IA visa criar sistemas autônomos capazes de realizar tarefas inteligentes, enquanto o ML se dedica a desenvolver métodos para que as máquinas aprendam com os dados.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEntender a diferença entre IA e ML é essencial para quem se interessa pelo fascinante mundo da tecnologia. O ML é uma parte crucial da IA, mas não abrange toda a sua extensão. É importante reconhecer essa distinção para ter uma visão clara sobre o avanço e as possibilidades dentro do campo tecnológico. Agora que você tem uma noção básica, que tal explorar mais esse universo?\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEu estou publicando aulas sobre ML e IA no meu canal do Youtube semanalmente e te convido a assisti-las! Além de aulas sobre ML e IA, você também vai encontrar um montão de conteúdo sobre tecnologia!\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPara acessar a playlist de aulas sobre ML e IA é só clicar \u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=2zMYTFuwHaQ&list=PLvZ08PHyHqDlVWMc2AxA5idUqkm_Q1hkQ\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003Eaqui\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan style=\"font-weight: 400;\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EGostou do artigo? Deixe o seu comentário abaixo, sugerindo novos temas! Será um prazer atendê-lo!\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EMuito tem se falado sobre a Inteligência Artificial, e é muito fácil cair na “pegadinha” de achar que Machine Learning é a mesma coisa que IA, e foi…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Finteligencia-artificial-e-machine-learning-o-que-voce-precisa-saber","date":"2 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02142745\u002FInteligenciaartificial3-1.jpg","externalMention":null,"author":{"id":148887,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2019\u002F01\u002F29171511\u002Fdouglas-carlos.png","name":"Douglas Carlos Men","description":"Programador, Professor e Entusiasta da Tecnologia","slug":"douglascarlosmen","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdouglascarlosmen","registered":"2019-01-24 12:49:50","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FProgramando-com-PHP-830861330582997","twitter":"https:\u002F\u002Ftwitter.com\u002Fdouglasmen_php","instagram":null,"github":null,"url":"","mail":"douglas@programandocomphp.com.br"},"articles_count":12,"views_count":14400,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Machine Learning","slug":"machine-learning","id":8908,"link":"https:\u002F\u002Fimasters.com.br\u002Fmachine-learning"}],"tags":[{"title":"AI","slug":"ai","id":451,"link":"https:\u002F\u002Fimasters.com.br\u002Fai"},{"title":"aprendizado de máquina","slug":"aprendizado-de-maquina","id":4960,"link":"https:\u002F\u002Fimasters.com.br\u002Faprendizado-de-maquina"},{"title":"artificial inteligence","slug":"artificial-inteligence","id":5473,"link":"https:\u002F\u002Fimasters.com.br\u002Fartificial-inteligence"},{"title":"IA","slug":"ia","id":4660,"link":"https:\u002F\u002Fimasters.com.br\u002Fia"},{"title":"inteligência artificial","slug":"inteligencia-artificial","id":2663,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"machine learning","slug":"machine-learning","id":4608,"link":"https:\u002F\u002Fimasters.com.br\u002Fmachine-learning"},{"title":"ml","slug":"ml","id":4716,"link":"https:\u002F\u002Fimasters.com.br\u002Fml"}],"seo":{"open_graph":{"title":"O que você precisa saber sobre Inteligência Artificial e Machine Learning","description":"Muito tem se falado sobre a Inteligência Artificial, e é muito fácil cair na “pegadinha” de achar que Machine Learning é a mesma coisa que IA, e foi...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02142745\u002FInteligenciaartificial3-1.jpg","width":800,"height":530},"modified_time":"2024-02-02T14:32:57-03:00","published_time":"2024-02-02T14:30:46-03:00"},"twitter":{"title":"O que você precisa saber sobre Inteligência Artificial e Machine Learning","description":"Muito tem se falado sobre a Inteligência Artificial, e é muito fácil cair na “pegadinha” de achar que Machine Learning é a mesma coisa que IA, e foi...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02142745\u002FInteligenciaartificial3-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Finteligencia-artificial-e-machine-learning-o-que-voce-precisa-saber","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Finteligencia-artificial-e-machine-learning-o-que-voce-precisa-saber","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Finteligencia-artificial-e-machine-learning-o-que-voce-precisa-saber"},"type":"post"},{"id":160521,"title":"Scripts SQL e Tabelas de Sistema – Parte 1: Alterando Colunas","content":"\u003Cp id=\"E936\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E937\" class=\"qowt-font10-Arial\"\u003ETodo administrador \u003C\u002Fspan\u003E\u003Cspan id=\"E938\" class=\"qowt-font10-Arial\"\u003Eou desenvolvedor de bancos de dados, cedo ou tarde, vai precisar criar\u003C\u002Fspan\u003E\u003Cspan id=\"E939\" class=\"qowt-font10-Arial\"\u003E scripts para executar múltiplas tarefas que se repetem para vários objetos.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E940\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E941\" class=\"qowt-font10-Arial\"\u003EAlém de ser uma \u003C\u002Fspan\u003E\u003Cspan id=\"E942\" class=\"qowt-font10-Arial\"\u003Etarefa tediosa, preparar este\u003C\u002Fspan\u003E\u003Cspan id=\"E943\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E944\" class=\"qowt-font10-Arial\"\u003E script\u003C\u002Fspan\u003E\u003Cspan id=\"E945\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E946\" class=\"qowt-font10-Arial\"\u003E manualmente é um processo \u003C\u002Fspan\u003E\u003Cspan id=\"E947\" class=\"qowt-font10-Arial\"\u003Eque envolve grande risco \u003C\u002Fspan\u003E\u003Cspan id=\"E948\" class=\"qowt-font10-Arial\"\u003Ede \u003C\u002Fspan\u003E\u003Cspan id=\"E949\" class=\"qowt-font10-Arial\"\u003Eerro.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E950\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E951\" class=\"qowt-font10-Arial\"\u003EO procedimento envolve, \u003C\u002Fspan\u003E\u003Cspan id=\"E952\" class=\"qowt-font10-Arial\"\u003Eprimeiramente identificar\u003C\u002Fspan\u003E\u003Cspan id=\"E953\" class=\"qowt-font10-Arial\"\u003E,\u003C\u002Fspan\u003E\u003Cspan id=\"E954\" class=\"qowt-font10-Arial\"\u003E os objetos que precisam ser al\u003C\u002Fspan\u003E\u003Cspan id=\"E955\" class=\"qowt-font10-Arial\"\u003Eterados e então construir as instruções DDL (DROP, CREATE, ALTER\u003C\u002Fspan\u003E\u003Cspan id=\"E956\" class=\"qowt-font10-Arial\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E957\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E958\" class=\"qowt-font10-Arial\"\u003EUm método de simplificar \u003C\u002Fspan\u003E\u003Cspan id=\"E959\" class=\"qowt-font10-Arial\"\u003Eas duas tarefas\u003C\u002Fspan\u003E\u003Cspan id=\"E960\" class=\"qowt-font10-Arial\"\u003E é \u003C\u002Fspan\u003E\u003Cspan id=\"E961\" class=\"qowt-font10-Arial\"\u003Ecriando consultas sobre as tabelas de sistema do banco de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E962\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E963\" class=\"qowt-font10-Arial\"\u003E(metadados) \u003C\u002Fspan\u003E\u003Cspan id=\"E964\" class=\"qowt-font10-Arial\"\u003Ee \u003C\u002Fspan\u003E\u003Cspan id=\"E965\" class=\"qowt-font10-Arial\"\u003Eentão definir na cláusula SELECT uma cadeia de caracteres que gera estas instruções DDL.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fo-caso-das-consultas-lentas-no-synapse\"\u003EO Caso das Consultas Lentas no Synapse\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E966\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E967\" class=\"qowt-font10-Arial\"\u003EEssa técnica\u003C\u002Fspan\u003E\u003Cspan id=\"E968\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E969\" class=\"qowt-font10-Arial\"\u003Epode ser usada\u003C\u002Fspan\u003E\u003Cspan id=\"E970\" class=\"qowt-font10-Arial\"\u003E tanto para base de dados do SQL Server (on-premises)\u003C\u002Fspan\u003E\u003Cspan id=\"E971\" class=\"qowt-font10-Arial\"\u003E quanto das versões do AZURE SQL DB.\u003C\u002Fspan\u003E\u003Cspan id=\"E972\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E973\" class=\"qowt-font10-Arial\"\u003EImportante observar q\u003C\u002Fspan\u003E\u003Cspan id=\"E974\" class=\"qowt-font10-Arial\"\u003Eue \u003C\u002Fspan\u003E\u003Cspan id=\"E975\" class=\"qowt-font10-Arial\"\u003Eas tabelas de sistema cobrem praticamente todos os objetos \u003C\u002Fspan\u003E\u003Cspan id=\"E976\" class=\"qowt-font10-Arial\"\u003Edo banco \u003C\u002Fspan\u003E\u003Cspan id=\"E977\" class=\"qowt-font10-Arial\"\u003E(veja o \u003C\u002Fspan\u003E\u003Ca id=\"E978\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Frelational-databases\u002Fsystem-tables\u002Fsystem-tables-transact-sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E979\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Elink\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E980\" class=\"qowt-font10-Arial\"\u003E). P\u003C\u002Fspan\u003E\u003Cspan id=\"E981\" class=\"qowt-font10-Arial\"\u003Eortanto\u003C\u002Fspan\u003E\u003Cspan id=\"E982\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E983\" class=\"qowt-font10-Arial\"\u003Ea mesma técnica se aplica a\u003C\u002Fspan\u003E\u003Cspan id=\"E984\" class=\"qowt-font10-Arial\"\u003E uma quantidade enorme de situações\u003C\u002Fspan\u003E\u003Cspan id=\"E985\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E986\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E987\" class=\"qowt-font10-Arial\"\u003ENeste artigo, apresento \u003C\u002Fspan\u003E\u003Cspan id=\"E988\" class=\"qowt-font10-Arial\"\u003Eum script que \u003C\u002Fspan\u003E\u003Cspan id=\"E989\" class=\"qowt-font10-Arial\"\u003Evarre todas as tabelas de usuário d\u003C\u002Fspan\u003E\u003Cspan id=\"E990\" class=\"qowt-font10-Arial\"\u003Ee um \u003C\u002Fspan\u003E\u003Cspan id=\"E991\" class=\"qowt-font10-Arial\"\u003Ebanco de dados e \u003C\u002Fspan\u003E\u003Cspan id=\"E992\" class=\"qowt-font10-Arial\"\u003Ealtera o tipo de dados \u003C\u002Fspan\u003E\u003Cspan id=\"E993\" class=\"qowt-font10-Arial\"\u003Ed\u003C\u002Fspan\u003E\u003Cspan id=\"E994\" class=\"qowt-font10-Arial\"\u003Eos campos \u003C\u002Fspan\u003E\u003Cspan id=\"E995\" class=\"qowt-font10-Arial\"\u003Eque atendem \u003C\u002Fspan\u003E\u003Cspan id=\"E996\" class=\"qowt-font10-Arial\"\u003Ea \u003C\u002Fspan\u003E\u003Cspan id=\"E997\" class=\"qowt-font10-Arial\"\u003Euma \u003C\u002Fspan\u003E\u003Cspan id=\"E998\" class=\"qowt-font10-Arial\"\u003Ecerta condição.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003EScripts SQL e Tabelas de Sistema\u003C\u002Fh2\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E999\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1000\"\u003EEntendo o Caso de Uso\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1001\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1002\" class=\"qowt-font10-Arial\"\u003EImagine que \u003C\u002Fspan\u003E\u003Cspan id=\"E1003\" class=\"qowt-font10-Arial\"\u003Evocê\u003C\u002Fspan\u003E\u003Cspan id=\"E1004\" class=\"qowt-font10-Arial\"\u003E precisa fazer \u003C\u002Fspan\u003E\u003Cspan id=\"E1005\" class=\"qowt-font10-Arial\"\u003Euma migração do seu banco de dados para um novo servidor SQL Server 2022\u003C\u002Fspan\u003E\u003Cspan id=\"E1006\" class=\"qowt-font10-Arial\"\u003E (\u003C\u002Fspan\u003E\u003Ca id=\"E1007\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fpt-br\u002Fsql\u002Ft-sql\u002Fstatements\u002Falter-database-transact-sql-compatibility-level\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1008\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Enível de compatibilidade \u003C\u002Fspan\u003E\u003Cspan id=\"E1009\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003E16.x\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1010\" class=\"qowt-font10-Arial\"\u003E).\u003C\u002Fspan\u003E\u003Cspan id=\"E1011\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1012\" class=\"qowt-font10-Arial\"\u003EUm dos problemas o\u003C\u002Fspan\u003E\u003Cspan id=\"E1013\" class=\"qowt-font10-Arial\"\u003Ebservados é que \u003C\u002Fspan\u003E\u003Cspan id=\"E1014\" class=\"qowt-font10-Arial\"\u003Eexistem\u003C\u002Fspan\u003E\u003Cspan id=\"E1015\" class=\"qowt-font10-Arial\"\u003E dezenas de campos que usam o tipo de dados TEXT\u003C\u002Fspan\u003E\u003Cspan id=\"E1016\" class=\"qowt-font10-Arial\"\u003E, que está prestes a ser aposentado.\u003C\u002Fspan\u003E\u003Cspan id=\"E1017\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1018\" class=\"qowt-font10-Arial\"\u003ESerá necessário \u003C\u002Fspan\u003E\u003Cspan id=\"E1019\" class=\"qowt-font10-Arial\"\u003Ealterar\u003C\u002Fspan\u003E\u003Cspan id=\"E1020\" class=\"qowt-font10-Arial\"\u003E todos\u003C\u002Fspan\u003E\u003Cspan id=\"E1021\" class=\"qowt-font10-Arial\"\u003E eles\u003C\u002Fspan\u003E\u003Cspan id=\"E1022\" class=\"qowt-font10-Arial\"\u003E para o tipo VARCHAR(MAX)\u003C\u002Fspan\u003E\u003Cspan id=\"E1023\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1024\" class=\"qowt-font10-Arial\"\u003Epara \u003C\u002Fspan\u003E\u003Cspan id=\"E1025\" class=\"qowt-font10-Arial\"\u003Eevitar problemas futuros\u003C\u002Fspan\u003E\u003Cspan id=\"E1026\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1027\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1028\" class=\"qowt-font10-Arial\"\u003ECabe a você identificar todos os casos e providenciar o script que fará as devidas alterações.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"E1029\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1030\"\u003EPreparando o Script\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp id=\"E1031\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1032\" class=\"qowt-font10-Arial\"\u003EPara resolver este problema, basta usar as tabelas \u003C\u002Fspan\u003E\u003Cspan id=\"E1033\" class=\"qowt-font10-Arial\"\u003Esys.\u003C\u002Fspan\u003E\u003Cspan id=\"E1034\" class=\"qowt-font10-Arial\"\u003Eobjects\u003C\u002Fspan\u003E\u003Cspan id=\"E1035\" class=\"qowt-font10-Arial\"\u003E, \u003C\u002Fspan\u003E\u003Cspan id=\"E1036\" class=\"qowt-font10-Arial\"\u003Esys.columns\u003C\u002Fspan\u003E\u003Cspan id=\"E1037\" class=\"qowt-font10-Arial\"\u003E e \u003C\u002Fspan\u003E\u003Cspan id=\"E1038\" class=\"qowt-font10-Arial\"\u003Esys.types\u003C\u002Fspan\u003E\u003Cspan id=\"E1039\" class=\"qowt-font10-Arial\"\u003E, que trazem\u003C\u002Fspan\u003E\u003Cspan id=\"E1040\" class=\"qowt-font10-Arial\"\u003E respectivamente os\u003C\u002Fspan\u003E\u003Cspan id=\"E1041\" class=\"qowt-font10-Arial\"\u003E metadados de tod\u003C\u002Fspan\u003E\u003Cspan id=\"E1042\" class=\"qowt-font10-Arial\"\u003Eo\u003C\u002Fspan\u003E\u003Cspan id=\"E1043\" class=\"qowt-font10-Arial\"\u003Es \u003C\u002Fspan\u003E\u003Cspan id=\"E1044\" class=\"qowt-font10-Arial\"\u003Eos objetos do banco, \u003C\u002Fspan\u003E\u003Cspan id=\"E1045\" class=\"qowt-font10-Arial\"\u003Eos\u003C\u002Fspan\u003E\u003Cspan id=\"E1046\" class=\"qowt-font10-Arial\"\u003E campos\u003C\u002Fspan\u003E\u003Cspan id=\"E1047\" class=\"qowt-font10-Arial\"\u003E das tabelas\u003C\u002Fspan\u003E\u003Cspan id=\"E1048\" class=\"qowt-font10-Arial\"\u003E e \u003C\u002Fspan\u003E\u003Cspan id=\"E1049\" class=\"qowt-font10-Arial\"\u003Eos \u003C\u002Fspan\u003E\u003Cspan id=\"E1050\" class=\"qowt-font10-Arial\"\u003Etipos de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E1051\" class=\"qowt-font10-Arial\"\u003E reconhecidos\u003C\u002Fspan\u003E\u003Cspan id=\"E1052\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1053\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1054\" class=\"qowt-font10-Arial\"\u003ECom \u003C\u002Fspan\u003E\u003Cspan id=\"E1055\" class=\"qowt-font10-Arial\"\u003Eessas três tabelas,\u003C\u002Fspan\u003E\u003Cspan id=\"E1056\" class=\"qowt-font10-Arial\"\u003E teremos condições de identificar os objetos que nos \u003C\u002Fspan\u003E\u003Cspan class=\"qowt-font10-Arial\"\u003Einteressam (campos com tipo de dados “TEXT”\u003C\u002Fspan\u003E\u003Cspan id=\"E1057\" class=\"qowt-font10-Arial\"\u003E) e preparar a declaração DDL desejada. Esta declaração \u003C\u002Fspan\u003E\u003Cspan id=\"E1058\" class=\"qowt-font10-Arial\"\u003Edeverá seguir \u003C\u002Fspan\u003E\u003Cspan id=\"E1059\" class=\"qowt-font10-Arial\"\u003Ea seguinte sintaxe:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02144755\u002Fquadro1.jpg\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160522\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02144755\u002Fquadro1.jpg\" alt=\"\" width=\"722\" height=\"80\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1078\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1079\" class=\"qowt-font10-Arial\"\u003EInicialmente \u003C\u002Fspan\u003E\u003Cspan id=\"E1080\" class=\"qowt-font10-Arial\"\u003Ecrio\u003C\u002Fspan\u003E\u003Cspan id=\"E1081\" class=\"qowt-font10-Arial\"\u003E um\u003C\u002Fspan\u003E\u003Cspan id=\"E1082\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E1083\" class=\"qowt-font10-Arial\"\u003E expressão de tabela\u003C\u002Fspan\u003E\u003Cspan id=\"E1084\" class=\"qowt-font10-Arial\"\u003E comum\u003C\u002Fspan\u003E\u003Cspan id=\"E1085\" class=\"qowt-font10-Arial\"\u003E (\u003C\u002Fspan\u003E\u003Ca id=\"E1086\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fpt-br\u002Fsql\u002Ft-sql\u002Fqueries\u002Fwith-common-table-expression-transact-sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1087\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Ecte\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1088\" class=\"qowt-font10-Arial\"\u003E)\u003C\u002Fspan\u003E\u003Cspan id=\"E1089\" class=\"qowt-font10-Arial\"\u003E para identificar os objetos. Em seguida\u003C\u002Fspan\u003E\u003Cspan id=\"E1090\" class=\"qowt-font10-Arial\"\u003E, uso estes dados para construir\u003C\u002Fspan\u003E\u003Cspan id=\"E1091\" class=\"qowt-font10-Arial\"\u003E as declarações DDL conforme a \u003C\u002Fspan\u003E\u003Cspan id=\"E1092\" class=\"qowt-font10-Arial\"\u003EQuadro\u003C\u002Fspan\u003E\u003Cspan id=\"E1093\" class=\"qowt-font10-Arial\"\u003E1.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1094\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1095\" class=\"qowt-font10-Arial\"\u003EPara que o script possa ser facilmente reaproveitado para outras alterações de tipos de dados, incluo duas variáveis para \u003C\u002Fspan\u003E\u003Cspan id=\"E1096\" class=\"qowt-font10-Arial\"\u003Einformar qual é o tipo de dados buscado e qual é o tipo de dados que será aplicado.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1097\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1098\" class=\"qowt-font10-Arial\"\u003EUsei os colchetes em \u003C\u002Fspan\u003E\u003Cspan id=\"E1099\" class=\"qowt-font10-Arial\"\u003Etodos os objetos\u003C\u002Fspan\u003E\u003Cspan id=\"E1100\" class=\"qowt-font10-Arial\"\u003E de banco para evitar problemas como nomes\u003C\u002Fspan\u003E\u003Cspan id=\"E1101\" class=\"qowt-font10-Arial\"\u003E fora do padrão SQL (exemplo: nomes que incluam palavras reservadas ou espaços em branco).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fsql-server\u002Fanalise-de-grafos-no-azure-sql-db\"\u003EAnálise de Grafos no Azure SQL DB\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan id=\"E1103\" class=\"qowt-font10-Arial\"\u003EO \u003C\u002Fspan\u003E\u003Cspan id=\"E1104\" class=\"qowt-font10-Arial\"\u003EQuadro\u003C\u002Fspan\u003E\u003Cspan id=\"E1105\" class=\"qowt-font10-Arial\"\u003E 2 mostra \u003C\u002Fspan\u003E\u003Cspan id=\"E1106\" class=\"qowt-font10-Arial\"\u003Ea declaração completa e o output obtido.\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02145103\u002Fquadro2.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160523\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02145103\u002Fquadro2.png\" alt=\"\" width=\"721\" height=\"632\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E1414\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1415\" class=\"qowt-font10-Arial\"\u003EObserve que eu adicionei um\u003C\u002Fspan\u003E\u003Cspan id=\"E1416\" class=\"qowt-font10-Arial\"\u003E caractere ponto-e-vírgula ao final de cada declaração\u003C\u002Fspan\u003E\u003Cspan id=\"E1417\" class=\"qowt-font10-Arial\"\u003E para que \u003C\u002Fspan\u003E\u003Cspan id=\"E1418\" class=\"qowt-font10-Arial\"\u003Eelas\u003C\u002Fspan\u003E\u003Cspan id=\"E1419\" class=\"qowt-font10-Arial\"\u003E seja\u003C\u002Fspan\u003E\u003Cspan id=\"E1420\" class=\"qowt-font10-Arial\"\u003Em\u003C\u002Fspan\u003E\u003Cspan id=\"E1421\" class=\"qowt-font10-Arial\"\u003E entendida\u003C\u002Fspan\u003E\u003Cspan id=\"E1422\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1423\" class=\"qowt-font10-Arial\"\u003E pelo SQL como comando\u003C\u002Fspan\u003E\u003Cspan id=\"E1424\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1425\" class=\"qowt-font10-Arial\"\u003E independente\u003C\u002Fspan\u003E\u003Cspan id=\"E1426\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1427\" class=\"qowt-font10-Arial\"\u003E ao invés de tratar a lista de declarações como um \u003C\u002Fspan\u003E\u003Cspan id=\"E1428\" class=\"qowt-font10-Arial\"\u003Epacote \u003C\u002Fspan\u003E\u003Cspan id=\"E1429\" class=\"qowt-font10-Arial\"\u003Eúnico \u003C\u002Fspan\u003E\u003Cspan id=\"E1430\" class=\"qowt-font10-Arial\"\u003E(\u003C\u002Fspan\u003E\u003Cspan id=\"E1431\" class=\"qowt-font10-Arial\"\u003E“\u003C\u002Fspan\u003E\u003Cspan id=\"E1432\" class=\"qowt-font10-Arial\"\u003Ebatch\u003C\u002Fspan\u003E\u003Cspan id=\"E1433\" class=\"qowt-font10-Arial\"\u003E”\u003C\u002Fspan\u003E\u003Cspan id=\"E1434\" class=\"qowt-font10-Arial\"\u003E)\u003C\u002Fspan\u003E\u003Cspan id=\"E1435\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Ch2 id=\"E1436\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-9\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1437\"\u003EFinalizando o Trabalho\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1438\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1439\" class=\"qowt-font10-Arial\"\u003EComo você já observou, o resultado da consulta da \u003C\u002Fspan\u003E\u003Cspan id=\"E1440\" class=\"qowt-font10-Arial\"\u003EQuadro\u003C\u002Fspan\u003E\u003Cspan id=\"E1441\" class=\"qowt-font10-Arial\"\u003E 2 é o próprio script que será \u003C\u002Fspan\u003E\u003Cspan id=\"E1442\" class=\"qowt-font10-Arial\"\u003Eexecutado.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1443\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1444\" class=\"qowt-font10-Arial\"\u003ENeste exemplo,\u003C\u002Fspan\u003E\u003Cspan id=\"E1445\" class=\"qowt-font10-Arial\"\u003E o script gerado tem apenas 2 declarações SQL, que poderiam sim ser criadas manualmente. Mas frequentemente uso esta técnica para criar \u003C\u002Fspan\u003E\u003Cspan id=\"E1446\" class=\"qowt-font10-Arial\"\u003Elistagens com centenas de declarações.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1447\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1448\" class=\"qowt-font10-Arial\"\u003EUm ponto que considero importante mencionar é que costumo adicionar no topo do script um\u003C\u002Fspan\u003E\u003Cspan id=\"E1449\" class=\"qowt-font10-Arial\"\u003Ea declaração para usar o banco de dados correto (“USE \u003C\u002Fspan\u003E\u003Cspan id=\"E1450\" class=\"qowt-font10-Arial\"\u003E[bdX]”). \u003C\u002Fspan\u003E\u003Cspan id=\"E1451\" class=\"qowt-font10-Arial\"\u003EIsso é facilmente inserido no gerador de script\u003C\u002Fspan\u003E\u003Cspan id=\"E1452\" class=\"qowt-font10-Arial\"\u003E, como mostra este esboço (\u003C\u002Fspan\u003E\u003Cspan id=\"E1453\" class=\"qowt-font10-Arial\"\u003EQuadro\u003C\u002Fspan\u003E\u003Cspan id=\"E1454\" class=\"qowt-font10-Arial\"\u003E 3).\u003C\u002Fspan\u003E\u003Cspan id=\"E1455\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02145318\u002Fquadro31.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160525\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02145318\u002Fquadro31.png\" alt=\"\" width=\"718\" height=\"187\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan id=\"E1507\" class=\"qowt-font10-Arial\"\u003ECaso prefira fazer o download do script completo, acesse este \u003C\u002Fspan\u003E\u003Ca id=\"E1508\" contenteditable=\"false\" href=\"https:\u002F\u002Fgithub.com\u002Fwcrivelini\u002Farticles\u002Fblob\u002Fmain\u002FSysTables_Scripts\u002FSysTabScript1.sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1509\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Elink\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1510\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fmysql\u002Fo-caso-do-indice-temporario\"\u003EO Caso do Índice Temporário\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1511\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-9\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1512\"\u003EScripts SQL: Comentários Finais\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1513\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1514\" class=\"qowt-font10-Arial\"\u003EMinha intenção aqui é convencer os que estão iniciando no mundo SQL a dar mais atenção às tabelas de sistema\u003C\u002Fspan\u003E\u003Cspan id=\"E1515\" class=\"qowt-font10-Arial\"\u003E e usar os metadados do banco a seu favor\u003C\u002Fspan\u003E\u003Cspan id=\"E1516\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E1517\" class=\"qowt-font10-Arial\"\u003E Evidentemente estes metadados jamais devem ser alterados manualmente, sob pena de corromper seu banco de dados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1518\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1519\" class=\"qowt-font10-Arial\"\u003EPorém, c\u003C\u002Fspan\u003E\u003Cspan id=\"E1520\" class=\"qowt-font10-Arial\"\u003Eomo se \u003C\u002Fspan\u003E\u003Cspan id=\"E1521\" class=\"qowt-font10-Arial\"\u003Epode ver\u003C\u002Fspan\u003E\u003Cspan id=\"E1522\" class=\"qowt-font10-Arial\"\u003E, a ideia de geração de scripts não é nenhum bicho de sete cabeças.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1523\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1524\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1525\" class=\"qowt-font10-Arial\"\u003EÉ necessári\u003C\u002Fspan\u003E\u003Cspan id=\"E1526\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E1527\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1528\" class=\"qowt-font10-Arial\"\u003Emuita atenção na construção\u003C\u002Fspan\u003E\u003Cspan id=\"E1529\" class=\"qowt-font10-Arial\"\u003E das declarações, \u003C\u002Fspan\u003E\u003Cspan id=\"E1530\" class=\"qowt-font10-Arial\"\u003Epois\u003C\u002Fspan\u003E\u003Cspan id=\"E1531\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1532\" class=\"qowt-font10-Arial\"\u003Equalque\u003C\u002Fspan\u003E\u003Cspan id=\"E1533\" class=\"qowt-font10-Arial\"\u003Er \u003C\u002Fspan\u003E\u003Cspan id=\"E1534\" class=\"qowt-font10-Arial\"\u003Edescuido\u003C\u002Fspan\u003E\u003Cspan id=\"E1535\" class=\"qowt-font10-Arial\"\u003E tem potencial para causar danos na estrutura do banco de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E1536\" class=\"qowt-font10-Arial\"\u003E e, \u003C\u002Fspan\u003E\u003Cspan id=\"E1537\" class=\"qowt-font10-Arial\"\u003Eem\u003C\u002Fspan\u003E\u003Cspan id=\"E1538\" class=\"qowt-font10-Arial\"\u003E casos\u003C\u002Fspan\u003E\u003Cspan id=\"E1539\" class=\"qowt-font10-Arial\"\u003E extremos\u003C\u002Fspan\u003E\u003Cspan id=\"E1540\" class=\"qowt-font10-Arial\"\u003E, perda de dados.\u003C\u002Fspan\u003E\u003Cspan id=\"E1541\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1542\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1543\" class=\"qowt-font10-Arial\"\u003EMas o\u003C\u002Fspan\u003E\u003Cspan id=\"E1544\" class=\"qowt-font10-Arial\"\u003E que costuma correr com frequência\u003C\u002Fspan\u003E\u003Cspan id=\"E1545\" class=\"qowt-font10-Arial\"\u003E com estes geradores de script\u003C\u002Fspan\u003E\u003Cspan id=\"E1546\" class=\"qowt-font10-Arial\"\u003E é que estes \u003C\u002Fspan\u003E\u003Cspan id=\"E1547\" class=\"qowt-font10-Arial\"\u003Edescuidos\u003C\u002Fspan\u003E\u003Cspan id=\"E1548\" class=\"qowt-font10-Arial\"\u003E são detectados na fase de testes\u003C\u002Fspan\u003E\u003Cspan id=\"E1549\" class=\"qowt-font10-Arial\"\u003E. Os \u003C\u002Fspan\u003E\u003Cspan id=\"E1550\" class=\"qowt-font10-Arial\"\u003Escripts\u003C\u002Fspan\u003E\u003Cspan id=\"E1551\" class=\"qowt-font10-Arial\"\u003E incorretos\u003C\u002Fspan\u003E\u003Cspan id=\"E1552\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1553\" class=\"qowt-font10-Arial\"\u003Egeralmente apresentam \u003C\u002Fspan\u003E\u003Cspan id=\"E1554\" class=\"qowt-font10-Arial\"\u003Eerros de sintaxe e\u003C\u002Fspan\u003E\u003Cspan id=\"E1555\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1556\" class=\"qowt-font10-Arial\"\u003Eque, portanto, não são reconhecidos como declarações \u003C\u002Fspan\u003E\u003Cspan id=\"E1557\" class=\"qowt-font10-Arial\"\u003ESQL \u003C\u002Fspan\u003E\u003Cspan id=\"E1558\" class=\"qowt-font10-Arial\"\u003Eválidas.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1559\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1560\" class=\"qowt-font10-Arial\"\u003ENo próximo artigo\u003C\u002Fspan\u003E\u003Cspan id=\"E1561\" class=\"qowt-font10-Arial\"\u003E, o assunto é a reconstrução de índices a partir do metadados. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1562\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1563\" class=\"qowt-font10-Arial\"\u003EAté lá\u003C\u002Fspan\u003E\u003Cspan id=\"E1564\" class=\"qowt-font10-Arial\"\u003E!\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ETodo administrador ou desenvolvedor de bancos de dados, cedo ou tarde, vai precisar criar scripts para executar múltiplas tarefas…. Scripts SQL\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas","date":"2 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02150545\u002Fbancodedados-1.jpg","externalMention":null,"author":{"id":452,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30184745\u002FwagnercriveliniP-128x128.jpeg","name":"Wagner Crivelini","description":"Consultor Sênior na Microsoft, na área de Data Insights para América Latina. Especialista em bancos de dados, é colunista em diversos portais de TI do Brasil e do exterior, com mais de 100 artigos técnicos publicados. É também co-produtor do DatabaseCast, primeiro podcast brasileiro sobre bancos de dados.","slug":"wagner-crivelini","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fwagner-crivelini","registered":"2010-12-30 11:28:37","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002Fwcrivelini@gmail.com","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.wcrivelini.com.br","mail":"wcrivelini@gmail.com"},"articles_count":91,"views_count":828100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Banco de Dados","slug":"banco-de-dados","id":7209,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados"},{"title":"Data","slug":"data","id":16,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"Microsoft Azure","slug":"windows","id":7277,"link":"https:\u002F\u002Fimasters.com.br\u002Fwindows"},{"title":"SQL Server","slug":"sql-server","id":7212,"link":"https:\u002F\u002Fimasters.com.br\u002Fsql-server"}],"tags":[{"title":"azure","slug":"azure","id":2238,"link":"https:\u002F\u002Fimasters.com.br\u002Fazure"},{"title":"banco de dados","slug":"banco-de-dados-2","id":189,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados-2"},{"title":"Data","slug":"data","id":626,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"Scripts SQL","slug":"scripts-sql","id":8975,"link":"https:\u002F\u002Fimasters.com.br\u002Fscripts-sql"},{"title":"sql","slug":"sql","id":706,"link":"https:\u002F\u002Fimasters.com.br\u002Fsql"},{"title":"sql server","slug":"sql-server-2","id":324,"link":"https:\u002F\u002Fimasters.com.br\u002Fsql-server-2"},{"title":"tabela","slug":"tabela","id":751,"link":"https:\u002F\u002Fimasters.com.br\u002Ftabela"}],"seo":{"open_graph":{"title":"Scripts SQL e Tabelas de Sistema - Parte 1: Alterando Colunas","description":"Todo administrador ou desenvolvedor de bancos de dados, cedo ou tarde, vai precisar criar scripts para executar múltiplas tarefas.... Scripts SQL","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02150545\u002Fbancodedados-1.jpg","width":800,"height":533},"modified_time":"2024-02-07T11:28:44-03:00","published_time":"2024-02-02T15:06:57-03:00"},"twitter":{"title":"Scripts SQL e Tabelas de Sistema - Parte 1: Alterando Colunas","description":"Todo administrador ou desenvolvedor de bancos de dados, cedo ou tarde, vai precisar criar scripts para executar múltiplas tarefas.... Scripts SQL","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02150545\u002Fbancodedados-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas"},"type":"post"},{"id":160546,"title":"Scripts SQL e Tabelas de Sistema – Parte 2: Criando Índices","content":"\u003Cp id=\"E1044\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1045\" class=\"qowt-font10-Arial\"\u003E\u003Cspan id=\"E1062\" class=\"qowt-font10-Arial\"\u003EOi, pessoal. Hoje, \u003C\u002Fspan\u003E\u003Cspan id=\"E1063\" class=\"qowt-font10-Arial\"\u003Eapresento\u003C\u002Fspan\u003E\u003Cspan id=\"E1064\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1065\" class=\"qowt-font10-Arial\"\u003Eo caso em que as colunas que \u003C\u002Fspan\u003E\u003Cspan id=\"E1066\" class=\"qowt-font10-Arial\"\u003Eterão suas\u003C\u002Fspan\u003E\u003Cspan id=\"E1067\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1068\" class=\"qowt-font10-Arial\"\u003Edefinições \u003C\u002Fspan\u003E\u003Cspan id=\"E1069\" class=\"qowt-font10-Arial\"\u003Ealteradas \u003C\u002Fspan\u003E\u003Cspan id=\"E1070\" class=\"qowt-font10-Arial\"\u003Eestão\u003C\u002Fspan\u003E\u003Cspan id=\"E1071\" class=\"qowt-font10-Arial\"\u003E associadas a \u003C\u002Fspan\u003E\u003Cspan id=\"E1072\" class=\"qowt-font10-Arial\"\u003Eíndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1073\" class=\"qowt-font10-Arial\"\u003E. E, mais importante de tudo, como recriar os índices \u003C\u002Fspan\u003E\u003Cspan id=\"E1074\" class=\"qowt-font10-Arial\"\u003Eassociados a tais colunas usando as \u003C\u002Fspan\u003E\u003Cspan id=\"E1075\" class=\"qowt-font10-Arial\"\u003Etabelas de sistema\u003C\u002Fspan\u003E\u003Cspan id=\"E1076\" class=\"qowt-font10-Arial\"\u003E do SQL Server\u003C\u002Fspan\u003E\u003Cspan id=\"E1077\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1045\" class=\"qowt-font10-Arial\"\u003ENo artigo anterior (\u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas\"\u003E\u003Cspan id=\"E1046\" class=\"qowt-font10-Arial\"\u003Eveja link\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1047\" class=\"qowt-font10-Arial\"\u003E), apresentei um exemplo \u003C\u002Fspan\u003E\u003Cspan id=\"E1048\" class=\"qowt-font10-Arial\"\u003Ecriando um\u003C\u002Fspan\u003E\u003Cspan id=\"E1049\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1050\" class=\"qowt-font10-Arial\"\u003Escript\u003C\u002Fspan\u003E\u003Cspan id=\"E1051\" class=\"qowt-font10-Arial\"\u003E para geração de declarações\u003C\u002Fspan\u003E\u003Cspan id=\"E1052\" class=\"qowt-font10-Arial\"\u003E DDL \u003C\u002Fspan\u003E\u003Cspan id=\"E1053\" class=\"qowt-font10-Arial\"\u003Epara\u003C\u002Fspan\u003E\u003Cspan id=\"E1054\" class=\"qowt-font10-Arial\"\u003E altera\u003C\u002Fspan\u003E\u003Cspan id=\"E1055\" class=\"qowt-font10-Arial\"\u003Er\u003C\u002Fspan\u003E\u003Cspan id=\"E1056\" class=\"qowt-font10-Arial\"\u003E as defini\u003C\u002Fspan\u003E\u003Cspan id=\"E1057\" class=\"qowt-font10-Arial\"\u003Eções de colunas que atendessem \u003C\u002Fspan\u003E\u003Cspan id=\"E1058\" class=\"qowt-font10-Arial\"\u003Ea \u003C\u002Fspan\u003E\u003Cspan id=\"E1059\" class=\"qowt-font10-Arial\"\u003Edeterminadas condições.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003EScripts SQL e Tabelas de Sistema\u003C\u002Fh2\u003E\n\u003Ch3 id=\"E1078\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1079\"\u003EEntenda o Caso de Uso\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp id=\"E1080\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1081\" class=\"qowt-font10-Arial\"\u003EAntes de mais nada, é preciso lembrar que não se pode alterar colunas que estejam vinculadas a \u003C\u002Fspan\u003E\u003Cspan id=\"E1082\" class=\"qowt-font10-Arial\"\u003Eoutros objetos, como \u003C\u002Fspan\u003E\u003Cspan id=\"E1083\" class=\"qowt-font10-Arial\"\u003Eíndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1084\" class=\"qowt-font10-Arial\"\u003E, defaults ou qualquer tipo de \u003C\u002Fspan\u003E\u003Cspan id=\"E1086\" class=\"qowt-font10-Arial\"\u003Econstraints\u003C\u002Fspan\u003E\u003Cspan id=\"E1088\" class=\"qowt-font10-Arial\"\u003E SQL\u003C\u002Fspan\u003E\u003Cspan id=\"E1089\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1090\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1091\" class=\"qowt-font10-Arial\"\u003EVeja no \u003C\u002Fspan\u003E\u003Cspan id=\"E1092\" class=\"qowt-font10-Arial\"\u003EQ\u003C\u002Fspan\u003E\u003Cspan id=\"E1093\" class=\"qowt-font10-Arial\"\u003Euadro\u003C\u002Fspan\u003E\u003Cspan id=\"E1094\" class=\"qowt-font10-Arial\"\u003E 1\u003C\u002Fspan\u003E\u003Cspan id=\"E1095\" class=\"qowt-font10-Arial\"\u003E a seguir o resultado obtido \u003C\u002Fspan\u003E\u003Cspan id=\"E1096\" class=\"qowt-font10-Arial\"\u003Equando tento alterar uma coluna associada a um índice\u003C\u002Fspan\u003E\u003Cspan id=\"E1097\" class=\"qowt-font10-Arial\"\u003E:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06134844\u002FScript1.png\"\u003E\u003Cimg class=\"alignnone wp-image-160550 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06134844\u002FScript1.png\" alt=\"Scripts SQL\" width=\"725\" height=\"196\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1172\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1173\" class=\"qowt-font10-Arial\"\u003EA \u003C\u002Fspan\u003E\u003Cspan id=\"E1174\" class=\"qowt-font10-Arial\"\u003Esolução \u003C\u002Fspan\u003E\u003Cspan id=\"E1175\" class=\"qowt-font10-Arial\"\u003Edo problema\u003C\u002Fspan\u003E\u003Cspan id=\"E1176\" class=\"qowt-font10-Arial\"\u003E é \u003C\u002Fspan\u003E\u003Cspan id=\"E1177\" class=\"qowt-font10-Arial\"\u003Eapagar \u003C\u002Fspan\u003E\u003Cspan id=\"E1178\" class=\"qowt-font10-Arial\"\u003Eeste\u003C\u002Fspan\u003E\u003Cspan id=\"E1179\" class=\"qowt-font10-Arial\"\u003Es índices, alterar as colunas e depois recriar \u003C\u002Fspan\u003E\u003Cspan id=\"E1180\" class=\"qowt-font10-Arial\"\u003Eseus \u003C\u002Fspan\u003E\u003Cspan id=\"E1181\" class=\"qowt-font10-Arial\"\u003Eíndices.\u003C\u002Fspan\u003E\u003Cspan id=\"E1182\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1183\" class=\"qowt-font10-Arial\"\u003ENa teoria, o procedimento é bem simples, mas \u003C\u002Fspan\u003E\u003Cspan id=\"E1184\" class=\"qowt-font10-Arial\"\u003Eé preciso considerar que são necessárias três\u003C\u002Fspan\u003E\u003Cspan id=\"E1185\" class=\"qowt-font10-Arial\"\u003E operações\u003C\u002Fspan\u003E\u003Cspan id=\"E1186\" class=\"qowt-font10-Arial\"\u003E para cada \u003C\u002Fspan\u003E\u003Cspan id=\"E1187\" class=\"qowt-font10-Arial\"\u003Ecoluna\u003C\u002Fspan\u003E\u003Cspan id=\"E1188\" class=\"qowt-font10-Arial\"\u003E que se vai alterar.\u003C\u002Fspan\u003E\u003Cspan id=\"E1189\" class=\"qowt-font10-Arial\"\u003E Sendo assim, o \u003C\u002Fspan\u003E\u003Cspan id=\"E1190\" class=\"qowt-font10-Arial\"\u003Escript\u003C\u002Fspan\u003E\u003Cspan id=\"E1191\" class=\"qowt-font10-Arial\"\u003E final pode facilmente\u003C\u002Fspan\u003E\u003Cspan id=\"E1192\" class=\"qowt-font10-Arial\"\u003E conter \u003C\u002Fspan\u003E\u003Cspan id=\"E1193\" class=\"qowt-font10-Arial\"\u003Ecentenas de \u003C\u002Fspan\u003E\u003Cspan id=\"E1194\" class=\"qowt-font10-Arial\"\u003Edeclara\u003C\u002Fspan\u003E\u003Cspan id=\"E1195\" class=\"qowt-font10-Arial\"\u003Eções\u003C\u002Fspan\u003E\u003Cspan id=\"E1196\" class=\"qowt-font10-Arial\"\u003E SQL\u003C\u002Fspan\u003E\u003Cspan id=\"E1197\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1198\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1199\" class=\"qowt-font10-Arial\"\u003EAutomatizar \u003C\u002Fspan\u003E\u003Cspan id=\"E1200\" class=\"qowt-font10-Arial\"\u003Ea criação desse script\u003C\u002Fspan\u003E\u003Cspan id=\"E1201\" class=\"qowt-font10-Arial\"\u003E não\u003C\u002Fspan\u003E\u003Cspan id=\"E1202\" class=\"qowt-font10-Arial\"\u003E apenas \u003C\u002Fspan\u003E\u003Cspan id=\"E1203\" class=\"qowt-font10-Arial\"\u003Ediminui\u003C\u002Fspan\u003E\u003Cspan id=\"E1204\" class=\"qowt-font10-Arial\"\u003E o tempo de desenvolvimento \u003C\u002Fspan\u003E\u003Cspan id=\"E1205\" class=\"qowt-font10-Arial\"\u003Edo script, mas \u003C\u002Fspan\u003E\u003Cspan id=\"E1206\" class=\"qowt-font10-Arial\"\u003Etambém reduz\u003C\u002Fspan\u003E\u003Cspan id=\"E1207\" class=\"qowt-font10-Arial\"\u003E dra\u003C\u002Fspan\u003E\u003Cspan id=\"E1208\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1209\" class=\"qowt-font10-Arial\"\u003Eticamente o risco de erro\u003C\u002Fspan\u003E\u003Cspan id=\"E1210\" class=\"qowt-font10-Arial\"\u003E no momento da implantação\u003C\u002Fspan\u003E\u003Cspan id=\"E1211\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1212\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1213\" class=\"qowt-font10-Arial\"\u003EEntão\u003C\u002Fspan\u003E\u003Cspan id=\"E1214\" class=\"qowt-font10-Arial\"\u003E o script desejado terá 3 blocos principais:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4 id=\"E1215\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1216\" class=\"qowt-font10-Arial\"\u003EBloco 1 \u003C\u002Fspan\u003E\u003Cspan id=\"E1217\" class=\"qowt-font10-Arial\"\u003E–\u003C\u002Fspan\u003E\u003Cspan id=\"E1218\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1219\" class=\"qowt-font10-Arial\"\u003Eapagar índices associados às colunas que serão alteradas\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Ch4 id=\"E1220\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1221\" class=\"qowt-font10-Arial\"\u003EBloco 2 – alterar as colunas desejadas (como vimos no artigo anterior)\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Ch4 id=\"E1222\" class=\"x-scope qowt-word-para-2 x-scope qowt-word-para-2 x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1223\" class=\"qowt-font10-Arial\"\u003EBloco 3 – reconstruir \u003C\u002Fspan\u003E\u003Cspan id=\"E1224\" class=\"qowt-font10-Arial\"\u003Eos índices apagados\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp id=\"E1225\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1226\" class=\"qowt-font10-Arial\"\u003EA automação \u003C\u002Fspan\u003E\u003Cspan id=\"E1228\" class=\"qowt-font10-Arial\"\u003Edos scripts para\u003C\u002Fspan\u003E\u003Cspan id=\"E1229\" class=\"qowt-font10-Arial\"\u003E cada um destes blocos\u003C\u002Fspan\u003E\u003Cspan id=\"E1230\" class=\"qowt-font10-Arial\"\u003E é apresentada a seguir.\u003C\u002Fspan\u003E\u003Cspan id=\"E1231\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1232\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1233\"\u003EScripts SQL – Defi\u003C\u002Fspan\u003E\u003Cspan id=\"E1234\"\u003En\u003C\u002Fspan\u003E\u003Cspan id=\"E1235\"\u003Ei\u003C\u002Fspan\u003E\u003Cspan id=\"E1236\"\u003Endo\u003C\u002Fspan\u003E\u003Cspan id=\"E1237\"\u003E Escopo\u003C\u002Fspan\u003E\u003Cspan id=\"E1238\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1239\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1240\" class=\"qowt-font10-Arial\"\u003EAntes de criar os blocos 1 e 3, é necessário \u003C\u002Fspan\u003E\u003Cspan id=\"E1241\" class=\"qowt-font10-Arial\"\u003Eidentifica\u003C\u002Fspan\u003E\u003Cspan id=\"E1242\" class=\"qowt-font10-Arial\"\u003Er\u003C\u002Fspan\u003E\u003Cspan id=\"E1243\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1244\" class=\"qowt-font10-Arial\"\u003Equais\u003C\u002Fspan\u003E\u003Cspan id=\"E1245\" class=\"qowt-font10-Arial\"\u003E índices a serem \u003C\u002Fspan\u003E\u003Cspan id=\"E1246\" class=\"qowt-font10-Arial\"\u003Eimpactados\u003C\u002Fspan\u003E\u003Cspan id=\"E1247\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E1248\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1249\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1250\" class=\"qowt-font10-Arial\"\u003ENo\u003C\u002Fspan\u003E\u003Cspan id=\"E1251\" class=\"qowt-font10-Arial\"\u003E Quadro 2\u003C\u002Fspan\u003E\u003Cspan id=\"E1252\" class=\"qowt-font10-Arial\"\u003E apresento a\u003C\u002Fspan\u003E\u003Cspan id=\"E1253\" class=\"qowt-font10-Arial\"\u003E expressão de tabela comum \u003C\u002Fspan\u003E\u003Cspan id=\"E1254\" class=\"qowt-font10-Arial\"\u003E(CTE)\u003C\u002Fspan\u003E\u003Cspan id=\"E1255\" class=\"qowt-font10-Arial\"\u003E que\u003C\u002Fspan\u003E\u003Cspan id=\"E1256\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1257\" class=\"qowt-font10-Arial\"\u003Eidentifica as tabelas\u003C\u002Fspan\u003E\u003Cspan id=\"E1258\" class=\"qowt-font10-Arial\"\u003E e índices afetados pela alteração \u003C\u002Fspan\u003E\u003Cspan id=\"E1259\" class=\"qowt-font10-Arial\"\u003Ede tipos de dados \u003C\u002Fspan\u003E\u003Cspan id=\"E1260\" class=\"qowt-font10-Arial\"\u003Ed\u003C\u002Fspan\u003E\u003Cspan id=\"E1261\" class=\"qowt-font10-Arial\"\u003Eas colunas\u003C\u002Fspan\u003E\u003Cspan id=\"E1262\" class=\"qowt-font10-Arial\"\u003E, seguindo o exemplo mostrado no artigo anterior. \u003C\u002Fspan\u003E\u003Cspan id=\"E1263\" class=\"qowt-font10-Arial\"\u003EEm seguida, identifico os \u003C\u002Fspan\u003E\u003Cspan id=\"E1264\" class=\"qowt-font10-Arial\"\u003Emetadados desses \u003C\u002Fspan\u003E\u003Cspan id=\"E1265\" class=\"qowt-font10-Arial\"\u003Eíndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1266\" class=\"qowt-font10-Arial\"\u003E, para que possam ser recriados posteriormente\u003C\u002Fspan\u003E\u003Cspan id=\"E1267\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135136\u002FScript2.png\"\u003E\u003Cimg class=\"alignnone wp-image-160552 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135136\u002FScript2.png\" alt=\"Scripts SQL\" width=\"725\" height=\"610\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fo-caso-das-consultas-lentas-no-synapse\"\u003EO Caso das Consultas Lentas no Synapse\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1812\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1813\" class=\"qowt-font10-Arial\"\u003EObserve que criei uma t\u003C\u002Fspan\u003E\u003Cspan id=\"E1814\" class=\"qowt-font10-Arial\"\u003Eabela temporária\u003C\u002Fspan\u003E\u003Cspan id=\"E1815\" class=\"qowt-font10-Arial\"\u003E “\u003C\u002Fspan\u003E\u003Cspan id=\"E1816\" class=\"qowt-font10-Arial\"\u003E#\u003C\u002Fspan\u003E\u003Cspan id=\"E1818\" class=\"qowt-font10-Arial\"\u003EtempIndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1820\" class=\"qowt-font10-Arial\"\u003E”\u003C\u002Fspan\u003E\u003Cspan id=\"E1821\" class=\"qowt-font10-Arial\"\u003E, porque estas\u003C\u002Fspan\u003E\u003Cspan id=\"E1822\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1823\" class=\"qowt-font10-Arial\"\u003Eas\u003C\u002Fspan\u003E\u003Cspan id=\"E1824\" class=\"qowt-font10-Arial\"\u003E informações\u003C\u002Fspan\u003E\u003Cspan id=\"E1825\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1826\" class=\"qowt-font10-Arial\"\u003Eserão usadas duas vezes, na\u003C\u002Fspan\u003E\u003Cspan id=\"E1827\" class=\"qowt-font10-Arial\"\u003E construção dos scripts dos \u003C\u002Fspan\u003E\u003Cspan id=\"E1828\" class=\"qowt-font10-Arial\"\u003Ebloco\u003C\u002Fspan\u003E\u003Cspan id=\"E1829\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1830\" class=\"qowt-font10-Arial\"\u003E 1 \u003C\u002Fspan\u003E\u003Cspan id=\"E1831\" class=\"qowt-font10-Arial\"\u003Ee \u003C\u002Fspan\u003E\u003Cspan id=\"E1832\" class=\"qowt-font10-Arial\"\u003E3\u003C\u002Fspan\u003E\u003Cspan id=\"E1833\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1834\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1835\" class=\"qowt-font10-Arial\"\u003EOutro ponto importante é que \u003C\u002Fspan\u003E\u003Cspan id=\"E1836\" class=\"qowt-font10-Arial\"\u003Ea declaração\u003C\u002Fspan\u003E\u003Cspan id=\"E1837\" class=\"qowt-font10-Arial\"\u003E acima \u003C\u002Fspan\u003E\u003Cspan id=\"E1838\" class=\"qowt-font10-Arial\"\u003Etraz informação para \u003C\u002Fspan\u003E\u003Cspan id=\"E1839\" class=\"qowt-font10-Arial\"\u003Egera\u003C\u002Fspan\u003E\u003Cspan id=\"E1840\" class=\"qowt-font10-Arial\"\u003Eção de\u003C\u002Fspan\u003E\u003Cspan id=\"E1841\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1842\" class=\"qowt-font10-Arial\"\u003Escript\u003C\u002Fspan\u003E\u003Cspan id=\"E1843\" class=\"qowt-font10-Arial\"\u003Es que envolvam\u003C\u002Fspan\u003E\u003Cspan id=\"E1844\" class=\"qowt-font10-Arial\"\u003E apenas índices \u003C\u002Fspan\u003E\u003Cspan id=\"E1845\" class=\"qowt-font10-Arial\"\u003Enão-\u003C\u002Fspan\u003E\u003Cspan id=\"E1847\" class=\"qowt-font10-Arial\"\u003Eclusterizados\u003C\u002Fspan\u003E\u003Cspan id=\"E1849\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E1850\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1851\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1852\" class=\"qowt-font10-Arial\"\u003EO caso dos índices \u003C\u002Fspan\u003E\u003Cspan id=\"E1854\" class=\"qowt-font10-Arial\"\u003Eclusterizados\u003C\u002Fspan\u003E\u003Cspan id=\"E1856\" class=\"qowt-font10-Arial\"\u003E requer muito mais cuidado, porque \u003C\u002Fspan\u003E\u003Cspan id=\"E1857\" class=\"qowt-font10-Arial\"\u003Eeles\u003C\u002Fspan\u003E\u003Cspan id=\"E1858\" class=\"qowt-font10-Arial\"\u003E ordenam os dados diretamente nas páginas de dados. Em outras palavras, fisicamente, o índice \u003C\u002Fspan\u003E\u003Cspan id=\"E1860\" class=\"qowt-font10-Arial\"\u003Eclusterizado\u003C\u002Fspan\u003E\u003Cspan id=\"E1862\" class=\"qowt-font10-Arial\"\u003E é a própria tabela. Portanto, não dá para simplesmente exclu\u003C\u002Fspan\u003E\u003Cspan id=\"E1863\" class=\"qowt-font10-Arial\"\u003Eí-los \u003C\u002Fspan\u003E\u003Cspan id=\"E1864\" class=\"qowt-font10-Arial\"\u003Esem que haja perda de dados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1866\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1867\"\u003EBloco 1 – \u003C\u002Fspan\u003E\u003Cspan id=\"E1868\"\u003EScript para Excluir Índices\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1869\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1870\" class=\"qowt-font10-Arial\"\u003ENe\u003C\u002Fspan\u003E\u003Cspan id=\"E1871\" class=\"qowt-font10-Arial\"\u003Este primeiro bloco\u003C\u002Fspan\u003E\u003Cspan id=\"E1872\" class=\"qowt-font10-Arial\"\u003E, eu monto um\u003C\u002Fspan\u003E\u003Cspan id=\"E1873\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E1874\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1875\" class=\"qowt-font10-Arial\"\u003Edeclaração \u003C\u002Fspan\u003E\u003Cspan id=\"E1876\" class=\"qowt-font10-Arial\"\u003Eque \u003C\u002Fspan\u003E\u003Cspan id=\"E1877\" class=\"qowt-font10-Arial\"\u003Egera \u003C\u002Fspan\u003E\u003Cspan id=\"E1878\" class=\"qowt-font10-Arial\"\u003Eo script\u003C\u002Fspan\u003E\u003Cspan id=\"E1879\" class=\"qowt-font10-Arial\"\u003E de exclusão de \u003C\u002Fspan\u003E\u003Cspan id=\"E1880\" class=\"qowt-font10-Arial\"\u003Eíndices. \u003C\u002Fspan\u003E\u003Cspan id=\"E1881\" class=\"qowt-font10-Arial\"\u003ETal script precisa conter declarações com a \u003C\u002Fspan\u003E\u003Cspan id=\"E1882\" class=\"qowt-font10-Arial\"\u003Esintaxe apresentada a seguir\u003C\u002Fspan\u003E\u003Cspan id=\"E1883\" class=\"qowt-font10-Arial\"\u003E (veja Quadro 3)\u003C\u002Fspan\u003E\u003Cspan id=\"E1884\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135317\u002Fscript3.png\"\u003E\u003Cimg class=\"alignnone wp-image-160553 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135317\u002Fscript3.png\" alt=\"Scripts SQL\" width=\"722\" height=\"90\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan id=\"E1910\" class=\"qowt-font10-Arial\"\u003EAgora\u003C\u002Fspan\u003E\u003Cspan id=\"E1911\" class=\"qowt-font10-Arial\"\u003E, no Quadro 4,\u003C\u002Fspan\u003E\u003Cspan id=\"E1912\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1913\" class=\"qowt-font10-Arial\"\u003Euso uma nova CTE para \u003C\u002Fspan\u003E\u003Cspan id=\"E1914\" class=\"qowt-font10-Arial\"\u003Ele\u003C\u002Fspan\u003E\u003Cspan id=\"E1915\" class=\"qowt-font10-Arial\"\u003Er\u003C\u002Fspan\u003E\u003Cspan id=\"E1916\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1917\" class=\"qowt-font10-Arial\"\u003Ed\u003C\u002Fspan\u003E\u003Cspan id=\"E1918\" class=\"qowt-font10-Arial\"\u003Ea tabela \u003C\u002Fspan\u003E\u003Cspan id=\"E1919\" class=\"qowt-font10-Arial\"\u003Etemporária “\u003C\u002Fspan\u003E\u003Cspan id=\"E1920\" class=\"qowt-font10-Arial\"\u003E#\u003C\u002Fspan\u003E\u003Cspan id=\"E1922\" class=\"qowt-font10-Arial\"\u003EtempIndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1924\" class=\"qowt-font10-Arial\"\u003E” \u003C\u002Fspan\u003E\u003Cspan id=\"E1925\" class=\"qowt-font10-Arial\"\u003Eapenas \u003C\u002Fspan\u003E\u003Cspan id=\"E1926\" class=\"qowt-font10-Arial\"\u003Eas informações necessárias para apagar estes \u003C\u002Fspan\u003E\u003Cspan id=\"E1927\" class=\"qowt-font10-Arial\"\u003Eíndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1928\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003Cspan id=\"E1929\" class=\"qowt-font10-Arial\"\u003EDepois defino uma cadeia de caracteres que escreva a declaração DDL desejada. \u003C\u002Fspan\u003E\u003Cspan id=\"E1930\" class=\"qowt-font10-Arial\"\u003EA adição do \u003C\u002Fspan\u003E\u003Cspan id=\"E1931\" class=\"qowt-font10-Arial\"\u003Ecaractere\u003C\u002Fspan\u003E\u003Cspan id=\"E1932\" class=\"qowt-font10-Arial\"\u003E CHAR(10) é exatamente para inserção de linhas \u003C\u002Fspan\u003E\u003Cspan id=\"E1933\" class=\"qowt-font10-Arial\"\u003Eextras\u003C\u002Fspan\u003E\u003Cspan id=\"E1934\" class=\"qowt-font10-Arial\"\u003E no script.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135421\u002Fscript4.png\"\u003E\u003Cimg class=\"alignnone wp-image-160554 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135421\u002Fscript4.png\" alt=\"Scripts SQL\" width=\"722\" height=\"657\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fsql-server\u002Fanalise-de-grafos-no-azure-sql-db\"\u003EAnálise de Grafos no Azure SQL DB\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E2220\" class=\"x-scope qowt-word-para-3 qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E2221\"\u003EScripts SQL – Bloco 3 – \u003C\u002Fspan\u003E\u003Cspan id=\"E2222\"\u003EScript para Recriar Índices\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E2223\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2224\" class=\"qowt-font10-Arial\"\u003EA criação de índices \u003C\u002Fspan\u003E\u003Cspan id=\"E2225\" class=\"qowt-font10-Arial\"\u003Eno\u003C\u002Fspan\u003E\u003Cspan id=\"E2226\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2227\" class=\"qowt-font10-Arial\"\u003ESQL \u003C\u002Fspan\u003E\u003Cspan id=\"E2228\" class=\"qowt-font10-Arial\"\u003Eon-premises \u003C\u002Fspan\u003E\u003Cspan id=\"E2229\" class=\"qowt-font10-Arial\"\u003Ee\u003C\u002Fspan\u003E\u003Cspan id=\"E2230\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2231\" class=\"qowt-font10-Arial\"\u003EAzure SQL\u003C\u002Fspan\u003E\u003Cspan id=\"E2232\" class=\"qowt-font10-Arial\"\u003E oferece múltiplas opções para o desenvolvedor.\u003C\u002Fspan\u003E\u003Cspan id=\"E2233\" class=\"qowt-font10-Arial\"\u003E (\u003C\u002Fspan\u003E\u003Ca id=\"E2234\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002FPT-BR\u002Fsql\u002Ft-sql\u002Fstatements\u002Fcreate-index-transact-sql?view=sql-server-ver16\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E2235\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003EClique aqui para saber mais\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E2236\" class=\"qowt-font10-Arial\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2237\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2238\" class=\"qowt-font10-Arial\"\u003EMesmo \u003C\u002Fspan\u003E\u003Cspan id=\"E2239\" class=\"qowt-font10-Arial\"\u003Econsidera\u003C\u002Fspan\u003E\u003Cspan id=\"E2240\" class=\"qowt-font10-Arial\"\u003Endo\u003C\u002Fspan\u003E\u003Cspan id=\"E2241\" class=\"qowt-font10-Arial\"\u003E apenas\u003C\u002Fspan\u003E\u003Cspan id=\"E2242\" class=\"qowt-font10-Arial\"\u003E índices\u003C\u002Fspan\u003E\u003Cspan id=\"E2243\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2244\" class=\"qowt-font10-Arial\"\u003Ecomuns (algumas vezes chamados de \u003C\u002Fspan\u003E\u003Cspan id=\"E2245\" class=\"qowt-font10-Arial\"\u003E“B-\u003C\u002Fspan\u003E\u003Cspan id=\"E2247\" class=\"qowt-font10-Arial\"\u003Etree\u003C\u002Fspan\u003E\u003Cspan id=\"E2249\" class=\"qowt-font10-Arial\"\u003E” \u003C\u002Fspan\u003E\u003Cspan id=\"E2250\" class=\"qowt-font10-Arial\"\u003Eou \u003C\u002Fspan\u003E\u003Cspan id=\"E2251\" class=\"qowt-font10-Arial\"\u003E“\u003C\u002Fspan\u003E\u003Cspan id=\"E2253\" class=\"qowt-font10-Arial\"\u003Erowstore\u003C\u002Fspan\u003E\u003Cspan id=\"E2255\" class=\"qowt-font10-Arial\"\u003E”, para diferenciar dos índices “\u003C\u002Fspan\u003E\u003Cspan id=\"E2257\" class=\"qowt-font10-Arial\"\u003Ecolumnstore\u003C\u002Fspan\u003E\u003Cspan id=\"E2259\" class=\"qowt-font10-Arial\"\u003E”)\u003C\u002Fspan\u003E\u003Cspan id=\"E2260\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2261\" class=\"qowt-font10-Arial\"\u003Ee não\u003C\u002Fspan\u003E\u003Cspan id=\"E2262\" class=\"qowt-font10-Arial\"\u003E–\u003C\u002Fspan\u003E\u003Cspan id=\"E2264\" class=\"qowt-font10-Arial\"\u003Eclusteridados\u003C\u002Fspan\u003E\u003Cspan id=\"E2266\" class=\"qowt-font10-Arial\"\u003E, \u003C\u002Fspan\u003E\u003Cspan id=\"E2267\" class=\"qowt-font10-Arial\"\u003Eexistem\u003C\u002Fspan\u003E\u003Cspan id=\"E2268\" class=\"qowt-font10-Arial\"\u003E diversas maneiras de customizá-los\u003C\u002Fspan\u003E\u003Cspan id=\"E2269\" class=\"qowt-font10-Arial\"\u003E às\u003C\u002Fspan\u003E\u003Cspan id=\"E2270\" class=\"qowt-font10-Arial\"\u003E sua\u003C\u002Fspan\u003E\u003Cspan id=\"E2271\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E2272\" class=\"qowt-font10-Arial\"\u003E necessidade\u003C\u002Fspan\u003E\u003Cspan id=\"E2273\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E2274\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2275\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2276\" class=\"qowt-font10-Arial\"\u003EPara simplificar a construção\u003C\u002Fspan\u003E\u003Cspan id=\"E2277\" class=\"qowt-font10-Arial\"\u003E do\u003C\u002Fspan\u003E\u003Cspan id=\"E2278\" class=\"qowt-font10-Arial\"\u003E gerador de\u003C\u002Fspan\u003E\u003Cspan id=\"E2279\" class=\"qowt-font10-Arial\"\u003E scripts\u003C\u002Fspan\u003E\u003Cspan id=\"E2280\" class=\"qowt-font10-Arial\"\u003E de criação de índices, vou considerar aqui apenas 03\u003C\u002Fspan\u003E\u003Cspan id=\"E2281\" class=\"qowt-font10-Arial\"\u003E cenários:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch5 id=\"E2282\" class=\"qowt-li-13_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E2283\" class=\"qowt-font10-Arial\"\u003EÍ\u003C\u002Fspan\u003E\u003Cspan id=\"E2284\" class=\"qowt-font10-Arial\"\u003Endices \u003C\u002Fspan\u003E\u003Cspan id=\"E2286\" class=\"qowt-font10-Arial\"\u003Erowstore\u003C\u002Fspan\u003E\u003Cspan id=\"E2288\" class=\"qowt-font10-Arial\"\u003E não \u003C\u002Fspan\u003E\u003Cspan id=\"E2290\" class=\"qowt-font10-Arial\"\u003Eclusterizados\u003C\u002Fspan\u003E\u003Cspan id=\"E2292\" class=\"qowt-font10-Arial\"\u003E com ordenação ascendente ou descendente\u003C\u002Fspan\u003E\u003C\u002Fh5\u003E\n\u003Ch5 id=\"E2293\" class=\"qowt-li-13_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E2294\" class=\"qowt-font10-Arial\"\u003EÍndices \u003C\u002Fspan\u003E\u003Cspan id=\"E2296\" class=\"qowt-font10-Arial\"\u003Erowstore\u003C\u002Fspan\u003E\u003Cspan id=\"E2298\" class=\"qowt-font10-Arial\"\u003E não \u003C\u002Fspan\u003E\u003Cspan id=\"E2300\" class=\"qowt-font10-Arial\"\u003Eclusterizados\u003C\u002Fspan\u003E\u003Cspan id=\"E2302\" class=\"qowt-font10-Arial\"\u003E com valores únicos\u003C\u002Fspan\u003E\u003C\u002Fh5\u003E\n\u003Ch5 id=\"E2303\" class=\"qowt-li-13_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E2304\" class=\"qowt-font10-Arial\"\u003EÍndices \u003C\u002Fspan\u003E\u003Cspan id=\"E2306\" class=\"qowt-font10-Arial\"\u003Erowstore\u003C\u002Fspan\u003E\u003Cspan id=\"E2308\" class=\"qowt-font10-Arial\"\u003E não \u003C\u002Fspan\u003E\u003Cspan id=\"E2310\" class=\"qowt-font10-Arial\"\u003Eclusterizados\u003C\u002Fspan\u003E\u003Cspan id=\"E2312\" class=\"qowt-font10-Arial\"\u003E incluindo colunas adicionais\u003C\u002Fspan\u003E\u003C\u002Fh5\u003E\n\u003Cp id=\"E2313\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2314\" class=\"qowt-font10-Arial\"\u003EAs informações necessárias para identificar os detalhes de criação de qualquer índice do banco de dados estão disponíveis na tabela de sistema \u003C\u002Fspan\u003E\u003Cspan id=\"E2315\" class=\"qowt-font10-Arial\"\u003E“\u003C\u002Fspan\u003E\u003Cspan id=\"E2317\" class=\"qowt-font10-Arial\"\u003Esys.index_columns\u003C\u002Fspan\u003E\u003Cspan id=\"E2319\" class=\"qowt-font10-Arial\"\u003E”\u003C\u002Fspan\u003E\u003Cspan id=\"E2320\" class=\"qowt-font10-Arial\"\u003E. Caso você não tenha observado, esta \u003C\u002Fspan\u003E\u003Cspan id=\"E2321\" class=\"qowt-font10-Arial\"\u003Etabela\u003C\u002Fspan\u003E\u003Cspan id=\"E2322\" class=\"qowt-font10-Arial\"\u003E já foi utilizada para criação da tabela temporá\u003C\u002Fspan\u003E\u003Cspan id=\"E2323\" class=\"qowt-font10-Arial\"\u003Eria “\u003C\u002Fspan\u003E\u003Cspan id=\"E2324\" class=\"qowt-font10-Arial\"\u003E#\u003C\u002Fspan\u003E\u003Cspan id=\"E2326\" class=\"qowt-font10-Arial\"\u003EtempIndices\u003C\u002Fspan\u003E\u003Cspan id=\"E2328\" class=\"qowt-font10-Arial\"\u003E”.\u003C\u002Fspan\u003E\u003Cspan id=\"E2329\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2330\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2331\" class=\"qowt-font10-Arial\"\u003EAs\u003C\u002Fspan\u003E\u003Cspan id=\"E2332\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2333\" class=\"qowt-font10-Arial\"\u003Ecolunas\u003C\u002Fspan\u003E\u003Cspan id=\"E2334\" class=\"qowt-font10-Arial\"\u003E principais desta última tabela são \u003C\u002Fspan\u003E\u003Cspan id=\"E2336\" class=\"qowt-font10-Arial\"\u003Eobject_id\u003C\u002Fspan\u003E\u003Cspan id=\"E2338\" class=\"qowt-font10-Arial\"\u003E, \u003C\u002Fspan\u003E\u003Cspan id=\"E2340\" class=\"qowt-font10-Arial\"\u003Eindex_id\u003C\u002Fspan\u003E\u003Cspan id=\"E2342\" class=\"qowt-font10-Arial\"\u003E e \u003C\u002Fspan\u003E\u003Cspan id=\"E2344\" class=\"qowt-font10-Arial\"\u003Eindex_column_id\u003C\u002Fspan\u003E\u003Cspan id=\"E2346\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E2347\" class=\"qowt-font10-Arial\"\u003E Eles identificam o ID da tabela, o ID do índice\u003C\u002Fspan\u003E\u003Cspan id=\"E2348\" class=\"qowt-font10-Arial\"\u003E daquela tabela e o ID das colunas que compõem este índice\u003C\u002Fspan\u003E\u003Cspan id=\"E2349\" class=\"qowt-font10-Arial\"\u003E. Com \u003C\u002Fspan\u003E\u003Cspan id=\"E2350\" class=\"qowt-font10-Arial\"\u003Eelas\u003C\u002Fspan\u003E\u003Cspan id=\"E2351\" class=\"qowt-font10-Arial\"\u003E é possível fazer buscas\u003C\u002Fspan\u003E\u003Cspan id=\"E2352\" class=\"qowt-font10-Arial\"\u003E combinando tabela\u003C\u002Fspan\u003E\u003Cspan id=\"E2353\" class=\"qowt-font10-Arial\"\u003E temporária\u003C\u002Fspan\u003E\u003Cspan id=\"E2354\" class=\"qowt-font10-Arial\"\u003E com outras tabelas de sistema, caso isso seja necessário.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2355\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2356\" class=\"qowt-font10-Arial\"\u003EÍndices podem ser criados sobre múltipl\u003C\u002Fspan\u003E\u003Cspan id=\"E2357\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E2358\" class=\"qowt-font10-Arial\"\u003Es \u003C\u002Fspan\u003E\u003Cspan id=\"E2359\" class=\"qowt-font10-Arial\"\u003Ecolunas\u003C\u002Fspan\u003E\u003Cspan id=\"E2360\" class=\"qowt-font10-Arial\"\u003E e, neste caso, \u003C\u002Fspan\u003E\u003Cspan id=\"E2361\" class=\"qowt-font10-Arial\"\u003Enossa\u003C\u002Fspan\u003E\u003Cspan id=\"E2362\" class=\"qowt-font10-Arial\"\u003E tabela \u003C\u002Fspan\u003E\u003Cspan id=\"E2363\" class=\"qowt-font10-Arial\"\u003Etemporária apresentará mais de uma linha por índice\u003C\u002Fspan\u003E\u003Cspan id=\"E2364\" class=\"qowt-font10-Arial\"\u003E. Porém, noss\u003C\u002Fspan\u003E\u003Cspan id=\"E2365\" class=\"qowt-font10-Arial\"\u003Eo\u003C\u002Fspan\u003E\u003Cspan id=\"E2366\" class=\"qowt-font10-Arial\"\u003E gerador \u003C\u002Fspan\u003E\u003Cspan id=\"E2367\" class=\"qowt-font10-Arial\"\u003Ede scripts precisa combinar estas colunas numa única lista\u003C\u002Fspan\u003E\u003Cspan id=\"E2368\" class=\"qowt-font10-Arial\"\u003E para \u003C\u002Fspan\u003E\u003Cspan id=\"E2369\" class=\"qowt-font10-Arial\"\u003Eescrever uma declaração SQL válida.\u003C\u002Fspan\u003E\u003Cspan id=\"E2370\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2371\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2372\" class=\"qowt-font10-Arial\"\u003EPara \u003C\u002Fspan\u003E\u003Cspan id=\"E2373\" class=\"qowt-font10-Arial\"\u003Eresolver esta questão\u003C\u002Fspan\u003E\u003Cspan id=\"E2374\" class=\"qowt-font10-Arial\"\u003E, eu \u003C\u002Fspan\u003E\u003Cspan id=\"E2375\" class=\"qowt-font10-Arial\"\u003Euso aqui\u003C\u002Fspan\u003E\u003Cspan id=\"E2376\" class=\"qowt-font10-Arial\"\u003E a fun\u003C\u002Fspan\u003E\u003Cspan id=\"E2377\" class=\"qowt-font10-Arial\"\u003Eção\u003C\u002Fspan\u003E\u003Cspan id=\"E2378\" class=\"qowt-font10-Arial\"\u003E de agregação\u003C\u002Fspan\u003E\u003Cspan id=\"E2379\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Ca id=\"E2380\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Ft-sql\u002Ffunctions\u002Fstring-agg-transact-sql?view=sql-server-ver16\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E2381\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003ESTRING_AGG\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E2382\" class=\"qowt-font10-Arial\"\u003E,\u003C\u002Fspan\u003E\u003Cspan id=\"E2383\" class=\"qowt-font10-Arial\"\u003E disponível em qualquer banco\u003C\u002Fspan\u003E\u003Cspan id=\"E2384\" class=\"qowt-font10-Arial\"\u003E de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E2385\" class=\"qowt-font10-Arial\"\u003E que tenha nível de compatibilidade 14.X\u003C\u002Fspan\u003E\u003Cspan id=\"E2386\" class=\"qowt-font10-Arial\"\u003E ou superior (SQL Server 2017).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2387\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2388\" class=\"qowt-font10-Arial\"\u003EA sintaxe \u003C\u002Fspan\u003E\u003Cspan id=\"E2389\" class=\"qowt-font10-Arial\"\u003Edessa função \u003C\u002Fspan\u003E\u003Cspan id=\"E2390\" class=\"qowt-font10-Arial\"\u003Eé bem simples, basta informar a \u003C\u002Fspan\u003E\u003Cspan id=\"E2391\" class=\"qowt-font10-Arial\"\u003Ecoluna que se quer agregar e qual o separador que será usado. No presente caso, o separador \u003C\u002Fspan\u003E\u003Cspan id=\"E2392\" class=\"qowt-font10-Arial\"\u003Edesejado é\u003C\u002Fspan\u003E\u003Cspan id=\"E2393\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2394\" class=\"qowt-font10-Arial\"\u003Eo caractere vírgula (‘,’).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2395\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2396\" class=\"qowt-font10-Arial\"\u003EO mesmo problema acontece caso o índice tenha colunas incluídas (cláusula INCLUDE). \u003C\u002Fspan\u003E\u003Cspan id=\"E2397\" class=\"qowt-font10-Arial\"\u003EA função STRING_AGG novamente resolve o problema.\u003C\u002Fspan\u003E\u003Cspan id=\"E2398\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2399\" class=\"qowt-font10-Arial\"\u003EA distinção entre as colunas indexadas e as colunas incluídas no índice é feita com a informação \u003C\u002Fspan\u003E\u003Cspan id=\"E2400\" class=\"qowt-font10-Arial\"\u003Eda coluna \u003C\u002Fspan\u003E\u003Cspan id=\"E2402\" class=\"qowt-font10-Arial\"\u003Eis_included_column\u003C\u002Fspan\u003E\u003Cspan id=\"E2404\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003Cspan id=\"E2405\" class=\"qowt-font10-Arial\"\u003ESe o valor for 0 (falso), a coluna é indexada, se for 1 (verdadeiro), a coluna é incluída.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2407\" class=\"qowt-font10-Arial\"\u003EEntão eu \u003C\u002Fspan\u003E\u003Cspan id=\"E2408\" class=\"qowt-font10-Arial\"\u003Ec\u003C\u002Fspan\u003E\u003Cspan id=\"E2409\" class=\"qowt-font10-Arial\"\u003Eomeço a \u003C\u002Fspan\u003E\u003Cspan id=\"E2410\" class=\"qowt-font10-Arial\"\u003Ecri\u003C\u002Fspan\u003E\u003Cspan id=\"E2411\" class=\"qowt-font10-Arial\"\u003Eaçã\u003C\u002Fspan\u003E\u003Cspan id=\"E2412\" class=\"qowt-font10-Arial\"\u003Eo \u003C\u002Fspan\u003E\u003Cspan id=\"E2413\" class=\"qowt-font10-Arial\"\u003Edo \u003C\u002Fspan\u003E\u003Cspan id=\"E2414\" class=\"qowt-font10-Arial\"\u003Emeu gerad\u003C\u002Fspan\u003E\u003Cspan id=\"E2415\" class=\"qowt-font10-Arial\"\u003Eor de scripts usando expressões de tabela \u003C\u002Fspan\u003E\u003Cspan class=\"qowt-font10-Arial\"\u003Ecomum (CTE) separadas para colunas indexadas e \u003C\u002Fspan\u003E\u003Cspan id=\"E2416\" class=\"qowt-font10-Arial\"\u003Eincluídas\u003C\u002Fspan\u003E\u003Cspan id=\"E2417\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E2418\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2419\" class=\"qowt-font10-Arial\"\u003EO\u003C\u002Fspan\u003E\u003Cspan id=\"E2420\" class=\"qowt-font10-Arial\"\u003E Quadro 5\u003C\u002Fspan\u003E\u003Cspan id=\"E2421\" class=\"qowt-font10-Arial\"\u003E mostra \u003C\u002Fspan\u003E\u003Cspan id=\"E2422\" class=\"qowt-font10-Arial\"\u003Eum exemplo com estas\u003C\u002Fspan\u003E\u003Cspan id=\"E2423\" class=\"qowt-font10-Arial\"\u003E duas \u003C\u002Fspan\u003E\u003Cspan id=\"E2425\" class=\"qowt-font10-Arial\"\u003ECTEs\u003C\u002Fspan\u003E\u003Cspan id=\"E2427\" class=\"qowt-font10-Arial\"\u003E e o resultado que elas retornariam\u003C\u002Fspan\u003E\u003Cspan id=\"E2428\" class=\"qowt-font10-Arial\"\u003E. O\u003C\u002Fspan\u003E\u003Cspan id=\"E2429\" class=\"qowt-font10-Arial\"\u003Ebserve que o SELECT final \u003C\u002Fspan\u003E\u003Cspan id=\"E2430\" class=\"qowt-font10-Arial\"\u003Eneste quadro \u003C\u002Fspan\u003E\u003Cspan id=\"E2431\" class=\"qowt-font10-Arial\"\u003Eainda não \u003C\u002Fspan\u003E\u003Cspan id=\"E2432\" class=\"qowt-font10-Arial\"\u003Elida com geração das declarações SQL.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135728\u002Fscript5.png\"\u003E\u003Cimg class=\"alignnone wp-image-160555 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135728\u002Fscript5.png\" alt=\"Scripts SQL\" width=\"585\" height=\"698\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E2998\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2999\" class=\"qowt-font10-Arial\"\u003ETrês informações\u003C\u002Fspan\u003E\u003Cspan id=\"E3000\" class=\"qowt-font10-Arial\"\u003E interessantes \u003C\u002Fspan\u003E\u003Cspan id=\"E3001\" class=\"qowt-font10-Arial\"\u003Esobre \u003C\u002Fspan\u003E\u003Cspan id=\"E3002\" class=\"qowt-font10-Arial\"\u003Eos\u003C\u002Fspan\u003E\u003Cspan id=\"E3003\" class=\"qowt-font10-Arial\"\u003E índices\u003C\u002Fspan\u003E\u003Cspan id=\"E3004\" class=\"qowt-font10-Arial\"\u003E do quadro acima\u003C\u002Fspan\u003E\u003Cspan id=\"E3005\" class=\"qowt-font10-Arial\"\u003E:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3006\" class=\"qowt-li-1_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E3007\" class=\"qowt-font10-Arial\"\u003EO índice da linha 2 \u003C\u002Fspan\u003E\u003Cspan id=\"E3008\" class=\"qowt-font10-Arial\"\u003Eé composto de cinco colunas\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3009\" class=\"qowt-li-1_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E3010\" class=\"qowt-font10-Arial\"\u003EO índice\u003C\u002Fspan\u003E\u003Cspan id=\"E3011\" class=\"qowt-font10-Arial\"\u003E da linha 4 \u003C\u002Fspan\u003E\u003Cspan id=\"E3012\" class=\"qowt-font10-Arial\"\u003Eé \u003C\u002Fspan\u003E\u003Cspan id=\"E3013\" class=\"qowt-font10-Arial\"\u003Eque usa a\u003C\u002Fspan\u003E\u003Cspan id=\"E3014\" class=\"qowt-font10-Arial\"\u003E cláusula INCLUDE\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E3015\" class=\"qowt-li-1_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E3016\" class=\"qowt-font10-Arial\"\u003ENenhum dos índices usa ordenação descendente de campos\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3017\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3018\" class=\"qowt-font10-Arial\"\u003EAntes de\u003C\u002Fspan\u003E\u003Cspan id=\"E3019\" class=\"qowt-font10-Arial\"\u003E gerar o script desejado\u003C\u002Fspan\u003E\u003Cspan id=\"E3020\" class=\"qowt-font10-Arial\"\u003E,\u003C\u002Fspan\u003E\u003Cspan id=\"E3021\" class=\"qowt-font10-Arial\"\u003E é \u003C\u002Fspan\u003E\u003Cspan id=\"E3022\" class=\"qowt-font10-Arial\"\u003Enecessário \u003C\u002Fspan\u003E\u003Cspan id=\"E3023\" class=\"qowt-font10-Arial\"\u003Eidentificar \u003C\u002Fspan\u003E\u003Cspan id=\"E3024\" class=\"qowt-font10-Arial\"\u003Eas propriedades dos índices e eliminar duplicidades. O Quadro \u003C\u002Fspan\u003E\u003Cspan id=\"E3025\" class=\"qowt-font10-Arial\"\u003E6 é, na realidade uma continuação do quadro anterior, por isso mostro apenas a citação das \u003C\u002Fspan\u003E\u003Cspan id=\"E3027\" class=\"qowt-font10-Arial\"\u003ECTEs\u003C\u002Fspan\u003E\u003Cspan id=\"E3029\" class=\"qowt-font10-Arial\"\u003E descritas anteriormente. (\u003C\u002Fspan\u003E\u003Cspan id=\"E3030\" class=\"qowt-font10-Arial\"\u003ECaso queira ver o script completo, \u003C\u002Fspan\u003E\u003Ca id=\"E3031\" contenteditable=\"false\" href=\"https:\u002F\u002Fgithub.com\u002Fwcrivelini\u002Farticles\u002Fblob\u002Fmain\u002FSysTables_Scripts\u002FSysTabScript2.sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E3032\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Eclique nesse link\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E3033\" class=\"qowt-font10-Arial\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135920\u002Fscript6.png\"\u003E\u003Cimg class=\"alignnone wp-image-160556 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135920\u002Fscript6.png\" alt=\"Scripts SQL\" width=\"642\" height=\"758\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3586\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3587\" class=\"qowt-font10-Arial\"\u003EPara fazer o download do script completo, acesse este \u003C\u002Fspan\u003E\u003Ca id=\"E3588\" contenteditable=\"false\" href=\"https:\u002F\u002Fgithub.com\u002Fwcrivelini\u002Farticles\u002Fblob\u002Fmain\u002FSysTables_Scripts\u002FSysTabScript2.sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E3589\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Elink\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E3590\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E3591\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E3592\"\u003EComo Executar os Scripts DDL\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3594\" class=\"qowt-font10-Arial\"\u003EDependendo da maneira como voc\u003C\u002Fspan\u003E\u003Cspan id=\"E3595\" class=\"qowt-font10-Arial\"\u003Eê deseja usar o\u003C\u002Fspan\u003E\u003Cspan id=\"E3596\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3597\" class=\"qowt-font10-Arial\"\u003E script\u003C\u002Fspan\u003E\u003Cspan id=\"E3598\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3599\" class=\"qowt-font10-Arial\"\u003E gerado\u003C\u002Fspan\u003E\u003Cspan id=\"E3600\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan class=\"qowt-font10-Arial\"\u003E, é preciso atenção \u003C\u002Fspan\u003E\u003Cspan class=\"qowt-font10-Arial\"\u003Ea alguns detalhes. Caso deseje exibir o resultado do\u003C\u002Fspan\u003E\u003Cspan id=\"E3602\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3603\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E3605\" class=\"qowt-font10-Arial\"\u003ESELECT\u003C\u002Fspan\u003E\u003Cspan id=\"E3606\" class=\"qowt-font10-Arial\"\u003E`s\u003C\u002Fspan\u003E\u003Cspan id=\"E3608\" class=\"qowt-font10-Arial\"\u003E acima e copiar o\u003C\u002Fspan\u003E\u003Cspan id=\"E3609\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3610\" class=\"qowt-font10-Arial\"\u003E script\u003C\u002Fspan\u003E\u003Cspan id=\"E3611\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3612\" class=\"qowt-font10-Arial\"\u003E gerado\u003C\u002Fspan\u003E\u003Cspan id=\"E3613\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3614\" class=\"qowt-font10-Arial\"\u003E, tenha certeza \u003C\u002Fspan\u003E\u003Cspan id=\"E3615\" class=\"qowt-font10-Arial\"\u003Ede alterar o \u003C\u002Fspan\u003E\u003Cspan id=\"E3616\" class=\"qowt-font10-Arial\"\u003Emodo de exibição da janela de resultados \u003C\u002Fspan\u003E\u003Cspan id=\"E3617\" class=\"qowt-font10-Arial\"\u003Eda sua\u003C\u002Fspan\u003E\u003Cspan id=\"E3618\" class=\"qowt-font10-Arial\"\u003E ferramenta \u003C\u002Fspan\u003E\u003Cspan id=\"E3619\" class=\"qowt-font10-Arial\"\u003Epara TEXTO.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3620\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3621\" class=\"qowt-font10-Arial\"\u003ECaso sua intenção seja executar de imediato o script gerado, é preciso guardar o texto gerado numa variável (que chamei de \u003C\u002Fspan\u003E\u003Cspan id=\"E3622\" class=\"qowt-font10-Arial\"\u003E@sql\u003C\u002Fspan\u003E\u003Cspan id=\"E3623\" class=\"qowt-font10-Arial\"\u003E) e, ao final, imprimir o conteúdo dessa variável e executá-la em seguida.\u003C\u002Fspan\u003E\u003Cspan id=\"E3624\" class=\"qowt-font10-Arial\"\u003E P\u003C\u002Fspan\u003E\u003Cspan id=\"E3625\" class=\"qowt-font10-Arial\"\u003Eara\u003C\u002Fspan\u003E\u003Cspan id=\"E3626\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E3627\" class=\"qowt-font10-Arial\"\u003Eo caso \u003C\u002Fspan\u003E\u003Cspan id=\"E3628\" class=\"qowt-font10-Arial\"\u003Edo bloco 1, \u003C\u002Fspan\u003E\u003Cspan id=\"E3629\" class=\"qowt-font10-Arial\"\u003Eveja no quadro abaixo como \u003C\u002Fspan\u003E\u003Cspan id=\"E3630\" class=\"qowt-font10-Arial\"\u003Eficaria \u003C\u002Fspan\u003E\u003Cspan id=\"E3631\" class=\"qowt-font10-Arial\"\u003Eo gerador de script\u003C\u002Fspan\u003E\u003Cspan id=\"E3632\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3633\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06140356\u002Fscript7.png\"\u003E\u003Cimg class=\"alignnone wp-image-160557 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06140356\u002Fscript7.png\" alt=\"Scripts SQL\" width=\"723\" height=\"301\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E3792\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-18\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E3793\"\u003ECo\u003C\u002Fspan\u003E\u003Cspan id=\"E3794\"\u003Ementários Finais\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E3795\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3796\" class=\"qowt-font10-Arial\"\u003ENeste artigo, apresentei \u003C\u002Fspan\u003E\u003Cspan id=\"E3797\" class=\"qowt-font10-Arial\"\u003Eum exemplo mais complexo de uso das tabelas de sistemas.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3798\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3799\" class=\"qowt-font10-Arial\"\u003EV\u003C\u002Fspan\u003E\u003Cspan id=\"E3800\" class=\"qowt-font10-Arial\"\u003Eários \u003C\u002Fspan\u003E\u003Cspan id=\"E3801\" class=\"qowt-font10-Arial\"\u003Epequenos truques\u003C\u002Fspan\u003E\u003Cspan id=\"E3802\" class=\"qowt-font10-Arial\"\u003E foram adicionados\u003C\u002Fspan\u003E\u003Cspan id=\"E3803\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E3804\" class=\"qowt-font10-Arial\"\u003Eno gerador de scripts\u003C\u002Fspan\u003E\u003Cspan id=\"E3805\" class=\"qowt-font10-Arial\"\u003E,\u003C\u002Fspan\u003E\u003Cspan id=\"E3806\" class=\"qowt-font10-Arial\"\u003E incluindo:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3807\" class=\"qowt-li-4_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E3808\" class=\"qowt-font10-Arial\"\u003Einserção de \u003C\u002Fspan\u003E\u003Cspan id=\"E3809\" class=\"qowt-font10-Arial\"\u003Ecaracteres especiais no \u003C\u002Fspan\u003E\u003Cspan id=\"E3810\" class=\"qowt-font10-Arial\"\u003Escript\u003C\u002Fspan\u003E\u003Cspan id=\"E3811\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E3812\" class=\"qowt-font10-Arial\"\u003Epara torná-lo mais legível\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3813\" class=\"qowt-li-4_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E3814\" class=\"qowt-font10-Arial\"\u003Ecomo\u003C\u002Fspan\u003E\u003Cspan id=\"E3815\" class=\"qowt-font10-Arial\"\u003E contornar o problema d\u003C\u002Fspan\u003E\u003Cspan id=\"E3816\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E3817\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E3818\" class=\"qowt-font10-Arial\"\u003Ecriação\u003C\u002Fspan\u003E\u003Cspan id=\"E3819\" class=\"qowt-font10-Arial\"\u003E de listas\u003C\u002Fspan\u003E\u003Cspan id=\"E3820\" class=\"qowt-font10-Arial\"\u003E de colunas\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3821\" class=\"qowt-li-4_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E3822\" class=\"qowt-font10-Arial\"\u003Enovas \u003C\u002Fspan\u003E\u003Cspan id=\"E3823\" class=\"qowt-font10-Arial\"\u003Eformas de executar \u003C\u002Fspan\u003E\u003Cspan id=\"E3824\" class=\"qowt-font10-Arial\"\u003Eo gerador\u003C\u002Fspan\u003E\u003Cspan id=\"E3825\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3826\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3827\" class=\"qowt-font10-Arial\"\u003EEu considero que é \u003C\u002Fspan\u003E\u003Cspan id=\"E3828\" class=\"qowt-font10-Arial\"\u003Emuito \u003C\u002Fspan\u003E\u003Cspan id=\"E3829\" class=\"qowt-font10-Arial\"\u003Eimportante \u003C\u002Fspan\u003E\u003Cspan id=\"E3830\" class=\"qowt-font10-Arial\"\u003Eque \u003C\u002Fspan\u003E\u003Cspan id=\"E3831\" class=\"qowt-font10-Arial\"\u003Edesenvolvedores e administradores\u003C\u002Fspan\u003E\u003Cspan id=\"E3832\" class=\"qowt-font10-Arial\"\u003E saibam utilizar os metadados da base SQL\u003C\u002Fspan\u003E\u003Cspan id=\"E3833\" class=\"qowt-font10-Arial\"\u003E. E\u003C\u002Fspan\u003E\u003Cspan id=\"E3834\" class=\"qowt-font10-Arial\"\u003E, insisto em repetir, \u003C\u002Fspan\u003E\u003Cspan id=\"E3835\" class=\"qowt-font10-Arial\"\u003Eeste conhecimento pode ser útil na execução de inúmeras operações repetitivas.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3836\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3837\" class=\"qowt-font10-Arial\"\u003EAté aqui, apresentei exemplos para lidar com operações dentro de um \u003C\u002Fspan\u003E\u003Cspan id=\"E3838\" class=\"qowt-font10-Arial\"\u003Eúnico \u003C\u002Fspan\u003E\u003Cspan id=\"E3839\" class=\"qowt-font10-Arial\"\u003Ebanco de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E3840\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003Cspan id=\"E3841\" class=\"qowt-font10-Arial\"\u003ENo\u003C\u002Fspan\u003E\u003Cspan id=\"E3842\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3843\" class=\"qowt-font10-Arial\"\u003E próximo\u003C\u002Fspan\u003E\u003Cspan id=\"E3844\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3845\" class=\"qowt-font10-Arial\"\u003E artigo\u003C\u002Fspan\u003E\u003Cspan id=\"E3846\" class=\"qowt-font10-Arial\"\u003Es,\u003C\u002Fspan\u003E\u003Cspan id=\"E3847\" class=\"qowt-font10-Arial\"\u003E vou falar d\u003C\u002Fspan\u003E\u003Cspan id=\"E3848\" class=\"qowt-font10-Arial\"\u003Ea geração de\u003C\u002Fspan\u003E\u003Cspan id=\"E3849\" class=\"qowt-font10-Arial\"\u003E scripts\u003C\u002Fspan\u003E\u003Cspan id=\"E3850\" class=\"qowt-font10-Arial\"\u003E que tenham escopo de execução\u003C\u002Fspan\u003E\u003Cspan id=\"E3851\" class=\"qowt-font10-Arial\"\u003E para toda instância SQL, ou seja, scripts que atuam sobre múltiplas bases de dados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EHoje, apresento o caso em que as colunas que terão suas definições alteradas….. e como recriar índices associados a colunas usando tabelas SQL Server.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-2-criando-indices","date":"6 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06142144\u002Ftabelas2.jpg","externalMention":null,"author":{"id":452,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30184745\u002FwagnercriveliniP-128x128.jpeg","name":"Wagner Crivelini","description":"Consultor Sênior na Microsoft, na área de Data Insights para América Latina. Especialista em bancos de dados, é colunista em diversos portais de TI do Brasil e do exterior, com mais de 100 artigos técnicos publicados. É também co-produtor do DatabaseCast, primeiro podcast brasileiro sobre bancos de dados.","slug":"wagner-crivelini","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fwagner-crivelini","registered":"2010-12-30 11:28:37","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002Fwcrivelini@gmail.com","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.wcrivelini.com.br","mail":"wcrivelini@gmail.com"},"articles_count":91,"views_count":828100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Banco de Dados","slug":"banco-de-dados","id":7209,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados"},{"title":"Data","slug":"data","id":16,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"}],"tags":[{"title":"Azure SQL","slug":"azure-sql","id":8739,"link":"https:\u002F\u002Fimasters.com.br\u002Fazure-sql"},{"title":"banco de dados","slug":"banco-de-dados-2","id":189,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados-2"},{"title":"Data","slug":"data","id":626,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"database","slug":"database","id":348,"link":"https:\u002F\u002Fimasters.com.br\u002Fdatabase"},{"title":"database sql server","slug":"database-sql-server","id":7188,"link":"https:\u002F\u002Fimasters.com.br\u002Fdatabase-sql-server"},{"title":"sql server","slug":"sql-server-2","id":324,"link":"https:\u002F\u002Fimasters.com.br\u002Fsql-server-2"}],"seo":{"open_graph":{"title":"Scripts SQL e Tabelas de Sistema - Parte 2: Criando Índices","description":"Hoje, apresento o caso em que as colunas que terão suas definições alteradas..... e como recriar índices associados a colunas usando tabelas SQL Server.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06142144\u002Ftabelas2.jpg","width":800,"height":533},"modified_time":"2024-02-07T11:27:03-03:00","published_time":"2024-02-06T15:13:00-03:00"},"twitter":{"title":"Scripts SQL e Tabelas de Sistema - Parte 2: Criando Índices","description":"Hoje, apresento o caso em que as colunas que terão suas definições alteradas..... e como recriar índices associados a colunas usando tabelas SQL Server.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06142144\u002Ftabelas2.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-2-criando-indices","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-2-criando-indices","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-2-criando-indices"},"type":"post"},{"id":160565,"title":"5 tópicos úteis para usar em React apps com Firebase e Firestore","content":"\u003Cp id=\"097d\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003ENeste artigo, vamos ver 5 usos do Firebase que foram muito úteis para mim em alguns projetos, foi o que eu chamei de 5 tópicos para usar em React apps com Firebase e Firestore. Vamos lá!\u003C\u002Fp\u003E\n\u003Ch2 id=\"1198\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003EReact – Introdução\u003C\u002Fh2\u003E\n\u003Cp id=\"af63\" class=\"pw-post-body-paragraph xk xl sw lm b xm za xo xp xq zb xs xt kw zc xv xw lb zd xy xz lg ze yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EO primeiro passo é instalar os packages que nós precisamos:\u003C\u002Fp\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"8330\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eyarn add react-redux-fireba\r\nse\u003C\u002Fspan\u003E\u003Cspan id=\"b531\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Eyarn add redux-firesto\r\nre\u003C\u002Fspan\u003E\u003Cspan id=\"f964\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Eyarn add firebase\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"ee64\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EPodemos usar o `npm install`para isso também. 😉\u003C\u002Fp\u003E\n\u003Ch2 id=\"f61a\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003EReact – Configuração\u003C\u002Fh2\u003E\n\u003Cp id=\"4b7e\" class=\"pw-post-body-paragraph xk xl sw lm b xm za xo xp xq zb xs xt kw zc xv xw lb zd xy xz lg ze yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EAgora, vamos criar nosso arquivo de configuração. No meu caso eu nomeei como \u003Ccode class=\"ef zu zv zw zl b\"\u003Efirebase-config.js\u003C\u002Fcode\u003E.\u003C\u002Fp\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"b65e\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { createStore, combineReducers, compose } from ‘redux’\r\nimport { reduxFirestore, firestoreReducer, createFirestoreInstance } from ‘redux-firestore’\r\nimport { firebaseReducer } from ‘react-redux-firebase’\r\nimport firebase from ‘firebase\u002Fapp’\r\nimport ‘firebase\u002Fauth’\r\nimport ‘firebase\u002Fdatabase’\r\nimport ‘firebase\u002Ffirestore’\u003C\u002Fspan\u003E\u003Cspan id=\"4d04\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst firebaseConfig = {\r\n apiKey: process.env.REACT_APP_FIREBASE_apiKey,\r\n authDomain: process.env.REACT_APP_FIREBASE_authDomain,\r\n databaseURL: process.env.REACT_APP_FIREBASE_databaseURL,\r\n projectId: process.env.REACT_APP_FIREBASE_projectId,\r\n storageBucket: process.env.REACT_APP_FIREBASE_storageBucket,\r\n messagingSenderId: process.env.REACT_APP_FIREBASE_messagingSenderId,\r\n appId: process.env.REACT_APP_FIREBASE_appId,\r\n measurementId: process.env.REACT_APP_FIREBASE_measurementId,\r\n}; \u002F\u002F from Firebase Console\u003C\u002Fspan\u003E\u003Cspan id=\"500c\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst rfConfig = {} \u002F\u002F optional redux-firestore Config Options\u003C\u002Fspan\u003E\u003Cspan id=\"a0e4\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E\u002F\u002F \r\nInitialize firebase instance\r\nfirebase.initializeApp(firebaseConfig)\u003C\u002Fspan\u003E\u003Cspan id=\"8b27\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E\u002F\u002F Initialize Cloud Firestore through Firebase\r\nfirebase.firestore();\u003C\u002Fspan\u003E\u003Cspan id=\"9046\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E\u002F\u002F Add reduxFirestore store enhancer to store creator\r\nconst createStoreWithFirebase = compose(\r\n reduxFirestore(firebase, rfConfig), \u002F\u002F firebase instance as first argument, \r\nrfConfig as optional second)(createStore)\u003C\u002Fspan\u003E\u003Cspan id=\"ca12\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E\u002F\u002F \r\nAdd Firebase to reducers\r\nconst rootReducer = combineReducers({\u003C\u002Fspan\u003E\u003Cspan id=\"410b\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efirebase: firebaseReducer,\r\nfirestore: firestoreReducer\u003C\u002Fspan\u003E\u003Cspan id=\"22b2\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E})\u003C\u002Fspan\u003E\u003Cspan id=\"8d40\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E\u002F\u002F Create store with reducers and initial state\r\nconst initialState = {}\r\nconst store = createStoreWithFirebase(rootReducer, initialState)\u003C\u002Fspan\u003E\u003Cspan id=\"782a\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst rrfConfig = {\r\n enableLogging: false,\r\n userProfile: ‘users’, \u002F\u002F root that user profiles are written to\r\n updateProfileOnLogin: false, \u002F\u002F enable\u002Fdisable updating of profile on login\r\n useFirestoreForProfile: true, \u002F\u002F Save profile to Firestore instead of Real Time Database\r\n useFirestoreForStorageMeta: true \u002F\u002F \r\nMetadata associated with storage file uploads goes to Firestore\r\n}\u003C\u002Fspan\u003E\u003Cspan id=\"74d7\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst rrfProps = {\r\n firebase,\r\n config: rrfConfig,\r\n dispatch: store.dispatch,\r\n createFirestoreInstance\r\n}\u003C\u002Fspan\u003E\u003Cspan id=\"f1e8\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Eexport { store, rrfProps };\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003EUma pequena observação no código sobre \u003Ccode class=\"ef zu zv zw zl b\"\u003EuserProfile: 'users'\u003C\u002Fcode\u003E. Essa configuração permite gravar os dados de perfil (como nome, telefone, etc..) em uma collection automaticamente.\u003Cbr \u002F\u003E\nAgora precisamos configurar o arquivo \u003Ccode class=\"ef zu zv zw zl b\"\u003Eindex.js\u003C\u002Fcode\u003E, verifiquemos as mudanças abaixo:\u003C\u002Fp\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"936b\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport React from ‘react’;\r\nimport { ReactReduxFirebaseProvider } from ‘react-redux-firebase’\r\nimport ReactDOM from ‘react-dom’;\r\nimport Root from ‘.\u002FRoot’;\r\nimport * as serviceWorker from ‘.\u002FserviceWorker’;\r\nimport { Provider } from ‘react-redux’;\r\nimport { store, rrfProps } from ‘.\u002Ffirebase-config’;\u003C\u002Fspan\u003E\u003Cspan id=\"027e\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003EReactDOM.render(\r\n <Provider store={store}>\r\n <ReactReduxFirebaseProvider {…rrfProps}>\r\n <Root \u002F>\r\n <\u002FReactReduxFirebaseProvider>\r\n <\u002FProvider>\r\n , document.getElementById(‘root’));\u003C\u002Fspan\u003E\u003Cspan id=\"b7f7\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003EserviceWorker.unregister();\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fmobile\u002Ftutorial-crud-em-app-android-e-ios-com-react-native-parte-4\"\u003E\u003Cem\u003E\u003Cstrong\u003ETutorial CRUD em app Android e iOS com React Native (Parte 4)\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"1841\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003EUsando\u003C\u002Fh3\u003E\n\u003Cp id=\"38e1\" class=\"pw-post-body-paragraph xk xl sw lm b xm za xo xp xq zb xs xt kw zc xv xw lb zd xy xz lg ze yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EPor último nós verificamos aqui como usar isso em alguns casos como:\u003C\u002Fp\u003E\n\u003Ch2 id=\"ea63\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003E1. Redirecionar o login\u003C\u002Fh2\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"9310\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { isEmpty, isLoaded } from 'react-redux-firebase';\r\nimport { useSelector } from 'react-redux';\u003C\u002Fspan\u003E\u003Cspan id=\"c090\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction Login(props) {\r\n const auth = useSelector(state => state.firebase && state.firebase.auth)\u003C\u002Fspan\u003E\u003Cspan id=\"aa0e\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003EuseEffect(() => {\r\n if (isLoaded(auth) && !isEmpty(auth)) \r\n history.push(routeNames.DASHBOARD)\r\n }, [auth]);\u003C\u002Fspan\u003E\u003Cspan id=\"56e0\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch2 id=\"413f\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003E2. Usando Autenticação\u003C\u002Fh2\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"dd37\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { useFirebase } from 'react-redux-firebase';\u003C\u002Fspan\u003E\u003Cspan id=\"2c92\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction Login(props) \r\n{\u003C\u002Fspan\u003E\u003Cspan id=\"96a4\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst firebase = useFirebase();\u003C\u002Fspan\u003E\u003Cspan id=\"6d86\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction loginWithGoogle() {\r\n firebase.login({ provider: 'google', type: 'popup' }).catch(e => {\r\n let msg = handleAuthError (e.code);\r\n message.error(msg);\u003C\u002Fspan\u003E\u003Cspan id=\"4f13\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E});\u003C\u002Fspan\u003E\u003Cspan id=\"85de\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003Cspan id=\"da4f\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"d2bb\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003E\u003Cstrong class=\"lm kl\"\u003EExplicando o código:\u003C\u002Fstrong\u003E Neste método estamos usando o login com o Google, repare no \u003Ccode class=\"ef zu zv zw zl b\"\u003Ecatch\u003C\u002Fcode\u003E estamos lançando uma mensagem, caso não dê erro ele automaticamente atualizará o state firebase.auth. 🙂\u003C\u002Fp\u003E\n\u003Ch2 id=\"2ebe\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003E3. Usando real-time\u003C\u002Fh2\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"b007\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { useSelector } from 'react-redux';\r\nimport { useFirestoreConnect, useFirestore, useFirebase } \r\nfrom 'react-redux-firebase';\u003C\u002Fspan\u003E\u003Cspan id=\"e686\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction Tests(props) \r\n{\u003C\u002Fspan\u003E\u003Cspan id=\"328a\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003EuseFirestoreConnect(() => [{ collection: 'tests', orderBy: [['createdAt', 'desc']] },])\r\n let tests = useSelector(state => state.firestore.ordered.tests);\u003C\u002Fspan\u003E\u003Cspan id=\"92de\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Ereturn\r\n(<>{JSON.stringify(tests)}<\u002F>);\u003C\u002Fspan\u003E\u003Cspan id=\"5185\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"aed6\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003E\u003Cstrong class=\"lm kl\"\u003EExplicando o código:\u003C\u002Fstrong\u003E Neste caso nós estamos como que ‘ouvindo’ a collection \u003Ccode class=\"ef zu zv zw zl b\"\u003Etests\u003C\u002Fcode\u003E ordenando ela por data decrescente. Sempre que houve uma inclusão, exclusão ou atualização nessa collection no firebase, nós obteremos aqui o que foi feito na variavel \u003Ccode class=\"ef zu zv zw zl b\"\u003Etests\u003C\u002Fcode\u003E.\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002Fsimplificando-componentes-com-react-hooks\"\u003ESimplificando componentes com React Hooks\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"bf7c\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003E4. Usando Firestore\u003C\u002Fh2\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"cf32\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { useFirestore } from 'react-redux-firebase'\u003C\u002Fspan\u003E\u003Cspan id=\"0887\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction Test(props) {\r\n const firestore = useFirestore();\u003C\u002Fspan\u003E\u003Cspan id=\"e6cc\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction addComment(comment) {\r\n const comments = [...props.test.comments];\r\n comments.push(comment)\u003C\u002Fspan\u003E\u003Cspan id=\"eafc\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efirestore.collection('tests')\r\n.doc(props.test.id).set({ ...props.test, comments }).then(data => \r\n{\u003C\u002Fspan\u003E\u003Cspan id=\"424d\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Emessage.success('Comentário enviado!');\u003C\u002Fspan\u003E\u003Cspan id=\"8d3b\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}).catch(e => {\r\n handleAuthError(e.code);\r\n }).finally(() => {\r\n \u002F\u002FsetLoading(false);\r\n });\r\n }\u003C\u002Fspan\u003E\u003Cspan id=\"7620\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"b475\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003E\u003Cstrong class=\"lm kl\"\u003EExplicando o código: \u003C\u002Fstrong\u003ENeste exemplo estamos adicionando um comentário no firestore.\u003C\u002Fp\u003E\n\u003Ch2 id=\"1493\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003E5. React – Usando as informações de perfil\u003C\u002Fh2\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"ef11\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { useSelector } from 'react-redux';\u003C\u002Fspan\u003E\u003Cspan id=\"2622\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction MenuBar(props) \r\n{\u003C\u002Fspan\u003E\u003Cspan id=\"1a5c\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst profile = useSelector(state => state.firebase.profile);\r\n return (<>{JSON.stringify(profile)}<\u002F>);\u003C\u002Fspan\u003E\u003Cspan id=\"7ae9\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"8886\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EVeja como é simples usando os dados de perfil do usuário logado no código acima.\u003C\u002Fp\u003E\n\u003Cp id=\"0bd7\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EIsso é tudo. Eu espero ter ajudado. Obrigado.\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\n","excerpt":"\u003Cp\u003ENeste artigo, vamos ver 5 usos do Firebase que foram muito úteis para mim em alguns projetos, foi o que eu chamei de 5 tópicos para usar em React apps com Firebase e Firestore.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002F5-topicos-uteis-para-usar-em-react-apps-com-firebase-e-firestore-2","date":"6 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06150125\u002Freact-1.jpg","externalMention":null,"author":{"id":146799,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06151859\u002Federtaveira1.jpeg","name":"Eder Taveira","description":"Eder Taveira é Desenvolvedor Full Stack. Formado em Ciências da Computação pela UFPa e Pós-graduando em Análise de sistemas Orientados a Objetos pela IESB. Trabalha com Java desde 2013 e PHP desde 2010 e com NodeJS desde 2016. Gosta muito de escrever artigos sobre diversas tecnologias (AngularJS, MongoDB, PHP, Java, Mobile Hibrido e Nativo) em seu blog edertaveira.com.","slug":"edertaveira","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Federtaveira","registered":"2015-01-22 15:39:40","social":{"linkedin":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Federtaveira","youtube":null,"facebook":"","twitter":"","instagram":null,"github":"https:\u002F\u002Fgithub.com\u002Federtaveira","url":"http:\u002F\u002Fwww.edertaveira.com","mail":"edertaveira@gmail.com"},"articles_count":10,"views_count":10000,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Front End","slug":"front-end","id":7304,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end"},{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"Cloud Firestore","slug":"cloud-firestore","id":8589,"link":"https:\u002F\u002Fimasters.com.br\u002Fcloud-firestore"},{"title":"firebase","slug":"firebase","id":4790,"link":"https:\u002F\u002Fimasters.com.br\u002Ffirebase"},{"title":"Firestore","slug":"firestore","id":8757,"link":"https:\u002F\u002Fimasters.com.br\u002Ffirestore"},{"title":"front","slug":"front","id":402,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront"},{"title":"front end","slug":"front-end-2","id":1383,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end-2"},{"title":"javascrip","slug":"javascrip","id":3416,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascrip"},{"title":"js","slug":"js","id":3311,"link":"https:\u002F\u002Fimasters.com.br\u002Fjs"},{"title":"react","slug":"react","id":3321,"link":"https:\u002F\u002Fimasters.com.br\u002Freact"}],"seo":{"open_graph":{"title":"React apps : 5 tópicos úteis para usar com Firebase e Firestore","description":"Neste artigo, vamos ver 5 usos do Firebase que foram muito úteis para mim em alguns projetos, foi o que eu chamei de 5 tópicos para usar em React apps com..","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06150125\u002Freact-1.jpg","width":800,"height":533},"modified_time":"2024-02-06T16:50:15-03:00","published_time":"2024-02-06T15:11:51-03:00"},"twitter":{"title":"React apps : 5 tópicos úteis para usar com Firebase e Firestore","description":"Neste artigo, vamos ver 5 usos do Firebase que foram muito úteis para mim em alguns projetos, foi o que eu chamei de 5 tópicos para usar em React apps com..","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06150125\u002Freact-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002F5-topicos-uteis-para-usar-em-react-apps-com-firebase-e-firestore-2","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002F5-topicos-uteis-para-usar-em-react-apps-com-firebase-e-firestore-2","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002F5-topicos-uteis-para-usar-em-react-apps-com-firebase-e-firestore-2"},"type":"post"},{"id":160577,"title":"Webscrapping com Node.js e Puppeteer","content":"\u003Cp\u003EEste artigo é uma continuação do tutorial de \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fwebscrapping-com-node-js\u002F\"\u003EWebscrapping com Node.js\u003C\u002Fa\u003E que escrevi outro dia. Crawlers e webscrappers são peças fundamentais para a \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fcomo-criar-um-mecanismo-de-busca\u002F\"\u003Econstrução de mecanismos de busca\u003C\u002Fa\u003E e já há algum tempo que estava para escrever sobre eles a pedido de leitores e amigos.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso porque crio tais bots desde 2010, desde que \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Flancamento-do-busca-acelerada\u002F\"\u003Ecomecei o projeto do Busca Acelerada\u003C\u002Fa\u003E pela primeira vez e de lá para cá não parei, tendo lançado diversos projetos para diversas empresas (como o \u003Ca href=\"http:\u002F\u002Fbuildin.com.br\u002F\"\u003EBuildIn\u003C\u002Fa\u003E para a Softplan), e até mesmo alguns projetos pessoais (como o SóFamosos).\u003C\u002Fp\u003E\n\u003Cp\u003EMas por que um segundo tutorial sobre o mesmo assunto? Não ensinei tudo que tinha de ensinar no primeiro?\u003C\u002Fp\u003E\n\u003Cp\u003EQuase. E neste tutorial vou explicar o problema com aquele primeiro webscrapper e mostrar outra alternativa.\u003C\u002Fp\u003E\n\u003Cp\u003EVamos lá!\u003C\u002Fp\u003E\n\u003Ch2\u003EWebscrapping com Node.js e Puppeteer\u003C\u002Fh2\u003E\n\u003Ch3 id=\"o-grande-problema-do-webscrapping\"\u003EO grande problema do webscrapping\u003C\u002Fh3\u003E\n\u003Cp\u003EO webscrapper que ensinei a criar no tutorial anterios é bem básico e sofre de alguns males bem comuns que quem já deve ter feito webscrapping antes deve conhecer: execução de scripts que tornam o HTML dinâmico.\u003C\u002Fp\u003E\n\u003Cp\u003EClaro, existem outros problemas também, como o bloqueio do bot após crawling excessivo, mas considerando que quase a totalidade dos sites atuais possuem execução de scripts para tornar suas páginas dinâmicas (usando libs e frameworks como React, Angular e Vue), é quase certo que você mais cedo ou mais tarde terá problemas com o seu webscrapper enxergando um HTML x e você no navegador enxergando um HTML y, o que dificultará seu trabalho de capturar os dados corretamente.\u003C\u002Fp\u003E\n\u003Cp\u003EExplicando melhor: quando você acessa um site via servidor, usando um script como o webscrapper do post anterior, você não executa o código front-end da página, não manipula o DOM final, não dispara as chamadas JS, etc. O seu robô apenas lê as informações que foram geradas no servidor do site-alvo, o que pode fazer com que seu robô nem tenha nada de útil pra ler na página caso a mesma seja uma SPA (Single Page Application) por exemplo.\u003C\u002Fp\u003E\n\u003Cp\u003EA solução: Headless Browsers!\u003C\u002Fp\u003E\n\u003Cp\u003EOs browsers web como conhecemos possuem 3 tarefas principais:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003Edada uma URL, acessar uma página HTML (funcionalidade principal, o tronco do browser);\u003C\u002Fli\u003E\n\u003Cli\u003Ecarregar o DOM e executar os scripts front-end (os membros);\u003C\u002Fli\u003E\n\u003Cli\u003Erenderizar visualmente o DOM (a cabeça);\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003EOs primeiros browsers antigos, que eram em modo texto, só faziam o primeiro item. O browser que você está usando pra ler este post faz os três. Um headless browser faz somente os dois primeiros, ou seja, ele apenas não possui uma interface gráfica, mas carrega o HTML, o DOM e executa todos os scripts de front-end.\u003C\u002Fp\u003E\n\u003Cp\u003EEsse tipo de browser é como se fosse um console application rodando em modo silencioso, apenas um processo no seu sistema operacional que age como um browser. No fundo ele é um browser, apenas não tem UI.\u003C\u002Fp\u003E\n\u003Cp\u003EMuito útil para testes automatizados de interface, é comum os headless browsers exporem bibliotecas de manipulação do DOM como JQuery para permitir que através de scripts o programador consiga usar a página carregada pelo headless browser, como executar cliques em botões, preencher campos, etc; tudo isso sem estar enxergando uma UI ou sequer estar usando mouse e teclado.\u003C\u002Fp\u003E\n\u003Cp\u003ENão é preciso ser um gênio para entender que podemos usar headless browsers para fazer webscrapping, certo? Com esse tipo de tecnologia conseguiremos que nosso bot leia a versão final do HTML, da mesma forma que um usuário “veria” no navegador, após a execução dos scripts de front-end. Não apenas isso, mas você consegue fazer com que seu bot não apenas leia conteúdo, mas que use a página em si, clicando em botões e selecionando opções, por exemplo.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003ESe DOM, HTML, front-end e outros termos utilizados aqui não forem de seu domínio, dificilmente você conseguirá criar um crawler realmente bom. Em meu livro de \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Flivro-nodejs\"\u003E\u003Cstrong\u003EProgramação Web com Node.js\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E, cubro estes e outros aspectos essenciais da programação web, caso te interesse.\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"escolhendo-um-headless-browser\"\u003EEscolhendo um headless browser\u003C\u002Fh3\u003E\n\u003Cp\u003EExistem diversas opções de headless browsers no mercado. A maioria é open-source e baseada no Webkit, a mesma base na qual o Apple Safari e o Google Chrome foram construídos, o que garante uma grande fidelidade em relação ao uso de web browser comuns para carregar o HTML+JS.\u003C\u002Fp\u003E\n\u003Cp\u003EAlgumas opções disponíveis são:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\"http:\u002F\u002Fphantomjs.org\u002F\"\u003EPhantomJS\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fslimerjs.org\u002F\"\u003ESlimerJS\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fsourceforge.net\u002Fprojects\u002Fhtmlunit\u002F\"\u003EHtmlUnit\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"http:\u002F\u002Fzombie.js.org\u002F\"\u003EZombieJS\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fdevelopers.google.com\u002Fweb\u002Fupdates\u002F2017\u002F04\u002Fheadless-chrome\"\u003EHeadless Chrome\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003EDestes, o SlimerJS usa a plataforma Gecko da Mozilla ao invés do Webkit, enquanto que o PhantomJS e o HtmlUnit são famosos por se integrarem ao Selenium, uma popular ferramenta de automação de testes. Além disso, o Phantom é o único que eu usei profissionalmente em uma startup que trabalhei que usava este headless browser para tirar screenshots de páginas web.\u003C\u002Fp\u003E\n\u003Cp\u003ENo entanto, meu intuito de escrever este post era justamente para aprender a usar outro headless browser que não o Phantom, pois este possui alguns problemas conhecidos como não-conformidade com ES6, obrigatoriedade de uso do JQuery e nenhuma novidade desde 2018 (o projeto está parado). Esses problemas (que não são o fim do mundo, mas que me motivaram a buscar outra tecnologia) são comentados \u003Ca href=\"https:\u002F\u002Fmedium.com\u002Fmatheus-rossi\u002Fweb-scraping-com-nodejs-e-phantomjs-b0bf5ab8312e\"\u003Eneste excelente post do Matheus Rossi\u003C\u002Fa\u003E. Então se você realmente quer aprender a usar o PhantomJS, leia o post que acabei de citar.\u003C\u002Fp\u003E\n\u003Cp\u003EUma coisa que descobri recentemente é que desde a versão 59 do navegador Google Chrome que foi disponibilizada a opção de rodar o navegador do Google sem a interface gráfica funcionando, em modo headless. Usar o Chrome em modo headless é o sonho de muito testador por aí, pois representa rodar scripts de testes automatizados no navegador mais popular do mundo, com a maior fidelidade possível em relação ao que o usuário final vai usar.\u003C\u002Fp\u003E\n\u003Cp\u003ECerto, headless browser escolhido, como fazer um webscrapper que use-o para carregar o mesmo DOM que um usuário do Chrome veria?\u003C\u002Fp\u003E\n\u003Ch3 id=\"manipulando-o-headless-browser-via-nodejs\"\u003EManipulando o headless browser via Node.js\u003C\u002Fh3\u003E\n\u003Cp\u003ENo mesmo \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FGoogleChrome\u002Fpuppeteer\"\u003EGithub do Google Chrome\u003C\u002Fa\u003E existe um projeto chamado \u003Cstrong\u003EPuppeteer\u003C\u002Fstrong\u003E, que em uma tradução livre seria um manipulador de marionetes, ou um mestre dos fantoches. Ele é essencialmente um módulo Node.js que permite manipular tanto o Headless Chrome quanto o Chrome “normal” para fazer tarefas como:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003Egerar screenshots e PDFs de páginas web;\u003C\u002Fli\u003E\n\u003Cli\u003Efazer crawling em cima de páginas com Ajax e SPAs;\u003C\u002Fli\u003E\n\u003Cli\u003Eautomatizar o uso de UIs web;\u003C\u002Fli\u003E\n\u003Cli\u003Efazer webscrapping com alta fidelidade;\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003EPara que o Puppeteer funcione você precisa ter o \u003Ca href=\"http:\u002F\u002Fnodejs.org\u002F\"\u003ENode.js \u003C\u002Fa\u003Einstalado na sua máquina. Também costumo utilizar o VS Code para escrever os códigos, ensino a instalar estas duas ferramentas no vídeo abaixo.\u003C\u002Fp\u003E\n\u003Cp\u003EDepois que tiver o Node instalado, vamos criar um novo projeto Node.js chamado webscrapper2, criar um index.js vazio dentro dele, navegar via terminal até essa pasta e rodar um ‘npm init -y’ para configurá-lo com as opções default.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003ESe você nunca programou em Node.js antes, sugiro começar pelos \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fo-que-e-nodejs-e-outras-5-duvidas-fundamentais\u002F\"\u003Etutoriais mais iniciantes de meu blog\u003C\u002Fa\u003E ou mesmo pelo \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Flivro-nodejs\"\u003Emeu livro\u003C\u002Fa\u003E, que pega o iniciante pela mão e ensina desde JS tradicional até diversos módulos do Node.\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAgora rode o comando abaixo para instalar o Puppeteer no seu projeto, sendo que ele automaticamente irá baixar sua própria versão do Chrome, independente se você já possuir uma (ou seja, a instalação irá demorar um pouco mais que o normal para módulos NPM):\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003Enpm install puppeteer\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EUsá-lo é muito simples, no seu index.js, inclua o seguinte código que representa a estrutura básica do nosso webscrapper:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003Econst puppeteer = require('puppeteer');\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003Easync function scrap() {\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst browser = await puppeteer.launch({ headless: \"new\" });\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst page = await browser.newPage();\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Eawait page.goto('http:\u002F\u002Fbooks.toscrape.com\u002F');\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Eawait page.waitForNetworkIdle();\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003E\u002F\u002F Scrap\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Ebrowser.close();\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econsole.log(result);\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Ereturn result;\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003E};\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003Escrap();\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENa primeira linha carregamos a dependência do módulo puppeteer. No bloco seguinte, criamos a função assíncrona que fará todo o trabalho de verdade, com a lógica de acesso à página e scrapping (comentado).\u003C\u002Fp\u003E\n\u003Cp\u003ENeste primeiro momento, essa função scrap apenas executa o Headless Chrome, acessa uma nova página com a URL de um site fake de livros e espera até que a rede se acalme (idle, páre de fazer ou esperar requisições) antes de se fechar. Ainda não há a lógica de scrapping aqui.\u003C\u002Fp\u003E\n\u003Cp\u003ENo bloco final, executamos a função e quando ela terminar, o valor retornado pela função scrap será impresso no console. Se você executar o projeto agora, terá um erro de que result está undefined, mas isso é esperado já que sequer declaramos ele em lugar algum, mas o teste é válido pois te mostrará que passou por todas as linhas anteriores com sucesso.\u003C\u002Fp\u003E\n\u003Cp\u003EAntes de fazer a versão completa da função scrap, temos de entender o que vamos capturar de informações da página em questão.\u003C\u002Fp\u003E\n\u003Ch3 id=\"fazendo-html-scrapping\"\u003EFazendo HTML Scrapping\u003C\u002Fh3\u003E\n\u003Cp\u003EO site Books to Scrape serve para o único propósito de ajudar desenvolvedores a praticar webscrapping. Ele mostra um catálogo de livros, como na imagem abaixo:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"aligncenter wp-image-2985 size-large lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-1024x598.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-300x175.png 300w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-768x449.png 768w\" alt=\"Books to Scrape\" width=\"720\" height=\"420\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-1024x598.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-300x175.png 300w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-768x449.png 768w\" data-sizes=\"auto\" data-eio-rwidth=\"1024\" data-eio-rheight=\"598\" data-pagespeed-url-hash=\"1184842108\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAcesse ele no seu navegador Chrome e com o clique direito do mouse sobre a área do primeiro livro da listagem, mais especificamente sobre o título dele e selecione a opção Inspecionar\u002FInspect.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso irá abrir a aba Elements do Google Developer Tools onde você poderá entender como construir um seletor que diga ao seu web scrapper onde estão os dados que ele deve ler. Neste caso, vamos ler apenas os nomes dos livros. Se você não está acostumado com CSS e\u002Fou seletores (no melhor estilo JQuery), você pode usar o recurso Copy > Selector que aparece no painel elements para gerar o seletor para você, como mostra a imagem abaixo.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"aligncenter wp-image-2986 size-large lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-1024x603.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-300x177.png 300w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-768x452.png 768w\" alt=\"Copiando o selector\" width=\"720\" height=\"424\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-1024x603.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-300x177.png 300w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-768x452.png 768w\" data-sizes=\"auto\" data-eio-rwidth=\"1024\" data-eio-rheight=\"603\" data-pagespeed-url-hash=\"1323270817\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENesse caso específico não usarei a sugestão do Chrome que é bem engessada. Usarei um seletor bem mais simples: “h3 > a”, ou seja, vou pegar o link\u002Fâncora de cada H3 do HTML dessa página. Os H3 dessa página são exatamente os títulos dos livros.\u003C\u002Fp\u003E\n\u003Cp\u003ESe analisarmos em detalhes este bloco que queremos extrair o título, veremos que o texto interno da âncora nem sempre é o título fiel pois, por uma questão de espaço, algumas vezes ele está truncado com reticências no final. Sendo assim, o atributo HTML que vamos ler com o scraper é o title da âncora, que esse sim sempre possui o título completo.\u003C\u002Fp\u003E\n\u003Cp\u003EVamos atualizar nosso código de scrapping para pegarmos esta informação:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003E \u002F\u002Fscrap\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst result = await page.evaluate(() => {\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Ereturn document.querySelector('h3 > a').title\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003E})\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAnalisando apenas o bloco de código de scrapping, criamos uma função que executa um código JavaScript sobre a página que carregamos. A execução de scripts é realizada usando a função evaluate. Nesse código JavaScript, estamos usando a função querySelector no documento e o seletor que criamos anteriormente para acessar um componente do DOM da página. Sobre este componente, queremos o seu atributo title.\u003C\u002Fp\u003E\n\u003Cp\u003ESe você rodar este código Node agora verá que ele retornará apenas o nome do primeiro livro, “A Light in the Attic”. Isso porque a função querySelector retorna apenas o primeiro componente que ela encontra com aquele seletor.\u003C\u002Fp\u003E\n\u003Cp\u003EO código abaixo resolve isso:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003E\u002F\u002Fscrap\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst result = await page.evaluate(() => {\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst books = [];\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Edocument.querySelectorAll('h3 > a').forEach(book => books.push(book.title));\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Ereturn books\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003E});\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAnalisando apenas o bloco de código de scrapping, criamos uma função que executa um código JavaScript sobre a página que carregamos. A execução de scripts é realizada usando a função evaluate. Nesse código JavaScript, estamos usando a função querySelector no documento e o seletor que criamos anteriormente para acessar um componente do DOM da página. Sobre este componente, queremos o seu atributo title.\u003C\u002Fp\u003E\n\u003Cp\u003ESe você rodar este código Node agora verá que ele retornará apenas o nome do primeiro livro, “A Light in the Attic”. Isso porque a função querySelector retorna apenas o primeiro componente que ela encontra com aquele seletor.\u003C\u002Fp\u003E\n\u003Cp\u003EO código abaixo resolve isso:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003E\u002F\u002Fscrap\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst result = await page.evaluate(() => {\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst books = [];\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Edocument.querySelectorAll('h3 > a').forEach(book => books.push(book.title));\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Ereturn books\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003E});\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAqui, usei a querySelectorAll, sobre a qual apliquei um forEach. Para cada livro encontrado com aquele seletor, eu adiciono o title do livro em um array de livros, retornado ao fim do evaluate.\u003C\u002Fp\u003E\n\u003Cp\u003ECom isso, se você executar novamente este script verá que ele retorna o título de todos os livros da primeira página do site, concluindo este post.\u003C\u002Fp\u003E\n\u003Cp\u003EQual seria o próximo passo? Navegar pelas demais páginas, coletando os títulos dos outros livros. Esta é a tarefa principal de um webcrawler ou webspider: crawl (rastejar). Ao algoritmo de webscrapping cabe apenas coletar os dados. Mas esse desagio eu deixo para você.\u003C\u002Fp\u003E\n\u003Cp\u003EAté a próxima!\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EEste artigo é uma continuação do tutorial de Webscrapping com Node.js que escrevi outro dia. Crawlers e webscrappers são peças fundamentais para…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fwebscrapping-com-node-js-e-puppeteer","date":"7 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F07132129\u002FNode.JS-pexels-markus-spiske-1089440-1.jpg","externalMention":null,"author":{"id":148188,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2022\u002F10\u002F11183022\u002FLuizTools.jpg","name":"Luiz Fernando Duarte Junior","description":"Pós-graduado em computação, trabalha com software desde 2006 nas mais variadas tecnologias. Empreendedor, autor e professor, quando não está ocupado programando, está escrevendo ou gravando sobre programação para seu canal e blog LuizTools.","slug":"luizfernando","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fluizfernando","registered":"2017-04-28 19:43:26","social":{"linkedin":null,"youtube":null,"facebook":"http:\u002F\u002Ffb.com\u002Fluiztools","twitter":"https:\u002F\u002Ftwitter.com\u002Fluiztools","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.luiztools.com.br\u002F","mail":"contato@luiztools.com.br"},"articles_count":94,"views_count":883600,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Back-End","slug":"back-end","id":7158,"link":"https:\u002F\u002Fimasters.com.br\u002Fback-end"},{"title":"Front End","slug":"front-end","id":7304,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end"},{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"BACK","slug":"back","id":8976,"link":"https:\u002F\u002Fimasters.com.br\u002Fback"},{"title":"back-end","slug":"back-end","id":404,"link":"https:\u002F\u002Fimasters.com.br\u002Fback-end"},{"title":"front","slug":"front","id":402,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront"},{"title":"front end","slug":"front-end-2","id":1383,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end-2"},{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"},{"title":"node.js","slug":"node-js","id":1032,"link":"https:\u002F\u002Fimasters.com.br\u002Fnode-js"},{"title":"Puppeteer","slug":"puppeteer","id":7787,"link":"https:\u002F\u002Fimasters.com.br\u002Fpuppeteer"},{"title":"webscrapping","slug":"webscrapping","id":5806,"link":"https:\u002F\u002Fimasters.com.br\u002Fwebscrapping"}],"seo":{"open_graph":{"title":"TUTORIAL: Webscrapping com Node.js e Puppeteer","description":"Este artigo é uma continuação do tutorial de Webscrapping com Node.js que escrevi outro dia. Crawlers e webscrappers são peças fundamentais para...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F07132129\u002FNode.JS-pexels-markus-spiske-1089440-1.jpg","width":800,"height":533},"modified_time":"2024-02-07T13:27:55-03:00","published_time":"2024-02-07T13:27:55-03:00"},"twitter":{"title":"TUTORIAL: Webscrapping com Node.js e Puppeteer","description":"Este artigo é uma continuação do tutorial de Webscrapping com Node.js que escrevi outro dia. Crawlers e webscrappers são peças fundamentais para...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F07132129\u002FNode.JS-pexels-markus-spiske-1089440-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fwebscrapping-com-node-js-e-puppeteer","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fwebscrapping-com-node-js-e-puppeteer","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fwebscrapping-com-node-js-e-puppeteer"},"type":"post"},{"id":160322,"title":"Escrevendo software para durar; tópicos de um programa resiliente","content":"\u003Cp\u003EAqui apresentarei alguns tópicos que acredito serem importantes na hora de desenvolver um software de forma que ele seja bastante resiliente e que dure por vários anos. Os tópicos não estão em uma ordem particular e são a minha opinião embasada pela minha experiência como desenvolvedor.\u003C\u002Fp\u003E\n\u003Cp\u003EEncare esse texto como um conjunto de ideias que coletei pelos anos, eu tentei deixar elas o mais genéricas possível, mas não tenho a pretensão de que elas se apliquem a qualquer cenário. Acredito que elas se encaixam melhor se sua equipe é pequena e você precisa entregar rápido.\u003C\u002Fp\u003E\n\u003Cp\u003EEu tentei deixar o texto genérico, mas muitos dos tópicos são para Golang, minha linguagem favorita no momento.\u003C\u002Fp\u003E\n\u003Ch2 id=\"foco-na-simplicidade\"\u003ESoftware – Foco na simplicidade\u003C\u002Fh2\u003E\n\u003Cp\u003EEscreva o software da forma mais simples que você puder, com o mínimo de camadas e abstrações. O motivo é que absolutamente nada vem de graça, toda nova camada, toda nova abstração, tudo tem um preço, geralmente pago em tempo de desenvolvimento, mais tempo de manutenção, mais complexidade, e pior, tempo de \u003Cem\u003Edown-time\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EO software deve fazer estritamente o necessário para cumprir a sua função, nada além disso.\u003C\u002Fp\u003E\n\u003Ch2 id=\"mantenha-o-stack-baixo\"\u003ESoftware – Mantenha o \u003Cem\u003Estack\u003C\u002Fem\u003E baixo\u003C\u002Fh2\u003E\n\u003Cp\u003EQuanto menos ferramentas necessárias para seu software funcionar, melhor.\u003C\u002Fp\u003E\n\u003Cp\u003EPor exemplo, pode parecer fácil resolver possíveis problemas de escalabilidade com uma fila e \u003Cem\u003Eworkers\u003C\u002Fem\u003E que a consomem. Mas além de muitas vezes ser desnecessário colocar uma fila significa que você adicionou na sua estrutura vários itens que antes você não tinha que se preocupar. Agora você precisa lidar com conexões de rede, chaves de segurança para ler e escrever no serviço da fila, etc.\u003C\u002Fp\u003E\n\u003Cp\u003EClaro que não significa que você nunca usará filas ou outras estruturas similares, mas é preciso considerar muito bem se é realmente necessário porque a carga de complexidade, código e problemas administrativos que não tem nenhuma relação com programação aumentarão consideravelmente.\u003C\u002Fp\u003E\n\u003Ch3 id=\"reduza-a-superfície-de-ataque\"\u003ESoftware – Reduza a superfície de ataque\u003C\u002Fh3\u003E\n\u003Cp\u003EManter o \u003Cem\u003Estack\u003C\u002Fem\u003E baixo também tem implicações fortes em segurança, pergunte para qualquer especialista em \u003Cem\u003ESRE\u003C\u002Fem\u003E se ele prefere lidar com a segurança de vários serviços interligados ou se ele prefere cuidar de um conjunto pequeno de serviços.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fseguranca\u002Fa-seguranca-do-software-comeca-protegendo-contas-de-desenvolvedor\"\u003EA segurança do software começa protegendo contas de desenvolvedor\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"esqueça-o-fantasma-da-escalabilidade\"\u003EEsqueça o fantasma da escalabilidade\u003C\u002Fh2\u003E\n\u003Cp\u003ESabe aquele ditado de que otimização é a raiz de todo mal? Otimizar para escalabilidade sem mensurar só porque “acho que precisa” é muito mais sério. Uma \u003Cem\u003EAPI REST\u003C\u002Fem\u003E feita em Go e gravando em um banco de dados como PostgreSQL bem escritos aceitam uma quantidade incrível de conexões por segundo mesmo estando em uma máquina simples com 1Gb RAM e 1 core. Se o banco estiver em uma máquina separada, ou melhor ainda se for contratado como \u003Cem\u003ESAAS\u003C\u002Fem\u003E a carga que esse pequeno servidor aguenta é enorme.\u003C\u002Fp\u003E\n\u003Cp\u003EÉ muito comum um sistema ser projetado com vários microsserviços, filas, serviço para armazenar chave\u002Fvalor \u003Cem\u003Ein memory\u003C\u002Fem\u003E, um serviço de \u003Cem\u003Evault\u003C\u002Fem\u003E para centralizar as chaves dos vários serviços, etc.\u003C\u002Fp\u003E\n\u003Cp\u003EDaí gasta uma fortuna em infra e um tempo enorme lidando com orquestração disso tudo. Precisará de um especialista em segurança para garantir que tudo está bem configurado e nada vazará.\u003C\u002Fp\u003E\n\u003Cp\u003EE no fim servir poucas conexões simultâneas.\u003C\u002Fp\u003E\n\u003Ch2 id=\"prefira-o-monólito\"\u003EPrefira o monólito\u003C\u002Fh2\u003E\n\u003Cp\u003EMonólito, microsserviços, FAAS, são apenas escolhas de arquitetura. Todas têm vantagens e desvantagens, mas se for possível escolha o monólito, o motivo é que a comunicação entre as partes do sistema é muito mais simples no monólito.\u003C\u002Fp\u003E\n\u003Cp\u003EAs outras opções incluem camadas de comunicação que precisam ser gerenciadas, tem impacto na segurança, no desempenho e temos uma tendência muito grande de subestimar esses custos.\u003C\u002Fp\u003E\n\u003Cp\u003ESei o quanto é tentador ter vários microsserviços, cada um com uma responsabilidade. Mas se mal projetado você acaba com um “monólito distribuído”, ou seja, você tem todos os problemas do monólito, só que agora está tudo distribuído e no lugar de ter as vantagens dos microsserviços você ficou apenas com as desvantagens.\u003C\u002Fp\u003E\n\u003Cp\u003EQuando for projetar camadas de serviços, sempre pense se o custo de lidar com segurança, rede, etc compensa a separação em serviços distintos e sempre seja muito crítico.\u003C\u002Fp\u003E\n\u003Cp\u003EPor exemplo, faz todo sentido para uma empresa grande, com vários produtos, ter um microsserviço especializado em autenticação consultado por todos os outros, esse serviço fica atrás de um firewall, conta com \u003Cem\u003Eload balance\u003C\u002Fem\u003E, tem várias Instâncias redundantes, etc.\u003C\u002Fp\u003E\n\u003Cp\u003EMas normalmente não é o que temos aqui no Brasil, o que mais vejo são pequenas empresas e \u003Cem\u003Estart-ups\u003C\u002Fem\u003E que tem carga bem moderada.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fcloud\u002Fpor-que-escolher-uma-plataforma-software-as-a-service\"\u003EPor que escolher uma plataforma Software as a Service\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"dividir-o-sistema-por-responsabilidades\"\u003EDividir o sistema por responsabilidades\u003C\u002Fh2\u003E\n\u003Cp\u003EUma boa forma de organizar o sistema e criar bibliotecas independentes que possam ser reusadas é dividir o sistema por responsabilidades e cada peça de software ter apenas uma responsabilidade.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso também se aplica se você resolver criar microsserviços, cada um deve ter apenas uma responsabilidade. Pode parecer óbvio falando assim, mas no dia a dia, com as demandas chegando e a sempre crescente cobrança por velocidade de entrega, é importante não ceder à tentação de \u003Cem\u003Etomar atalhos\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EMesmo quando no monólito, bibliotecas que acumulam responsabilidades diferentes são ruins.\u003C\u002Fp\u003E\n\u003Ch2 id=\"evite-dividir-a-equipe\"\u003EEvite dividir a equipe\u003C\u002Fh2\u003E\n\u003Cp\u003EDividir o sistema por responsabilidades é bom, mas isso não se aplica a equipe, isso pode não ser possível dependendo do tamanho da empresa, mas é melhor ter uma única equipe em que todo mundo troque informações rapidamente.\u003C\u002Fp\u003E\n\u003Ch3 id=\"comunicação\"\u003EComunicação\u003C\u002Fh3\u003E\n\u003Cp\u003EComunicação tem um grande impacto na qualidade do software. A falta de comunicação facilmente faz com que o esforço seja duplicado, é dessa forma que o Windows acabou com 6 controles de áudio diferentes. A boa comunicação faz com que nem todos entendam\u002Fsaibam as prioridades da empresa e as dificuldades que os outros desenvolvedores estão passando.\u003C\u002Fp\u003E\n\u003Cp\u003ETudo bem ter equipes distintas se a empresa é grande o suficiente, mas é preciso lembrar que a comunicação entre equipes é mais custosa que comunicação entre membros da mesma equipe. Aliás, \u003Cem\u003Eproduct owner\u003C\u002Fem\u003E, \u003Cem\u003Eproduct manager\u003C\u002Fem\u003E, \u003Cem\u003Escrum master\u003C\u002Fem\u003E, ou seja lá como for chamado o cargo da pessoa que passa as demandas para os desenvolvedores de software, ele tem que ficar o mais próximo possível dos devs. de preferência estando junto deles o dia todo.\u003C\u002Fp\u003E\n\u003Cp\u003EExistem formas de atenuar o problema da comunicação, por exemplo, uma coisa que funciona muito bem é todo mundo na mesma sala de chat, mesmo com as pessoas distantes fisicamente basta abrir o áudio e falar com as pessoas. Isso além de estreitar os laços da equipe, evita o “telefone sem fio”, evita marcar reuniões inúteis, etc.\u003C\u002Fp\u003E\n\u003Cp\u003EEu já testei essa dinâmica em duas empresas diferentes com muito sucesso, você inicia seu dia, entra na sala de chat, coloca seu microfone no mudo e fica trabalhando, se alguém te chama é a mesma dinâmica de chamar uma pessoa da mesa do lado.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cspan style=\"text-decoration: underline;\"\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fsoftware\u002F5-razoes-pelas-quais-o-software-hibrido-e-o-combustivel-da-proxima-geracao-de-software\"\u003E5 razões pelas quais o software híbrido é o combustível da próxima geração de software\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"prefira-tecnologia-testada-e-tediosa\"\u003EPrefira tecnologia testada e tediosa\u003C\u002Fh2\u003E\n\u003Cp\u003ETemos uma tendência de querer usar as tecnologias mais novas e cintilantes. Programador gosta de novidades e tecnologia. Dai assiste uma palestra e fica doido para colocar a nova tecnologia em qualquer coisa.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso é péssimo para a resiliência do \u003Cem\u003Esoftware\u003C\u002Fem\u003E que se está construindo. Idealmente toda tecnologia usada no software devia ser \u003Cem\u003Etediosa\u003C\u002Fem\u003E no sentido de que não traz nenhuma novidade, os programadores dominam ela quase que completamente, já foi \u003Cem\u003Etestada em batalha\u003C\u002Fem\u003E inúmeras vezes e não tem o menor risco de deixar de ser mantida, ou ter uma guinada inesperada nos próximos anos.\u003C\u002Fp\u003E\n\u003Cp\u003EPor exemplo, se você pegar um bom livro de \u003Cem\u003EPostgreSQL\u003C\u002Fem\u003E de cinco anos atrás ele provavelmente ainda será totalmente relevante hoje, um bom livro de \u003Cem\u003EBash\u003C\u002Fem\u003E resiste uma década fácil e um bom livro de C é eterno. E eu realmente espero que Go siga a mesma linha.\u003C\u002Fp\u003E\n\u003Ch3 id=\"comandos-do-sistema-operacional\"\u003EComandos do sistema operacional\u003C\u002Fh3\u003E\n\u003Cp\u003EPor falar em \u003Cem\u003EBash\u003C\u002Fem\u003E, aprenda a usar bem os comandos do sistema operacional, muitas vezes é melhor escrever um pequeno script e usar o que já existe que desenvolver você mesmo.\u003C\u002Fp\u003E\n\u003Cp\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fdesign\u002Farquitetura-de-software-estilos-e-padroes-de-design\"\u003EArquitetura de Software: estilos e padrões de design\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"filas-e-workers\"\u003EFilas e \u003Cem\u003EWorkers\u003C\u002Fem\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EMelhor que todo o peso de adicionar um serviço de filas na sua estrutura é usar o banco de dados que você já deve estar usando de qualquer forma.\u003C\u002Fp\u003E\n\u003Cp\u003ENo meu caso que o banco escolhido é o \u003Cem\u003EPostgreSQL\u003C\u002Fem\u003E principalmente por motivos históricos, eu uso uma combinação de \u003Cem\u003Eselect… for update\u003C\u002Fem\u003E e \u003Cem\u003Eselect… skip locked”\u003C\u002Fem\u003E para processar registros com segurança sem travas de \u003Cem\u003Elocks\u003C\u002Fem\u003E de registro, também adiciono um simples campo para registrar o status atual do registro que precisa ser processado e pronto.\u003C\u002Fp\u003E\n\u003Cp\u003EOutro mecanismo interessante, principalmente quando você precisa consumir serviços de terceiros para processar o registro, é criar um campo com o histórico do processamento.\u003C\u002Fp\u003E\n\u003Cp\u003EUm campo texto que você concatena coisas como o resultado de uma chamada a uma API, erros, etc. É bem agradável o erro no mesmo registro que está causando ele.\u003C\u002Fp\u003E\n\u003Cp\u003ESe o processamento não precisa ser rápido, é melhor chamar o \u003Cem\u003Eworker\u003C\u002Fem\u003E via \u003Cem\u003Ecrontab\u003C\u002Fem\u003E do que ele ficar em \u003Cem\u003Eloop\u003C\u002Fem\u003E esperando que algum registro precise ser processado. A grande vantagem de usar crontab é seu programa não ficar na memória o tempo todo, ele sempre inicia em um estado limpo e o próprio e você não corre o menor risco de um \u003Cem\u003Ememory leak\u003C\u002Fem\u003E crescer a ponto de ser um problema.\u003C\u002Fp\u003E\n\u003Ch3 id=\"fts\"\u003EFTS\u003C\u002Fh3\u003E\n\u003Cp\u003ENo lugar de usar ElastcSearch tanto o PostgreSQL como o SQLite são ótimos para \u003Cem\u003Efull text search\u003C\u002Fem\u003E. Recentemente precisei criar um pequeno servidor de logs para acumular logs de vários sistemas e o mais importante poder recuperar essa informação facilmente.\u003C\u002Fp\u003E\n\u003Cp\u003EUsei o SQLite e um pequeno servidor Go e o resultado foi muito bom, uma única tabela tipo FTS recebe os registros com um campo o log em si, outro para armazenar a data e outro para o nome do sistema que produziu o log.\u003C\u002Fp\u003E\n\u003Cp\u003ECom esse pequeno sistema ficou muito simples de procurar por ocorrências, erros e ter uma visão do estado geral do sistema.\u003C\u002Fp\u003E\n\u003Ch2 id=\"não-use-panic\"\u003ENão use \u003Cem\u003Epanic\u003C\u002Fem\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003EQuando estiver programando em Go, trate todos os erros, eu sei o quanto é repetitivo, às vezes tratamos erros que se acontecerem é o sistema operacional que está com problemas, mas não sei dizer quantas vezes deixei de tratar um erro que parecia impossível de acontecer e claro que ele aconteceu.\u003C\u002Fp\u003E\n\u003Ch2 id=\"não-recupere-depois-de-panic\"\u003ENão recupere depois de \u003Cem\u003Epanic\u003C\u002Fem\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003EÀs vezes escrevemos sistemas que não podem ficar fora do ar, essa é a justificativa para o sistema se recuperar de um \u003Cem\u003Epanic\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EMas o \u003Cem\u003Epanic\u003C\u002Fem\u003E serve para te dizer que alguma coisa muito errada aconteceu e precisa de sua atenção, idealmente quando um programa da \u003Cem\u003Epanic\u003C\u002Fem\u003E o correto é escrever um teste que reproduza o problema e então tratar o erro.\u003C\u002Fp\u003E\n\u003Cp\u003EPara o sistema continuar no ar, use um gerenciador de serviços como o \u003Ca href=\"http:\u002F\u002Fsupervisord.org\u002F\"\u003Esupervisor\u003C\u002Fa\u003E, por exemplo.\u003C\u002Fp\u003E\n\u003Cp\u003EDessa forma, com o passar do tempo seu sistema vai se tornar mais e mais resiliente.\u003C\u002Fp\u003E\n\u003Ch2 id=\"trate-o-erro-onde-ele-ocorre\"\u003ETrate o erro onde ele ocorre\u003C\u002Fh2\u003E\n\u003Cp\u003EQuando eu programava em C++ eu desabilitava o \u003Cem\u003Etry catch\u003C\u002Fem\u003E direto no \u003Cem\u003Egcc\u003C\u002Fem\u003E com o parâmetro \u003Cem\u003E-fno-exceptions\u003C\u002Fem\u003E, é sempre preferível tratar erros onde eles ocorrem. Em Go, por exemplo, nunca use uma função para esconder o \u003Cem\u003Eif err != nil\u003C\u002Fem\u003E. Isso criará uma indireção que tornará o código menos explícito.\u003C\u002Fp\u003E\n\u003Ch2 id=\"nunca-confie-em-dados-que-você-recebe\"\u003ENunca confie em dados que você recebe\u003C\u002Fh2\u003E\n\u003Cp\u003ENão importa se é um \u003Cem\u003EAPI REST\u003C\u002Fem\u003E ou funções internas do seu programa, nunca confie no usuário, mesmo que esse usuário seja você no futuro. Todos os dados devem ser validados.\u003C\u002Fp\u003E\n\u003Ch3 id=\"sempre-valide-tipos-de-interface\"\u003ESempre valide tipos de interface\u003C\u002Fh3\u003E\n\u003Cp\u003EQuando uma função Go recebe um parâmetro que é uma interface, o próprio compilador trata de assegurar que seja do tipo correto. O problema mesmo é quando usamos uma interface vazia. E daí fazemos cast para algum tipo específico. Se você não testar o tipo e ele não for o que você espera ou for \u003Cem\u003Enil\u003C\u002Fem\u003E o programa gerará um \u003Cem\u003Epanic\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EAlém disso, internamente interfaces são ponteiros, então ela pode ser \u003Cem\u003Enil\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Ch3 id=\"sempre-cheque-nil\"\u003ESempre cheque \u003Cem\u003Enil\u003C\u002Fem\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003ESempre que receber um ponteiro ou uma interface, verifique se é \u003Cem\u003Enil\u003C\u002Fem\u003E antes de usar ou tentar converter.\u003C\u002Fp\u003E\n\u003Cp\u003EUma boa prática para detectar esses problemas é passar linters no código, o \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgolangci\u002Fgolangci-lint\"\u003Egolangci-lint\u003C\u002Fa\u003E aplica vários linters que detectam esses e vários outros problemas.\u003C\u002Fp\u003E\n\u003Ch3 id=\"sempre-verifique-o-tamanho-de-arrays\"\u003ESempre verifique o tamanho de \u003Cem\u003Earrays\u003C\u002Fem\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EGeralmente programadores estão acostumados a verificar o tamanho de \u003Cem\u003Earrays\u003C\u002Fem\u003E em \u003Cem\u003Efor loop\u003C\u002Fem\u003E, mas esquecem de verificar se recebem o \u003Cem\u003Earray\u003C\u002Fem\u003E se estão interessandos apenas no primeiro item.\u003C\u002Fp\u003E\n\u003Ch2 id=\"não-quebre-sua-api\"\u003ENão quebre sua API\u003C\u002Fh2\u003E\n\u003Cp\u003EQuando criar uma API seja minimalista, evite adicionar funcionalidades extras que possam parecer interessantes durante a implementação, mantenha uma especificação enxuta. Se você sobrecarrega sua API de funcionalidades, fica mais custoso fazer mudanças atualizações no seu código no futuro.\u003C\u002Fp\u003E\n\u003Ch3 id=\"não-tenha-versões-da-mesma-api\"\u003ENão tenha versões da mesma API\u003C\u002Fh3\u003E\n\u003Cp\u003EPoucas coisas dão tanto trabalho quanto manter duas versões diferentes da mesma API, mas as coisas mudam, e muitas vezes é inevitável que você precise mudar alguma coisa que potencialmente quebre a API e você precise manter duas (ou mais) versões. No lugar disso, tente projetar a API de forma que consiga receber acréscimos, geralmente não há problema em adicionar um campo a mais em uma resposta de uma chamada ou mesmo adicionar uma funcionalidade nova desde que as existentes continuem funcionando e testadas. Os devs. (internos e dos clientes) vão agradecer.\u003C\u002Fp\u003E\n\u003Ch2 id=\"testes-são-fundamentais\"\u003ETestes são fundamentais\u003C\u002Fh2\u003E\n\u003Cp\u003ETestes são fundamentais, mas foque primeiro em testar as funcionalidades não código.\u003C\u002Fp\u003E\n\u003Cp\u003EEm linguagens compiladas a cobertura de testes não precisa ser muito grande, porque o compilador já pegou todos os erros de sintaxe, esquecimentos, etc.\u003C\u002Fp\u003E\n\u003Cp\u003EJá em uma linguagem de script é preciso ser mais rigoroso.\u003C\u002Fp\u003E\n\u003Cp\u003EQualquer função que tenha um SQL dentro dela precisa ser completamente testada, o motivo é que mesmo se você estiver usando uma linguagem compilada o código SQL é um pedacinho de código interpretado dentro do seu programa compilado, o compilador não tem como saber se aquele trecho é válido.\u003C\u002Fp\u003E\n\u003Ch2 id=\"mantenha-o-cartão-corporativo-abastecido\"\u003EMantenha o cartão corporativo abastecido\u003C\u002Fh2\u003E\n\u003Cp\u003ENão tem nenhuma relação com programação, mas coloquei esse ponto aqui porque tenho certeza que vários programadores sênior vão rir ao ler isso e lembrar das vezes que ficaram procurando o motivo do sistema ter caído. Só para descobrir que era porque a pessoa encarregada do cartão corporativo deixou ele sem fundos.\u003C\u002Fp\u003E\n\u003Ch2 id=\"referências\"\u003EReferências\u003C\u002Fh2\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fcrg.eti.br\u002Fpost\u002Farquivos-ocultos-no-unix\u002F\"\u003EArquivos ocultos no UNIX\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fcrg.eti.br\u002Fpost\u002Fescrevendo-software-para-durar\u002Funix_prog_design.pdf\"\u003EProgram design in the UNIX environment\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=v24wrd3RwGo\"\u003EHow Go Programs Keep Working\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=5IUj1EZwpJY\"\u003EThe Only Unbreakable Law\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fwww.radicalsimpli.city\u002F\"\u003ERadical Simplicity in Technology\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fsuckless.org\u002Fphilosophy\u002F\"\u003Esuckless.org\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n","excerpt":"\u003Cp\u003EAqui apresentarei alguns tópicos que acredito serem importantes na hora de desenvolver um software de forma que ele seja bastante resiliente e que dure…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fescrevendo-software-para-durar-topicos-de-um-programa-resiliente","date":"13 dez, 2023","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F13111009\u002Fsoftware-1.jpg","externalMention":null,"author":{"id":148141,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30180934\u002Fcesar-gimenes-128x128.jpg","name":"Cesar Gimenes","description":"Trabalha com tecnologia desde a década de 90. Já atuou na área de educação e participou de projetos de mobilidade de grande volume para laboratórios farmacêuticos. Criou games tanto para PC, como para iOS. Hoje está direcionando seus esforços em plataformas de Sistemas Embarcados, IoT, microservices e cloud computing. É um entusiasta de tecnologias como Golang e Docker.","slug":"cesargimenes","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fcesargimenes","registered":"2017-03-23 14:25:13","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Ffacebook.com\u002Fcrgimenes","twitter":"https:\u002F\u002Ftwitter.com\u002Fcrgimenes","instagram":null,"github":null,"url":"","mail":"crg@crg.eti.br"},"articles_count":22,"views_count":48400,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"APIs e Microsserviços","slug":"apis-microsservicos","id":4257,"link":"https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos"},{"title":"Go Golang","slug":"go-golang","id":8896,"link":"https:\u002F\u002Fimasters.com.br\u002Fgo-golang"},{"title":"PostgreSQL","slug":"postgresql","id":7213,"link":"https:\u002F\u002Fimasters.com.br\u002Fpostgresql"},{"title":"Software","slug":"software","id":7243,"link":"https:\u002F\u002Fimasters.com.br\u002Fsoftware"}],"tags":[{"title":"api","slug":"api","id":187,"link":"https:\u002F\u002Fimasters.com.br\u002Fapi"},{"title":"api rest","slug":"api-rest","id":2973,"link":"https:\u002F\u002Fimasters.com.br\u002Fapi-rest"},{"title":"arrays","slug":"arrays","id":2758,"link":"https:\u002F\u002Fimasters.com.br\u002Farrays"},{"title":"escalabilidade","slug":"escalabilidade","id":2074,"link":"https:\u002F\u002Fimasters.com.br\u002Fescalabilidade"},{"title":"go","slug":"go","id":3239,"link":"https:\u002F\u002Fimasters.com.br\u002Fgo"},{"title":"golang","slug":"golang","id":4556,"link":"https:\u002F\u002Fimasters.com.br\u002Fgolang"},{"title":"microsserviços","slug":"microsservicos","id":5006,"link":"https:\u002F\u002Fimasters.com.br\u002Fmicrosservicos"},{"title":"monolito","slug":"monolito","id":8098,"link":"https:\u002F\u002Fimasters.com.br\u002Fmonolito"},{"title":"panic","slug":"panic","id":8948,"link":"https:\u002F\u002Fimasters.com.br\u002Fpanic"},{"title":"postgresql","slug":"postgresql-2","id":1089,"link":"https:\u002F\u002Fimasters.com.br\u002Fpostgresql-2"},{"title":"saas","slug":"saas","id":1082,"link":"https:\u002F\u002Fimasters.com.br\u002Fsaas"},{"title":"software","slug":"software-2","id":274,"link":"https:\u002F\u002Fimasters.com.br\u002Fsoftware-2"},{"title":"stack","slug":"stack","id":1580,"link":"https:\u002F\u002Fimasters.com.br\u002Fstack"},{"title":"tecnologia","slug":"tecnologia-2","id":185,"link":"https:\u002F\u002Fimasters.com.br\u002Ftecnologia-2"},{"title":"testes","slug":"testes","id":1591,"link":"https:\u002F\u002Fimasters.com.br\u002Ftestes"}],"seo":{"open_graph":{"title":"Escrevendo software para durar; tópicos de um programa resiliente","description":"Aqui apresentarei alguns tópicos que acredito serem importantes na hora de desenvolver um software de forma que ele seja bastante resiliente e que dure...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F13111009\u002Fsoftware-1.jpg","width":800,"height":530},"modified_time":"2023-12-13T11:50:10-03:00","published_time":"2023-12-13T11:50:10-03:00"},"twitter":{"title":"Escrevendo software para durar; tópicos de um programa resiliente","description":"Aqui apresentarei alguns tópicos que acredito serem importantes na hora de desenvolver um software de forma que ele seja bastante resiliente e que dure...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F13111009\u002Fsoftware-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fescrevendo-software-para-durar-topicos-de-um-programa-resiliente","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fescrevendo-software-para-durar-topicos-de-um-programa-resiliente","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fescrevendo-software-para-durar-topicos-de-um-programa-resiliente"},"type":"post"},{"id":160329,"title":"Views virtuais e materializadas; diferenças e motivações para utilização","content":"\u003Cheader class=\"header\"\u003E\n\u003Cnav class=\"menu-responsive js-menuResponsive\"\u003E\u003C\u002Fnav\u003E\n\u003C\u002Fheader\u003E\n\u003Cdiv class=\"banner\"\u003EViews virtuais e materializadas\u003C\u002Fdiv\u003E\n\u003Cp\u003E\u003Cmain class=\"container container--single js-postContainer\"\u003EAtualmente estamos cada vez mais partindo para arquiteturas de sistemas distribuídas e a complexidade dos nossos projetos aumenta, aumenta e aumenta… Em determinados momentos nossos projetos passam de dezenas de registros para milhões (ou mais), porém, os requisitos de negócio permanecem os mesmos, ou seja, ainda precisamos computador e derivar esses milhões de registros.\u003C\u002Fmain\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003EViews virtuais e materializadas\u003C\u002Fh2\u003E\n\u003Cp\u003EProvavelmente o que funciona em poucos segundos ou milissegundos (também poderia ser menos ou mais, trata-se apenas de exemplos) com dezenas de registros passou a funcionar em minutos ou horas (também poderia ser menos ou mais, trata-se apenas de exemplos) com milhões de registros.\u003C\u002Fp\u003E\n\u003Cp\u003EPara o exemplo e contexto desse \u003Cem\u003Epost\u003C\u002Fem\u003E vamos ter o seguinte cenário:\u003C\u002Fp\u003E\n\u003Cp\u003EPrecisamos informar a quantidade de vendas para nossos produtos, individualmente um por um.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso poderia ser feito de N maneiras, seja em uma arquitetura distribuída ou não, por exemplo:\u003C\u002Fp\u003E\n\u003Ch3 id=\"comunicação-através-de-rede-com-http\"\u003EComunicação através de rede com HTTP\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cimg src=\"https:\u002F\u002Fres.cloudinary.com\u002Fmahenrique94\u002Fimage\u002Fupload\u002Fv1644001374\u002FContando_quantidade_de_pedidos_para_um_determinado_produto_b1uhvp.png\" alt=\"Exemplo pedindo dados para um microsserviço\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EComo vemos na imagem, poderíamos realizar uma requisição \u003Ccode\u003EHTTP\u003C\u002Fcode\u003E para o serviço responsável por pedidos e aguardar a resposta enquanto eles computam o dado do banco de dados.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fdotnet\u002Fangular-rodando-a-aplicacao-no-docker\"\u003EAngular: rodando a aplicação no Docker\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"comunicação-através-do-banco-de-dados\"\u003EComunicação através do banco de dados\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cimg src=\"https:\u002F\u002Fres.cloudinary.com\u002Fmahenrique94\u002Fimage\u002Fupload\u002Fv1644001449\u002FContando_quantidade_de_pedidos_para_um_determinado_produto_1_nhw832.png\" alt=\"Exemplo conectando em um banco de dados único\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EJá nesse outro exemplo, ambos os serviços conectam-se em uma única fonte de dados, temos serviços distribuídos, mas, a base de dados permanece única.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg src=\"https:\u002F\u002Fres.cloudinary.com\u002Fmahenrique94\u002Fimage\u002Fupload\u002Fv1644001451\u002FContando_quantidade_de_pedidos_para_um_determinado_produto_2_xjpgz8.png\" alt=\"Exemplo de monolitico\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EPor fim e não menos importante, aqui temos um serviço único com base de dados única.\u003C\u002Fp\u003E\n\u003Cp\u003EPoderiam haver N outras formas de se desenhar tal fluxo, o ponto aqui não é o fluxo em si, mas, como a informação é obtida. Repare que em todas as situações foi necessário executar uma \u003Cem\u003Equery\u003C\u002Fem\u003E para o banco de dados passando a informação do produto e contando todos os pedidos realizados para o mesmo (também existem N soluções, para o contexto do \u003Cem\u003Epost\u003C\u002Fem\u003E vamos focar na utilização de \u003Cem\u003Eviews\u003C\u002Fem\u003E).\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fsql-server\u002Fsql-server-como-identificar-e-comprimir-tabelas-e-indices-sem-compressao-de-dados\"\u003ESQL Server: como identificar e comprimir tabelas e índices sem compressão de dados\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"virtual\"\u003EViews virtuais\u003C\u002Fh2\u003E\n\u003Cp\u003EUma primeira abordagem poderia ser: Vamos criar uma \u003Cem\u003Eview\u003C\u002Fem\u003E virtual no banco de dados que vai realizar tal contagem para nós e deixará o valor salvo. Apesar de ser uma boa solução ela possuí dois pontos negativos, sendo:\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003EAumentará o tempo de escrita, pois, quando houver a escrita a \u003Cem\u003Eengine\u003C\u002Fem\u003E do banco de dados precisará atualizar tal valor.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cem\u003EViews\u003C\u002Fem\u003E virtuais são atalhos para \u003Cem\u003Equeries\u003C\u002Fem\u003E que irão executar e expandir, sendo assim, ainda teríamos problemas de performance.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp\u003E\u003Cimg src=\"https:\u002F\u002Fres.cloudinary.com\u002Fmahenrique94\u002Fimage\u002Fupload\u002Fv1644001804\u002FContando_quantidade_de_pedidos_para_um_determinado_produto_3_zri62y.png\" alt=\"Exemplo usando view virtual\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"materializada\"\u003EMaterializada\u003C\u002Fh2\u003E\n\u003Cp\u003EUma outra abordagem seria a gente criar a trabalhar com \u003Cem\u003Eviews\u003C\u002Fem\u003E materializadas (\u003Cem\u003Ematerialized views\u003C\u002Fem\u003E), a única diferença seria que nesse caso os dados seriam replicados e copiados fisicamente para uma outra tabela, dessa forma, quando a busca for realizada apenas essa única tabela será processada e podemos ainda filtrar por produto utilizando índices. Mas, aqui também nem tudo são flores, ainda temos pontos negativos para cada estilo de arquitetura, sendo:\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003EComplexidade para sincronização dos dados\u003C\u002Fli\u003E\n\u003Cli\u003EDuplicação e desnormalização dos dados\u003C\u002Fli\u003E\n\u003Cli\u003EPossíveis inconsistências eventuais (principalmente para arquiteturas distribuídas)\u003C\u002Fli\u003E\n\u003Cli\u003EPossíveis inconsistências de dados (principalmente para arquiteturas distribuídas)\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp\u003E\u003Cimg src=\"https:\u002F\u002Fres.cloudinary.com\u002Fmahenrique94\u002Fimage\u002Fupload\u002Fv1644001977\u002FContando_quantidade_de_pedidos_para_um_determinado_produto_4_koxnem.png\" alt=\"Exemplo usando view materializada\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"conclusão\"\u003EConclusão\u003C\u002Fh2\u003E\n\u003Cp\u003ENesse \u003Cem\u003Epost\u003C\u002Fem\u003E entendemos as diferenças e motivações para utilização de \u003Cem\u003Eviews\u003C\u002Fem\u003E virtuais ou materializadas, cada abordagem possuí seus conjuntos de \u003Cem\u003Etrade-offs\u003C\u002Fem\u003E que devem ser analisados e avaliados com calma, as vezes a virtualização fará mais sentido e outras a materialização será mais coerente.\u003C\u002Fp\u003E\n\u003Cp\u003EAbraços, até a próxima.\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EViews virtuais e materializadas. Atualmente estamos cada vez mais partindo para arquiteturas de sistemas distribuídas e a complexidade dos nossos projetos..\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fviews-virtuais-e-materializadas-diferencas-e-motivacoes-para-utilizacao","date":"13 dez, 2023","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F13140018\u002Fcodigo1-1.jpg","externalMention":null,"author":{"id":148753,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F18154638\u002Fmath.jpg","name":"Matheus Henrique Castiglioni","description":"Apaixonado pelo mundo dos códigos e um eterno estudante, gosto de aprender e saber um pouco de tudo, aquela curiosidade de saber como tudo funciona, tento compartilhar o máximo de conhecimentos adquiridos e ajudar todos aqueles que sou capaz.","slug":"matheushenriquecastiglioni","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fmatheushenriquecastiglioni","registered":"2018-06-15 17:25:10","social":{"linkedin":"http:\u002F\u002Flinkedin.com\u002Fin\u002Fmatheus-cas","youtube":"http:\u002F\u002Fyoutube.com\u002Fchannel\u002FUCSrG4","facebook":"http:\u002F\u002Ffacebook.com\u002Fmatheus.castig","twitter":"http:\u002F\u002Ftwitter.com\u002Fmahenrique94","instagram":"http:\u002F\u002Finstagram.com\u002Fmahenrique94\u002F","github":"http:\u002F\u002Fgithub.com\u002Fmahenrique94","url":"http:\u002F\u002Fmatheuscastiglioni.com.br\u002F","mail":"matheushcastiglioni@gmail.com"},"articles_count":31,"views_count":96100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Banco de Dados","slug":"banco-de-dados","id":7209,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados"}],"tags":[{"title":"arquiteturas","slug":"arquiteturas","id":8953,"link":"https:\u002F\u002Fimasters.com.br\u002Farquiteturas"},{"title":"arquiteturas de sistemas","slug":"arquiteturas-de-sistemas","id":8952,"link":"https:\u002F\u002Fimasters.com.br\u002Farquiteturas-de-sistemas"},{"title":"banco de dados","slug":"banco-de-dados-2","id":189,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados-2"},{"title":"Data","slug":"data","id":626,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"http","slug":"http","id":517,"link":"https:\u002F\u002Fimasters.com.br\u002Fhttp"},{"title":"materializadas","slug":"materializadas","id":8951,"link":"https:\u002F\u002Fimasters.com.br\u002Fmaterializadas"},{"title":"materialized views","slug":"materialized-views","id":8954,"link":"https:\u002F\u002Fimasters.com.br\u002Fmaterialized-views"},{"title":"sistemas","slug":"sistemas","id":2142,"link":"https:\u002F\u002Fimasters.com.br\u002Fsistemas"},{"title":"views","slug":"views","id":2348,"link":"https:\u002F\u002Fimasters.com.br\u002Fviews"},{"title":"views materializadas","slug":"views-materializadas","id":8955,"link":"https:\u002F\u002Fimasters.com.br\u002Fviews-materializadas"},{"title":"Views virtuais","slug":"views-virtuais","id":8950,"link":"https:\u002F\u002Fimasters.com.br\u002Fviews-virtuais"},{"title":"Views virtuais e materializadas","slug":"views-virtuais-e-materializadas","id":8949,"link":"https:\u002F\u002Fimasters.com.br\u002Fviews-virtuais-e-materializadas"}],"seo":{"open_graph":{"title":"Views virtuais e materializadas; diferenças e motivações para utilização","description":"Views virtuais e materializadas. Atualmente estamos cada vez mais partindo para arquiteturas de sistemas distribuídas e a complexidade dos nossos projetos..","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F13140018\u002Fcodigo1-1.jpg","width":799,"height":531},"modified_time":"2023-12-13T14:10:36-03:00","published_time":"2023-12-13T14:07:05-03:00"},"twitter":{"title":"Views virtuais e materializadas; diferenças e motivações para utilização","description":"Views virtuais e materializadas. Atualmente estamos cada vez mais partindo para arquiteturas de sistemas distribuídas e a complexidade dos nossos projetos..","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F13140018\u002Fcodigo1-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fviews-virtuais-e-materializadas-diferencas-e-motivacoes-para-utilizacao","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fviews-virtuais-e-materializadas-diferencas-e-motivacoes-para-utilizacao","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fviews-virtuais-e-materializadas-diferencas-e-motivacoes-para-utilizacao"},"type":"post"},{"id":160590,"title":"Dia a dia na Engenharia do Asaas: como funcionam nossas squads multidisciplinares","content":"\u003Cdiv class=\"gm gn go gp gq\"\u003E\n\u003Cdiv class=\"ab ca\"\u003E\n\u003Cdiv class=\"ch bg fy fz ga gb\"\u003E\n\u003Cp id=\"c017\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EO time de Engenharia do Asaas se diferencia por contar com princípios que guiam as decisões de todos os seus integrantes. No dia a dia das equipes, isso se reflete em uma dinâmica de trabalho que envolve autonomia e colaboração, por meio da divisão em squads multidisciplinares.\u003C\u002Fp\u003E\n\u003Cp id=\"4b6a\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EContinue a leitura e conheça mais sobre o dia a dia na engenharia do Asaas e como são nossas squads!\u003C\u002Fp\u003E\n\u003Ch1 id=\"0cc1\" class=\"og oh hi be oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd bj\" data-selectable-paragraph=\"\"\u003EO que é uma squad?\u003C\u002Fh1\u003E\n\u003Cp id=\"e5cf\" class=\"pw-post-body-paragraph ni nj hi nk b nl pe nn no np pf nr ns nt pg nv nw nx ph nz oa ob pi od oe of gm bj\" data-selectable-paragraph=\"\"\u003EComeçando pelo começo, vamos explicar o que é uma squad. Trata-se de uma equipe multidisciplinar (ou seja, com profissionais que atuam em papéis diferentes) que compartilha do mesmo objetivo.\u003C\u002Fp\u003E\n\u003Cp id=\"9f25\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EPor exemplo, uma equipe composta por um profissional de redação, um designer gráfico e um líder, que atua com o objetivo de promover a marca de uma empresa, pode ser considerada uma squad. Assim, ao invés de reunir profissionais que têm a mesma função, o agrupamento é feito considerando o objetivo específico do time, o projeto que ele está desenvolvendo ou o problema que está solucionando.\u003C\u002Fp\u003E\n\u003Ch1 id=\"7335\" class=\"og oh hi be oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd bj\" data-selectable-paragraph=\"\"\u003EComo são as squads do Asaas?\u003C\u002Fh1\u003E\n\u003Cp id=\"61be\" class=\"pw-post-body-paragraph ni nj hi nk b nl pe nn no np pf nr ns nt pg nv nw nx ph nz oa ob pi od oe of gm bj\" data-selectable-paragraph=\"\"\u003ENo Asaas, geralmente as squads são compostas por 1 tech lead, 1 product manager, 1 product designer e alguns engenheiros, que é como chamamos os nossos desenvolvedores.\u003C\u002Fp\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"cc09\" class=\"ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of pj pk pl bj\" data-selectable-paragraph=\"\"\u003EO \u003Cstrong class=\"nk hj\"\u003Etech lead \u003C\u002Fstrong\u003Eé o profissional responsável por fazer a gestão das atividades do grupo, avaliar a viabilidade e os requisitos técnicos e garantir a qualidade dos produtos. Além disso, também tem a função de liderar e desenvolver a squad, garantindo o engajamento dos colaboradores e a gestão de performance.\u003C\u002Fli\u003E\n\u003Cli id=\"6ca7\" class=\"ni nj hi nk b nl pm nn no np pn nr ns nt po nv nw nx pp nz oa ob pq od oe of pj pk pl bj\" data-selectable-paragraph=\"\"\u003E\u003Cstrong class=\"nk hj\"\u003EProduct manager\u003C\u002Fstrong\u003E, ou PM, é o gerente do produto, quem realiza o planejamento e a gestão do produto e define quais iniciativas serão desenvolvidas.\u003C\u002Fli\u003E\n\u003Cli id=\"0043\" class=\"ni nj hi nk b nl pm nn no np pn nr ns nt po nv nw nx pp nz oa ob pq od oe of pj pk pl bj\" data-selectable-paragraph=\"\"\u003EO \u003Cstrong class=\"nk hj\"\u003Eproduct designer \u003C\u002Fstrong\u003Eatua em conjunto com os engenheiros criando fluxos de interação e interfaces digitais no produto, utilizando conhecimentos de experiência de usuário (UX) e interface de usuário (UI).\u003C\u002Fli\u003E\n\u003Cli id=\"e158\" class=\"ni nj hi nk b nl pm nn no np pn nr ns nt po nv nw nx pp nz oa ob pq od oe of pj pk pl bj\" data-selectable-paragraph=\"\"\u003EPor fim, os \u003Cstrong class=\"nk hj\"\u003Eengenheiros \u003C\u002Fstrong\u003Etêm como missão desenvolver sistemas complexos e de alta qualidade, trabalhando em melhorias para usuários e clientes.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"f01e\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EComo nossos próprios engenheiros comentam, esse modelo funciona muito bem aqui porque favorece a produtividade, a integração entre os setores e, consequentemente, a comunicação.\u003C\u002Fp\u003E\n\u003Cp id=\"7154\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EAssim, os profissionais da squad podem se comunicar melhor entre si, pois compartilham do mesmo objetivo e mantêm-se mais próximos, e também podem colaborar com outras squads.\u003C\u002Fp\u003E\n\u003Cp id=\"1907\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EConfira mais detalhes sobre o assunto no vídeo sobre o dia a dia nas squads de Engenharia do Asaas.\u003C\u002Fp\u003E\n\u003Cfigure class=\"pr ps pt pu pv gz\"\u003E\n\u003Cdiv class=\"pw jy l fi\"\u003E\n\u003Cdiv class=\"px py l\"\u003E\u003Ciframe class=\"fr n gh dv bg\" title=\"Dia a dia na Engenharia do Asaas: como funcionam nossas squads multidisciplinares\" src=\"https:\u002F\u002Fcdn.embedly.com\u002Fwidgets\u002Fmedia.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FtAHkFVDy1sM%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DtAHkFVDy1sM&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FtAHkFVDy1sM%2Fhqdefault.jpg&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=youtube\" width=\"854\" height=\"480\" frameborder=\"0\" scrolling=\"no\" allowfullscreen=\"allowfullscreen\" data-mce-fragment=\"1\"\u003E\u003C\u002Fiframe\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Ch1 id=\"d0f1\" class=\"og oh hi be oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd bj\" data-selectable-paragraph=\"\"\u003EQuais são as rotinas das equipes?\u003C\u002Fh1\u003E\n\u003Cp id=\"548f\" class=\"pw-post-body-paragraph ni nj hi nk b nl pe nn no np pf nr ns nt pg nv nw nx ph nz oa ob pi od oe of gm bj\" data-selectable-paragraph=\"\"\u003EFaz parte da cultura do time de Engenharia o cuidado com a qualidade das entregas, o trabalho colaborativo e priorização da qualidade antes da quantidade.\u003C\u002Fp\u003E\n\u003Cp id=\"b4cf\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003ENo dia a dia, o time tem algumas rotinas que contribuem para que essas características sejam ainda mais fortes.\u003C\u002Fp\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"11d5\" class=\"ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of pj pk pl bj\" data-selectable-paragraph=\"\"\u003E\u003Cstrong class=\"nk hj\"\u003EDaily e reunião semanal\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"680f\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003ENas \u003Cstrong class=\"nk hj\"\u003Ereuniões diárias\u003C\u002Fstrong\u003E (dailies) com o time, os profissionais têm espaço para compartilhar o que desenvolveram no dia anterior, se encontraram algum obstáculo ou se precisam de ajuda com alguma tarefa. Assim, todos da equipe podem saber o que os colegas estão desenvolvendo e contribuir sempre que necessário.\u003C\u002Fp\u003E\n\u003Cp id=\"1dc8\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003ENas \u003Cstrong class=\"nk hj\"\u003Ereuniões semanais\u003C\u002Fstrong\u003E, em conjunto com o PM e o tech lead, são definidas as atividades em que o time estará focado, sempre negociando prazos para que o produto final seja desenvolvido com qualidade. Por isso, quando necessário, entrega-se menos ou mais tarde, mas sempre com alta qualidade.\u003C\u002Fp\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"4443\" class=\"ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of pj pk pl bj\" data-selectable-paragraph=\"\"\u003E\u003Cstrong class=\"nk hj\"\u003ERevisões de código\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"a712\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EPara cultivar o aprendizado dos engenheiros e a qualidade do produto, há uma\u003Cstrong class=\"nk hj\"\u003E rotina diária de revisões de código\u003C\u002Fstrong\u003E, em que cada um reserva um tempo do seu dia para olhar os códigos dos colegas e propor melhorias.\u003C\u002Fp\u003E\n\u003Cp id=\"1add\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EAlém dessas rotinas fixas, também há alinhamentos conforme a necessidade de cada projeto. Quando uma tarefa impacta diferentes partes do produto, por exemplo, ocorrem \u003Cstrong class=\"nk hj\"\u003Econversas com outros squads\u003C\u002Fstrong\u003E da Engenharia, o que possibilita a colaboração e a troca de ideias sobre como seguir com a tarefa.\u003C\u002Fp\u003E\n\u003Cp id=\"4ef5\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EPara conhecer mais sobre o time, confira o post do coordenador da área, Joás Garcia, explicando sobre os \u003Ca class=\"af pz\" href=\"https:\u002F\u002Fmedium.com\u002Festacao-asaas\u002Fengenharia-de-software-ortodoxa-por-que-princ%C3%ADpios-importam-6a46efcacbc2\" rel=\"noopener\"\u003Eprincípios da Engenharia\u003C\u002Fa\u003E, e siga o Asaas no Medium para saber assim que os próximos posts forem ao ar.\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv class=\"gm gn go gp gq\"\u003E\n\u003Cdiv class=\"ab ca\"\u003E\n\u003Cdiv class=\"ch bg fy fz ga gb\"\u003E\n\u003Cp id=\"f02b\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EEstamos com oportunidades abertas! \u003Ca class=\"af pz\" href=\"https:\u002F\u002Fasaas.gupy.io\u002F\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003EConfira nossas vagas\u003C\u002Fa\u003E e venha trabalhar com a gente.\u003C\u002Fp\u003E\n\u003Cp id=\"f5db\" class=\"pw-post-body-paragraph ni nj hi nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gm bj\" data-selectable-paragraph=\"\"\u003EAh, e se você curtiu esse post, não deixe de bater palmas pra ele!\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EO time de Engenharia do Asaas se diferencia por contar com princípios que guiam as decisões de todos os seus integrantes. No dia a dia das equipes, isso se reflete em uma dinâmica de trabalho que envolve autonomia e colaboração, por meio da divisão em squads multidisciplinares.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fback-end\u002Fdia-a-dia-na-engenharia-do-asaas-como-funcionam-nossas-squads-multidisciplinares","date":"16 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F16092507\u002Fdestaqueasaas.jpg","externalMention":null,"author":{"id":90038,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F16092123\u002FWhatsApp-Image-2024-02-09-at-15.58.18.jpeg","name":"Rodrigo Miguel","description":"VP de Engenharia na Asaas. Envolvido com Engenharia de Software há mais de 20 anos, lidera times apaixonados por resolver problemas que tornem a vida das pessoas mais fácil.","slug":"rodrigomacielimasters-com-br","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Frodrigomacielimasters-com-br","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"rodrigomiguel@imasters.com.br"},"articles_count":1,"views_count":100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Back-End","slug":"back-end","id":7158,"link":"https:\u002F\u002Fimasters.com.br\u002Fback-end"},{"title":"Carreira Dev","slug":"carreira-dev","id":7265,"link":"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev"}],"tags":[{"title":"asaas","slug":"asaas","id":8977,"link":"https:\u002F\u002Fimasters.com.br\u002Fasaas"},{"title":"engenharia","slug":"engenharia","id":196,"link":"https:\u002F\u002Fimasters.com.br\u002Fengenharia"},{"title":"squads","slug":"squads","id":6669,"link":"https:\u002F\u002Fimasters.com.br\u002Fsquads"}],"seo":{"open_graph":{"title":"Dia a dia na Engenharia do Asaas: como funcionam nossas squads multidisciplinares - iMasters - We are Developers","description":"O time de Engenharia do Asaas se diferencia por contar com princípios que guiam as decisões de todos os seus integrantes. No dia a dia das equipes, isso se reflete em uma dinâmica de trabalho que envolve autonomia e colaboração, por meio da divisão em squads multidisciplinares.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F16092507\u002Fdestaqueasaas.jpg","width":850,"height":478},"modified_time":"2024-02-26T16:11:01-03:00","published_time":"2024-02-16T10:01:26-03:00"},"twitter":{"title":"Dia a dia na Engenharia do Asaas: como funcionam nossas squads multidisciplinares - iMasters - We are Developers","description":"O time de Engenharia do Asaas se diferencia por contar com princípios que guiam as decisões de todos os seus integrantes. No dia a dia das equipes, isso se reflete em uma dinâmica de trabalho que envolve autonomia e colaboração, por meio da divisão em squads multidisciplinares.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F16092507\u002Fdestaqueasaas.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fback-end\u002Fdia-a-dia-na-engenharia-do-asaas-como-funcionam-nossas-squads-multidisciplinares","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fback-end\u002Fdia-a-dia-na-engenharia-do-asaas-como-funcionam-nossas-squads-multidisciplinares","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fback-end\u002Fdia-a-dia-na-engenharia-do-asaas-como-funcionam-nossas-squads-multidisciplinares"},"type":"post"},{"id":160596,"title":"Uma mulher na ciência de dados | Dia Internacional de Mulheres e Meninas na Ciência","content":"\u003Cp\u003EEste mês celebramos o \u003Cstrong\u003EDia Internacional de Mulheres e Meninas na Ciência\u003C\u002Fstrong\u003E. A data foi  estabelecida pela Assembleia Geral das Nações Unidas e se mostra como um lembrete poderoso do progresso que fizemos e do trabalho que ainda precisa ser feito para garantir que mulheres e meninas em todo o mundo tenham as mesmas oportunidades e reconhecimento que seus colegas do sexo masculino. Um dia para celebrar as realizações incríveis da mulher na ciência e também para refletir sobre os desafios que enfrentamos diariamente.\u003C\u002Fp\u003E\n\u003Cp\u003EIsto porque ainda temos uma longa jornada em busca de promover o acesso igualitário à ciência e estimular a participação feminina nesse campo. A igualdade de gênero é uma prioridade global da UNESCO, que reconhece a importância de apoiar e capacitar jovens meninas para que possam contribuir plenamente com suas ideias e habilidades, trazendo  diversidade na pesquisa científica, o que é fundamental para enfrentar os desafios globais, como a melhoria da saúde e o combate à mudança climática.\u003C\u002Fp\u003E\n\u003Cp\u003ENo entanto, apesar da relevância das áreas de ciência, tecnologia, engenharia e matemática (STEM) para as economias nacionais, a igualdade de gênero nessas áreas ainda não foi alcançada na maioria dos países. Estatísticas mostram que apenas cerca de um terço dos pesquisadores são mulheres e que a representação feminina em áreas de STEM ainda é baixa.\u003C\u002Fp\u003E\n\u003Ch2\u003EUma mulher na ciência de dados\u003C\u002Fh2\u003E\n\u003Cp\u003EEu sou uma Arquiteta de Soluções AWS especializada em Data Analytics, com uma paixão incessante por desvendar os mistérios dos dados e transformá-los em insights valiosos. Minha jornada no mundo da tecnologia não tem sido apenas sobre dominar as intricadas nuances da computação em nuvem ou a complexidade dos algoritmos de machine learning; tem sido também uma jornada de superação de obstáculos, desafios e quebra de barreiras impostas pela sociedade.\u003C\u002Fp\u003E\n\u003Cp\u003EAfinal, ser uma mulher na ciência e tecnologia não é fácil. Desde o início da minha carreira, tenho enfrentado estereótipos de gênero, preconceitos velados e a falta de representação feminina em cargos de liderança. No entanto, esses obstáculos nunca me impediram de seguir minha paixão pela ciência de dados. Na verdade, eles apenas fortaleceram minha determinação em provar que as mulheres têm um lugar legítimo e valioso nesse campo.\u003C\u002Fp\u003E\n\u003Cp\u003EA ciência e a tecnologia permeiam todas as facetas da minha vida. Desde o momento em que acordo de manhã até a hora de dormir, estou imersa em um mundo de dados, algoritmos e inovação. Como líder da área de dados na dataRain Consulting, tenho o privilégio de trabalhar com uma equipe talentosa e diversificada para desenvolver soluções inovadoras para os nossos clientes. Além disso, como uma mulher na ciência e instrutora certificada pela AWS, tenho a oportunidade de compartilhar meu conhecimento e inspirar a próxima geração de profissionais de tecnologia.\u003C\u002Fp\u003E\n\u003Cp\u003EOs desafios ao longo do caminho foram muitos. Superar estereótipos de gênero, lutar contra a falta de representação feminina na área e manter-me atualizada com as constantes mudanças tecnológicas foram apenas alguns dos obstáculos que enfrentei. No entanto, cada desafio superado só serviu para me fortalecer e me tornar uma profissional mais resiliente e determinada.\u003C\u002Fp\u003E\n\u003Cp\u003EÀ medida que celebramos o Dia das Mulheres e Meninas na Ciência, lembramos que ainda há muito trabalho a ser feito. Devemos continuar desafiando os estereótipos de gênero, promovendo a diversidade e a inclusão e capacitando as mulheres a seguirem seus sonhos científicos. Somente assim podemos construir um futuro onde todas as mentes brilhantes, independentemente do gênero, tenham a chance de brilhar e fazer a diferença no mundo da ciência e da tecnologia.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EEste mês celebramos o Dia Internacional de Mulheres e Meninas na Ciência…Um dia para celebrar as realizações incríveis da mulher na ciência e também…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fuma-mulher-na-ciencia-de-dados-dia-internacional-de-mulheres-e-meninas-na-ciencia","date":"19 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19113030\u002Fpexels-christina-morillo-1181472-1.jpg","externalMention":null,"author":{"id":149221,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19110838\u002FThais-Lino-1.jpg","name":"Thaís Lino","description":"Thaís Lino é Arquiteta de Soluções AWS especializada em Data Analytics, com certificações que incluem AWS Data Analytics - Specialty e AWS Solutions Architect - Professional. Líder na dataRain Consulting, é responsável pela equipe de engenheiros de dados e cientistas de dados. É instrutora certificada pela AWS e ministra cursos em diversas áreas. Conta ainda com as certificações AWS Solutions Architect - Professional e AWS Machine Learning - Specialty.","slug":"thaislino","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fthaislino","registered":"2024-02-19 14:10:28","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"thaislino@imasters.com.br"},"articles_count":1,"views_count":100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Carreira Dev","slug":"carreira-dev","id":7265,"link":"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev"}],"tags":[{"title":"arquiteta de soluções","slug":"arquiteta-de-solucoes","id":8978,"link":"https:\u002F\u002Fimasters.com.br\u002Farquiteta-de-solucoes"},{"title":"arquitetura de software","slug":"arquitetura-de-software","id":393,"link":"https:\u002F\u002Fimasters.com.br\u002Farquitetura-de-software"},{"title":"ciência de dados","slug":"ciencia-de-dados","id":5843,"link":"https:\u002F\u002Fimasters.com.br\u002Fciencia-de-dados"},{"title":"Datas analútics","slug":"datas-analutics","id":8979,"link":"https:\u002F\u002Fimasters.com.br\u002Fdatas-analutics"},{"title":"mulher","slug":"mulher","id":3546,"link":"https:\u002F\u002Fimasters.com.br\u002Fmulher"},{"title":"software","slug":"software-2","id":274,"link":"https:\u002F\u002Fimasters.com.br\u002Fsoftware-2"}],"seo":{"open_graph":{"title":"Uma mulher na ciência de dados | Dia de Mulheres na Ciência","description":"Este mês celebramos o Dia Internacional de Mulheres e Meninas na Ciência...Um dia para celebrar as realizações incríveis da mulher na ciência e também...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19113030\u002Fpexels-christina-morillo-1181472-1.jpg","width":800,"height":534},"modified_time":"2024-02-19T11:32:55-03:00","published_time":"2024-02-19T11:32:55-03:00"},"twitter":{"title":"Uma mulher na ciência de dados | Dia de Mulheres na Ciência","description":"Este mês celebramos o Dia Internacional de Mulheres e Meninas na Ciência...Um dia para celebrar as realizações incríveis da mulher na ciência e também...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19113030\u002Fpexels-christina-morillo-1181472-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fuma-mulher-na-ciencia-de-dados-dia-internacional-de-mulheres-e-meninas-na-ciencia","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fuma-mulher-na-ciencia-de-dados-dia-internacional-de-mulheres-e-meninas-na-ciencia","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fuma-mulher-na-ciencia-de-dados-dia-internacional-de-mulheres-e-meninas-na-ciencia"},"type":"post"},{"id":160606,"title":"MFA e Azure AD B2C: autenticação multifator em poucos cliques! | DevOps Experience","content":"\u003Cp id=\"181e\" class=\"pw-post-body-paragraph xz ya tv lk b yb yc yd ye yf yg yh yi ku yj yk yl kz ym yn yo le yp yq yr ys er bj yt\" data-selectable-paragraph=\"\"\u003ENo dia \u003Cstrong class=\"lk kj\"\u003E31\u002F01\u002F2024 (quarta-feira\u003C\u002Fstrong\u003E) aconteceu a \u003Cstrong class=\"lk kj\"\u003Eedição de Janeiro\u002F2024\u003C\u002Fstrong\u003E do \u003Ca class=\"af ov\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fp\u002FC2aJIr9B1Yu\u002F?img_index=1\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"lk kj\"\u003EDevOps Experience\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E, um dos maiores eventos online no Brasil com foco em DevOps. Tive a honra de mais uma vez participar como palestrante, sendo que aproveito este espaço para deixar aqui meu muito obrigado ao \u003Cstrong class=\"lk kj\"\u003EDaniel Ginês\u003C\u002Fstrong\u003E e à \u003Cstrong class=\"lk kj\"\u003EAline Martins\u003C\u002Fstrong\u003E pelo convite e por todo o apoio para que eu participasse do evento.\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\u003Cstrong\u003E\u003Cem\u003ELEIA TAMBÉM: \u003C\u002Fem\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fdotnet\u002Fnovidades-do-net-8-short-circuit-middleware-em-minimal-apis\"\u003E\u003Cem\u003ENovidades do .NET 8: Short-circuit middleware em Minimal APIs\u003C\u002Fem\u003E\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp class=\"pw-post-body-paragraph xz ya tv lk b yb yc yd ye yf yg yh yi ku yj yk yl kz ym yn yo le yp yq yr ys er bj\" data-selectable-paragraph=\"\"\u003EDesta vez realizei uma apresentação focada em \u003Cstrong\u003EMFA e Azure\u003C\u002Fstrong\u003E, na implementação de \u003Cstrong class=\"lk kj\"\u003Eautenticação multifator (MFA) com o Azure AD B2C\u003C\u002Fstrong\u003E, demonstrando como este serviço em nuvem pode contribuir para a c\u003Cstrong class=\"lk kj\"\u003Eriação rápida de soluções que dependam de MFA\u003C\u002Fstrong\u003E. Além do \u003Cstrong class=\"lk kj\"\u003EAzure AD B2C\u003C\u002Fstrong\u003E, o exemplo que utilizei envolvia ainda tecnologias como \u003Cstrong class=\"lk kj\"\u003E.NET 8\u003C\u002Fstrong\u003E, \u003Cstrong class=\"lk kj\"\u003EGraph API\u003C\u002Fstrong\u003E e \u003Cstrong class=\"lk kj\"\u003EMicrosoft Identity\u003C\u002Fstrong\u003E.\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fc-sharp\u002F159882-2\"\u003E\u003Cem\u003E\u003Cstrong\u003ENovidades do C# 12: Inline Array\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"7c87\" class=\"pw-post-title tu eu tv be kj tw tx gn ty tz ua ub gq uc ud hw ue uf hx hz ia ug uh ib id ie ui uj if ih bj\" data-testid=\"storyTitle\"\u003EMFA e Azure\u003C\u002Fh2\u003E\n\u003Cp id=\"be33\" class=\"pw-post-body-paragraph xz ya tv lk b yb yc yd ye yf yg yh yi ku yj yk yl kz ym yn yo le yp yq yr ys er bj\" data-selectable-paragraph=\"\"\u003EEm um \u003Cstrong class=\"lk kj\"\u003Evídeo recent\u003C\u002Fstrong\u003Ee do \u003Cstrong class=\"lk kj\"\u003ECanal .NET \u003C\u002Fstrong\u003Eno \u003Cstrong class=\"lk kj\"\u003EYouTube\u003C\u002Fstrong\u003E também demonstrei este mesmo exemplo, mas indo além através do uso de \u003Cstrong class=\"lk kj\"\u003EConditional Access\u003C\u002Fstrong\u003E e de uma \u003Cstrong class=\"lk kj\"\u003EPolicy que desativava a obrigatoriedade do MFA para usuários específicos\u003C\u002Fstrong\u003E. Acesse esse \u003Ca class=\"af ov\" href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=9R-vP1I1ufY\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"lk kj\"\u003Elink\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E e \u003Cstrong class=\"lk kj\"\u003Eassista gratuitamente\u003C\u002Fstrong\u003E o conteúdo:\u003C\u002Fp\u003E\n\u003Cfigure class=\"zc zd ze zf zg xs\"\u003E\n\u003Cdiv class=\"ca ii l dl\"\u003E\n\u003Cdiv class=\"zh kd l\"\u003E\u003Ciframe class=\"ed n jr dk bg\" title=\"Autenticação Multifator (MFA) em .NET: um exemplo simples e rápido com Azure AD B2C\" src=\"https:\u002F\u002Fcdn.embedly.com\u002Fwidgets\u002Fmedia.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F9R-vP1I1ufY%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D9R-vP1I1ufY&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F9R-vP1I1ufY%2Fhqdefault.jpg&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=youtube\" width=\"854\" height=\"480\" frameborder=\"0\" scrolling=\"no\" allowfullscreen=\"allowfullscreen\" data-mce-fragment=\"1\"\u003E\u003C\u002Fiframe\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Ffigure\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\u003Cem\u003E\u003Cstrong\u003ELEIAT TAMBÉM: Novidades do .NET 8: coleções imutáveis com FrozenSet\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"9d54\" class=\"pw-post-body-paragraph xz ya tv lk b yb yc yd ye yf yg yh yi ku yj yk yl kz ym yn yo le yp yq yr ys er bj\" data-selectable-paragraph=\"\"\u003EPúblico que acompanhou a apresentação: \u003Cstrong class=\"lk kj\"\u003E220 participantes (pico de pessoas assistindo simultaneamente a palestra)\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"5abb\" class=\"pw-post-body-paragraph xz ya tv lk b yb yc yd ye yf yg yh yi ku yj yk yl kz ym yn yo le yp yq yr ys er bj\" data-selectable-paragraph=\"\"\u003EOs slides e o exemplo da apresentação foram disponibilizados em um repositório no \u003Cstrong class=\"lk kj\"\u003EGitHub\u003C\u002Fstrong\u003E, bastando clicar neste \u003Ca class=\"af ov\" href=\"https:\u002F\u002Fgithub.com\u002Frenatogroffe\u002FMFA_DevOpsExperience-Jan2024\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"lk kj\"\u003Elink\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E para acessar o conteúdo. Caso achem útil este conteúdo, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no \u003Cstrong class=\"lk kj\"\u003EGitHub\u003C\u002Fstrong\u003E!\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EDesta vez realizei uma apresentação focada em MFA e Azure, na implementação de autenticação multifator (MFA) com o Azure AD B2C, demonstrando como este…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fmfa-e-azure-ad-b2c-autenticacao-multifator-em-poucos-cliques-devops-experience","date":"20 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20144055\u002Fdevops-1.jpg","externalMention":null,"author":{"id":147927,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30180005\u002Fgroffe-128x128.jpg","name":"Renato Groffe","description":"Atua como consultor em atividades voltadas ao desenvolvimento de sistemas há mais de 15 anos. Microsoft MVP (Most Valuable Professional) e participante do programa MTAC (Multi-Plataform Technical Audience Contributor). Bacharel em Sistemas de Informação, com Especialização em Engenharia de Software e MBA em Business Intelligence. Também é palestrante e autor técnico em portais e revistas especializadas, com foco em tecnologias Microsoft e boas práticas na área de software.","slug":"renatogroffe","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Frenatogroffe","registered":"2016-09-01 18:39:52","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"renato.groffe@yahoo.com.br"},"articles_count":112,"views_count":1254400,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"DevSecOps","slug":"devsecops","id":1,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops"}],"tags":[{"title":"autenticação multifator","slug":"autenticacao-multifator","id":8981,"link":"https:\u002F\u002Fimasters.com.br\u002Fautenticacao-multifator"},{"title":"devops","slug":"devops","id":1925,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevops"},{"title":"MFA e Azure","slug":"mfa-e-azure","id":8980,"link":"https:\u002F\u002Fimasters.com.br\u002Fmfa-e-azure"}],"seo":{"open_graph":{"title":"MFA e Azure AD B2C: autenticação multifator | DevOps Experience","description":"Desta vez realizei uma apresentação focada em MFA e Azure, na implementação de autenticação multifator (MFA) com o Azure AD B2C, demonstrando como este...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20144055\u002Fdevops-1.jpg","width":799,"height":531},"modified_time":"2024-02-20T14:42:31-03:00","published_time":"2024-02-20T14:42:30-03:00"},"twitter":{"title":"MFA e Azure AD B2C: autenticação multifator | DevOps Experience","description":"Desta vez realizei uma apresentação focada em MFA e Azure, na implementação de autenticação multifator (MFA) com o Azure AD B2C, demonstrando como este...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20144055\u002Fdevops-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fmfa-e-azure-ad-b2c-autenticacao-multifator-em-poucos-cliques-devops-experience","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fmfa-e-azure-ad-b2c-autenticacao-multifator-em-poucos-cliques-devops-experience","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fmfa-e-azure-ad-b2c-autenticacao-multifator-em-poucos-cliques-devops-experience"},"type":"post"},{"id":160612,"title":"Scripts SQL e Tabelas de Sistema – Parte 3: Arquivos de Log","content":"\u003Cp id=\"E1126\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1127\" class=\"qowt-font10-Arial\"\u003EO assunto desta vez é a geração de scripts que \u003C\u002Fspan\u003E\u003Cspan id=\"E1128\" class=\"qowt-font10-Arial\"\u003Ese apliquem a múltiplos bancos de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E1129\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1130\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1131\" class=\"qowt-font10-Arial\"\u003EÉ claro que scripts que \u003C\u002Fspan\u003E\u003Cspan id=\"E1132\" class=\"qowt-font10-Arial\"\u003Eafetam\u003C\u002Fspan\u003E\u003Cspan id=\"E1133\" class=\"qowt-font10-Arial\"\u003E toda instância SQL são muito poderosos, mas é sempre bom lembrar que quanto mais amplo o escopo do seu script, \u003C\u002Fspan\u003E\u003Cspan id=\"E1134\" class=\"qowt-font10-Arial\"\u003Emaiores devem ser \u003C\u002Fspan\u003E\u003Cspan id=\"E1135\" class=\"qowt-font10-Arial\"\u003Eos cuidados na \u003C\u002Fspan\u003E\u003Cspan id=\"E1136\" class=\"qowt-font10-Arial\"\u003Esua \u003C\u002Fspan\u003E\u003Cspan id=\"E1137\" class=\"qowt-font10-Arial\"\u003Econstrução\u003C\u002Fspan\u003E\u003Cspan id=\"E1138\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1139\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1140\" class=\"qowt-font10-Arial\"\u003ETendo isso em mente, começamos \u003C\u002Fspan\u003E\u003Cspan id=\"E1141\" class=\"qowt-font10-Arial\"\u003Ea conversa falando \u003C\u002Fspan\u003E\u003Cspan id=\"E1142\" class=\"qowt-font10-Arial\"\u003Edos tipos de tabelas de sistema.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas\"\u003EScripts SQL e Tabelas de Sistema – Parte 1: Alterando Colunas\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1143\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1144\"\u003EScripts SQL – Tipos de Tabelas de Sistema\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1145\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1146\" class=\"qowt-font10-Arial\"\u003EEstou\u003C\u002Fspan\u003E\u003Cspan id=\"E1147\" class=\"qowt-font10-Arial\"\u003E sempre me referindo a estes catálogos como “tabelas de sistema”, mas muitos deles são visões ou até mesmo exibições de gerenciamento dinâmico do sistema (que englobam as \u003C\u002Fspan\u003E\u003Ca id=\"E1148\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Frelational-databases\u002Fsystem-dynamic-management-views\u002Fsystem-dynamic-management-views?view=sql-server-ver16\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1149\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003EDMVs e DMFs\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1150\" class=\"qowt-font10-Arial\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1151\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1152\" class=\"qowt-font10-Arial\"\u003EDe qualquer modo, p\u003C\u002Fspan\u003E\u003Cspan id=\"E1153\" class=\"qowt-font10-Arial\"\u003Eara fins de criação de um gerador de scripts, não importa que tipo de objeto que se está usa\u003C\u002Fspan\u003E\u003Cspan id=\"E1154\" class=\"qowt-font10-Arial\"\u003En\u003C\u002Fspan\u003E\u003Cspan id=\"E1155\" class=\"qowt-font10-Arial\"\u003Edo\u003C\u002Fspan\u003E\u003Cspan id=\"E1156\" class=\"qowt-font10-Arial\"\u003E. B\u003C\u002Fspan\u003E\u003Cspan id=\"E1157\" class=\"qowt-font10-Arial\"\u003Easta saber como trabalhar com seus metadados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1158\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1159\" class=\"qowt-font10-Arial\"\u003EJá apresentei algumas tabelas de sistema nos artigos anteriores, \u003C\u002Fspan\u003E\u003Cspan id=\"E1160\" class=\"qowt-font10-Arial\"\u003Emas o ponto importante é que aquelas tabelas existem em todos os bancos de dados da instância,\u003C\u002Fspan\u003E\u003Cspan id=\"E1161\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1162\" class=\"qowt-font10-Arial\"\u003Esejam eles\u003C\u002Fspan\u003E\u003Cspan id=\"E1163\" class=\"qowt-font10-Arial\"\u003E ba\u003C\u002Fspan\u003E\u003Cspan id=\"E1164\" class=\"qowt-font10-Arial\"\u003Encos\u003C\u002Fspan\u003E\u003Cspan id=\"E1165\" class=\"qowt-font10-Arial\"\u003E de sistema \u003C\u002Fspan\u003E\u003Cspan id=\"E1166\" class=\"qowt-font10-Arial\"\u003E(MASTER, TEMPDB, MSDB, MODEL) \u003C\u002Fspan\u003E\u003Cspan id=\"E1167\" class=\"qowt-font10-Arial\"\u003Eou de usuário.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1168\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1169\" class=\"qowt-font10-Arial\"\u003EOutros catálogos são específicos de uma ou outra base de sistema.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1170\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1171\" class=\"qowt-font10-Arial\"\u003EPor exemplo, na base MASTER, \u003C\u002Fspan\u003E\u003Cspan id=\"E1172\" class=\"qowt-font10-Arial\"\u003Eexistem algumas tabelas extras que só são encontradas ali. Por exemplo:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli id=\"E1173\" class=\"qowt-li-21_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E1174\" class=\"qowt-font10-Arial\"\u003Esys.databases\u003C\u002Fspan\u003E\u003Cspan id=\"E1175\" class=\"qowt-font10-Arial\"\u003E :\u003C\u002Fspan\u003E\u003Cspan id=\"E1176\" class=\"qowt-font10-Arial\"\u003E contém informações \u003C\u002Fspan\u003E\u003Cspan id=\"E1177\" class=\"qowt-font10-Arial\"\u003Ede\u003C\u002Fspan\u003E\u003Cspan id=\"E1178\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1179\" class=\"qowt-font10-Arial\"\u003Etodas as \u003C\u002Fspan\u003E\u003Cspan id=\"E1180\" class=\"qowt-font10-Arial\"\u003Ebases de dados (veja \u003C\u002Fspan\u003E\u003Ca id=\"E1181\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Frelational-databases\u002Fsystem-catalog-views\u002Fsys-databases-transact-sql?view=sql-server-ver16\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1182\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Elink\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1183\" class=\"qowt-font10-Arial\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"E1184\" class=\"qowt-li-21_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E1185\" class=\"qowt-font10-Arial\"\u003Esys.servers\u003C\u002Fspan\u003E\u003Cspan id=\"E1186\" class=\"qowt-font10-Arial\"\u003E :\u003C\u002Fspan\u003E\u003Cspan id=\"E1187\" class=\"qowt-font10-Arial\"\u003E informa metadados dos servidores \u003C\u002Fspan\u003E\u003Cspan id=\"E1188\" class=\"qowt-font10-Arial\"\u003Evinculados (“\u003C\u002Fspan\u003E\u003Ca id=\"E1189\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Frelational-databases\u002Fsystem-catalog-views\u002Fsys-servers-transact-sql?view=sql-server-ver16\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1190\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Elinked servers\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1191\" class=\"qowt-font10-Arial\"\u003E”)\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"E1192\" class=\"qowt-li-21_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E1193\" class=\"qowt-font10-Arial\"\u003Esys.logins\u003C\u002Fspan\u003E\u003Cspan id=\"E1194\" class=\"qowt-font10-Arial\"\u003E : \u003C\u002Fspan\u003E\u003Cspan id=\"E1195\" class=\"qowt-font10-Arial\"\u003Etraz informações de todos os logins cadastrados na instância SQL\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"E1196\" class=\"qowt-li-21_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E1197\" class=\"qowt-font10-Arial\"\u003Esys.master\u003C\u002Fspan\u003E\u003Cspan id=\"E1198\" class=\"qowt-font10-Arial\"\u003E_files\u003C\u002Fspan\u003E\u003Cspan id=\"E1199\" class=\"qowt-font10-Arial\"\u003E : \u003C\u002Fspan\u003E\u003Cspan id=\"E1200\" class=\"qowt-font10-Arial\"\u003Emetadados dos arquivos de dados e log usados\u003C\u002Fspan\u003E\u003Cspan id=\"E1201\" class=\"qowt-font10-Arial\"\u003E em cada base de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E1202\" class=\"qowt-font10-Arial\"\u003E (\u003C\u002Fspan\u003E\u003Cspan id=\"E1203\" class=\"qowt-font10-Arial\"\u003E“\u003C\u002Fspan\u003E\u003Ca id=\"E1204\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fpt-br\u002Fsql\u002Frelational-databases\u002Fsystem-catalog-views\u002Fsys-master-files-transact-sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1205\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Edatafiles\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1206\" class=\"qowt-font10-Arial\"\u003E”)\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"E1207\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1208\" class=\"qowt-font10-Arial\"\u003EDo mesmo modo, n\u003C\u002Fspan\u003E\u003Cspan id=\"E1209\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E1210\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1211\" class=\"qowt-font10-Arial\"\u003Ebase MSDB existem tabelas \u003C\u002Fspan\u003E\u003Cspan id=\"E1212\" class=\"qowt-font10-Arial\"\u003Eque tratam de metadados dos jobs da instância,\u003C\u002Fspan\u003E\u003Cspan id=\"E1213\" class=\"qowt-font10-Arial\"\u003E seus passos, \u003C\u002Fspan\u003E\u003Cspan id=\"E1214\" class=\"qowt-font10-Arial\"\u003Eagendamentos etc.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1215\" class=\"x-scope qowt-word-para-3 qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1216\"\u003ECaso de Uso\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1217\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1218\" class=\"qowt-font10-Arial\"\u003ENeste exemplo, \u003C\u002Fspan\u003E\u003Cspan id=\"E1219\" class=\"qowt-font10-Arial\"\u003Eapresento um script simples para ajudar o administrador da instância a controlar \u003C\u002Fspan\u003E\u003Cspan id=\"E1220\" class=\"qowt-font10-Arial\"\u003Eo consumo excessivo de espaço em disco por parte dos arquivos de log\u003C\u002Fspan\u003E\u003Cspan id=\"E1221\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E1222\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1223\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1224\" class=\"qowt-font10-Arial\"\u003EOriginalmente, e\u003C\u002Fspan\u003E\u003Cspan id=\"E1226\" class=\"qowt-font10-Arial\"\u003Eu \u003C\u002Fspan\u003E\u003Cspan id=\"E1227\" class=\"qowt-font10-Arial\"\u003Ecriei \u003C\u002Fspan\u003E\u003Cspan id=\"E1228\" class=\"qowt-font10-Arial\"\u003Eeste script para lidar com um caso real\u003C\u002Fspan\u003E\u003Cspan id=\"E1229\" class=\"qowt-font10-Arial\"\u003E, onde o ambiente de testes \u003C\u002Fspan\u003E\u003Cspan id=\"E1230\" class=\"qowt-font10-Arial\"\u003Eda empresa \u003C\u002Fspan\u003E\u003Cspan id=\"E1231\" class=\"qowt-font10-Arial\"\u003Edispunha \u003C\u002Fspan\u003E\u003Cspan id=\"E1232\" class=\"qowt-font10-Arial\"\u003Ede uma quantidade limitada de espaço para os arquivos de log.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1233\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1234\" class=\"qowt-font10-Arial\"\u003EO objetivo deste script é identificar quais arquivos de log \u003C\u002Fspan\u003E\u003Cspan id=\"E1235\" class=\"qowt-font10-Arial\"\u003Eestão ocupando mais espaço do que o esperado e então tentar liberar espaço \u003C\u002Fspan\u003E\u003Cspan id=\"E1236\" class=\"qowt-font10-Arial\"\u003Elivre\u003C\u002Fspan\u003E\u003Cspan id=\"E1237\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1238\" class=\"qowt-font10-Arial\"\u003Ed\u003C\u002Fspan\u003E\u003Cspan id=\"E1239\" class=\"qowt-font10-Arial\"\u003Eestes arquivos.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1240\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1241\" class=\"qowt-font10-Arial\"\u003EPara isso, eu uso a instrução \u003C\u002Fspan\u003E\u003Ca id=\"E1242\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Ft-sql\u002Fdatabase-console-commands\u002Fdbcc-shrinkfile-transact-sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1243\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003EDBCC SHRINKFILE\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1244\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003Cspan id=\"E1245\" class=\"qowt-font10-Arial\"\u003EImportante \u003C\u002Fspan\u003E\u003Cspan id=\"E1246\" class=\"qowt-font10-Arial\"\u003Elembrar\u003C\u002Fspan\u003E\u003Cspan id=\"E1247\" class=\"qowt-font10-Arial\"\u003E que \u003C\u002Fspan\u003E\u003Cspan id=\"E1248\" class=\"qowt-font10-Arial\"\u003Epara executar \u003C\u002Fspan\u003E\u003Cspan id=\"E1249\" class=\"qowt-font10-Arial\"\u003Eesta operação\u003C\u002Fspan\u003E\u003Cspan id=\"E1250\" class=\"qowt-font10-Arial\"\u003E é necessário \u003C\u002Fspan\u003E\u003Cspan id=\"E1251\" class=\"qowt-font10-Arial\"\u003Efazer parte\u003C\u002Fspan\u003E\u003Cspan id=\"E1252\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1253\" class=\"qowt-font10-Arial\"\u003Ed\u003C\u002Fspan\u003E\u003Cspan id=\"E1254\" class=\"qowt-font10-Arial\"\u003Eo grupo de segurança \u003C\u002Fspan\u003E\u003Cspan id=\"E1255\" class=\"qowt-font10-Arial\"\u003Esysadmin\u003C\u002Fspan\u003E\u003Cspan id=\"E1256\" class=\"qowt-font10-Arial\"\u003E ou então do grupo \u003C\u002Fspan\u003E\u003Cspan id=\"E1257\" class=\"qowt-font10-Arial\"\u003Edb_owner\u003C\u002Fspan\u003E\u003Cspan id=\"E1258\" class=\"qowt-font10-Arial\"\u003E de cada um dos bancos de dados afetados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"E1259\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1260\"\u003EDefinindo Escopo\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp id=\"E1261\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1262\" class=\"qowt-font10-Arial\"\u003EPara \u003C\u002Fspan\u003E\u003Cspan id=\"E1263\" class=\"qowt-font10-Arial\"\u003Eencontrar os metadados necessários para esta tarefa, eu uso duas tabelas de sistema específicas da base MASTER:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli id=\"E1264\" class=\"qowt-li-7_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-4\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E1265\" class=\"qowt-font10-Arial\"\u003Esys.databases\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli id=\"E1266\" class=\"qowt-li-7_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-4\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E1267\" class=\"qowt-font10-Arial\"\u003Esys.master_files\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp id=\"E1268\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1269\" class=\"qowt-font10-Arial\"\u003EO Quadro 1 mostra a consulta \u003C\u002Fspan\u003E\u003Cspan id=\"E1270\" class=\"qowt-font10-Arial\"\u003Epara identificar \u003C\u002Fspan\u003E\u003Cspan id=\"E1271\" class=\"qowt-font10-Arial\"\u003Eo tamanho d\u003C\u002Fspan\u003E\u003Cspan id=\"E1272\" class=\"qowt-font10-Arial\"\u003Eos arquivos de log das bases de dados \u003C\u002Fspan\u003E\u003Cspan id=\"E1273\" class=\"qowt-font10-Arial\"\u003Ede usuário \u003C\u002Fspan\u003E\u003Cspan id=\"E1274\" class=\"qowt-font10-Arial\"\u003Eque tiverem status \u003C\u002Fspan\u003E\u003Cspan id=\"E1275\" class=\"qowt-font10-Arial\"\u003E“online”.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_160613\" aria-describedby=\"caption-attachment-160613\" style=\"width: 718px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20145007\u002Fquadro1.png\"\u003E\u003Cimg class=\"wp-image-160613 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20145007\u002Fquadro1.png\" alt=\"\" width=\"718\" height=\"476\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-160613\" class=\"wp-caption-text\"\u003EQuadro 1: verificando o tamanho dos arquivos de log\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-2-criando-indices\"\u003EScripts SQL e Tabelas de Sistema – Parte 2: Criando Índices\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1525\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1526\"\u003EConstruindo o Gerador de Scripts de Gerenciamento de Log\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1527\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1528\" class=\"qowt-font10-Arial\"\u003EAgora eu reutilizo a consulta anterior para criar o gerador de scripts\u003C\u002Fspan\u003E\u003Cspan id=\"E1529\" class=\"qowt-font10-Arial\"\u003E e adiciono duas variáveis\u003C\u002Fspan\u003E\u003Cspan id=\"E1530\" class=\"qowt-font10-Arial\"\u003E para especificar qual o tamanho limite dos arquivos\u003C\u002Fspan\u003E\u003Cspan id=\"E1531\" class=\"qowt-font10-Arial\"\u003E que sofrer\u003C\u002Fspan\u003E\u003Cspan id=\"E1532\" class=\"qowt-font10-Arial\"\u003Eão\u003C\u002Fspan\u003E\u003Cspan id=\"E1533\" class=\"qowt-font10-Arial\"\u003E a redução e qual o tamanho\u003C\u002Fspan\u003E\u003Cspan id=\"E1534\" class=\"qowt-font10-Arial\"\u003E que será\u003C\u002Fspan\u003E\u003Cspan id=\"E1535\" class=\"qowt-font10-Arial\"\u003E reservado\u003C\u002Fspan\u003E\u003Cspan id=\"E1536\" class=\"qowt-font10-Arial\"\u003E para eles. Veja o\u003C\u002Fspan\u003E\u003Cspan id=\"E1537\" class=\"qowt-font10-Arial\"\u003E Quadro 2.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_160614\" aria-describedby=\"caption-attachment-160614\" style=\"width: 716px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20145213\u002Fquadro1-A.png\"\u003E\u003Cimg class=\"wp-image-160614 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20145213\u002Fquadro1-A.png\" alt=\"\" width=\"716\" height=\"540\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-160614\" class=\"wp-caption-text\"\u003EQuatro 2 A\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cfigure id=\"attachment_160616\" aria-describedby=\"caption-attachment-160616\" style=\"width: 715px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20145520\u002Fquadro2B1.png\"\u003E\u003Cimg class=\"wp-image-160616 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20145520\u002Fquadro2B1.png\" alt=\"\" width=\"715\" height=\"362\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-160616\" class=\"wp-caption-text\"\u003EQuadro 2 B: gerador dos scripts de “ShrinkFile”\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E1863\" class=\"x-scope qowt-word-para-2 x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1864\" class=\"qowt-font10-Arial\"\u003EObserve \u003C\u002Fspan\u003E\u003Cspan id=\"E1865\" class=\"qowt-font10-Arial\"\u003Eno quadro acima \u003C\u002Fspan\u003E\u003Cspan id=\"E1866\" class=\"qowt-font10-Arial\"\u003Eque o\u003C\u002Fspan\u003E\u003Cspan id=\"E1867\" class=\"qowt-font10-Arial\"\u003E resultado da consulta foi exibido em modo texto, exatamente para exibir \u003C\u002Fspan\u003E\u003Cspan id=\"E1868\" class=\"qowt-font10-Arial\"\u003Eas novas “linhas” que fazem parte do script.\u003C\u002Fspan\u003E\u003Cspan id=\"E1869\" class=\"qowt-font10-Arial\"\u003E Basta agora copiar \u003C\u002Fspan\u003E\u003Cspan class=\"qowt-font10-Arial\"\u003Eestas declarações e execut\u003C\u002Fspan\u003E\u003Cspan id=\"E1870\" class=\"qowt-font10-Arial\"\u003Eá-las no seu ambiente.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E1871\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1872\" class=\"qowt-font10-Arial\"\u003EVocê pode fazer\u003C\u002Fspan\u003E\u003Cspan id=\"E1873\" class=\"qowt-font10-Arial\"\u003E o download do script completo\u003C\u002Fspan\u003E\u003Cspan id=\"E1874\" class=\"qowt-font10-Arial\"\u003E n\u003C\u002Fspan\u003E\u003Cspan id=\"E1875\" class=\"qowt-font10-Arial\"\u003Eeste \u003C\u002Fspan\u003E\u003Ca id=\"E1876\" contenteditable=\"false\" href=\"https:\u002F\u002Fgithub.com\u002Fwcrivelini\u002Farticles\u002Fblob\u002Fmain\u002FSysTables_Scripts\u002FSysTabScript3.sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1877\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Elink\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1878\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1879\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-12\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1880\"\u003EScripts SQL – Co\u003C\u002Fspan\u003E\u003Cspan id=\"E1881\"\u003Ementários Finais\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1882\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1883\" class=\"qowt-font10-Arial\"\u003ENeste artigo\u003C\u002Fspan\u003E\u003Cspan id=\"E1884\" class=\"qowt-font10-Arial\"\u003E, trago um exemplo bem simples de uso de geradores de scripts que afetam múltiplos bancos de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E1885\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1886\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1887\" class=\"qowt-font10-Arial\"\u003EO exemplo foi escolhido a dedo, visto\u003C\u002Fspan\u003E\u003Cspan id=\"E1888\" class=\"qowt-font10-Arial\"\u003E que o nível de complexidade do gerador de scripts aumenta muito quando \u003C\u002Fspan\u003E\u003Cspan id=\"E1889\" class=\"qowt-font10-Arial\"\u003Ese \u003C\u002Fspan\u003E\u003Cspan id=\"E1890\" class=\"qowt-font10-Arial\"\u003Etrata\u003C\u002Fspan\u003E\u003Cspan id=\"E1891\" class=\"qowt-font10-Arial\"\u003E de criar \u003C\u002Fspan\u003E\u003Cspan id=\"E1892\" class=\"qowt-font10-Arial\"\u003Eações que \u003C\u002Fspan\u003E\u003Cspan id=\"E1893\" class=\"qowt-font10-Arial\"\u003Evão \u003C\u002Fspan\u003E\u003Cspan id=\"E1894\" class=\"qowt-font10-Arial\"\u003Eafetar objetos internos de \u003C\u002Fspan\u003E\u003Cspan id=\"E1895\" class=\"qowt-font10-Arial\"\u003Emúltiplas\u003C\u002Fspan\u003E\u003Cspan id=\"E1896\" class=\"qowt-font10-Arial\"\u003E base\u003C\u002Fspan\u003E\u003Cspan id=\"E1897\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1898\" class=\"qowt-font10-Arial\"\u003E de dados. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1899\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1900\" class=\"qowt-font10-Arial\"\u003EUm exercício que demonstraria esta afirmação \u003C\u002Fspan\u003E\u003Cspan id=\"E1901\" class=\"qowt-font10-Arial\"\u003E(e fica como sugestão para o leitor) seria converter os scripts dos artigos anteriores para serem executados em todos\u003C\u002Fspan\u003E\u003Cspan id=\"E1902\" class=\"qowt-font10-Arial\"\u003E os\u003C\u002Fspan\u003E\u003Cspan id=\"E1903\" class=\"qowt-font10-Arial\"\u003E bancos de dados da instância.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1904\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1905\" class=\"qowt-font10-Arial\"\u003ENo quarto artigo dessa série, trarei \u003C\u002Fspan\u003E\u003Cspan id=\"E1906\" class=\"qowt-font10-Arial\"\u003Eum novo exemplo que exatamente isso\u003C\u002Fspan\u003E\u003Cspan id=\"E1907\" class=\"qowt-font10-Arial\"\u003E: inspeciona cada uma das bases e toma ações dentro de cada uma delas.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1908\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1909\" class=\"qowt-font10-Arial\"\u003EAté a próxima!\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EO assunto desta vez é a geração de scripts SQL que se apliquem a múltiplos bancos de dados. É claro que scripts que afetam toda instância SQL são muito…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fscripts-sql-e-tabelas-de-sistema-parte-3-arquivos-de-log","date":"20 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20151050\u002FLOG1-1.png","externalMention":null,"author":{"id":452,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30184745\u002FwagnercriveliniP-128x128.jpeg","name":"Wagner Crivelini","description":"Consultor Sênior na Microsoft, na área de Data Insights para América Latina. Especialista em bancos de dados, é colunista em diversos portais de TI do Brasil e do exterior, com mais de 100 artigos técnicos publicados. É também co-produtor do DatabaseCast, primeiro podcast brasileiro sobre bancos de dados.","slug":"wagner-crivelini","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fwagner-crivelini","registered":"2010-12-30 11:28:37","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002Fwcrivelini@gmail.com","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.wcrivelini.com.br","mail":"wcrivelini@gmail.com"},"articles_count":91,"views_count":828100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Banco de Dados","slug":"banco-de-dados","id":7209,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados"},{"title":"Data","slug":"data","id":16,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"}],"tags":[{"title":"arquivos de log","slug":"arquivos-de-log","id":8982,"link":"https:\u002F\u002Fimasters.com.br\u002Farquivos-de-log"},{"title":"log","slug":"log","id":534,"link":"https:\u002F\u002Fimasters.com.br\u002Flog"},{"title":"Scripts SQL","slug":"scripts-sql","id":8975,"link":"https:\u002F\u002Fimasters.com.br\u002Fscripts-sql"},{"title":"sql","slug":"sql","id":706,"link":"https:\u002F\u002Fimasters.com.br\u002Fsql"}],"seo":{"open_graph":{"title":"Scripts SQL e Tabelas de Sistema - Parte 3: Arquivos de Log","description":"O assunto desta vez é a geração de scripts SQL que se apliquem a múltiplos bancos de dados. É claro que scripts que afetam toda instância SQL são muito...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20151050\u002FLOG1-1.png","width":800,"height":530},"modified_time":"2024-02-20T15:14:16-03:00","published_time":"2024-02-20T15:14:16-03:00"},"twitter":{"title":"Scripts SQL e Tabelas de Sistema - Parte 3: Arquivos de Log","description":"O assunto desta vez é a geração de scripts SQL que se apliquem a múltiplos bancos de dados. É claro que scripts que afetam toda instância SQL são muito...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20151050\u002FLOG1-1.png"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fscripts-sql-e-tabelas-de-sistema-parte-3-arquivos-de-log","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fscripts-sql-e-tabelas-de-sistema-parte-3-arquivos-de-log","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fscripts-sql-e-tabelas-de-sistema-parte-3-arquivos-de-log"},"type":"post"},{"id":160375,"title":"Novidades do .NET 8: Short-circuit middleware em Minimal APIs","content":"\u003Cp id=\"f433\" class=\"pw-post-body-paragraph lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj ms\" data-selectable-paragraph=\"\"\u003EUm importante aspecto arquitetural precisa ser levado em conta ao enviarmos uma requisição HTTP para uma aplicação \u003Cstrong class=\"lw fs\"\u003EASP.NET Core\u003C\u002Fstrong\u003E: diversos \u003Cstrong class=\"lw fs\"\u003Emiddlewares\u003C\u002Fstrong\u003E podem ser acionados durante o processamento desta solicitação e, mesmo, logo após a produção do resultado. Vale lembrar que a arquitetura do \u003Cstrong class=\"lw fs\"\u003EASP.NET Core\u003C\u002Fstrong\u003E está centrada em uma pilha de execução de \u003Cstrong class=\"lw fs\"\u003Emiddlewares\u003C\u002Fstrong\u003E, sendo comum que esses componentes envolvam funcionalidades como autenticação\u002Fautorização, \u003Cstrong class=\"lw fs\"\u003ECORS\u003C\u002Fstrong\u003E (\u003Cstrong class=\"lw fs\"\u003ECross-Origin Resource Sharing\u003C\u002Fstrong\u003E), compressão de respostas e logging\u002Fmonitoramento. Pensando em performance e também em simplificar o processamento de alguns tipos de requisições, o \u003Cstrong class=\"lw fs\"\u003EASP.NET Core\u003C\u002Fstrong\u003E traz agora no \u003Cstrong class=\"lw fs\"\u003E.NET 8\u003C\u002Fstrong\u003E uma estrutura chamada \u003Cstrong class=\"lw fs\"\u003Eshort-circuit middleware\u003C\u002Fstrong\u003E. Esta nova implementação permite que configuremos endpoints que serão acionados imediatamente quando da chegada de uma requisição HTTP, sem que ocorra o acionamento dos \u003Cstrong class=\"lw fs\"\u003Emiddlewares\u003C\u002Fstrong\u003E configurados na pilha de execução da aplicação.\u003C\u002Fp\u003E\n\u003Cp id=\"170c\" class=\"pw-post-body-paragraph lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003EPara demonstrar esta nova capacidade criei em um projeto de testes um \u003Cstrong class=\"lw fs\"\u003Emiddleware\u003C\u002Fstrong\u003E – classe \u003Cstrong class=\"lw fs\"\u003EMiddlewareExecutionNotificator\u003C\u002Fstrong\u003E – que gera notificações de alerta, com isto acontecendo antes (\u003Cstrong class=\"lw fs\"\u003Elinha 16\u003C\u002Fstrong\u003E) e após o processamento de uma requisição HTTP (\u003Cstrong class=\"lw fs\"\u003Elinha 18\u003C\u002Fstrong\u003E):\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\u003Ccode\u003E\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cpre\u003Enamespace APIContagem.Middlewares;\r\n\r\npublic class MiddlewareExecutionNotificator\r\n{\r\n private readonly RequestDelegate _next;\r\n\r\n public MiddlewareExecutionNotificator(RequestDelegate next)\r\n {\r\n _next = next;\r\n }\r\n\r\n public async Task Invoke(HttpContext httpContext)\r\n {\r\n var logger = (ILogger<MiddlewareExecutionNotificator>)httpContext\r\n .RequestServices.GetService(typeof(ILogger<MiddlewareExecutionNotificator>))!;\r\n logger.LogWarning(\"MiddlewareExecutionNotificator - Inicio da execucao\");\r\n await _next(httpContext);\r\n logger.LogWarning(\"MiddlewareExecutionNotificator - Fim da execucao\");\r\n }\r\n}\u003C\u002Fpre\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003EO Extension Method \u003Cstrong class=\"lw fs\"\u003EUseMiddlewareExecutionNotificator\u003C\u002Fstrong\u003E permitirá que o \u003Cstrong class=\"lw fs\"\u003Emiddleware\u003C\u002Fstrong\u003E seja ativado para os endpoints da API de testes:\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\u003Ccode\u003E\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cpre\u003Enamespace APIContagem.Middlewares;\r\n\r\npublic static class MiddlewareExecutionNotificatorExtensions\r\n{\r\n public static IApplicationBuilder UseMiddlewareExecutionNotificator(\r\n this IApplicationBuilder builder)\r\n {\r\n return builder.UseMiddleware<MiddlewareExecutionNotificator>();\r\n }\r\n}\u003C\u002Fpre\u003E\n\u003Cp id=\"c618\" class=\"pw-post-body-paragraph lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003ENa listagem seguinte podemos observar:\u003C\u002Fp\u003E\n\u003Cul class=\"\"\u003E\n\u003Cli id=\"e5ad\" class=\"lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr nk nl nm bj\" data-selectable-paragraph=\"\"\u003EA ativação do \u003Cstrong class=\"lw fs\"\u003Emiddleware\u003C\u002Fstrong\u003E de testes, por meio de uma chamada ao método \u003Cstrong class=\"lw fs\"\u003EUseMiddlewareExecutionNotificator\u003C\u002Fstrong\u003E;\u003C\u002Fli\u003E\n\u003Cli id=\"00c7\" class=\"lu lv fr lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nk nl nm bj\" data-selectable-paragraph=\"\"\u003EO endpoint \u003Cstrong class=\"lw fs\"\u003E\u002Fstatus\u003C\u002Fstrong\u003E foi definido como um \u003Cstrong class=\"lw fs\"\u003EHealth Check\u003C\u002Fstrong\u003E (\u003Cstrong class=\"lw fs\"\u003Elinhas 19 a 23\u003C\u002Fstrong\u003E), indicando que a aplicação está funcionando normalmente;\u003C\u002Fli\u003E\n\u003Cli id=\"9b9f\" class=\"lu lv fr lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nk nl nm bj\" data-selectable-paragraph=\"\"\u003EJá o endpoint \u003Cstrong class=\"lw fs\"\u003E\u002Fcontador\u003C\u002Fstrong\u003E fará uma contagem de acessos, sendo incrementado a cada nova requisição.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cdiv class=\"ng nh l ee\"\u003E\n\u003Cp\u003E\u003Ccode\u003E\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cpre\u003Eusing APIContagem;\r\nusing APIContagem.Middlewares;\r\nusing APIContagem.Models;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddEndpointsApiExplorer();\r\nbuilder.Services.AddSwaggerGen();\r\nbuilder.Services.AddSingleton<Contador>();\r\n\r\nvar app = builder.Build();\r\n\r\napp.UseSwagger();\r\napp.UseSwaggerUI();\r\n\r\napp.UseHttpsRedirection();\r\napp.UseMiddlewareExecutionNotificator();\r\n\r\napp.MapGet(\"\u002Fstatus\", () =>\r\n{\r\n app.Logger.LogInformation(\"Acionado endpoint de Health Check\");\r\n return \"API Contagem - OK\";\r\n});\r\n\r\napp.MapGet(\"\u002Fcontador\", (Contador contador) =>\r\n{\r\n int valorAtualContador;\r\n lock (contador)\r\n {\r\n contador.Incrementar();\r\n valorAtualContador = contador.ValorAtual;\r\n }\r\n app.Logger.LogInformation($\"Contador - Valor atual: {valorAtualContador}\");\r\n\r\n return TypedResults.Ok(new ResultadoContador()\r\n {\r\n ValorAtual = contador.ValorAtual,\r\n Local = contador.Local,\r\n Kernel = contador.Kernel,\r\n Framework = contador.Framework,\r\n Mensagem = app.Configuration[\"Saudacao\"]\r\n });\r\n}).Produces<ResultadoContador>().WithOpenApi();\r\n\r\napp.Run();\u003C\u002Fpre\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv\u003EAo executar a aplicação com essas configurações serão geradas mensagens no \u003Cstrong class=\"lw fs\"\u003ETerminal \u003C\u002Fstrong\u003Edo \u003Cstrong class=\"lw fs\"\u003EVisual Studio Code\u003C\u002Fstrong\u003E (\u003Cstrong class=\"lw fs\"\u003Eem amarelo\u003C\u002Fstrong\u003E) antes e após a execução da implementação de cada endpoint, em virtude da ativação do \u003Cstrong class=\"lw fs\"\u003Emiddleware\u003C\u002Fstrong\u003E de testes:\u003C\u002Fdiv\u003E\n\u003Cdiv\u003E\n\u003Cfigure class=\"nb nc nd ne nf ln lf lg paragraph-image\"\u003E\n\u003Cdiv class=\"lo lp ee lq bg lr\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"lf lg lh\"\u003E\u003Cpicture\u003E\u003Cimg class=\"bg ls lt c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*IZ0AVo5i78fFvMV-YR8Umw.gif\" alt=\"\" width=\"700\" height=\"394\" \u002F\u003E\u003C\u002Fpicture\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\u003Cfigcaption class=\"ns nt nu lf lg nv nw be b bf z dw\" data-selectable-paragraph=\"\"\u003EClique nesta imagem para visualizar com uma melhor resolução\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cp id=\"baf9\" class=\"pw-post-body-paragraph lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003EPara ativar o \u003Cstrong class=\"lw fs\"\u003Emiddleware de short-circuit\u003C\u002Fstrong\u003E para o endpoint \u003Cstrong class=\"lw fs\"\u003E\u002Fstatus\u003C\u002Fstrong\u003E basta acionar o método \u003Cstrong class=\"lw fs\"\u003EShortCircuit\u003C\u002Fstrong\u003E (\u003Cstrong class=\"lw fs\"\u003Elinha 23\u003C\u002Fstrong\u003E):\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\u003Ccode\u003E\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cpre\u003Eusing APIContagem;\r\nusing APIContagem.Middlewares;\r\nusing APIContagem.Models;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddEndpointsApiExplorer();\r\nbuilder.Services.AddSwaggerGen();\r\nbuilder.Services.AddSingleton<Contador>();\r\n\r\nvar app = builder.Build();\r\n\r\napp.UseSwagger();\r\napp.UseSwaggerUI();\r\n\r\napp.UseHttpsRedirection();\r\napp.UseMiddlewareExecutionNotificator();\r\n\r\napp.MapGet(\"\u002Fstatus\", () =>\r\n{\r\n app.Logger.LogInformation(\"Acionado endpoint de Health Check\");\r\n return \"API Contagem - OK\";\r\n}).ShortCircuit();\r\n\r\napp.MapGet(\"\u002Fcontador\", (Contador contador) =>\r\n{\r\n int valorAtualContador;\r\n lock (contador)\r\n {\r\n contador.Incrementar();\r\n valorAtualContador = contador.ValorAtual;\r\n }\r\n app.Logger.LogInformation($\"Contador - Valor atual: {valorAtualContador}\");\r\n\r\n return TypedResults.Ok(new ResultadoContador()\r\n {\r\n ValorAtual = contador.ValorAtual,\r\n Local = contador.Local,\r\n Kernel = contador.Kernel,\r\n Framework = contador.Framework,\r\n Mensagem = app.Configuration[\"Saudacao\"]\r\n });\r\n}).Produces<ResultadoContador>().WithOpenApi();\r\n\r\napp.Run();\r\n\r\n\u003C\u002Fpre\u003E\n\u003Cp id=\"3dd3\" class=\"pw-post-body-paragraph lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003ENovos testes com os endpoints da aplicação resultarão em diferenças. Enquanto as requisições direcionadas a \u003Cstrong class=\"lw fs\"\u003E\u002Fcontador\u003C\u002Fstrong\u003E exibirão mensagens (\u003Cstrong class=\"lw fs\"\u003Eem amarelo\u003C\u002Fstrong\u003E) antes e após a execução do código que implementa o endpoint, o mesmo comportamento deixará de acontecer com o endpoint \u003Cstrong class=\"lw fs\"\u003E\u002Fstatus\u003C\u002Fstrong\u003E:\u003C\u002Fp\u003E\n\u003Cfigure class=\"nb nc nd ne nf ln lf lg paragraph-image\"\u003E\n\u003Cdiv class=\"lo lp ee lq bg lr\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"lf lg lh\"\u003E\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003Cimg class=\"bg ls lt c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*1qpcX1VLqZYa0AfqREcY3g.gif\" alt=\"\" width=\"700\" height=\"394\" \u002F\u003E\u003C\u002Fpicture\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\u003Cfigcaption class=\"ns nt nu lf lg nv nw be b bf z dw\" data-selectable-paragraph=\"\"\u003EClique nesta imagem para visualizar com uma melhor resolução\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cp id=\"8461\" class=\"pw-post-body-paragraph lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003ETemos ainda a possibilidade de utilizar o método \u003Cstrong class=\"lw fs\"\u003EMapShortCircuit\u003C\u002Fstrong\u003E, definindo um \u003Cstrong class=\"lw fs\"\u003Estatus code\u003C\u002Fstrong\u003E e uma lista de rotas em que a execução da pilha de middlewares será ignorada. No exemplo a seguir (\u003Cstrong class=\"lw fs\"\u003Elinha 45\u003C\u002Fstrong\u003E) o \u003Cstrong class=\"lw fs\"\u003Estatus 404\u003C\u002Fstrong\u003E (\u003Cstrong class=\"lw fs\"\u003ENot Found\u003C\u002Fstrong\u003E) será retornado em tentativas de acesso a arquivos como \u003Cstrong class=\"lw fs\"\u003Erobots.txt\u003C\u002Fstrong\u003E e \u003Cstrong class=\"lw fs\"\u003Efavicon.ico\u003C\u002Fstrong\u003E (os quais normalmente não existem em projetos como APIs REST):\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\u003Ccode\u003E\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cpre\u003Eusing APIContagem;\r\nusing APIContagem.Middlewares;\r\nusing APIContagem.Models;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddEndpointsApiExplorer();\r\nbuilder.Services.AddSwaggerGen();\r\nbuilder.Services.AddSingleton<Contador>();\r\n\r\nvar app = builder.Build();\r\n\r\napp.UseSwagger();\r\napp.UseSwaggerUI();\r\n\r\napp.UseHttpsRedirection();\r\napp.UseMiddlewareExecutionNotificator();\r\n\r\napp.MapGet(\"\u002Fstatus\", () =>\r\n{\r\n app.Logger.LogInformation(\"Acionado endpoint de Health Check\");\r\n return \"API Contagem - OK\";\r\n}).ShortCircuit();\r\n\r\napp.MapGet(\"\u002Fcontador\", (Contador contador) =>\r\n{\r\n int valorAtualContador;\r\n lock (contador)\r\n {\r\n contador.Incrementar();\r\n valorAtualContador = contador.ValorAtual;\r\n }\r\n app.Logger.LogInformation($\"Contador - Valor atual: {valorAtualContador}\");\r\n\r\n return TypedResults.Ok(new ResultadoContador()\r\n {\r\n ValorAtual = contador.ValorAtual,\r\n Local = contador.Local,\r\n Kernel = contador.Kernel,\r\n Framework = contador.Framework,\r\n Mensagem = app.Configuration[\"Saudacao\"]\r\n });\r\n}).Produces<ResultadoContador>().WithOpenApi();\r\n\r\napp.MapShortCircuit(404, \"robots.txt\", \"favicon.ico\");\r\n\r\napp.Run();\u003C\u002Fpre\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv\u003E\n\u003Cdiv class=\"fk fl fm fn fo\"\u003E\n\u003Cdiv class=\"ab ca\"\u003E\n\u003Cdiv class=\"ch bg ew ex ey ez\"\u003E\n\u003Cp id=\"9bf8\" class=\"pw-post-body-paragraph lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003EObservamos na animação seguinte que ao usar o método \u003Cstrong class=\"lw fs\"\u003EMapShortCircuit\u003C\u002Fstrong\u003E o middleware de testes sequer foi acionado (em tentativas envolvendo o acesso a \u003Cstrong class=\"lw fs\"\u003Erobots.txt\u003C\u002Fstrong\u003E e \u003Cstrong class=\"lw fs\"\u003Efavicon.ico\u003C\u002Fstrong\u003E):\u003C\u002Fp\u003E\n\u003Cfigure class=\"nb nc nd ne nf ln lf lg paragraph-image\"\u003E\n\u003Cdiv class=\"lo lp ee lq bg lr\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"lf lg lh\"\u003E\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F1*3Cw809SGJjheWoh2KyY8vg.gif 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003Cimg class=\"bg ls lt c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F1*3Cw809SGJjheWoh2KyY8vg.gif\" alt=\"\" width=\"700\" height=\"394\" \u002F\u003E\u003C\u002Fpicture\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\u003Cfigcaption class=\"ns nt nu lf lg nv nw be b bf z dw\" data-selectable-paragraph=\"\"\u003EClique nesta imagem para visualizar com uma melhor resolução\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cp id=\"620c\" class=\"pw-post-body-paragraph lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003EEste projeto foi disponibilizado no \u003Cstrong class=\"lw fs\"\u003EGitHub\u003C\u002Fstrong\u003E:\u003C\u002Fp\u003E\n\u003Cp id=\"bb3f\" class=\"pw-post-body-paragraph lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003E\u003Ca class=\"af nx\" href=\"https:\u002F\u002Fgithub.com\u002Frenatogroffe\u002FASPNETCore8-REST_API-Minimal-ShortCircuit_ContagemAcessos\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"lw fs\"\u003Ehttps:\u002F\u002Fgithub.com\u002Frenatogroffe\u002FASPNETCore8-REST_API-Minimal-ShortCircuit_ContagemAcessos\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cblockquote class=\"ny nz oa\"\u003E\n\u003Cp id=\"4dc9\" class=\"lu lv ob lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003ECaso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no \u003Cstrong class=\"lw fs\"\u003EGitHub\u003C\u002Fstrong\u003E!\u003C\u002Fp\u003E\n\u003C\u002Fblockquote\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv class=\"ab ca oc od oe of\" role=\"separator\"\u003E\u003C\u002Fdiv\u003E\n\u003Cdiv class=\"fk fl fm fn fo\"\u003E\n\u003Cdiv class=\"ab ca\"\u003E\n\u003Cdiv class=\"ch bg ew ex ey ez\"\u003E\n\u003Ch1 id=\"2eba\" class=\"ok ol fr be om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph bj\" data-selectable-paragraph=\"\"\u003EReferências\u003C\u002Fh1\u003E\n\u003Cp id=\"a6df\" class=\"pw-post-body-paragraph lu lv fr lw b lx pi lz ma mb pj md me mf pk mh mi mj pl ml mm mn pm mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003E\u003Ca class=\"af nx\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Faspnet\u002Fcore\u002Frelease-notes\u002Faspnetcore-8.0?view=aspnetcore-7.0#short-circuit-middleware-after-routing\" target=\"_blank\" rel=\"noopener ugc nofollow noreferrer\"\u003E\u003Cstrong class=\"lw fs\"\u003EWhat’s new in ASP.NET Core 8 | .NET Blog\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"5c7b\" class=\"pw-post-body-paragraph lu lv fr lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fk bj\" data-selectable-paragraph=\"\"\u003E\u003Ca class=\"af nx\" href=\"https:\u002F\u002Frenatogroffe.medium.com\u002Fnet-8-guia-de-refer%C3%AAncia-artigos-dicas-v%C3%ADdeos-e-exemplos-de-utiliza%C3%A7%C3%A3o-79c4850aaeb\" rel=\"noopener\"\u003E\u003Cstrong class=\"lw fs\"\u003E.NET 8 – Guia de Referência: artigos, dicas, vídeos e exemplos de utilização\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EPensando em performance e também em simplificar o processamento de alguns tipos de requisições, o ASP.NET Core traz agora no .NET 8 uma estrutura chamada…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdotnet\u002Fnovidades-do-net-8-short-circuit-middleware-em-minimal-apis","date":"18 dez, 2023","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F18151456\u002FDotnet-framework-1.jpg","externalMention":null,"author":{"id":147927,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30180005\u002Fgroffe-128x128.jpg","name":"Renato Groffe","description":"Atua como consultor em atividades voltadas ao desenvolvimento de sistemas há mais de 15 anos. Microsoft MVP (Most Valuable Professional) e participante do programa MTAC (Multi-Plataform Technical Audience Contributor). Bacharel em Sistemas de Informação, com Especialização em Engenharia de Software e MBA em Business Intelligence. Também é palestrante e autor técnico em portais e revistas especializadas, com foco em tecnologias Microsoft e boas práticas na área de software.","slug":"renatogroffe","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Frenatogroffe","registered":"2016-09-01 18:39:52","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"renato.groffe@yahoo.com.br"},"articles_count":112,"views_count":1254400,"certifications":null,"conquests":null,"office":null},"categories":[{"title":".NET","slug":"dotnet","id":7291,"link":"https:\u002F\u002Fimasters.com.br\u002Fdotnet"},{"title":"Framework","slug":"framework","id":7290,"link":"https:\u002F\u002Fimasters.com.br\u002Fframework"},{"title":"Tecnologia","slug":"tecnologia","id":4254,"link":"https:\u002F\u002Fimasters.com.br\u002Ftecnologia"},{"title":"Tendências","slug":"tendencias","id":7264,"link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias"}],"tags":[{"title":".NET","slug":"net","id":209,"link":"https:\u002F\u002Fimasters.com.br\u002Fnet"},{"title":".net 8","slug":"net-8","id":8962,"link":"https:\u002F\u002Fimasters.com.br\u002Fnet-8"},{"title":"asp.net core","slug":"asp-net-core","id":5241,"link":"https:\u002F\u002Fimasters.com.br\u002Fasp-net-core"},{"title":"dotnet","slug":"dotnet-2","id":1718,"link":"https:\u002F\u002Fimasters.com.br\u002Fdotnet-2"},{"title":"hort-circuit","slug":"hort-circuit","id":8963,"link":"https:\u002F\u002Fimasters.com.br\u002Fhort-circuit"},{"title":"http","slug":"http","id":517,"link":"https:\u002F\u002Fimasters.com.br\u002Fhttp"},{"title":"middleware","slug":"middleware","id":5070,"link":"https:\u002F\u002Fimasters.com.br\u002Fmiddleware"},{"title":"Minimal APIs","slug":"minimal-apis","id":8964,"link":"https:\u002F\u002Fimasters.com.br\u002Fminimal-apis"}],"seo":{"open_graph":{"title":"Novidades do .NET 8: Short-circuit middleware em Minimal APIs","description":"Pensando em performance e também em simplificar o processamento de alguns tipos de requisições, o ASP.NET Core traz agora no .NET 8 uma estrutura chamada...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F18151456\u002FDotnet-framework-1.jpg","width":800,"height":533},"modified_time":"2023-12-18T15:19:03-03:00","published_time":"2023-12-18T15:19:01-03:00"},"twitter":{"title":"Novidades do .NET 8: Short-circuit middleware em Minimal APIs","description":"Pensando em performance e também em simplificar o processamento de alguns tipos de requisições, o ASP.NET Core traz agora no .NET 8 uma estrutura chamada...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F18151456\u002FDotnet-framework-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdotnet\u002Fnovidades-do-net-8-short-circuit-middleware-em-minimal-apis","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdotnet\u002Fnovidades-do-net-8-short-circuit-middleware-em-minimal-apis","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdotnet\u002Fnovidades-do-net-8-short-circuit-middleware-em-minimal-apis"},"type":"post"},{"id":160632,"title":"Por que é tão desafiador qualificar jovens na área de TI?","content":"\u003Cp\u003ESegundo a Brasscom (Associação das Empresas de Tecnologia), estima-se que, até 2025, o mercado brasileiro terá um déficit de 530 mil profissionais de TI. No entanto, mesmo com esse gap de vagas, surge uma questão intrigante: por que existem desenvolvedores desempregados e a necessidade de qualificar jovens?\u003C\u002Fp\u003E\n\u003Cp\u003EAo longo dos anos, tenho tido a oportunidade de liderar o Instituto Atravessando a Ponte, que visa capacitar jovens de baixa renda na área de Tecnologia da Informação (TI). Essa jornada tem sido marcada por desafios significativos, especialmente quando se trata da preparação desses jovens para ingressar no ensino superior e no mercado de trabalho.\u003C\u002Fp\u003E\n\u003Cp\u003EÉ inegável que a área de TI é uma das mais promissoras em termos de oportunidades de carreira no Brasil. No entanto, mesmo com a crescente demanda por profissionais qualificados, nos deparamos com uma realidade paradoxal: enquanto o mercado clama por talentos, há desenvolvedores desempregados. Essa dicotomia levanta questões importantes sobre os desafios enfrentados na capacitação e inserção desses jovens no mercado de trabalho.\u003C\u002Fp\u003E\n\u003Ch2\u003EO desafio de qualificar jovens na área de TI?\u003C\u002Fh2\u003E\n\u003Cp\u003EUm dos principais obstáculos observados é a lacuna entre a formação educacional dos jovens e as demandas do mercado de trabalho em TI. Muitos desses jovens, apesar do interesse e da motivação para seguir carreira na área, enfrentam dificuldades significativas em disciplinas fundamentais como matemática. Esse problema não apenas afeta seu desempenho no ensino superior, mas também limita suas oportunidades de emprego no futuro.\u003C\u002Fp\u003E\n\u003Ch3\u003EFormação integral\u003C\u002Fh3\u003E\n\u003Cp\u003EAlém disso, há um desafio adicional em proporcionar uma formação integral para esses jovens, entendendo que a verdadeira transformação ocorre quando estes são capacitados em todas as áreas de suas vidas, não apenas em termos de habilidades técnicas, mas também em seu desenvolvimento pessoal, familiar e profissional. No entanto, alcançar esse objetivo requer recursos, apoio e parcerias sólidas que nem sempre são fáceis de obter.\u003C\u002Fp\u003E\n\u003Cp\u003EÉ importante reconhecer os esforços de iniciativas como o Instituto Atravessando a Ponte, que buscam enfrentar esses desafios de frente. Ao oferecer bolsas integrais em cursos de TI e investir no desenvolvimento integral dos jovens, essas iniciativas estão contribuindo para criar um futuro mais inclusivo e promissor para todos.\u003C\u002Fp\u003E\n\u003Ch2\u003EÁrea de TI para qualificar jovens: É preciso o esforço de todos\u003C\u002Fh2\u003E\n\u003Cp\u003ENo entanto, para verdadeiramente superar os desafios que enfrentamos na capacitação de jovens na área de TI, é necessário um esforço coletivo. Governos, instituições de ensino, empresas e a sociedade como um todo precisam se unir para criar políticas e programas que incentivem a formação e inserção desses jovens no mercado de trabalho.\u003C\u002Fp\u003E\n\u003Cp\u003EAcredito que, ao enfrentarmos esses desafios juntos, podemos não apenas transformar a vida desses jovens, mas também construir um futuro mais próspero e inclusivo para todos.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EAté 2025 o Brasil terá um déficit de 530 mil profissionais de TI. Mas por que existem devs desempregados e por que é difícil qualificar os jovens?\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fpor-que-e-tao-desafiador-qualificar-jovens-na-area-de-ti","date":"22 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F22163134\u002Ffreepik-conceito-de-colagem-de-html-e-css-com-pessoa-jovem-1.jpg","externalMention":null,"author":{"id":149223,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F22162129\u002Fcarlosperobelli-1.jpg","name":"Carlos Perobelli","description":"Carlos Perobelli é fundador do Instituto Atravessando a Ponte","slug":"carlosperobelli","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fcarlosperobelli","registered":"2024-02-22 19:22:21","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"carlosperobelli@imasters.com.br"},"articles_count":1,"views_count":100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Carreira Dev","slug":"carreira-dev","id":7265,"link":"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev"}],"tags":[{"title":"carreira dev","slug":"carreira-dev","id":7767,"link":"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev"},{"title":"déficit","slug":"deficit","id":3459,"link":"https:\u002F\u002Fimasters.com.br\u002Fdeficit"},{"title":"desenvolvedor","slug":"desenvolvedor","id":2054,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvedor"},{"title":"desenvolvedora","slug":"desenvolvedora","id":8922,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvedora"},{"title":"desenvolvedoras","slug":"desenvolvedoras","id":8983,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvedoras"},{"title":"desenvolvedores","slug":"desenvolvedores","id":1009,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvedores"},{"title":"dev","slug":"dev","id":954,"link":"https:\u002F\u002Fimasters.com.br\u002Fdev"},{"title":"Jovens","slug":"jovens","id":6394,"link":"https:\u002F\u002Fimasters.com.br\u002Fjovens"},{"title":"mercado de TI","slug":"mercado-de-ti","id":8984,"link":"https:\u002F\u002Fimasters.com.br\u002Fmercado-de-ti"},{"title":"ti","slug":"ti","id":262,"link":"https:\u002F\u002Fimasters.com.br\u002Fti"}],"seo":{"open_graph":{"title":"Por que é tão desafiador qualificar jovens na área de TI?","description":"Até 2025 o Brasil terá um déficit de 530 mil profissionais de TI. Mas por que existem devs desempregados e por que é difícil qualificar jovens?","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F22163134\u002Ffreepik-conceito-de-colagem-de-html-e-css-com-pessoa-jovem-1.jpg","width":800,"height":534},"modified_time":"2024-02-22T16:38:08-03:00","published_time":"2024-02-22T16:38:08-03:00"},"twitter":{"title":"Por que é tão desafiador qualificar jovens na área de TI?","description":"Até 2025 o Brasil terá um déficit de 530 mil profissionais de TI. Mas por que existem devs desempregados e por que é difícil qualificar jovens?","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F22163134\u002Ffreepik-conceito-de-colagem-de-html-e-css-com-pessoa-jovem-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fpor-que-e-tao-desafiador-qualificar-jovens-na-area-de-ti","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fpor-que-e-tao-desafiador-qualificar-jovens-na-area-de-ti","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev\u002Fpor-que-e-tao-desafiador-qualificar-jovens-na-area-de-ti"},"type":"post"},{"id":160385,"title":"Dica | Pattern Observer + Spring WebFlux","content":"\u003Cp id=\"c3e4\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EVeja neste post rápido o que é o pattern Observer e como podemos utilizar ele trabalhando com Spring WebFlux. O desenvolvimento de aplicações modernas exige soluções flexíveis que possam lidar com eventos e notificações de forma eficiente. O padrão Observer é uma solução amplamente utilizada para este fim, permitindo que objetos observadores se inscrevam para receber atualizações de um objeto quando ocorrem mudanças de estado.\u003C\u002Fp\u003E\n\u003Cfigure class=\"yi yj yk yl ym yn jv jw paragraph-image\"\u003E\n\u003Cdiv class=\"ahv ahw dl ahx bg ahy\" tabindex=\"0\" role=\"button\"\u003E\n\u003Cdiv class=\"jv jw ahu\"\u003E\u003Cpicture\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002Fformat:webp\u002F0*DoNxk0wimEQL-SdD 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002Fformat:webp\u002F0*DoNxk0wimEQL-SdD 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002Fformat:webp\u002F0*DoNxk0wimEQL-SdD 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002Fformat:webp\u002F0*DoNxk0wimEQL-SdD 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002Fformat:webp\u002F0*DoNxk0wimEQL-SdD 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002Fformat:webp\u002F0*DoNxk0wimEQL-SdD 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002Fformat:webp\u002F0*DoNxk0wimEQL-SdD 1400w\" type=\"image\u002Fwebp\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" \u002F\u003E\u003Csource srcset=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:640\u002F0*DoNxk0wimEQL-SdD 640w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:720\u002F0*DoNxk0wimEQL-SdD 720w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:750\u002F0*DoNxk0wimEQL-SdD 750w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:786\u002F0*DoNxk0wimEQL-SdD 786w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:828\u002F0*DoNxk0wimEQL-SdD 828w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1100\u002F0*DoNxk0wimEQL-SdD 1100w, https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1400\u002F0*DoNxk0wimEQL-SdD 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" data-testid=\"og\" \u002F\u003E\u003Cimg class=\"bg yo yp c\" role=\"presentation\" src=\"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:875\u002F0*DoNxk0wimEQL-SdD\" alt=\"\" width=\"700\" height=\"569\" \u002F\u003E\u003C\u002Fpicture\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\u003Cfigcaption class=\"yq ft yr jv jw ys yt be b bf z dq\" data-selectable-paragraph=\"\"\u003ESpring WebFlux\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cp id=\"7a71\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003ENeste post rápido, exploraremos o padrão Observer e sua relação com o Spring WebFlux, um framework baseado em reatividade que oferece suporte a programação assíncrona e não bloqueante.\u003C\u002Fp\u003E\n\u003Cp id=\"b035\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EBom, o padrão Observer é um dos padrões de design mais conhecidos e úteis no desenvolvimento de software. Ele faz parte do grupo de padrões comportamentais e é projetado para permitir que um objeto (sujeito) notifique uma lista de objetos dependentes (observadores) sobre mudanças no seu estado, mantendo essas duas partes desacopladas.\u003C\u002Fp\u003E\n\u003Ch2\u003EPattern Observer + Spring WebFlux\u003C\u002Fh2\u003E\n\u003Cp id=\"ba6f\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EO padrão Observer consiste em dois componentes principais:\u003C\u002Fp\u003E\n\u003Col class=\"\"\u003E\n\u003Cli id=\"5145\" class=\"xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg ahz zf zg bj\" data-selectable-paragraph=\"\"\u003ESujeito (Subject): É o objeto que mantém uma lista de observadores e notifica esses observadores sobre mudanças em seu estado.\u003C\u002Fli\u003E\n\u003Cli id=\"90ff\" class=\"xn xo tw lk b xp zh xr xs xt zi xv xw ku zj xy xz kz zk yb yc le zl ye yf yg ahz zf zg bj\" data-selectable-paragraph=\"\"\u003EObservador (Observer): São os objetos que desejam ser notificados sobre as mudanças no sujeito. Eles implementam uma interface comum que define os métodos para receber notificações.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp id=\"82c8\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EAgora falando do Spring WebFlux, ele é um projeto do ecossistema Spring que oferece suporte à programação reativa.\u003C\u002Fp\u003E\n\u003Cp id=\"1efc\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EEle foi projetado para construir aplicativos assíncronos e não bloqueantes, tornando-o uma escolha ideal para desenvolvimento de aplicações altamente escaláveis e eficientes em termos de recursos.\u003C\u002Fp\u003E\n\u003Cp id=\"6260\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EO Spring WebFlux segue o princípio da programação reativa, que é baseado na observação de eventos, isso o torna uma escolha natural para implementar o padrão Observer, onde os eventos são notificações que informam as mudanças de estado.\u003C\u002Fp\u003E\n\u003Cp id=\"4702\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003ENo Spring WebFlux, os observadores podem ser representados como Flux ou Mono, que são tipos específicos de publicadores reativos.\u003C\u002Fp\u003E\n\u003Cp id=\"f40b\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EUm Flux representa uma sequência de eventos, enquanto um Mono é um fluxo que emite no máximo um evento.\u003C\u002Fp\u003E\n\u003Cp id=\"421a\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EO sujeito no Spring WebFlux é geralmente um objeto que emite esses eventos.\u003C\u002Fp\u003E\n\u003Cp id=\"c591\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EQuando o sujeito emite um evento, todos os observadores (Flux ou Mono) registrados para esse evento específico são notificados e podem reagir a essa mudança de estado.\u003C\u002Fp\u003E\n\u003Cp id=\"7c6a\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EEssa abordagem é semelhante ao padrão Observer, onde o sujeito notifica seus observadores sobre as mudanças de estado.\u003C\u002Fp\u003E\n\u003Cp id=\"214b\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003ENo entanto, no contexto do Spring WebFlux, a notificação é baseada em eventos reativos, o que torna o processo altamente eficiente e adequado para a programação assíncrona.\u003C\u002Fp\u003E\n\u003Cp id=\"ee85\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EBem interessante né? No próximo artigo nós criaremos um exemplo prático para que você tenha um melhor entendimento sobre este assunto.\u003C\u002Fp\u003E\n\u003Cp id=\"3a6d\" class=\"pw-post-body-paragraph xn xo tw lk b xp xq xr xs xt xu xv xw ku xx xy xz kz ya yb yc le yd ye yf yg er bj\" data-selectable-paragraph=\"\"\u003EEspero que tenham gostado e até um próximo post rápido pessoal 🙂\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EVeja neste post rápido o que é o pattern Observer e como podemos utilizar ele trabalhando com Spring WebFlux. O padrão Observer é uma solução amplamente…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fdica-pattern-observer-spring-webflux","date":"18 dez, 2023","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F18172537\u002Fideia1-1.jpg","externalMention":null,"author":{"id":148270,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F07\u002F18172928\u002Fthiago-adriano.jpg.png","name":"Thiago Adriano","description":"Microsoft (MVP), atualmente trabalha como Arquiteto de Software para TV Bandeirantes. Nesses últimos anos, focou nas tecnologias criadas pela Microsoft, mas sempre esteve antenado para as novas tecnologias que estão surgindo no mercado. Em um breve resumo, é uma pessoa apaixonada pelo que faz, tem a sua profissão como hobby.","slug":"thiagoadriano","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fthiagoadriano","registered":"2017-07-24 19:55:27","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"tadriano.net@outlook.com"},"articles_count":97,"views_count":940900,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Desenvolvimento","slug":"desenvolvimento","id":7234,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento"},{"title":"Software development","slug":"software-development-4","id":8959,"link":"https:\u002F\u002Fimasters.com.br\u002Fsoftware-development-4"}],"tags":[{"title":"desenvolvimento","slug":"desenvolvimento-2","id":186,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento-2"},{"title":"framework","slug":"framework-2","id":495,"link":"https:\u002F\u002Fimasters.com.br\u002Fframework-2"},{"title":"observer","slug":"observer","id":1720,"link":"https:\u002F\u002Fimasters.com.br\u002Fobserver"},{"title":"Pattern Observer","slug":"pattern-observer","id":8966,"link":"https:\u002F\u002Fimasters.com.br\u002Fpattern-observer"},{"title":"software","slug":"software-2","id":274,"link":"https:\u002F\u002Fimasters.com.br\u002Fsoftware-2"},{"title":"Spring WebFlux","slug":"spring-webflux","id":8965,"link":"https:\u002F\u002Fimasters.com.br\u002Fspring-webflux"}],"seo":{"open_graph":{"title":"Dica rápida de senvolvimento | Pattern Observer + Spring WebFlux","description":"Veja neste post rápido o que é o pattern Observer e como podemos utilizar ele trabalhando com Spring WebFlux. O padrão Observer é uma solução amplamente...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F18172537\u002Fideia1-1.jpg","width":799,"height":533},"modified_time":"2023-12-18T17:46:18-03:00","published_time":"2023-12-18T17:43:26-03:00"},"twitter":{"title":"Dica rápida de senvolvimento | Pattern Observer + Spring WebFlux","description":"Veja neste post rápido o que é o pattern Observer e como podemos utilizar ele trabalhando com Spring WebFlux. O padrão Observer é uma solução amplamente...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F18172537\u002Fideia1-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fdica-pattern-observer-spring-webflux","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fdica-pattern-observer-spring-webflux","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fdica-pattern-observer-spring-webflux"},"type":"post"},{"id":160651,"title":"Como acertar em cheio em sua próxima revisão de código","content":"\u003Cp\u003E\u003Cem\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEste artigo explora os meandros das revisões de código, destacando sua importância no processo de desenvolvimento. Desde a definição das regras básicas para uma revisão de código eficaz até a exploração da função complementar das ferramentas de IA, esta leitura visa capacitar os desenvolvedores com as ferramentas e os insights necessários para melhorar suas habilidades de revisão, transformando essa fase crítica não apenas em um processo eficiente, mas também em um catalisador para o sucesso da equipe.  \u003C\u002Fspan\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEstá se arrastando quando chega a hora das revisões de código? Embora lidar com essa tarefa possa não ser seu item favorito na lista, esse componente essencial do processo de desenvolvimento de software traz benefícios comprovados.  \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPara ajudar você a começar a trabalhar, este artigo esclarece o impacto transformador que elas têm na elevação da qualidade do código e na colaboração da equipe, além de fornecer insights práticos para aprimorar suas habilidades e ser um craque na sua próxima revisão de código. Pronto? Vamos nos aprofundar.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cb\u003ENão negligencie a importância das revisões de código\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ENão é preciso dizer que essa prática desempenha um papel fundamental para garantir a qualidade de alto nível do software. Há algumas razões convincentes por trás disso.  \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPor um lado, as \u003Cstrong\u003Erevisões de código\u003C\u002Fstrong\u003E se destacam como agentes de mudança, reduzindo significativamente o número de defeitos pós-lançamento. Elas servem de base para identificar e corrigir problemas no início do ciclo de desenvolvimento, economizando tempo e recursos a longo prazo e, por fim, melhorando o resultado final.  \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPor outro lado, as pesquisas revelam que as \u003Ca href=\"https:\u002F\u002Fjserd.springeropen.com\u002Farticles\u002F10.1186\u002Fs40411-018-0058-0\"\u003Erevisões de código por pares\u003C\u002Fa\u003E são uma forma reconhecida de promover o compartilhamento de conhecimento dentro de uma equipe. Dois pares de olhos são melhores do que um, e a função de um revisor é crucial nesse cenário colaborativo. Além de contribuir para a qualidade do código, os revisores servem como guias, ajudando outros desenvolvedores a encontrar erros, identificar pontos cegos e aprimorar suas habilidades de codificação. Isso também faz maravilhas para a colaboração da equipe, promovendo um senso compartilhado de propriedade do código.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cb\u003EAlgumas regras básicas para começar\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAgora que descobrimos os benefícios de realizar revisões de código, vamos nos aprofundar em três práticas fundamentais que o ajudarão a navegar em sua função como revisor. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003E Mantenha o foco e seja consciente do tempo \u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EQuando estiver se dedicando às revisões de código, encontre um equilíbrio entre velocidade e minúcia. Se possível, procure \u003Cstrong\u003Emanter as sessões com menos de 60 minutos para manter-se atento\u003C\u002Fstrong\u003E e evitar o esgotamento, pois o desempenho e a atenção aos detalhes tendem a cair depois desse ponto. Em vez disso, opte por sessões curtas regulares para manter a consistência, resolver problemas prontamente e criar um fluxo de trabalho mais suave. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Col start=\"2\"\u003E\n\u003Cli\u003E\u003Cstrong\u003E Reduza o tamanho \u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EO tamanho dos blocos de código em análise afeta significativamente a eficiência do processo. A divisão de grandes tarefas em partes menores e mais gerenciáveis gera feedback de maior qualidade e melhorias adicionais. Uma regra prática útil é \u003Cstrong\u003Elimitar cada revisão a menos de 400\u003C\u002Fstrong\u003E linhas para manter o foco das sessões de revisão e examinar minuciosamente cada componente.  \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Col start=\"3\"\u003E\n\u003Cli\u003E\u003Cstrong\u003E Defenda a consistência \u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Cstrong\u003EFamiliarize-se e garanta a adesão aos padrões de codificação estabelecidos\u003C\u002Fstrong\u003E no projeto. Quer se trate de indentação, convenções de nomenclatura ou outras práticas, seguir essas diretrizes promove a uniformidade em toda a base de código, facilitando a compreensão e a contribuição eficaz de toda a equipe.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cb\u003EUma lista de verificação dos princípios básicos da revisão de código \u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EIndo além do básico, vamos agora mudar nosso foco para a abordagem e a execução eficazes de suas revisões de código. Para orientá-lo nesse processo crítico, comece com uma lista de verificação clara que abranja os aspectos essenciais a serem observados ao revisar o código: \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Cstrong\u003E✅Primeiro o mais importante: certifique-se de que o código funciona como pretendido.\u003C\u002Fstrong\u003E Verifique se ele atende aos requisitos especificados e fornece o resultado correto. Isso envolve a verificação da lógica, dos algoritmos e da funcionalidade geral para garantir uma experiência de usuário perfeita. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Cstrong\u003E✅Faça uma verificação da legibilidade.\u003C\u002Fstrong\u003E Certifique-se de que o código seja claro e fácil de entender, seguindo as convenções de codificação e os padrões de nomenclatura estabelecidos. Verifique se a formatação é consistente e se a base de código está bem documentada e com explicações lógicas. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Cstrong\u003E✅Concentre-se na capacidade de manutenção.\u003C\u002Fstrong\u003E Avalie a facilidade com que o script pode ser alterado ou ampliado no futuro. Busque estruturas de código limpas e modulares, reduza as dependências e siga os padrões de codificação para aumentar a capacidade de evolução, facilitando o trabalho no futuro. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Cstrong\u003E✅Examine o código em busca de vulnerabilidades de segurança.\u003C\u002Fstrong\u003E Realize auditorias de segurança completas e varreduras de vulnerabilidade para encontrar possíveis pontos fracos. Fique atento aos problemas cotidianos, garantindo que as entradas sejam tratadas corretamente, que os dados sejam gerenciados com segurança e que haja defesas contra ameaças comuns. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Cstrong\u003E✅Verifique novamente se o código está otimizado para eficiência e velocidade.\u003C\u002Fstrong\u003E Considere fatores como velocidade de execução, uso de memória e otimização de recursos. Identifique os possíveis gargalos e sugira melhorias para um aplicativo otimizado. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAlém desses aspectos fundamentais a serem observados, você pode detalhar essa lista de verificação geral desconstruindo as principais etapas naquelas que acredita serem necessárias. Aqui estão alguns \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmgreiler\u002Fcode-review-checklist\"\u003Eexemplos úteis\u003C\u002Fa\u003E, caso esteja procurando inspiração.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cb\u003ESeja gentil: Dicas para oferecer feedback construtivo\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAgora, vamos supor que, durante a revisão, você tenha encontrado erros, inconsistências ou desvios dos padrões de codificação. Como você os aborda? Considerando que as revisões de código são esforços colaborativos, é crucial \u003Cstrong\u003Eapontar gentilmente os problemas e sugerir melhorias\u003C\u002Fstrong\u003E de maneira construtiva. Para promover uma comunicação eficaz:  \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Cstrong\u003EManter as coisas amigáveis é fundamental.\u003C\u002Fstrong\u003E Manter um tom positivo durante a revisão de código melhora a dinâmica da equipe e contribui para uma cultura de melhoria contínua.  \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ELeitura relacionada (em inglês): \u003Ca href=\"https:\u002F\u002Fnearsure.com\u002Fblog\u002Fsoft-skills-any-remote-software-developer-needs-to-master\u002F?utm_source=linkedin&utm_medium=organic\"\u003E\u003Cem\u003ESoft skills Any Remote Software Developer Needs to Master \u003C\u002Fem\u003E\u003C\u002Fa\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Cstrong\u003ECrie revisões construtivas.\u003C\u002Fstrong\u003E Certifique-se de que todos os seus comentários sejam voltados para a melhoria do código e evite comentários pessoais. Concentre-se em melhorias específicas, explique as razões por trás dessas sugestões e ofereça alternativas quando necessário. Você pode até mesmo \u003Cstrong\u003Efazer perguntas e abrir um diálogo\u003C\u002Fstrong\u003E com seu colega para encontrar soluções de forma colaborativa.  \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003E\u003Cstrong\u003EDeixe de lado as preferências pessoais.\u003C\u002Fstrong\u003E Para uma revisão mais proveitosa, pratique a diferenciação entre gostos subjetivos e falhas objetivas. Em vez de enfatizar suas próprias preferências de estilo, mantenha o foco em garantir que o código atenda aos padrões de qualidade exigidos.  \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPor fim, \u003Cstrong\u003Enão se esqueça de dar um grito de alerta\u003C\u002Fstrong\u003E e fazer elogios quando encontrar algo bem-feito no trabalho do autor.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cstrong\u003ECodificação mais inteligente: integrando a IA ao seu processo de revisão \u003C\u002Fstrong\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EA IA generativa já é \u003Ca href=\"https:\u002F\u002Fnearsure.com\u002Fblog\u002Fhow-generative-ai-is-transforming-software-engineering\u002F\"\u003Eamplamente usada na programação\u003C\u002Fa\u003E, provando que simplifica o trabalho dos desenvolvedores. Uma de suas aplicações úteis é acelerar os fluxos de trabalho de revisão de código, economizando o tempo dos desenvolvedores ao automatizar o processo de revisão, especialmente para tarefas meticulosas. Soluções orientadas por IA, como o \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ffreeedcom\u002Fai-codereviewer\"\u003EAI Code Reviewer do GitHub\u003C\u002Fa\u003E, podem analisar o código e fornecer feedback e sugestões inteligentes sobre solicitações pull.  \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EApesar de sua utilidade, é importante entender que as ferramentas de IA não substituirão os desenvolvedores. Portanto, \u003Ca href=\"https:\u002F\u002Fgraphite.dev\u002Fblog\u002Fai-code-review-experiments\"\u003Euse-as com sabedoria\u003C\u002Fa\u003E, integrando-as como ferramentas de revisão de código de apoio, e busque um equilíbrio entre a assistência da IA e seus próprios insights e experiência para obter os melhores resultados. Lembre-se de que, no âmbito do desenvolvimento de software, a supervisão e a experiência humanas continuam inestimáveis quando se trata de tomada de decisões e criatividade. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cb\u003EVamos encerrar o assunto\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EDepois de explorar a importância e os benefícios das revisões de código no processo de desenvolvimento e descobrir algumas dicas e truques valiosos, acreditamos que você está pronto para abordar suas próximas revisões com entusiasmo renovado! Quais desses insights já fazem parte de sua rotina?  \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ENão perca outras dicas! Este artigo foi produzido e divulgado pela Nearsure. Acompanhe a\u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003E \u003Ca href=\"https:\u002F\u002Fwww.linkedin.com\u002Fnewsletters\u002Ftechremote-6996105939804155904\u002F\"\u003Enewsletter\u003C\u002Fa\u003E (em inglês) e também mantenha-se atualizado acessando o \u003Ca href=\"https:\u002F\u002Fnearsure.com\u002Fblog\u002F\"\u003Enosso blog\u003C\u002Fa\u003E. V\u003C\u002Fspan\u003Eenha conferir outros artigos de assuntos relacionados e mais!\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EEstá se arrastando quando chega a hora das revisões de código? Embora lidar com essa tarefa possa não ser seu item favorito na lista, esse componente essencial do processo de desenvolvimento de software traz benefícios comprovados.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-acertar-em-cheio-em-sua-proxima-revisao-de-codigo","date":"26 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F23152318\u002Fcode-review-1536x864.jpg","externalMention":null,"author":{"id":149224,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F23145310\u002Ffoto-MicaelaRuiz.png","name":"Micaela Ruiz","description":"Micaela is the Head of Talent Marketing at Nearsure, driving impactful employer branding strategies. Her role is to position Nearsure as a top-choice employer, to attract and retain exceptional talent.","slug":"micaela-ruiz","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fmicaela-ruiz","registered":"2024-02-23 17:54:39","social":{"linkedin":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fmicaela-ruiz-camauer\u002F","youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"paula_micaela@codecon.dev"},"articles_count":1,"views_count":100,"certifications":null,"conquests":null,"office":"Head of Talent Marketing & Branding at Nearsure"},"categories":[{"title":"Desenvolvimento","slug":"desenvolvimento","id":7234,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento"},{"title":"Software development","slug":"software-development-4","id":8959,"link":"https:\u002F\u002Fimasters.com.br\u002Fsoftware-development-4"}],"tags":[{"title":"boas práticas","slug":"boas-praticas","id":2756,"link":"https:\u002F\u002Fimasters.com.br\u002Fboas-praticas"},{"title":"code review","slug":"code-review","id":5119,"link":"https:\u002F\u002Fimasters.com.br\u002Fcode-review"},{"title":"revisão de código","slug":"revisao-de-codigo","id":2045,"link":"https:\u002F\u002Fimasters.com.br\u002Frevisao-de-codigo"}],"seo":{"open_graph":{"title":"Como acertar em cheio em sua próxima revisão de código - iMasters - We are Developers","description":"Está se arrastando quando chega a hora das revisões de código? Embora lidar com essa tarefa possa não ser seu item favorito na lista, esse componente essencial do processo de desenvolvimento de software traz benefícios comprovados.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F23152318\u002Fcode-review-1536x864.jpg","width":1536,"height":864},"modified_time":"2024-02-26T15:27:15-03:00","published_time":"2024-02-26T10:44:04-03:00"},"twitter":{"title":"Como acertar em cheio em sua próxima revisão de código - iMasters - We are Developers","description":"Está se arrastando quando chega a hora das revisões de código? Embora lidar com essa tarefa possa não ser seu item favorito na lista, esse componente essencial do processo de desenvolvimento de software traz benefícios comprovados.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F23152318\u002Fcode-review-1536x864.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-acertar-em-cheio-em-sua-proxima-revisao-de-codigo","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-acertar-em-cheio-em-sua-proxima-revisao-de-codigo","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento\u002Fcomo-acertar-em-cheio-em-sua-proxima-revisao-de-codigo"},"type":"post"},{"id":160406,"title":"DevSecOps é difícil, mas escolha entre desenvolvimento rápido e maior confiabilidade não deveria ser","content":"\u003Cp\u003EDevSecOps é difícil, mas escolha entre desenvolvimento rápido e maior confiabilidade não deveria ser.\u003Cbr \u002F\u003E\nA última coisa que as equipes de desenvolvimento precisam é implantar novos recursos com vulnerabilidades. Cibersegurança nunca foi tão importante quanto é agora, já que o volume de desenvolvimento de aplicações cresceu muito, bem como o avanço de tecnologias de armazenamento e processamento abriram flancos importantes aumentando a complexidade nesta jornada.\u003C\u002Fp\u003E\n\u003Cp\u003EUm estudo da Dynatrace de agosto de 2023 aponta que quase dois terços dos CISOs (64%) no Brasil dizem que o gerenciamento de vulnerabilidades é mais difícil porque a complexidade em sua cadeia de suprimentos de software e ecossistema de nuvem aumentou. Outra dificuldade detectada pelos C-Levels em Cibersegurança envolve a própria manutenção de uma cultura de desenvolvimento seguro das aplicações e softwares.\u003C\u002Fp\u003E\n\u003Cp\u003ENa pesquisa, 90% dos líderes entrevistados disseram que o uso de soluções e processos muito pontuais ampliam as possibilidades de vulnerabilidades, o que resultará em mais exploração por cibercriminosos. Todavia, estima-se que apenas 10% das empresas possuem um DevSecOps maduro.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos\u002Ffalhas-em-observabilidade-afetam-os-apps-e-a-seguranca-das-organizacoes\"\u003EFalhas em Observabilidade afetam os Apps e a Segurança das Organizações\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003EDevSecOps\u003C\u002Fh2\u003E\n\u003Cp\u003EO DevSecOps está associado intimamente à colaboração entre desenvolvedores e operações para melhorar a entrega e a confiabilidade dos aplicativos em produção. O conceito consolida um fundamental ciclo de entrega de software de forma automatizada, tornando-se uma cultura própria tanto para quem desenvolve, quanto para quem implanta aplicativos com segurança. Além disso, integra auditorias automatizadas, testes de penetração e faz parte de uma metodologia ágil a concepção de aplicativos.\u003C\u002Fp\u003E\n\u003Cp\u003EMuitas equipes de DevOps se veem na missão de organizar o caos das implementações de infraestruturas de aplicações que crescem organicamente. E isto inclui automatizar o pipeline de entrega com CI\u002FCD (integração contínua e entrega contínua), padronizar configurações com contêineres e configurar a infraestrutura como código dentro de um ciclo de vida de desenvolvimento de software para construção de projetos que sejam confiáveis, reutilizáveis e compatíveis.\u003C\u002Fp\u003E\n\u003Cp\u003EDevOps é difícil? Sim, com certeza é desafiador. No entanto, a escolha entre desenvolvimento mais rápido e maior confiabilidade não deveria ser. Estamos vendo uma importante virada de chave na incorporação da segurança e criando uma cultura DevSecOps mais forte e tornando cada vez mais desenvolvedores conscientes e responsáveis pela segurança de seus aplicativos.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EDevSecOps é difícil, mas escolha entre desenvolvimento rápido e maior confiabilidade não deveria ser. A última coisa que as equipes de desenvolvimento…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fdevsecops-e-dificil-mas-escolha-entre-desenvolvimento-rapido-e-maior-confiabilidade-nao-deveria-ser","date":"26 dez, 2023","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19123455\u002FDevSecOps-1.jpg","externalMention":null,"author":{"id":149212,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F14111948\u002FThiago-Sposito2-M%C3%A9dia.jpeg","name":"Thiago Spósito","description":"Sócio da Add Value","slug":"thiago-sposito","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fthiago-sposito","registered":"2023-08-14 14:19:52","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"","instagram":null,"github":null,"url":"","mail":"lucas10@capitalinformacao.com.br"},"articles_count":2,"views_count":400,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"DevSecOps","slug":"devsecops","id":1,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops"}],"tags":[{"title":"desenvolvimento","slug":"desenvolvimento-2","id":186,"link":"https:\u002F\u002Fimasters.com.br\u002Fdesenvolvimento-2"},{"title":"devsecops","slug":"devsecops","id":8102,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops"},{"title":"gestão da segurança","slug":"gestao-da-seguranca","id":4001,"link":"https:\u002F\u002Fimasters.com.br\u002Fgestao-da-seguranca"},{"title":"secops","slug":"secops","id":4287,"link":"https:\u002F\u002Fimasters.com.br\u002Fsecops"},{"title":"segurança","slug":"seguranca-2","id":298,"link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca-2"},{"title":"segurança da informação","slug":"seguranca-da-informacao","id":548,"link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca-da-informacao"}],"seo":{"open_graph":{"title":"DevSecOps é difícil; Escolha: desenvolvimento rápido ou confiabilidade?","description":"DevSecOps é difícil, mas escolha entre desenvolvimento rápido e maior confiabilidade não deveria ser. A última coisa que as equipes de desenvolvimento...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19123455\u002FDevSecOps-1.jpg","width":800,"height":533},"modified_time":"2023-12-19T13:00:19-03:00","published_time":"2023-12-26T10:15:45-03:00"},"twitter":{"title":"DevSecOps é difícil; Escolha: desenvolvimento rápido ou confiabilidade?","description":"DevSecOps é difícil, mas escolha entre desenvolvimento rápido e maior confiabilidade não deveria ser. A última coisa que as equipes de desenvolvimento...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19123455\u002FDevSecOps-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fdevsecops-e-dificil-mas-escolha-entre-desenvolvimento-rapido-e-maior-confiabilidade-nao-deveria-ser","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fdevsecops-e-dificil-mas-escolha-entre-desenvolvimento-rapido-e-maior-confiabilidade-nao-deveria-ser","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdevsecops\u002Fdevsecops-e-dificil-mas-escolha-entre-desenvolvimento-rapido-e-maior-confiabilidade-nao-deveria-ser"},"type":"post"},{"id":160412,"title":"Como testar services em NestJS com Jest","content":"\u003Cp\u003ETestar suas aplicações antes de enviá-las para produção é importante e todo mundo já sabe. Mas será que você sabe como testar eficientemente sua aplicação escrita em NestJS?\u003C\u002Fp\u003E\n\u003Cp\u003ENeste tutorial veremos como utilizar o módulo Jest para criar testes de unidade (unit tests) dos services em backends NestJS. É importante antes de avançar que você já tenha experiência, ao menos básico, implementando webapis com NestJS, o que pode ser aprendido \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Ftutorial-nestjs-para-iniciantes\u002F\"\u003Enesta outra série aqui do blog\u003C\u002Fa\u003E. Também é desejável, embora não obrigatório, que você já conheça o básico de Jest para Node.js, o que pode ser aprendido \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Ftdd-como-criar-unit-tests-em-node-js-com-jest\u002F\"\u003Eneste outro tutorial aqui\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EVeremos neste post:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fcomo-testar-services-em-nestjs-com-jest\u002F#2\"\u003ECriando Unit tests de Services\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fcomo-testar-services-em-nestjs-com-jest\u002F#3\"\u003ETestes Mockados com Jest\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fcomo-testar-services-em-nestjs-com-jest\u002F#4\"\u003ECobertura de Testes\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003EVamos lá!\u003C\u002Fp\u003E\n\u003Ch2 id=\"criando-unit-tests-de-services\"\u003ENestJS – Criando Unit Tests de Services\u003C\u002Fh2\u003E\n\u003Cp\u003EPara este tutorial vamos usar o Jest como biblioteca de testes, que é muito popular atualmente e também porque ele já vem integrado “nativamente” no framework NestJS, permitindo fazer asserções de uma maneira muito simples, prática e padronizada, dando agilidade ao processo de unit testing ou TDD, caso leve a metodologia realmente a sério. Além disso ele cria informações de cobertura de testes muito legais.\u003C\u002Fp\u003E\n\u003Cp\u003EPara não começar nossos estudos completamente do zero usarei o projeto visto \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fcomo-criar-uma-webapi-com-nestjs-prisma-sql\u002F\"\u003Eneste outro tutorial\u003C\u002Fa\u003E, uma webapi de usuários (CRUD) com banco SQL cujos fontes você consegue baixar ou clonar do meu GitHub público \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fluiztools\u002Fnestjs-examples\u002Ftree\u002Fmain\u002Fprisma-sql-example\"\u003Eneste link\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003ERecomendo que você clone esta API na sua máquina e dê uma analisada nos fontes, que são bem simples. Verá que inclusive já temos uma pasta test com um arquivo de teste e outro de configuração dentro. Isso é padrão do NestJS, não fui eu quem criou, então pode excluir o conteúdo dessa pasta. Então crie um novo arquivo de testes chamado user.service.spec.ts. O sufixo ‘spec’ é o padrão para arquivos de teste em NestJS, então vamos manter.\u003C\u002Fp\u003E\n\u003Cp\u003EAbaixo o conteúdo inicial desse arquivo, onde começaremos com o script de preparação dos testes e um teste básico se o serviço foi corretamente carregado.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141405\u002Ftools1.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160414\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141405\u002Ftools1.png\" alt=\"\" width=\"911\" height=\"370\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENa função beforeAll, que será executada antes de todos testes da nossa suíte (literalmente “before all”), nós vamos inicializar nosso módulo de teste (TestingModule), configurando ele com o nosso UserService como provider, assim como faríamos em um módulo real de um backend NestJS. Repare como uso a função estática Test.createTestingModule para isso, que vai simular a inicialização real de um módulo pra gente. Na sequência, carregamos este serviço em uma variável local com a função get do objeto moduleFixture que criamos, a fim de usá-lo nos demais testes sem precisar repetir esse setup.\u003C\u002Fp\u003E\n\u003Cp\u003EComo primeiro teste, vamos testar se o user service foi carregado com sucesso, verificando apenas se está “defined” (ou seja, diferente de undefined, padrão do let). Fazemos isso com a função it, que é apenas um atalho para a função test do Jest, para soar melhor ao ler os testes (na leitura fica “it should be…”). Dentro do callback do it nós escrevemos nosso teste e ao final do mesmo usamos a função expect para analisar um resultado\u002Fvariável com o auxílio de uma função de aferição, neste caso a toBeDefined, que atende ao que precisamos.\u003C\u002Fp\u003E\n\u003Cp\u003ESe você já usou Jest antes, tenho certeza que nada disso é exatamente novidade, apenas as questões específicas do Nest mesmo.\u003C\u002Fp\u003E\n\u003Cp\u003EPara rodar nossos testes, primeiro precisamos ir no package.json e procurar a seção jest dele, onde estão as configurações globais do Jest para esta aplicação. Ajuste para que fique como abaixo, onde incluí também uma série de configurações relacionadas a cálculos de cobertura de código (code coverage).\u003C\u002Fp\u003E\n\u003Cdiv id=\"crayon-657e4a3dc1491969310246\" class=\"crayon-syntax crayon-theme-eclipse crayon-font-monaco crayon-os-pc print-yes notranslate\" data-settings=\" minimize scroll-mouseover\"\u003E\n\u003Cdiv class=\"crayon-plain-wrap\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141522\u002Ftools2.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160415\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141522\u002Ftools2.png\" alt=\"\" width=\"908\" height=\"368\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\n\u003Cdiv\u003EAgora para rodar, basta executar o comando abaixo no terminal:\u003C\u002Fdiv\u003E\n\u003Cdiv\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141624\u002FTools3.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160416\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141624\u002FTools3.png\" alt=\"\" width=\"918\" height=\"46\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fdiv\u003E\n\u003Cdiv\u003E\n\u003Cp\u003EE com isso você terá o seguinte resultado, se fez tudo certo.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"size-large wp-image-31086 aligncenter lazy lazyautosizes ls-is-cached lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-720x387.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-720x387.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-480x258.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-150x81.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-768x412.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-894x480.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-556x299.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-450x242.png 450w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02.png 1084w\" alt=\"\" width=\"720\" height=\"387\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-720x387.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-720x387.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-480x258.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-150x81.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-768x412.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-894x480.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-556x299.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02-450x242.png 450w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-20-at-16.41.02.png 1084w\" data-sizes=\"auto\" data-eio-rwidth=\"720\" data-eio-rheight=\"387\" data-pagespeed-url-hash=\"1587959538\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EA seguir, recomendo que você escreva um ou mais testes por conta própria, para as funções do UserService, o que deve fazer aparecer alguns desafios e problemas que trato no próximo tópico.\u003C\u002Fp\u003E\n\u003Ch3 id=\"testes-mockados-com-jest\"\u003ETestes Mockados com Jest\u003C\u002Fh3\u003E\n\u003Cp\u003EUm unit test é um teste automatizado que testa uma única unidade da sua aplicação, geralmente uma única função, em um único contexto. Cheio de “únicos” nesse parágrafo, não? Assim, para que nossos testes de services sejam realmente unitários, devemos isolá-lo de quaisquer dependências externas.\u003C\u002Fp\u003E\n\u003Cp\u003ENosso UserService não é um serviço exatamente complexo, já que ele é apenas um CRUD de usuário. No entanto ele tem um ponto fundamentalmente chato no que tange testes já que depende de uma infraestrutura de banco de dados para funcionar. Se você quer testar uma consulta, tem de ter massa de dados, certo? Se você quer inserir dados, tem de limpar eles ao final do teste ou até mesmo garantir que eles rodem em sequência pois um insere, outro lê e por aí vai. São vários problemas se quiser testar módulos que usam banco e essas abordagens que citei são todas dor de cabeça na certa, já vi elas na prática. No entanto, se usar essa abordagem de preparar recursos de infraestrutura para os testes acabará testando a infraestrutura em si e atrasando muito os testes do SEU código de fato.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003EComo assim Luiz, eu não deveria testar minha infraestrutura nos testes?\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EDependendo do teste, até pode, mas pensa comigo: o banco de dados é uma parte da sua aplicação cujas funcionalidades não são de sua gestão ou controle, mas sim do fabricante do banco. Por exemplo, se tiver um bug no salvamento em disco de um registro, você tem como corrigir? Até poderia, já que muitos bancos são open-source, mas esse é um exemplo de aspecto da sua aplicação que você não gerencia, mas depende para o seu código funcionar, toda vez que quer escrever ou ler dados.\u003C\u002Fp\u003E\n\u003Cp\u003EEsses pacotes e recursos não-gerenciáveis por você, cujo código você usa mas não mexe, são fortes candidatos a serem mockados, porque eles costumam muitas vezes tornar os seus testes dependentes, acoplados, lentos e falhos, além de exigir muito setup e cleanup, antes e depois dos testes respectivamente.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003EMockados? Como assim?\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EMocking é uma técnica de testes onde você cria simulações (mocks) de objetos\u002Ffunções\u002Fwhatever a serem utilizadas em determinados testes. Assim, ao invés de usar de fato um banco real para os testes, você pode mockar algumas funções do Prisma para que ele ACHE que foi no banco de dados, mas na verdade não foi. Assim, você consegue testar somente o SEU código, buscando bugs nele, ao invés de ficar testando o banco por tabela.\u003C\u002Fp\u003E\n\u003Cp\u003EVamos pegar como exemplo um teste de obter usuário, que normalmente exigiria um banco com um registro ao menos para funcionar:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141737\u002Ftolols4.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160417\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141737\u002Ftolols4.png\" alt=\"\" width=\"915\" height=\"191\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ERepare que aqui eu começo definindo um id falso e depois crio o mock sobrescrevendo a função findUnique da coleção users do nosso userService. Para isso usei a função mockReturnValueOnce, que vai substituir o retorno da função mockada pelo objeto que quisermos, mas somente UMA vez (“return value once”), ou seja, nas próximas chamadas ela já terá voltado ao normal, é um efeito temporário.\u003C\u002Fp\u003E\n\u003Cp\u003EAgora sabendo qual o retorno esperado da função, podemos chamar a getUser (que internamente chama a findUnique) e fazemos o expect normalmente. O resultado é um belíssimo teste passando.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003EMas Luiz, isso não é roubar?\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENão, pois todo o código da userService.getUser está sendo testado, apenas o código interno da findUnique, que é da biblioteca Prisma, que não está. Inclusive isso permite que você baixe os fontes do repositório deste tutorial e rode os testes na sua máquina sem sequer ter um banco de dados criado!!!!\u003C\u002Fp\u003E\n\u003Cp\u003EVamos a mais um exemplo, desta vez de consulta de todos usuários:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141831\u002FCaptura-de-tela-2023-12-19-141759.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160418\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141831\u002FCaptura-de-tela-2023-12-19-141759.png\" alt=\"\" width=\"916\" height=\"232\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENote que fiz a mesma coisa, mas desta vez criei um array fake e mockei a função findMany, pois é ela que é usada internamente na getUsers. Já os testes, resolvi fazer dois expects ao invés de um, o que é uma possibilidade também caso queira dar mais precisão à sua asserção.\u003C\u002Fp\u003E\n\u003Cp\u003ESeguindo em frente, que tal um teste de adição de usuário?\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141938\u002FTools5.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160419\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19141938\u002FTools5.png\" alt=\"\" width=\"915\" height=\"303\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ERepare como esses mocks de user e id estão ficando repetitivos, você pode inclusive criar eles a nível global no arquivo, reutilizando em cada teste. Apenas cuide para que um teste não mexa nas propriedades do objeto, o que causaria efeitos colaterais nos outros testes. Eles têm de ser completamente independentes!\u003C\u002Fp\u003E\n\u003Cp\u003EAgora um teste de update:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19142039\u002FTools6.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160420\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19142039\u002FTools6.png\" alt=\"\" width=\"921\" height=\"262\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EBem parecido com os anteriores, certo? Repare que o “segredo” aqui é saber qual função interna do Prisma você deve mockar para aquele teste, depois o resto é só escrever testes Jest comuns.\u003C\u002Fp\u003E\n\u003Cp\u003EE por último, a função de exclusão:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19142143\u002FTools7.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160421\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19142143\u002FTools7.png\" alt=\"\" width=\"925\" height=\"197\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EE com isso temos todos os testes do CRUD finalizados, seu terminal deve ficar assim:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"size-medium wp-image-31104 aligncenter lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53-480x376.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53-480x376.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53-150x117.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53-400x313.png 400w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53-450x352.png 450w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53.png 636w\" alt=\"\" width=\"480\" height=\"376\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53-480x376.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53-480x376.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53-150x117.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53-400x313.png 400w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53-450x352.png 450w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.16.53.png 636w\" data-sizes=\"auto\" data-eio-rwidth=\"480\" data-eio-rheight=\"376\" data-pagespeed-url-hash=\"2812707444\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EDemais, não?\u003C\u002Fp\u003E\n\u003Ch3 id=\"cobertura-de-testes\"\u003ECobertura de Testes\u003C\u002Fh3\u003E\n\u003Cp\u003ECriar todos os testes necessários para garantir que todas as unidade do seu software realmente funcionam é o que chamamos de cobertura de código (code coverage), cuja (quase) utópica marca de 100% deve ser sempre o ideal, embora praticamente inalcançável em sistemas complexos. O quão ‘detalhado’ os seus testes serão vai muito do grau de importância que todas essas questões possuem para o seu negócio e o quanto domina  ele.\u003C\u002Fp\u003E\n\u003Cp\u003EE para incrementar o resultado dos testes, vamos adicionar estatísticas de code coverage neles (cobertura de testes de código), rodando o projeto com o seguinte comando.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19142251\u002Ftools8.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160422\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19142251\u002Ftools8.png\" alt=\"\" width=\"921\" height=\"42\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ECom isso, não apenas os testes serão executados (todos arquivos spec.ts) como será inspecionado se seus testes cobrem as linhas, funções e ramificações do seu projeto. No meu exemplo, tive o seguinte resultado:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"size-full wp-image-31105 aligncenter lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56-480x159.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56-150x50.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56-556x184.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56-450x149.png 450w\" alt=\"\" width=\"720\" height=\"238\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56-480x159.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56-150x50.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56-556x184.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.23.56-450x149.png 450w\" data-sizes=\"auto\" data-eio-rwidth=\"720\" data-eio-rheight=\"238\" data-pagespeed-url-hash=\"1366887761\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENote que a maioria dos arquivos do projeto está em vermelho, pois não escrevemos testes para eles, então vamos nos focar no user.service.ts. Como podemos melhorar a cobertura dele, mesmo após termos escrito testes para todas funções do CRUD? Se você olhar as linhas não-cobertas, verá que tem a 8. Indo até lá, verá que é um código de inicialização do Prisma, então você tem duas opções: ou mocka essa função de conexão, ou diz pro Jest ignorar essa função do UserService.\u003C\u002Fp\u003E\n\u003Cp\u003EVou optar pela segunda opção para mostrar mais um truque de testes:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19142346\u002Ftools9.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160423\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19142346\u002Ftools9.png\" alt=\"\" width=\"922\" height=\"101\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EQuando você adiciona um comentário iniciado por “istanbul” você pode dizer ao Jest para ele ignorar uma linha, função ou até arquivo inteiro. No caso acima, mandei ele ignorar a próxima função.\u003C\u002Fp\u003E\n\u003Cp\u003EO resultado, é um aumento na cobertura já que essa função não estará mais entrando na contabilização, veja abaixo.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"size-large wp-image-31106 aligncenter lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-720x242.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-720x242.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-480x161.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-150x50.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-768x258.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-1280x430.png 1280w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-894x300.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-556x187.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-450x151.png 450w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10.png 1430w\" alt=\"\" width=\"720\" height=\"242\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-720x242.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-720x242.png 720w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-480x161.png 480w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-150x50.png 150w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-768x258.png 768w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-1280x430.png 1280w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-894x300.png 894w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-556x187.png 556w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10-450x151.png 450w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002FScreenshot-2023-10-24-at-20.28.10.png 1430w\" data-sizes=\"auto\" data-eio-rwidth=\"720\" data-eio-rheight=\"242\" data-pagespeed-url-hash=\"3760152232\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EExperimente escrever os testes para o app.service.ts (muito fácil) e para o main.ts, eu recomendo mandar ignorar o arquivo inteiro, usando a seguinte instrução na primeira linha do mesmo.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19142455\u002Ftools10.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160424\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19142455\u002Ftools10.png\" alt=\"\" width=\"917\" height=\"47\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EJuntando este conhecimento com ferramentas de Continuous Integration (CI) como CircleCI e Jenkins, podemos incluir testes de unidade automatizados em nosso build para evitar que um código suba para produção com algum bug (um dia falarei disso por aqui).\u003C\u002Fp\u003E\n\u003Cp\u003EMas e como podemos fazer testes mais amplos, como testes nos controllers ou End-to-End? Esse tipo de teste é assunto para outro tutorial, em breve.\u003C\u002Fp\u003E\n\u003Cp\u003EEspero que tenham gostado do tutorial e que apliquem em seus projetos!\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv class=\"crayon-main\"\u003E\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ETestar suas aplicações antes de enviá-las para produção é importante e todo mundo já sabe. Você sabe como testar sua aplicação escrita em NestJS?\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002Fcomo-testar-services-em-nestjs-com-jest","date":"28 dez, 2023","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19143352\u002FNodeJS-1.jpg","externalMention":null,"author":{"id":148188,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2022\u002F10\u002F11183022\u002FLuizTools.jpg","name":"Luiz Fernando Duarte Junior","description":"Pós-graduado em computação, trabalha com software desde 2006 nas mais variadas tecnologias. Empreendedor, autor e professor, quando não está ocupado programando, está escrevendo ou gravando sobre programação para seu canal e blog LuizTools.","slug":"luizfernando","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fluizfernando","registered":"2017-04-28 19:43:26","social":{"linkedin":null,"youtube":null,"facebook":"http:\u002F\u002Ffb.com\u002Fluiztools","twitter":"https:\u002F\u002Ftwitter.com\u002Fluiztools","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.luiztools.com.br\u002F","mail":"contato@luiztools.com.br"},"articles_count":94,"views_count":883600,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Front End","slug":"front-end","id":7304,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end"},{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"api","slug":"api","id":187,"link":"https:\u002F\u002Fimasters.com.br\u002Fapi"},{"title":"app.service.ts","slug":"app-service-ts","id":8967,"link":"https:\u002F\u002Fimasters.com.br\u002Fapp-service-ts"},{"title":"CIRCLECI","slug":"circleci","id":5733,"link":"https:\u002F\u002Fimasters.com.br\u002Fcircleci"},{"title":"Continuous Integration (CI)","slug":"continuous-integration-ci","id":8968,"link":"https:\u002F\u002Fimasters.com.br\u002Fcontinuous-integration-ci"},{"title":"crud","slug":"crud","id":635,"link":"https:\u002F\u002Fimasters.com.br\u002Fcrud"},{"title":"jenkins","slug":"jenkins","id":652,"link":"https:\u002F\u002Fimasters.com.br\u002Fjenkins"},{"title":"JEST","slug":"jest","id":5735,"link":"https:\u002F\u002Fimasters.com.br\u002Fjest"},{"title":"js","slug":"js","id":3311,"link":"https:\u002F\u002Fimasters.com.br\u002Fjs"},{"title":"mocka","slug":"mocka","id":8970,"link":"https:\u002F\u002Fimasters.com.br\u002Fmocka"},{"title":"NestJS","slug":"nestjs","id":8972,"link":"https:\u002F\u002Fimasters.com.br\u002Fnestjs"},{"title":"node","slug":"node","id":236,"link":"https:\u002F\u002Fimasters.com.br\u002Fnode"},{"title":"nodejs","slug":"nodejs","id":3153,"link":"https:\u002F\u002Fimasters.com.br\u002Fnodejs"},{"title":"Prisma","slug":"prisma","id":8971,"link":"https:\u002F\u002Fimasters.com.br\u002Fprisma"},{"title":"UserService","slug":"userservice","id":8969,"link":"https:\u002F\u002Fimasters.com.br\u002Fuserservice"}],"seo":{"open_graph":{"title":"NodeJS: Como testar services em NestJS com Jest","description":"Testar suas aplicações antes de enviá-las para produção é importante e todo mundo já sabe. Você sabe como testar sua aplicação escrita em NestJS?","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19143352\u002FNodeJS-1.jpg","width":800,"height":533},"modified_time":"2023-12-19T14:42:20-03:00","published_time":"2023-12-28T11:10:44-03:00"},"twitter":{"title":"NodeJS: Como testar services em NestJS com Jest","description":"Testar suas aplicações antes de enviá-las para produção é importante e todo mundo já sabe. Você sabe como testar sua aplicação escrita em NestJS?","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F19143352\u002FNodeJS-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002Fcomo-testar-services-em-nestjs-com-jest","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002Fcomo-testar-services-em-nestjs-com-jest","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002Fcomo-testar-services-em-nestjs-com-jest"},"type":"post"},{"id":160671,"title":"Scripts SQL e Tabelas de Sistema – Parte 4: Atuando em Toda Instância","content":"\u003Cp id=\"E1167\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1168\" class=\"qowt-font10-Arial\"\u003EFechando \u003C\u002Fspan\u003E\u003Cspan id=\"E1169\" class=\"qowt-font10-Arial\"\u003Ees\u003C\u002Fspan\u003E\u003Cspan id=\"E1170\" class=\"qowt-font10-Arial\"\u003Et\u003C\u002Fspan\u003E\u003Cspan id=\"E1171\" class=\"qowt-font10-Arial\"\u003Ea \u003C\u002Fspan\u003E\u003Cspan id=\"E1172\" class=\"qowt-font10-Arial\"\u003Esérie sobre \u003Cstrong\u003EBanco de dados e Scripts SQL\u003C\u002Fstrong\u003E, apresento \u003C\u002Fspan\u003E\u003Cspan id=\"E1173\" class=\"qowt-font10-Arial\"\u003Eum\u003C\u002Fspan\u003E\u003Cspan id=\"E1174\" class=\"qowt-font10-Arial\"\u003E caso \u003C\u002Fspan\u003E\u003Cspan id=\"E1175\" class=\"qowt-font10-Arial\"\u003Emais \u003C\u002Fspan\u003E\u003Cspan id=\"E1176\" class=\"qowt-font10-Arial\"\u003Etrabalhoso,\u003C\u002Fspan\u003E\u003Cspan id=\"E1177\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1178\" class=\"qowt-font10-Arial\"\u003Eonde as consultas \u003C\u002Fspan\u003E\u003Cspan id=\"E1179\" class=\"qowt-font10-Arial\"\u003Eenvolve\u003C\u002Fspan\u003E\u003Cspan id=\"E1180\" class=\"qowt-font10-Arial\"\u003Em \u003C\u002Fspan\u003E\u003Cspan id=\"E1181\" class=\"qowt-font10-Arial\"\u003Edados de \u003C\u002Fspan\u003E\u003Cspan id=\"E1182\" class=\"qowt-font10-Arial\"\u003Etoda instância. Isso quer dizer que são \u003C\u002Fspan\u003E\u003Cspan id=\"E1183\" class=\"qowt-font10-Arial\"\u003Eusadas\u003C\u002Fspan\u003E\u003Cspan id=\"E1184\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1185\" class=\"qowt-font10-Arial\"\u003Etabelas de sistema \u003C\u002Fspan\u003E\u003Cspan id=\"E1186\" class=\"qowt-font10-Arial\"\u003Ede múltiplas\u003C\u002Fspan\u003E\u003Cspan id=\"E1187\" class=\"qowt-font10-Arial\"\u003E bases de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E1188\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1189\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1190\" class=\"qowt-font10-Arial\"\u003ENeste exemplo, o o\u003C\u002Fspan\u003E\u003Cspan id=\"E1191\" class=\"qowt-font10-Arial\"\u003Ebjetivo é \u003C\u002Fspan\u003E\u003Cspan id=\"E1192\" class=\"qowt-font10-Arial\"\u003Eidentificar\u003C\u002Fspan\u003E\u003Cspan id=\"E1193\" class=\"qowt-font10-Arial\"\u003E em toda instância\u003C\u002Fspan\u003E\u003Cspan id=\"E1194\" class=\"qowt-font10-Arial\"\u003E as tabelas que\u003C\u002Fspan\u003E\u003Cspan id=\"E1195\" class=\"qowt-font10-Arial\"\u003E são de tipos especiais\u003C\u002Fspan\u003E\u003Cspan id=\"E1196\" class=\"qowt-font10-Arial\"\u003E, como por exemplo\u003C\u002Fspan\u003E\u003Cspan id=\"E1197\" class=\"qowt-font10-Arial\"\u003E tabelas em memória,\u003C\u002Fspan\u003E\u003Cspan id=\"E1198\" class=\"qowt-font10-Arial\"\u003E tabelas temporais, tabelas de grafos, tabelas replicadas\u003C\u002Fspan\u003E\u003Cspan id=\"E1199\" class=\"qowt-font10-Arial\"\u003E, \u003C\u002Fspan\u003E\u003Ca id=\"E1200\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fpt-br\u002Fsql\u002Frelational-databases\u002Fsecurity\u002Fledger\u002Fledger-overview?view=sql-server-ver16\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1201\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Etabelas de\u003C\u002Fspan\u003E\u003Cspan id=\"E1202\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003E ledger\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1203\" class=\"qowt-font10-Arial\"\u003E (disponíveis no SQL Server 2022).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1205\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1206\"\u003EScripts SQL – Origem da Informação\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1207\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1208\" class=\"qowt-font10-Arial\"\u003ENo\u003C\u002Fspan\u003E\u003Cspan id=\"E1209\" class=\"qowt-font10-Arial\"\u003Es exemplos anteriores\u003C\u002Fspan\u003E\u003Cspan id=\"E1210\" class=\"qowt-font10-Arial\"\u003E, \u003C\u002Fspan\u003E\u003Cspan id=\"E1211\" class=\"qowt-font10-Arial\"\u003Eusei muitas vezes a tabela de sistema \u003C\u002Fspan\u003E\u003Cspan id=\"E1212\" class=\"qowt-font10-Arial\"\u003Esys.objects\u003C\u002Fspan\u003E\u003Cspan id=\"E1213\" class=\"qowt-font10-Arial\"\u003E, que contém\u003C\u002Fspan\u003E\u003Cspan id=\"E1214\" class=\"qowt-font10-Arial\"\u003E dados de todos os objetos do banco de dados. \u003C\u002Fspan\u003E\u003Cspan id=\"E1215\" class=\"qowt-font10-Arial\"\u003EPorém esta tabela não traz\u003C\u002Fspan\u003E\u003Cspan id=\"E1216\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1217\" class=\"qowt-font10-Arial\"\u003Etodas as informações\u003C\u002Fspan\u003E\u003Cspan id=\"E1218\" class=\"qowt-font10-Arial\"\u003E sobre \u003C\u002Fspan\u003E\u003Cspan id=\"E1219\" class=\"qowt-font10-Arial\"\u003Eas\u003C\u002Fspan\u003E\u003Cspan id=\"E1220\" class=\"qowt-font10-Arial\"\u003E tabelas \u003C\u002Fspan\u003E\u003Cspan id=\"E1221\" class=\"qowt-font10-Arial\"\u003Ede usuário\u003C\u002Fspan\u003E\u003Cspan id=\"E1222\" class=\"qowt-font10-Arial\"\u003E que \u003C\u002Fspan\u003E\u003Cspan id=\"E1223\" class=\"qowt-font10-Arial\"\u003Eserão necessári\u003C\u002Fspan\u003E\u003Cspan id=\"E1224\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E1225\" class=\"qowt-font10-Arial\"\u003Es no presente estudo\u003C\u002Fspan\u003E\u003Cspan id=\"E1226\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1227\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1228\" class=\"qowt-font10-Arial\"\u003EPor isso \u003C\u002Fspan\u003E\u003Cspan id=\"E1229\" class=\"qowt-font10-Arial\"\u003Euso aqui\u003C\u002Fspan\u003E\u003Cspan id=\"E1230\" class=\"qowt-font10-Arial\"\u003E a visão \u003C\u002Fspan\u003E\u003Cspan id=\"E1231\" class=\"qowt-font10-Arial\"\u003Ede sistema \u003C\u002Fspan\u003E\u003Cspan id=\"E1232\" class=\"qowt-font10-Arial\"\u003Esys.\u003C\u002Fspan\u003E\u003Cspan id=\"E1233\" class=\"qowt-font10-Arial\"\u003Etables\u003C\u002Fspan\u003E\u003Cspan id=\"E1234\" class=\"qowt-font10-Arial\"\u003E, que traz \u003C\u002Fspan\u003E\u003Cspan id=\"E1235\" class=\"qowt-font10-Arial\"\u003Einformações mais detalhadas\u003C\u002Fspan\u003E\u003Cspan id=\"E1236\" class=\"qowt-font10-Arial\"\u003E, mas lida\u003C\u002Fspan\u003E\u003Cspan id=\"E1237\" class=\"qowt-font10-Arial\"\u003E apenas \u003C\u002Fspan\u003E\u003Cspan id=\"E1238\" class=\"qowt-font10-Arial\"\u003Ecom\u003C\u002Fspan\u003E\u003Cspan id=\"E1239\" class=\"qowt-font10-Arial\"\u003E tabelas de usuário\u003C\u002Fspan\u003E\u003Cspan id=\"E1240\" class=\"qowt-font10-Arial\"\u003E. (\u003C\u002Fspan\u003E\u003Ca id=\"E1241\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fpt-br\u002Fsql\u002Frelational-databases\u002Fsystem-catalog-views\u002Fsys-tables-transact-sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1242\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003EVeja mais detalhes\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1243\" class=\"qowt-font10-Arial\"\u003E). \u003C\u002Fspan\u003E\u003Cspan id=\"E1244\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1245\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1246\" class=\"qowt-font10-Arial\"\u003ECom este catálogo\u003C\u002Fspan\u003E\u003Cspan id=\"E1247\" class=\"qowt-font10-Arial\"\u003E, consigo classificar os tipos de tabela\u003C\u002Fspan\u003E\u003Cspan id=\"E1248\" class=\"qowt-font10-Arial\"\u003E de \u003C\u002Fspan\u003E\u003Cspan id=\"E1249\" class=\"qowt-font10-Arial\"\u003Eusuário\u003C\u002Fspan\u003E\u003Cspan id=\"E1250\" class=\"qowt-font10-Arial\"\u003E de um determinado banco de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E1251\" class=\"qowt-font10-Arial\"\u003E, como se vê n\u003C\u002Fspan\u003E\u003Cspan id=\"E1252\" class=\"qowt-font10-Arial\"\u003Ea consulta do Quadro 1.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26142136\u002Fw1.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160672\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26142136\u002Fw1.png\" alt=\"\" width=\"717\" height=\"407\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1466\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1467\" class=\"qowt-font10-Arial\"\u003EO leitor mais atento\u003C\u002Fspan\u003E\u003Cspan id=\"E1469\" class=\"qowt-font10-Arial\"\u003E vai notar que eu usei um “\u003C\u002Fspan\u003E\u003Cspan id=\"E1470\" class=\"qowt-font10-Arial\"\u003Ej\u003C\u002Fspan\u003E\u003Cspan id=\"E1471\" class=\"qowt-font10-Arial\"\u003Eoin” com a tabela \u003C\u002Fspan\u003E\u003Cspan id=\"E1472\" class=\"qowt-font10-Arial\"\u003Esys.schemas\u003C\u002Fspan\u003E\u003Cspan id=\"E1473\" class=\"qowt-font10-Arial\"\u003E ao invés usar simplesmente a função \u003C\u002Fspan\u003E\u003Cspan id=\"E1474\" class=\"qowt-font10-Arial\"\u003ESCHEMA_NAME()\u003C\u002Fspan\u003E\u003Cspan id=\"E1475\" class=\"qowt-font10-Arial\"\u003E para identificar o nome do esquema associado a tabela \u003C\u002Fspan\u003E\u003Cspan id=\"E1476\" class=\"qowt-font10-Arial\"\u003E(coluna TAB).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1477\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1478\" class=\"qowt-font10-Arial\"\u003EEssa diferença é fundamental no exemplo que vou mostrar, porque a função\u003C\u002Fspan\u003E\u003Cspan id=\"E1479\" class=\"qowt-font10-Arial\"\u003E mencionada\u003C\u002Fspan\u003E\u003Cspan id=\"E1480\" class=\"qowt-font10-Arial\"\u003E tem \u003C\u002Fspan\u003E\u003Cspan id=\"E1481\" class=\"qowt-font10-Arial\"\u003Eescopo\u003C\u002Fspan\u003E\u003Cspan id=\"E1482\" class=\"qowt-font10-Arial\"\u003E sobre o banco de dados ativo\u003C\u002Fspan\u003E\u003Cspan id=\"E1483\" class=\"qowt-font10-Arial\"\u003E. Como vou escrever uma consulta para ser executada sobre todos os bancos de dados, a função iria falhar.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1484\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1485\" class=\"qowt-font10-Arial\"\u003EDo mesmo modo, a função \u003C\u002Fspan\u003E\u003Cspan id=\"E1486\" class=\"qowt-font10-Arial\"\u003EDB_NAME()\u003C\u002Fspan\u003E\u003Cspan id=\"E1487\" class=\"qowt-font10-Arial\"\u003E usada na coluna DB\u003C\u002Fspan\u003E\u003Cspan id=\"E1488\" class=\"qowt-font10-Arial\"\u003E também irá falhar. Por isso ela necessariamente terá que ser substituída \u003C\u002Fspan\u003E\u003Cspan id=\"E1489\" class=\"qowt-font10-Arial\"\u003Epor uma cadeia de caracteres na montagem do script final.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"E1490\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1491\"\u003EAtuando sobre Toda Instância\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp id=\"E1492\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1493\" class=\"qowt-font10-Arial\"\u003EÉ hora de adaptar a consulta \u003C\u002Fspan\u003E\u003Cspan id=\"E1494\" class=\"qowt-font10-Arial\"\u003Edo Quadro 1 para que seja feita uma varredura sobre toda instância.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1495\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1496\" class=\"qowt-font10-Arial\"\u003EAs alterações necessárias são óbvias, mas é um pouco complicad\u003C\u002Fspan\u003E\u003Cspan id=\"E1497\" class=\"qowt-font10-Arial\"\u003Eo \u003C\u002Fspan\u003E\u003Cspan id=\"E1498\" class=\"qowt-font10-Arial\"\u003Eescrever\u003C\u002Fspan\u003E\u003Cspan id=\"E1499\" class=\"qowt-font10-Arial\"\u003E isso no script. \u003C\u002Fspan\u003E\u003Cspan id=\"E1500\" class=\"qowt-font10-Arial\"\u003EBasicamente vamos repetir aquela consulta para todos os bancos \u003C\u002Fspan\u003E\u003Cspan id=\"E1501\" class=\"qowt-font10-Arial\"\u003Ee juntar os resultados \u003C\u002Fspan\u003E\u003Cspan id=\"E1502\" class=\"qowt-font10-Arial\"\u003Ecom o operador \u003C\u002Fspan\u003E\u003Cspan id=\"E1503\" class=\"qowt-font10-Arial\"\u003EUNION\u003C\u002Fspan\u003E\u003Cspan id=\"E1504\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1505\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1506\" class=\"qowt-font10-Arial\"\u003EAlém dos detalhes que comentei anteriormente\u003C\u002Fspan\u003E\u003Cspan id=\"E1507\" class=\"qowt-font10-Arial\"\u003E, temos que informar \u003C\u002Fspan\u003E\u003Cspan id=\"E1508\" class=\"qowt-font10-Arial\"\u003Ena definição da cláusula \u003C\u002Fspan\u003E\u003Cspan id=\"E1509\" class=\"qowt-font10-Arial\"\u003EFROM\u003C\u002Fspan\u003E\u003Cspan id=\"E1510\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1511\" class=\"qowt-font10-Arial\"\u003Eo nome do banco de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E1512\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1513\" class=\"qowt-font10-Arial\"\u003Eque está sendo pesquisado\u003C\u002Fspan\u003E\u003Cspan id=\"E1514\" class=\"qowt-font10-Arial\"\u003E. É fácil fazer isso fazendo uma consulta sobre a tabela de \u003C\u002Fspan\u003E\u003Cspan id=\"E1515\" class=\"qowt-font10-Arial\"\u003Esys\u003C\u002Fspan\u003E\u003Cspan id=\"E1516\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E1517\" class=\"qowt-font10-Arial\"\u003Edatabases\u003C\u002Fspan\u003E\u003Cspan id=\"E1518\" class=\"qowt-font10-Arial\"\u003E disponível na base MASTER e gerando uma cadeia de caracteres que não é nada mais a declaração SQL que desej\u003C\u002Fspan\u003E\u003Cspan id=\"E1519\" class=\"qowt-font10-Arial\"\u003Eo. O Quadro 2 mostra esta declaração.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_160673\" aria-describedby=\"caption-attachment-160673\" style=\"width: 717px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26142322\u002Fw2.png\"\u003E\u003Cimg class=\"wp-image-160673 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26142322\u002Fw2.png\" alt=\"\" width=\"717\" height=\"547\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-160673\" class=\"wp-caption-text\"\u003EQuadro 2 – Construindo a declaração SQL\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cp id=\"E1716\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1717\" class=\"qowt-font10-Arial\"\u003EBasicamente, \u003C\u002Fspan\u003E\u003Cspan id=\"E1718\" class=\"qowt-font10-Arial\"\u003Etod\u003C\u002Fspan\u003E\u003Cspan id=\"E1719\" class=\"qowt-font10-Arial\"\u003Eo texto em vermelho \u003C\u002Fspan\u003E\u003Cspan id=\"E1720\" class=\"qowt-font10-Arial\"\u003Eda cláusula SELECT n\u003C\u002Fspan\u003E\u003Cspan id=\"E1721\" class=\"qowt-font10-Arial\"\u003Eo Quadro 2 é \u003C\u002Fspan\u003E\u003Cspan id=\"E1722\" class=\"qowt-font10-Arial\"\u003Ede fato\u003C\u002Fspan\u003E\u003Cspan id=\"E1723\" class=\"qowt-font10-Arial\"\u003E a consulta original mostrada no Quadro 1\u003C\u002Fspan\u003E\u003Cspan id=\"E1724\" class=\"qowt-font10-Arial\"\u003E, ao que eu adicionei alguns ajustes\u003C\u002Fspan\u003E\u003Cspan id=\"E1725\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E1726\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1727\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1728\" class=\"qowt-font10-Arial\"\u003EExaminando mais atentamente\u003C\u002Fspan\u003E\u003Cspan id=\"E1729\" class=\"qowt-font10-Arial\"\u003E a cláusula SELECT\u003C\u002Fspan\u003E\u003Cspan id=\"E1730\" class=\"qowt-font10-Arial\"\u003E, pode-se observar que a \u003C\u002Fspan\u003E\u003Cspan id=\"E1731\" class=\"qowt-font10-Arial\"\u003Ecadeia de caracteres\u003C\u002Fspan\u003E\u003Cspan id=\"E1732\" class=\"qowt-font10-Arial\"\u003E gerada te\u003C\u002Fspan\u003E\u003Cspan id=\"E1733\" class=\"qowt-font10-Arial\"\u003Erá\u003C\u002Fspan\u003E\u003Cspan id=\"E1734\" class=\"qowt-font10-Arial\"\u003E ao seu final uma cláusula \u003C\u002Fspan\u003E\u003Cspan id=\"E1735\" class=\"qowt-font10-Arial\"\u003EUNION\u003C\u002Fspan\u003E\u003Cspan id=\"E1736\" class=\"qowt-font10-Arial\"\u003E extra.\u003C\u002Fspan\u003E\u003Cspan id=\"E1737\" class=\"qowt-font10-Arial\"\u003E Portanto, \u003C\u002Fspan\u003E\u003Cspan id=\"E1738\" class=\"qowt-font10-Arial\"\u003Eela\u003C\u002Fspan\u003E\u003Cspan id=\"E1739\" class=\"qowt-font10-Arial\"\u003E ainda não é uma declaração SQL válida.\u003C\u002Fspan\u003E\u003Cspan id=\"E1740\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1741\" class=\"qowt-font10-Arial\"\u003EEsse problema é contornado\u003C\u002Fspan\u003E\u003Cspan id=\"E1742\" class=\"qowt-font10-Arial\"\u003E eliminando \u003C\u002Fspan\u003E\u003Cspan id=\"E1743\" class=\"qowt-font10-Arial\"\u003Eos\u003C\u002Fspan\u003E\u003Cspan id=\"E1744\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1745\" class=\"qowt-font10-Arial\"\u003Eúltimos \u003C\u002Fspan\u003E\u003Cspan id=\"E1746\" class=\"qowt-font10-Arial\"\u003Eseis caracteres\u003C\u002Fspan\u003E\u003Cspan id=\"E1747\" class=\"qowt-font10-Arial\"\u003E d\u003C\u002Fspan\u003E\u003Cspan id=\"E1748\" class=\"qowt-font10-Arial\"\u003Ea variável \u003C\u002Fspan\u003E\u003Cspan id=\"E1749\" class=\"qowt-font10-Arial\"\u003E@sql\u003C\u002Fspan\u003E\u003Cspan id=\"E1750\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1751\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1752\" class=\"qowt-font10-Arial\"\u003EAlém disso, para \u003C\u002Fspan\u003E\u003Cspan id=\"E1753\" class=\"qowt-font10-Arial\"\u003Eque eu possa analisar os dados \u003C\u002Fspan\u003E\u003Cspan id=\"E1754\" class=\"qowt-font10-Arial\"\u003Eque serão \u003C\u002Fspan\u003E\u003Cspan id=\"E1755\" class=\"qowt-font10-Arial\"\u003Ecoletados\u003C\u002Fspan\u003E\u003Cspan id=\"E1756\" class=\"qowt-font10-Arial\"\u003E, é interessante gravar \u003C\u002Fspan\u003E\u003Cspan id=\"E1757\" class=\"qowt-font10-Arial\"\u003Eas informações coletadas\u003C\u002Fspan\u003E\u003Cspan id=\"E1758\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003Cspan id=\"E1759\" class=\"qowt-font10-Arial\"\u003EO Quadro 3 mostra \u003C\u002Fspan\u003E\u003Cspan id=\"E1760\" class=\"qowt-font10-Arial\"\u003Eestes passos.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_160674\" aria-describedby=\"caption-attachment-160674\" style=\"width: 716px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26142440\u002Fw3.png\"\u003E\u003Cimg class=\"wp-image-160674 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26142440\u002Fw3.png\" alt=\"\" width=\"716\" height=\"730\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-160674\" class=\"wp-caption-text\"\u003EQuadro 3 – Gravando os dados coletados em uma variável de tabela\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E2031\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2032\" class=\"qowt-font10-Arial\"\u003ENa minha instânc\u003C\u002Fspan\u003E\u003Cspan id=\"E2033\" class=\"qowt-font10-Arial\"\u003Ei\u003C\u002Fspan\u003E\u003Cspan id=\"E2034\" class=\"qowt-font10-Arial\"\u003Ea de demo, \u003C\u002Fspan\u003E\u003Cspan id=\"E2035\" class=\"qowt-font10-Arial\"\u003Eforam identificadas mais de 150 tabelas.\u003C\u002Fspan\u003E\u003Cspan id=\"E2036\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2037\" class=\"qowt-font10-Arial\"\u003EPara ter uma visão geral das minhas tabelas, \u003C\u002Fspan\u003E\u003Cspan id=\"E2038\" class=\"qowt-font10-Arial\"\u003Efarei uma nova consulta que mostra a quantidade de tabelas de cada tipo que fazem parte de cada base de dados.\u003C\u002Fspan\u003E\u003Cspan id=\"E2039\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E2040\" class=\"x-scope qowt-word-para-2 x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2041\" class=\"qowt-font10-Arial\"\u003EIncluo também o operador ROLLUP e a função GROUPING para mostra\u003C\u002Fspan\u003E\u003Cspan id=\"E2042\" class=\"qowt-font10-Arial\"\u003Er também o total geral por base.\u003C\u002Fspan\u003E\u003Cspan id=\"E2043\" class=\"qowt-font10-Arial\"\u003E O Quadro 4 mostra esta consulta e seus resultados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_160675\" aria-describedby=\"caption-attachment-160675\" style=\"width: 716px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26142557\u002Fw4.png\"\u003E\u003Cimg class=\"wp-image-160675 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26142557\u002Fw4.png\" alt=\"\" width=\"716\" height=\"617\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-160675\" class=\"wp-caption-text\"\u003EQuadro 4 : analisando os dados coletados\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E2305\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2306\" class=\"qowt-font10-Arial\"\u003EVale lembrar que, como eu usei uma variável de tabela para gravar os resultados\u003C\u002Fspan\u003E\u003Cspan id=\"E2307\" class=\"qowt-font10-Arial\"\u003E, estes só estarão disponíveis\u003C\u002Fspan\u003E\u003Cspan id=\"E2308\" class=\"qowt-font10-Arial\"\u003E durante a execução do lote de declarações SQL (ou “\u003C\u002Fspan\u003E\u003Cspan id=\"E2309\" class=\"qowt-font10-Arial\"\u003Ebatch\u003C\u002Fspan\u003E\u003Cspan id=\"E2310\" class=\"qowt-font10-Arial\"\u003E”, se preferir).\u003C\u002Fspan\u003E\u003Cspan id=\"E2311\" class=\"qowt-font10-Arial\"\u003E Portanto as declarações que apresentei \u003C\u002Fspan\u003E\u003Cspan id=\"E2312\" class=\"qowt-font10-Arial\"\u003Enos\u003C\u002Fspan\u003E\u003Cspan id=\"E2313\" class=\"qowt-font10-Arial\"\u003E quadro\u003C\u002Fspan\u003E\u003Cspan id=\"E2314\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E2315\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2316\" class=\"qowt-font10-Arial\"\u003E2, 3 e 4 \u003C\u002Fspan\u003E\u003Cspan id=\"E2317\" class=\"qowt-font10-Arial\"\u003Eprecisam ser executadas como um único lote\u003C\u002Fspan\u003E\u003Cspan id=\"E2318\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E2319\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2320\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2321\" class=\"qowt-font10-Arial\"\u003ENesse aspecto, a declaração de uma tabela temporária \u003C\u002Fspan\u003E\u003Cspan id=\"E2322\" class=\"qowt-font10-Arial\"\u003Eseria mais versátil, porque ela irá existir enquanto a sessão \u003C\u002Fspan\u003E\u003Cspan id=\"E2323\" class=\"qowt-font10-Arial\"\u003Epermanecer\u003C\u002Fspan\u003E\u003Cspan id=\"E2324\" class=\"qowt-font10-Arial\"\u003E aberta\u003C\u002Fspan\u003E\u003Cspan id=\"E2325\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E2326\" class=\"qowt-font10-Arial\"\u003E Só não \u003C\u002Fspan\u003E\u003Cspan id=\"E2327\" class=\"qowt-font10-Arial\"\u003Eusei esta alternativa, porque seria necessário alterar\u003C\u002Fspan\u003E\u003Cspan id=\"E2328\" class=\"qowt-font10-Arial\"\u003E a declaração do Quadro 2, adicionando um “\u003C\u002Fspan\u003E\u003Cspan id=\"E2329\" class=\"qowt-font10-Arial\"\u003ECREATE TABLE\u003C\u002Fspan\u003E\u003Cspan id=\"E2330\" class=\"qowt-font10-Arial\"\u003E” \u003C\u002Fspan\u003E\u003Cspan id=\"E2331\" class=\"qowt-font10-Arial\"\u003Eantes da declaração das varáveis.\u003C\u002Fspan\u003E\u003Cspan id=\"E2332\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2333\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2334\" class=\"qowt-font10-Arial\"\u003EPara fazer o download do script completo, click neste \u003C\u002Fspan\u003E\u003Ca id=\"E2335\" contenteditable=\"false\" href=\"https:\u002F\u002Fgithub.com\u002Fwcrivelini\u002Farticles\u002Fblob\u002Fmain\u002FSysTables_Scripts\u002FSysTabScript4.sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E2336\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Elink\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E2337\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"E2338\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-9\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E2339\"\u003ECo\u003C\u002Fspan\u003E\u003Cspan id=\"E2340\"\u003Ementários Finais\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp id=\"E2341\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2342\" class=\"qowt-font10-Arial\"\u003EComo se pode ver, a construção de scripts que atuem em toda instância não é nenhum bicho de sete cabeças. Mas é fato que é preciso muita atenção\u003C\u002Fspan\u003E\u003Cspan id=\"E2343\" class=\"qowt-font10-Arial\"\u003E na construção das declarações e o aprendizado de alguns truques que procurei mostrar aqui.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E2344\" class=\"x-scope qowt-word-para-2 x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2345\" class=\"qowt-font10-Arial\"\u003ENaturalmente \u003C\u002Fspan\u003E\u003Cspan id=\"E2346\" class=\"qowt-font10-Arial\"\u003Ea estratégia de criação de scripts apresentada aqui\u003C\u002Fspan\u003E\u003Cspan id=\"E2347\" class=\"qowt-font10-Arial\"\u003E é apenas uma de várias maneiras \u003C\u002Fspan\u003E\u003Cspan id=\"E2348\" class=\"qowt-font10-Arial\"\u003Eque \u003C\u002Fspan\u003E\u003Cspan id=\"E2349\" class=\"qowt-font10-Arial\"\u003Etratam da execução de ações sobre toda instância SQL. \u003C\u002Fspan\u003E\u003Cspan id=\"E2350\" class=\"qowt-font10-Arial\"\u003EMuitos desenvolvedores usam, por exemplo, o procedimento\u003C\u002Fspan\u003E\u003Cspan id=\"E2351\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2352\" class=\"qowt-font10-Arial\"\u003Esp_MSforeachdb\u003C\u002Fspan\u003E\u003Cspan id=\"E2353\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E2354\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2355\" class=\"qowt-font10-Arial\"\u003EPorém\u003C\u002Fspan\u003E\u003Cspan id=\"E2356\" class=\"qowt-font10-Arial\"\u003E,\u003C\u002Fspan\u003E\u003Cspan id=\"E2357\" class=\"qowt-font10-Arial\"\u003E este recurso não é documentado e nem suportado pela MICROSOFT.\u003C\u002Fspan\u003E\u003Cspan id=\"E2358\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2359\" class=\"qowt-font10-Arial\"\u003EEle até que funciona bem, \u003C\u002Fspan\u003E\u003Cspan id=\"E2360\" class=\"qowt-font10-Arial\"\u003Emas você escolhe usá-lo por sua própria conta e risco.\u003C\u002Fspan\u003E\u003Cspan id=\"E2361\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2362\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2363\" class=\"qowt-font10-Arial\"\u003ENo meu entendimento, quando o desenvolvedor c\u003C\u002Fspan\u003E\u003Cspan id=\"E2364\" class=\"qowt-font10-Arial\"\u003Eria seu próprio script, ao menos\u003C\u002Fspan\u003E\u003Cspan id=\"E2365\" class=\"qowt-font10-Arial\"\u003E ele compreende detalhes das ações que está executando.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2366\" class=\"x-scope qowt-word-para-10\"\u003E\u003Cspan id=\"E2367\" class=\"qowt-font10-Arial\"\u003EVolto a reforçar que o lema do Tio\u003C\u002Fspan\u003E\u003Cspan id=\"E2368\" class=\"qowt-font10-Arial\"\u003E Ben (Homem-Aranha)\u003C\u002Fspan\u003E\u003Cspan id=\"E2369\" class=\"qowt-font10-Arial\"\u003E é mais do que válido \u003C\u002Fspan\u003E\u003Cspan id=\"E2370\" class=\"qowt-font10-Arial\"\u003Eem \u003C\u002Fspan\u003E\u003Cspan id=\"E2371\" class=\"qowt-font10-Arial\"\u003E caso\u003C\u002Fspan\u003E\u003Cspan id=\"E2372\" class=\"qowt-font10-Arial\"\u003Es como o apresentado aqui\u003C\u002Fspan\u003E\u003Cspan id=\"E2373\" class=\"qowt-font10-Arial\"\u003E: “\u003C\u002Fspan\u003E\u003Cspan id=\"E2374\" class=\"qowt-font10-Arial\"\u003ECom grandes poderes vêm grandes responsabilidades”\u003C\u002Fspan\u003E\u003Cspan id=\"E2375\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E2376\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2377\" class=\"x-scope qowt-word-para-10\"\u003E\u003Cspan id=\"E2378\" class=\"qowt-font10-Arial\"\u003ECom scripts que atua\u003C\u002Fspan\u003E\u003Cspan id=\"E2379\" class=\"qowt-font10-Arial\"\u003Em\u003C\u002Fspan\u003E\u003Cspan id=\"E2380\" class=\"qowt-font10-Arial\"\u003E sobre toda instância, v\u003C\u002Fspan\u003E\u003Cspan id=\"E2381\" class=\"qowt-font10-Arial\"\u003Eocê pode\u003C\u002Fspan\u003E\u003Cspan id=\"E2382\" class=\"qowt-font10-Arial\"\u003E reduzir dramaticamente o tempo de execução de tarefas do dia a dia. Mas também corre o risco de destruir sua instância inteira se não testar extensivamente o seu script \u003C\u002Fspan\u003E\u003Cspan id=\"E2383\" class=\"qowt-font10-Arial\"\u003Eem ambiente controlado.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2384\" class=\"x-scope qowt-word-para-10\"\u003E\u003Cspan id=\"E2385\" class=\"qowt-font10-Arial\"\u003EEu uso estes recursos com frequência,\u003C\u002Fspan\u003E\u003Cspan id=\"E2386\" class=\"qowt-font10-Arial\"\u003E mas sempre tenho cuidado de fazer testes para todos os cenários em que meu script pode atuar.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2387\" class=\"x-scope qowt-word-para-10\"\u003E\u003Cspan id=\"E2388\" class=\"qowt-font10-Arial\"\u003EEspero que est\u003C\u002Fspan\u003E\u003Cspan id=\"E2389\" class=\"qowt-font10-Arial\"\u003Ea série de artigos sobre Banco de dados e Scripts SQL tenha sido útil p\u003C\u002Fspan\u003E\u003Cspan id=\"E2390\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E2391\" class=\"qowt-font10-Arial\"\u003Era você também\u003C\u002Fspan\u003E\u003Cspan id=\"E2392\" class=\"qowt-font10-Arial\"\u003E!\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2393\" class=\"x-scope qowt-word-para-1\"\u003E\u003Cspan id=\"E2394\" class=\"qowt-font10-Arial\"\u003EAté a próxima\u003C\u002Fspan\u003E\u003Cspan id=\"E2395\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003ELeia todas as partes aqui:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas\"\u003EScripts SQL e Tabelas de Sistema – Parte 1: Alterando Colunas\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-2-criando-indices\"\u003EScripts SQL e Tabelas de Sistema – Parte 2: Criando Índices\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-3-arquivos-de-log\"\u003EScripts SQL e Tabelas de Sistema – Parte 3: Arquivos de Log\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fscripts-sql-e-tabelas-de-sistema-parte-4-atuando-em-toda-instancia\"\u003EScripts SQL e Tabelas de Sistema – Parte 4: Atuando em Toda Instância\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EFechando esta série sobre Banco de dados e Scripts SQL, apresento um caso mais trabalhoso, onde as consultas envolvem dados de toda instância. Isso quer…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fscripts-sql-e-tabelas-de-sistema-parte-4-atuando-em-toda-instancia","date":"26 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26143410\u002Fbanco-de-dados-1.jpg","externalMention":null,"author":{"id":452,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30184745\u002FwagnercriveliniP-128x128.jpeg","name":"Wagner Crivelini","description":"Consultor Sênior na Microsoft, na área de Data Insights para América Latina. Especialista em bancos de dados, é colunista em diversos portais de TI do Brasil e do exterior, com mais de 100 artigos técnicos publicados. É também co-produtor do DatabaseCast, primeiro podcast brasileiro sobre bancos de dados.","slug":"wagner-crivelini","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fwagner-crivelini","registered":"2010-12-30 11:28:37","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002Fwcrivelini@gmail.com","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.wcrivelini.com.br","mail":"wcrivelini@gmail.com"},"articles_count":91,"views_count":828100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Banco de Dados","slug":"banco-de-dados","id":7209,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados"},{"title":"Data","slug":"data","id":16,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"}],"tags":[{"title":"Atuando em Toda Instância","slug":"atuando-em-toda-instancia","id":8987,"link":"https:\u002F\u002Fimasters.com.br\u002Fatuando-em-toda-instancia"},{"title":"banco de dados","slug":"banco-de-dados-2","id":189,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados-2"},{"title":"dados","slug":"dados","id":374,"link":"https:\u002F\u002Fimasters.com.br\u002Fdados"},{"title":"Data","slug":"data","id":626,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"data base","slug":"data-base","id":946,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata-base"},{"title":"DB","slug":"db","id":1603,"link":"https:\u002F\u002Fimasters.com.br\u002Fdb"},{"title":"instância","slug":"instancia","id":8513,"link":"https:\u002F\u002Fimasters.com.br\u002Finstancia"},{"title":"Scripts SQL","slug":"scripts-sql","id":8975,"link":"https:\u002F\u002Fimasters.com.br\u002Fscripts-sql"},{"title":"sistema","slug":"sistema","id":5170,"link":"https:\u002F\u002Fimasters.com.br\u002Fsistema"},{"title":"sql","slug":"sql","id":706,"link":"https:\u002F\u002Fimasters.com.br\u002Fsql"},{"title":"Tabelas de Sistema","slug":"tabelas-de-sistema","id":8986,"link":"https:\u002F\u002Fimasters.com.br\u002Ftabelas-de-sistema"}],"seo":{"open_graph":{"title":"Scripts SQL e Tabelas de Sistema - Parte 4: Atuando em Toda Instância","description":"Fechando esta série sobre Banco de dados e Scripts SQL, apresento um caso mais trabalhoso, onde as consultas envolvem dados de toda instância. Isso quer...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26143410\u002Fbanco-de-dados-1.jpg","width":800,"height":534},"modified_time":"2024-02-26T15:06:32-03:00","published_time":"2024-02-26T14:39:43-03:00"},"twitter":{"title":"Scripts SQL e Tabelas de Sistema - Parte 4: Atuando em Toda Instância","description":"Fechando esta série sobre Banco de dados e Scripts SQL, apresento um caso mais trabalhoso, onde as consultas envolvem dados de toda instância. Isso quer...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F26143410\u002Fbanco-de-dados-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fscripts-sql-e-tabelas-de-sistema-parte-4-atuando-em-toda-instancia","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fscripts-sql-e-tabelas-de-sistema-parte-4-atuando-em-toda-instancia","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fscripts-sql-e-tabelas-de-sistema-parte-4-atuando-em-toda-instancia"},"type":"post"}],"total":23,"maxPages":2}},"magazines":{"data":[]},"tv":{"recents":{"prevPageToken":"","nextPageToken":"CAwQAA","results":12,"totalPages":439,"items":[{"id":"VAqKKwATTbw","date":"2025-06-25T22:25:53Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FVAqKKwATTbw\u002Fmqdefault.jpg","title":"TOTVS Developers Podcast #70 Qual o futuro do Desenvolvimento FrontEnd","description":"Neste episódio do TOTVS Developers, Wesley Soares recebe Guilherme Prezzi e Ana Paula Weiss pra um papo direto e sem enrolação sobre os caminhos do FrontEnd! \n\nTem de tudo: dos perrengues ao impacto da IA no dia a dia do dev.\nQuer saber como se manter relevante nesse cenário em constante mudança? Dá o play e cola com a gente nessa conversa imperdível! 🚀\n\nProdução iMasters, com:\n\nWesley Soares - Frontend specialist | Senior Software Engineer na TOTVS\n\nGuilherme Prezzi - FrontEnd Architect na TOTVS\n\nAna Paula Weiss - Frontend specialist | Engenheira de Software na TOTVS","shortDescription":"Neste episódio do TOTVS Developers, Wesley Soares recebe Guilherme Prezzi e Ana Paula Weiss pra um papo direto e sem enrolação sobre os caminhos do FrontEnd! \n\nTem de tudo: dos perrengues ao impacto da IA no dia a dia do dev","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=VAqKKwATTbw","author":"Neste episódio do TOTVS Developers","viewCount":65,"fetching":false},{"id":"slDGcrm-u6M","date":"2025-05-15T23:01:00Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FslDGcrm-u6M\u002Fmqdefault.jpg","title":"TOTVS Developers Podcast #69 Ferramentas de desenvolvimento","description":"Nesse episódio, Wemerson Guimarães bate um papo com a Pachi Parra e a Aline Lariguet sobre as ferramentas que fazem a diferença na vida de quem desenvolve. \n\nA Pachi traz a visão da comunidade: o que tá em alta, como o open-source impulsiona a galera e dicas pra escolher bem suas ferramentas. Já a Aline compartilha sua rotina prática como dev fullstack, mostrando as ferramentas indispensáveis no dia a dia e como o PO-UI agiliza o desenvolvimento com Angular. \n\nTambém falamos sobre os desafios na adoção de novas techs, a fadiga de ferramentas e as tendências que estão moldando o futuro — como IA, low-code e observability. \n\nBora ouvir?\n\nHost - Wemerson Guimarães - Product Manager | Product Owner | Software Architect - https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fwemersonguimaraes\u002F \n\nCo-Host - Aline Lariguet - Product Owner e desenvolvedora no PO UI - https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Faline-lariguet\u002F \n\nConvidada - Pachi Parra - Developer Advocate no GitHub","shortDescription":"Nesse episódio, Wemerson Guimarães bate um papo com a Pachi Parra e a Aline Lariguet sobre as ferramentas que fazem a diferença na vida de quem desenvolve","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=slDGcrm-u6M","author":"Nesse episódio","viewCount":35,"fetching":false},{"id":"1cZiJlcb2V4","date":"2025-05-11T11:50:29Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F1cZiJlcb2V4\u002Fmqdefault.jpg","title":"TOTVS Developers Podcast #42 CI CD","description":"Olá,\n\nNeste episódio iremos falamos sobre CI\u002FCD\n\nVamos começar o nosso papo explicando um pouco sobre CI e CD mas com a ajuda de um terceiro convidado, o ChatGPT. E ver se ele acerta o que é o CI\u002FCD.\n\nQuais os principais desafios ao implementar e, principalmente, manter um processo de CI\u002FCD?\n\nTambém a evolução dos pipelines em parceria com os produtos .\n\nE muito mais...\n\n--- Dê o play\n\nCONVIDADOS:\n\n1 - LUCAS SEPE - lucas.sepe@totvs.com.br (https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Flucas-peixoto-sepe-883273b4\u002F) \n\n2 - RENATO CUNHA - renato.cunha@totvs.com.br \u002F cunharenatodev@gmail.com\n(https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fcunharenatodev\u002F)\n\nHosts\n\nJuliano Alves\n\nReinaldo Silotto\n\nProdução Executiva - Diego de Lima - https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fdiegodlima\u002F\n\nDicas:\n\n- Universidade TOTVS\n\n- Automação e script com shell utilizando linux.\n\nLivros:\n\nInspirado: Como criar produtos de tecnologia que os clientes amam\n\nManual de DevOps: como obter agilidade, confiabilidade e segurança em organizações tecnológicas\n\n\nEntrega Contínua: Como Entregar Software de Forma Rápida e Confiável","shortDescription":"Olá,\n\nNeste episódio iremos falamos sobre CI\u002FCD\n\nVamos começar o nosso papo explicando um pouco sobre CI e CD mas com a ajuda de um terceiro convidado, o ChatGPT","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=1cZiJlcb2V4","author":"Olá","viewCount":37,"fetching":false},{"id":"PJb-1-_bEEQ","date":"2025-05-11T11:47:42Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FPJb-1-_bEEQ\u002Fmqdefault.jpg","title":"TOTVS Developers Podcast #43 Microsserviços x Monolitos","description":"Olá,\n\nNeste episódio iremos falamos sobre MICROSSERVIÇOS x MONOLITOS\n\nHoje temos um episódio especial em que vamos discutir o tema monolitos versus microsserviços, abordando as vantagens, desvantagens e fazendo algumas comparações com aplicações modernas e o paradigma antigo. Também temos dois convidados experts no assunto. \n\nE muito mais...\n\n--- Dê o play\n\nCONVIDADOS:\n\n1 - Fernanda A R Silva - Engenheira de Software - https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Ffernanda-a-r-silva-32194bb8\u002F\n\n2 - Fabrício Kneipp - Engenheiro de Software - https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fkneipp\u002F\n\nHosts\n\nJuliano Alves\n\nRenato Cunha\n\nReinaldo Silotto\n\nProdução Executiva - Diego de Lima - https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fdiegodlima\u002F\n\nDicas:\n\nSyngenta Digital Brasil - https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fsyngenta-digital-brasil\u002F\n\nMedium Syngenta Digital Brasil - https:\u002F\u002Fsyngentadigital.medium.com\u002F\n\nLivro: Migrando Sistemas Monolíticos Para Microsserviços: Padrões Evolutivos Para Transformar seu Sistema Monolítico - Autor Sam Newman","shortDescription":"Olá,\n\nNeste episódio iremos falamos sobre MICROSSERVIÇOS x MONOLITOS\n\nHoje temos um episódio especial em que vamos discutir o tema monolitos versus microsserviços, abordando as vantagens, desvantagens e fazendo algumas comparações com aplicações modernas e o paradigma antigo","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=PJb-1-_bEEQ","author":"Olá","viewCount":93,"fetching":false},{"id":"T1meQWUi4A4","date":"2025-03-12T14:00:28Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FT1meQWUi4A4\u002Fmqdefault.jpg","title":"TOTVS Developers Podcast #67 - Presença Feminina no Mercado Tech","description":"Panorama atual da presença feminina no mercado Tech:\nUma pesquisa da Serasa Experian revelou que apenas 0,07% das mulheres no Brasil atuam na área de Tecnologia da Informação (TI), totalizando cerca de 69,8 mil profissionais. Em comparação, 0,33% dos homens estão empregados nesse setor.\n\nDados do IBGE indicam que a participação feminina entre os concluintes de cursos relacionados à ciência da computação e TI caiu de 17,5% em 2012 para 15% em 2022.\n\nApesar disso, há sinais positivos: segundo a Brasscom, o número de mulheres empregadas na área de tecnologia cresceu 1,5 ponto percentual acima do número de homens nos últimos três anos.\n\nA presença feminina no setor de tecnologia tem crescido, mas ainda há barreiras a serem superadas. Neste episódio, discutimos os desafios enfrentados por mulheres na área, desde preconceitos e a síndrome do impostor até a importância da representatividade e liderança feminina.\n\n🚀 Exploramos iniciativas como bootcamps, mentorias e comunidades que incentivam a inclusão, além do impacto da diversidade em equipes e projetos inovadores. Também falamos sobre o papel das empresas e dos homens na construção de um ambiente mais igualitário.\n\n🎙️ Vem com a gente nessa conversa essencial sobre equidade de gênero no Tech e o que podemos esperar para o futuro!\n\n🔔 Inscreva-se no canal e ative as notificações para não perder nenhum conteúdo!\n\nAh, e deixe suas dúvidas e perguntas nos comentários que a gente te responde.\n\nNeste podcast participaram:\n\nRicardo Mansano: Host | Development & Support Manager TOTVS\n\nAna Maria Silva: Cientista da Computação | Embaixadora Programaria\n\nIsla Marques: Coordenadora Cultura de Dados e IA TOTVS","shortDescription":"Panorama atual da presença feminina no mercado Tech:\nUma pesquisa da Serasa Experian revelou que apenas 0,07% das mulheres no Brasil atuam na área de Tecnologia da Informação (TI), totalizando cerca de 69,8 mil profissionais","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=T1meQWUi4A4","author":" Presença Feminina no Mercado Tech","viewCount":30,"fetching":false},{"id":"iK8VJ7D4a0M","date":"2025-02-13T14:01:00Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FiK8VJ7D4a0M\u002Fmqdefault.jpg","title":"TOTVS Developers Podcast #66 - Cultura e Agilidade","description":"TOTVS Developers Podcast #66 - Cultura e Agilidade","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=iK8VJ7D4a0M","author":"Cultura e Agilidade","viewCount":115,"fetching":false},{"id":"Ocysn2nGFXM","date":"2025-01-29T12:14:26Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FOcysn2nGFXM\u002Fmqdefault.jpg","title":"GeekMasters | Criando um chatbot para sua live do youtube com PHP","description":"Descubra como criar um chatbot para interagir com o público em suas lives no YouTube utilizando PHP!\r\n\r\nNeste evento online, você aprenderá a integrar comandos automatizados, personalizar respostas e deixar suas transmissões mais dinâmicas e profissionais.\r\n\r\n💡 O que você vai aprender:\r\nConfiguração do ambiente para desenvolvimento em PHP.\r\nIntegração do chatbot com a API do YouTube.\r\nCriação de comandos automáticos e personalizados.\r\nDicas para tornar seu chatbot ainda mais interativo.\r\n\r\n🚀 Para quem é este evento?\r\nIdeal para criadores de conteúdo, desenvolvedores iniciantes ou entusiastas que desejam elevar o nível das suas lives.\r\n\r\nEvento com:\r\nRodrigo Wanderley de Melo Cardoso (pokemaobr)\r\nDesenvolvedor do eventosti ponto dev, Streamer (Live \"Coder\") na Twitch, palestrante e humorista dev. Organizador e curador de eventos de TI. Bacharel em matemática com MBA em SOA. Evangelista PHPSP e criador do PokePHP. O foco é ajudar a comunidade a disseminar conteúdos técnicos e piadas para devs.","shortDescription":"Descubra como criar um chatbot para interagir com o público em suas lives no YouTube utilizando PHP!\r\n\r\nNeste evento online, você aprenderá a integrar comandos automatizados, personalizar respostas e deixar suas transmissões mais dinâmicas e profissionais","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Ocysn2nGFXM","author":"PHP","viewCount":353,"fetching":false},{"id":"uZERm5oqHUs","date":"2024-12-23T19:00:06Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FuZERm5oqHUs\u002Fmqdefault.jpg","title":"GeekMasters - Melhores do ano!","description":"Fala Devs! Confira no último episódio do GeekMasters de 2024 os melhores momentos do nosso videocast e também do Podcast TOTVS Developers. É muita informação e conteúdo para você aproveita e curtir!","shortDescription":"Fala Devs! Confira no último episódio do GeekMasters de 2024 os melhores momentos do nosso videocast e também do Podcast TOTVS Developers","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=uZERm5oqHUs","author":"Melhores do ano!","viewCount":88,"fetching":false},{"id":"LfpBD0C3gVs","date":"2024-07-02T17:57:26Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FLfpBD0C3gVs\u002Fmqdefault.jpg","title":"TOTVS DEVELOPERS #56 - Explorando o mundo do Protheus","description":"Explore o universo do Protheus conosco! Dicas, segredos e muito mais em nosso podcast. \nPara profissionais de TI e amantes de tecnologia. Assistam!\n\nCONVIDADO:\nRENATO CUNHA\nCOORDENADOR DE ENGENHARIA DE SOFTWARE NA TOTVS \u002F PROTHEUS\n\nHOST:\nRAFAEL CHINAGLIA \nJORNALISTA TOTVS DEVELOPERS","shortDescription":"Explore o universo do Protheus conosco! Dicas, segredos e muito mais em nosso podcast","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=LfpBD0C3gVs","author":"Explorando o mundo do Protheus","viewCount":85,"fetching":false},{"id":"KnbB5xRkvM4","date":"2024-05-29T11:30:10Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FKnbB5xRkvM4\u002Fmqdefault.jpg","title":"TOTVS DEVELOPERS #55 - Design e desenvolvimento de Software","description":"Neste episódio, mergulhamos no design e desenvolvimento de software, cobrindo desde a coleta de requisitos e design até codificação e testes. Vamos discutir as melhores práticas, metodologias ágeis e ferramentas essenciais para criar software eficiente e seguro. Imperdível para entusiastas de tecnologia e desenvolvedores!\n\nParticipantes:\n\nRAFAEL CHINAGLIA - JORNALISTA TOTVS DEVELOPERS\n\nALEX SOARES - DESIGN LEAD NA TOTVS | AUTOR DO LIVRO “DESIGN COM NEUROCIÊNCIA\"","shortDescription":"Neste episódio, mergulhamos no design e desenvolvimento de software, cobrindo desde a coleta de requisitos e design até codificação e testes","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=KnbB5xRkvM4","author":"Design e desenvolvimento de Software","viewCount":148,"fetching":false},{"id":"WE0XYd69zCI","date":"2024-04-30T14:44:47Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FWE0XYd69zCI\u002Fmqdefault.jpg","title":"TOTVS DEVELOPERS #54 - Como a IA pode aumentar a produtividade","description":"Neste episódio, exploramos como a inteligência artificial está revolucionando a produtividade, desde automação de tarefas até insights preditivos.\n\nHOST: RAFAEL CHINAGLIA - JORNALISTA DO TOTVS DEVELOPERS\n\nPARTICIPANTE 1: Ana Claudia Pinto- Consultora Especialista em Fluig na TOTVS\n\nPARTICIPANTE 2: Marcio Martins Souto - Arquiteto de Soluções | Especialista de Pré-Vendas | Engenheiro da Computação","shortDescription":"Neste episódio, exploramos como a inteligência artificial está revolucionando a produtividade, desde automação de tarefas até insights preditivos","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=WE0XYd69zCI","author":"Como a IA pode aumentar a produtividade","viewCount":87,"fetching":false},{"id":"QMfij8G3FzE","date":"2024-03-11T03:00:12Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FQMfij8G3FzE\u002Fmqdefault.jpg","title":"Divulgue seu talento na maior comunidade dev","description":"Reinaldo Silotto e Rafael Chinaglia do time iMasters explicam como divulgar seus talentos e suas skills para a maior comunidade Dev do Brasil, seja por meio de artigos, shorts, Reels e webinars.","shortDescription":"Reinaldo Silotto e Rafael Chinaglia do time iMasters explicam como divulgar seus talentos e suas skills para a maior comunidade Dev do Brasil, seja por meio de artigos, shorts, Reels e webinars","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=QMfij8G3FzE","author":"Reinaldo Silotto e Rafael Chinaglia do time iMasters explicam como divulgar seus talentos e suas skills para a maior comunidade Dev do Brasil","viewCount":84,"fetching":false}]},"most-viewed":{"prevPageToken":"","nextPageToken":"CAwQAA","results":12,"totalPages":439,"items":[{"id":"KbvfV01tSig","date":"2017-06-02T21:01:11Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FKbvfV01tSig\u002Fmqdefault.jpg","title":"DevOps na Vida Real - Jeferson Noronha","description":"Jeferson Noronha, Lead DevOps Engineer da Produban fala sobre DevOps na Vida Real.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br","shortDescription":"Jeferson Noronha, Lead DevOps Engineer da Produban fala sobre DevOps na Vida Real","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=KbvfV01tSig","viewCount":103219,"fetching":false},{"id":"Hu2c7x3yIrw","date":"2018-06-12T14:46:33Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FHu2c7x3yIrw\u002Fmqdefault.jpg","title":"Blockchain e PHP - Criando uma criptomoeda - Gabriel Rodrigues Couto","description":"2017 foi o ano de maior crescimento do mercado de criptomoedas, onde somente o Bitcoin valorizou mais de 500%. O que existe por trás de grande parte das criptomoedas é uma tecnologia chamada Blockchain, que organiza as transações para que sejam distribuídas de forma decentralizada e confiável. Como se implementa um blockchain e alguns dos seus possíveis usos serão mostrados nessa palestra, bem como a criação da primeira criptomoeda em PHP.","shortDescription":"2017 foi o ano de maior crescimento do mercado de criptomoedas, onde somente o Bitcoin valorizou mais de 500%","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Hu2c7x3yIrw","viewCount":38016,"fetching":false},{"id":"KmShf5VDGUM","date":"2017-06-02T21:03:24Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FKmShf5VDGUM\u002Fmqdefault.jpg","title":"PHP & Segurança: Blindando Aplicações Web - Rafael Jaques","description":"Rafael Jaques - Professor da IFRS fala sobre PHP & Segurança: Blindando Aplicações Web.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br","shortDescription":"Rafael Jaques - Professor da IFRS fala sobre PHP & Segurança: Blindando Aplicações Web","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=KmShf5VDGUM","viewCount":28084,"fetching":false},{"id":"Z_XJys9qyGk","date":"2022-02-25T21:57:19Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FZ_XJys9qyGk\u002Fmqdefault.jpg","title":"Por que VIM? Por que decidi trocar uma IDE por um editor no terminal? com Augusto Pascuti","description":"Augusto Pascutii fala sobre o VIM, e a decisão de trocar uma IDE por um editor no terminal no PHP Experience 2015.","shortDescription":"Augusto Pascutii fala sobre o VIM, e a decisão de trocar uma IDE por um editor no terminal no PHP Experience 2015","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Z_XJys9qyGk","viewCount":19860,"fetching":false},{"id":"lkG0yitC3Pg","date":"2015-08-21T18:15:12Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FlkG0yitC3Pg\u002Fmqdefault.jpg","title":"NoSQL em ambientes de alta disponibilidade: Case EasyTaxi com Augusto Pascutti","description":"Augusto Pascutti fala sobre NoSQL em ambientes de alta disponibilidade no DEVCommerce Conference 2015","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=lkG0yitC3Pg","viewCount":18659,"fetching":false},{"id":"RI-lEhT0Jiw","date":"2017-07-07T20:56:19Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FRI-lEhT0Jiw\u002Fmqdefault.jpg","title":"Desenvolvimento de uma Infraestrutura Ágil com Práticas DevOps - Gabriela Dias","description":"Gabriela Dias - Diretora de Operações, da 4Linux fala sobre Desenvolvimento de uma Infraestrutura Ágil com Práticas DevOps. \nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br","shortDescription":"Gabriela Dias - Diretora de Operações, da 4Linux fala sobre Desenvolvimento de uma Infraestrutura Ágil com Práticas DevOps","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=RI-lEhT0Jiw","viewCount":13177,"fetching":false},{"id":"QxRXB1B9m8E","date":"2018-04-19T07:48:41Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FQxRXB1B9m8E\u002Fmqdefault.jpg","title":"Domain-Driven Design: uma visão geral - Eriksen Costa","description":"Domain-Driven Design: uma visão geral para desenvolvedores, artistas, responsáveis ou degustadores de café com leite\n\nSoftware está comendo o mundo e as empresas precisam se tornar em empresas de software. A revolução Ágil que aconteceu nos últimos 16 anos reduziu o ciclo de entrega de software mas deixou uma lacuna de design. Muitos projetos Ágeis estão produzindo código ruim.\nA única forma de resolver esse problema é voltar a fazer design.\nDomain-Driven Design (DDD) é uma forma de desenvolver software que foca em implementar o melhor design de software baseado em modelos que refletem explicitamente as competências da organização.\nEssa palestra introduz o assunto com uma linguagem simples, com foco no design estratégico do DDD e dicas de técnicas para facilitar a modelagem de um domínio.","shortDescription":"Domain-Driven Design: uma visão geral para desenvolvedores, artistas, responsáveis ou degustadores de café com leite\n\nSoftware está comendo o mundo e as empresas precisam se tornar em empresas de software","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=QxRXB1B9m8E","viewCount":11682,"fetching":false},{"id":"S9_K1jwjo1U","date":"2017-05-09T14:08:06Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FS9_K1jwjo1U\u002Fmqdefault.jpg","title":"Construindo e mantendo aplicações multi-tenant - Aryel Tupinambá","description":"Aryel Tupinambá, CTO da LQDI Digital fala sobre Construindo e mantendo aplicações multi-tenant no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Aryel Tupinambá, CTO da LQDI Digital fala sobre Construindo e mantendo aplicações multi-tenant no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=S9_K1jwjo1U","viewCount":7768,"fetching":false},{"id":"Eq9FePINvwU","date":"2016-08-19T14:39:31Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FEq9FePINvwU\u002Fmqdefault.jpg","title":"Estrutura eficiente de cache com Nginx - Eduardo Maia","description":"Eduardo Maia, IT Coordinator da Marisa fala sobre Estrutura eficiente de cache com Nginx no DevCommerce Conference 2016.\nSaiba mais em http:\u002F\u002Fdevcommerce2016.imasters.com.br\u002F.","shortDescription":"Eduardo Maia, IT Coordinator da Marisa fala sobre Estrutura eficiente de cache com Nginx no DevCommerce Conference 2016","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Eq9FePINvwU","viewCount":7198,"fetching":false},{"id":"3alX9_RAouw","date":"2017-05-09T14:14:19Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F3alX9_RAouw\u002Fmqdefault.jpg","title":"PHP distribuído “Microserviços vs Monolito” o melhor dos 2 mundos - Luiz Fernando","description":"Luiz Fernando, Product Owner da Leroy Merlin fala sobre PHP distribuído, fault-tolerant e assíncrono; “Microserviços vs Monolito” o melhor dos 2 mundos no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Luiz Fernando, Product Owner da Leroy Merlin fala sobre PHP distribuído, fault-tolerant e assíncrono; “Microserviços vs Monolito” o melhor dos 2 mundos no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=3alX9_RAouw","viewCount":6551,"fetching":false},{"id":"Yuzfu90xNgs","date":"2018-08-01T14:00:05Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FYuzfu90xNgs\u002Fmqdefault.jpg","title":"The Velopers #3 | Entrevista com Jeferson Noronha (LinuxTips)","description":"Jeferson Noronha fala sobre sua carreira devops, distros linux, evolução de sysadmin, carreira internacional, cervejas e ainda adivinha se é pokémon. \n\nThe Velopers: https:\u002F\u002Ftwitter.com\u002Fthevelopersbr\nJeferson Noronha- https:\u002F\u002Ftwitter.com\u002Fbadtux_\nPokemaobr - https:\u002F\u002Ftwitter.com\u002Fpokemaobr\nLinuxTips: https:\u002F\u002Fwww.linuxtips.com.br #thevelopers #imasters","shortDescription":"Jeferson Noronha fala sobre sua carreira devops, distros linux, evolução de sysadmin, carreira internacional, cervejas e ainda adivinha se é pokémon","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Yuzfu90xNgs","viewCount":6477,"fetching":false},{"id":"e1g_xPNeb24","date":"2016-12-07T19:10:30Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002Fe1g_xPNeb24\u002Fmqdefault.jpg","title":"Webinar: Spring Boot para Microserviços","description":"Esse webinar apresenta o Spring Boot, seus recursos e bibliotecas e como utiliza-lo em uma arquitetura de microserviços preparando o participante a aplicar as técnicas imediatamente.\n\nCONTEÚDO PROGRAMÁTICO\n\n- Microserviços e como ajudam aos devs e as empresas\n- Comunicação via API\n- SpringBoot na sua aplicação\n- Seu primeiro controller\n- Actuator\n- Layout de projeto\n\nSOBRE DIEGO DE OLIVEIRA\n\nEngenheiro de sistemas com mais de doze anos de experiência, Diego é apaixonado pela entrega de software funcionando. Tem experiência de desenvolvimento que varia de sistemas embarcados a distribuídos, bancos de dados, infraestrutura e web. Hoje trabalha como Especialista de Sistemas no UOL-PagSeguro em área de disponibilidade de sistemas, checkout, modularização de componentes e mentoring.","shortDescription":"Esse webinar apresenta o Spring Boot, seus recursos e bibliotecas e como utiliza-lo em uma arquitetura de microserviços preparando o participante a aplicar as técnicas imediatamente","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=e1g_xPNeb24","viewCount":5680,"fetching":false}]},"7-masters":{"prevPageToken":"","nextPageToken":"EAAaHlBUOkNBd2lFRFU0TWtORVJUZzJNME5GTXpaQ1EwSQ","results":12,"totalPages":201,"items":[{"id":"0FmQQrzRk7Y","date":"2019-03-29T16:38:00Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F0FmQQrzRk7Y\u002Fmqdefault.jpg","title":"7Masters Stacks Cloud - Google Cloud em \"7 Minutos\" com Wellington Silva","description":"","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=0FmQQrzRk7Y","author":" Wellington Silva","viewCount":745,"fetching":false},{"id":"5I7vhphzANA","date":"2019-03-22T13:08:31Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F5I7vhphzANA\u002Fmqdefault.jpg","title":"7Masters Stacks Cloud - AWS para desenvolvedores com Junior Rocha","description":"","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=5I7vhphzANA","author":"Junior Rocha","viewCount":713,"fetching":false},{"id":"UoVd0WovlTE","date":"2019-03-22T13:01:00Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FUoVd0WovlTE\u002Fmqdefault.jpg","title":"7Masters Stacks Cloud - IBM Cloud com Filipe Avelino Corrêa","description":"","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=UoVd0WovlTE","author":"Filipe Avelino Corrêa","viewCount":167,"fetching":false},{"id":"KSrP6VZY51c","date":"2019-03-22T12:41:07Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FKSrP6VZY51c\u002Fmqdefault.jpg","title":"7Masters Stacks Cloud - Digital Ocean com Paulo Victor Gomes","description":"","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=KSrP6VZY51c","author":"Paulo Victor Gomes","viewCount":341,"fetching":false},{"id":"PLR69Bue_SA","date":"2019-03-22T12:33:54Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FPLR69Bue_SA\u002Fmqdefault.jpg","title":"7Masters Stacks Cloud - Openstack com Francisco Freire","description":"","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=PLR69Bue_SA","author":"Francisco Freire","viewCount":335,"fetching":false},{"id":"V-HRJPXXWdA","date":"2019-03-21T14:50:32Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FV-HRJPXXWdA\u002Fmqdefault.jpg","title":"7Masters Stacks Cloud - Heroku Like a Pro com Stevan Olegario","description":"","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=V-HRJPXXWdA","author":" Stevan Olegario","viewCount":308,"fetching":false},{"id":"IlwlzPnlsrc","date":"2019-03-22T13:02:02Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FIlwlzPnlsrc\u002Fmqdefault.jpg","title":"7Masters Stacks Cloud - Microsoft Azure - Jaqueline Ramos","description":"","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=IlwlzPnlsrc","author":"Jaqueline Ramos","viewCount":244,"fetching":false},{"id":"yG2E0jI7_vM","date":"2019-01-17T13:02:18Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FyG2E0jI7_vM\u002Fmqdefault.jpg","title":"7Masters Web Semântica - O que aprendi sobre Web Semântica com Cynthia Zanoni","description":"O que aprendi sobre Web Semântica com Cynthia Zanoni","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=yG2E0jI7_vM","author":"Cynthia Zanoni","viewCount":624,"fetching":false},{"id":"Hqsv_mS1XN4","date":"2019-01-17T12:58:35Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FHqsv_mS1XN4\u002Fmqdefault.jpg","title":"7Masters Web Semântica - Modelos Mentais e Semântica com Lucas Silva","description":"Modelos Mentais e Semântica com Lucas Silva","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Hqsv_mS1XN4","author":"Lucas Silva","viewCount":266,"fetching":false},{"id":"45hGqAf5mQQ","date":"2019-01-17T12:54:07Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F45hGqAf5mQQ\u002Fmqdefault.jpg","title":"7Masters Web Semântica - Custom Elements Everywhere com Larissa Abreu","description":"Custom Elements Everywhere com Larissa Abreu","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=45hGqAf5mQQ","author":"Larissa Abreu","viewCount":603,"fetching":false},{"id":"JdvVdlu46bM","date":"2019-01-17T12:52:51Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FJdvVdlu46bM\u002Fmqdefault.jpg","title":"7Masters Web Semântica - Como o CSS moderno impactou as estruturas HTML com Rafael Dantas","description":"Como o CSS moderno impactou a forma como escrevemos as estruturas HTML com Rafael Dantas","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=JdvVdlu46bM","author":"Rafael Dantas","viewCount":314,"fetching":false},{"id":"U-Lipdgnczg","date":"2019-01-17T12:45:45Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FU-Lipdgnczg\u002Fmqdefault.jpg","title":"7Masters Web Semântica - Semantic SEO com Dan Jesus","description":"Semantic SEO com Dan Jesus","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=U-Lipdgnczg","author":"Dan Jesus","viewCount":193,"fetching":false}]},"php-experience":{"prevPageToken":"","nextPageToken":"EAAaHlBUOkNBd2lFRE13T0RreVJEa3dSVU13UXpVMU9EWQ","results":12,"totalPages":30,"items":[{"id":"HaMEdLkwe8I","date":"2017-04-10T14:54:39Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FHaMEdLkwe8I\u002Fmqdefault.jpg","title":"PHP Experience 2017","description":"A gente já tá com saudade do PHP Experience, e você? Assista ao vídeo e veja um pouquinho de como foi o evento, mate a saudade e se prepare para os próximos! JS Experience, Android DevConf e InterCon acontecem em junho, agosto e outubro, fique ligado nas datas!","shortDescription":"","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=HaMEdLkwe8I","author":"A gente já tá com saudade do PHP Experience","viewCount":2780,"fetching":false},{"id":"sZpUP1eSVa0","date":"2017-05-09T13:48:58Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FsZpUP1eSVa0\u002Fmqdefault.jpg","title":"Explorando o Poder dos Middlewares - Daniel Gimenes","description":"Daniel Gimenes, Engenheiro de Software da Maestrooo fala sobre Explorando o Poder dos Middlewares no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Daniel Gimenes, Engenheiro de Software da Maestrooo fala sobre Explorando o Poder dos Middlewares no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=sZpUP1eSVa0","author":"Daniel Gimenes","viewCount":2354,"fetching":false},{"id":"JPkhrVkXKhE","date":"2017-05-09T13:50:37Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FJPkhrVkXKhE\u002Fmqdefault.jpg","title":"Domain-Driven Design - Jefersson Nathan","description":"Jefersson Nathan, PHP Developer da Marco Pivetta Software Development fala sobre Domain-Driven Design no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Jefersson Nathan, PHP Developer da Marco Pivetta Software Development fala sobre Domain-Driven Design no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=JPkhrVkXKhE","author":"Jefersson Nathan","viewCount":9064,"fetching":false},{"id":"yiXWMwgHsvU","date":"2017-05-09T13:53:33Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FyiXWMwgHsvU\u002Fmqdefault.jpg","title":"Compartilhando Qualidade e Conhecimento com Code Review - Antonio Spinelli","description":"Antonio Spinelli, Desenvolvedor Sênior, da CargoX, fala sobre Compartilhando Qualidade e Conhecimento com Code Review no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Antonio Spinelli, Desenvolvedor Sênior, da CargoX, fala sobre Compartilhando Qualidade e Conhecimento com Code Review no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=yiXWMwgHsvU","author":"Antonio Spinelli","viewCount":2821,"fetching":false},{"id":"pYI-xievuOo","date":"2017-05-09T13:56:06Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FpYI-xievuOo\u002Fmqdefault.jpg","title":"Existe Vida Além do REST? - Ravan Scafi","description":"Ravan Scafi, Backend Developer da Leroy Merlin fala sobre Existe Vida Além do REST? no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Ravan Scafi, Backend Developer da Leroy Merlin fala sobre Existe Vida Além do REST? no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=pYI-xievuOo","author":"Ravan Scafi","viewCount":1451,"fetching":false},{"id":"1uvgqbPw-04","date":"2017-05-09T13:59:38Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F1uvgqbPw-04\u002Fmqdefault.jpg","title":"Programação Orientada a Aspectos em PHP - Ricardo Tulio","description":"Ricardo Tulio, Desenvolvedor na Pagar.me fala sobre Programação Orientada a Aspectos em PHP no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Ricardo Tulio, Desenvolvedor na Pagar","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=1uvgqbPw-04","author":"Ricardo Tulio","viewCount":2972,"fetching":false},{"id":"k7YgqITFaKk","date":"2017-05-09T14:01:25Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002Fk7YgqITFaKk\u002Fmqdefault.jpg","title":"Aspectos do Design Orientado a Objetos - João Batista Neto","description":"João Batista Neto, Líder de Desenvolvimento do iMasters fala sobre Aspectos do Design Orientado a Objetos no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"João Batista Neto, Líder de Desenvolvimento do iMasters fala sobre Aspectos do Design Orientado a Objetos no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=k7YgqITFaKk","author":"João Batista Neto","viewCount":13544,"fetching":false},{"id":"fjJnZwFR54I","date":"2017-05-09T14:03:57Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FfjJnZwFR54I\u002Fmqdefault.jpg","title":"The Gates to the Data - Paulo Eduardo Rezende","description":"Paulo Eduardo Rezende, Desenvolvedor Senior da Easy fala sobre The Gates to the Data no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Paulo Eduardo Rezende, Desenvolvedor Senior da Easy fala sobre The Gates to the Data no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=fjJnZwFR54I","author":"Paulo Eduardo Rezende","viewCount":296,"fetching":false},{"id":"S9_K1jwjo1U","date":"2017-05-09T14:08:06Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FS9_K1jwjo1U\u002Fmqdefault.jpg","title":"Construindo e mantendo aplicações multi-tenant - Aryel Tupinambá","description":"Aryel Tupinambá, CTO da LQDI Digital fala sobre Construindo e mantendo aplicações multi-tenant no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Aryel Tupinambá, CTO da LQDI Digital fala sobre Construindo e mantendo aplicações multi-tenant no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=S9_K1jwjo1U","author":"Aryel Tupinambá","viewCount":7768,"fetching":false},{"id":"eoL2hKOxUXw","date":"2017-05-09T14:10:18Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FeoL2hKOxUXw\u002Fmqdefault.jpg","title":"Essay about Event-Driven Architecture - Paulo Victor Gomes","description":"Paulo Victor Gomes, CTO da Natue fala sobre Essay about Event-Driven Architecture no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Paulo Victor Gomes, CTO da Natue fala sobre Essay about Event-Driven Architecture no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=eoL2hKOxUXw","author":"Paulo Victor Gomes","viewCount":1623,"fetching":false},{"id":"3alX9_RAouw","date":"2017-05-09T14:14:19Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F3alX9_RAouw\u002Fmqdefault.jpg","title":"PHP distribuído “Microserviços vs Monolito” o melhor dos 2 mundos - Luiz Fernando","description":"Luiz Fernando, Product Owner da Leroy Merlin fala sobre PHP distribuído, fault-tolerant e assíncrono; “Microserviços vs Monolito” o melhor dos 2 mundos no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Luiz Fernando, Product Owner da Leroy Merlin fala sobre PHP distribuído, fault-tolerant e assíncrono; “Microserviços vs Monolito” o melhor dos 2 mundos no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=3alX9_RAouw","author":"Luiz Fernando","viewCount":6551,"fetching":false},{"id":"nSXxwcPEyV0","date":"2017-05-09T14:16:21Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FnSXxwcPEyV0\u002Fmqdefault.jpg","title":"Memórias das trincheiras (parte 2) - Elton Minetto","description":"Elton Minetto, Co-fundador e CEO da Coderockr fala sobre Memórias das trincheiras no PHP Experience 2017.\nSaiba mais em https:\u002F\u002Fphpexperience2017.imasters.com.br\u002F","shortDescription":"Elton Minetto, Co-fundador e CEO da Coderockr fala sobre Memórias das trincheiras no PHP Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=nSXxwcPEyV0","author":"Elton Minetto","viewCount":573,"fetching":false}]},"android-devconference":{"prevPageToken":"","nextPageToken":"EAAaHlBUOkNBd2lFRGs0TkVNMU9EUkNNRGcyUVVFMlJESQ","results":12,"totalPages":39,"items":[{"id":"hfuhKCEnNPE","date":"2017-08-24T14:18:56Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FhfuhKCEnNPE\u002Fmqdefault.jpg","title":"Android DevConference: Por que usar o Node no backend?","description":"Luiz Fernando Duarte, Developer Evangelista da Umbler, fala sobre a escolha por utilizar Node no seu backend e qual plataforma de desenvolvimento mais agrada.","shortDescription":"Luiz Fernando Duarte, Developer Evangelista da Umbler, fala sobre a escolha por utilizar Node no seu backend e qual plataforma de desenvolvimento mais agrada","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=hfuhKCEnNPE","author":"Luiz Fernando Duarte","viewCount":2436,"fetching":false},{"id":"buB7iYOwU64","date":"2017-08-25T17:21:24Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FbuB7iYOwU64\u002Fmqdefault.jpg","title":"Como um developer inicia um processo de desenvolvimento criativo","description":"Corey Latislaw, do Google Expert Program, fala sobre técnicas para o desenvolvedor adotar um processo criativo em seus projetos.","shortDescription":"Corey Latislaw, do Google Expert Program, fala sobre técnicas para o desenvolvedor adotar um processo criativo em seus projetos","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=buB7iYOwU64","author":"Corey Latislaw","viewCount":603,"fetching":false},{"id":"iaUnT1ne8Zc","date":"2017-08-28T12:51:11Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FiaUnT1ne8Zc\u002Fmqdefault.jpg","title":"Android DevConference: machine learning e a sua evolução","description":"Luiz Gustavo Martins, Developer Advocate do Google, fala sobre as novas tendências de mercado dev e a necessidade de acompanhamento dos com os novos avanços tecnológicos.","shortDescription":"Luiz Gustavo Martins, Developer Advocate do Google, fala sobre as novas tendências de mercado dev e a necessidade de acompanhamento dos com os novos avanços tecnológicos","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=iaUnT1ne8Zc","author":"Luiz Gustavo Martins","viewCount":344,"fetching":false},{"id":"95Y1cJSCl30","date":"2017-08-29T16:56:36Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F95Y1cJSCl30\u002Fmqdefault.jpg","title":"Aumente sua produtividade com ferramentas Google","description":"Marcelo Quinta, Professor da UFG, fala sobre algumas novas ferramentas que instigam o desenvolvedor no seu processo criativo e de organização.","shortDescription":"Marcelo Quinta, Professor da UFG, fala sobre algumas novas ferramentas que instigam o desenvolvedor no seu processo criativo e de organização","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=95Y1cJSCl30","author":"Marcelo Quinta","viewCount":472,"fetching":false},{"id":"5Pl1c9Tv-GM","date":"2017-08-29T17:20:55Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F5Pl1c9Tv-GM\u002Fmqdefault.jpg","title":"Entenda os avanços da nova linguagem oficial para Android","description":"Ramon Rabello, Android Software Engineer Senior da Colab.re, fala sobre os tipos de avanços que a nova linguagem Kotlin trouxe.","shortDescription":"Ramon Rabello, Android Software Engineer Senior da Colab","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=5Pl1c9Tv-GM","author":"Ramon Rabello","viewCount":762,"fetching":false},{"id":"32iTUk5UZtI","date":"2017-08-30T13:22:39Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F32iTUk5UZtI\u002Fmqdefault.jpg","title":"Airbnb: novas tecnologias e integração contínua","description":"Felipe Lima, Software Engineer da Airbnb, fala sobre as novas tecnologias que estão sendo testadas pela empresa e a busca por ferramentas que buscam uma integração contínua.","shortDescription":"Felipe Lima, Software Engineer da Airbnb, fala sobre as novas tecnologias que estão sendo testadas pela empresa e a busca por ferramentas que buscam uma integração contínua","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=32iTUk5UZtI","author":"Felipe Lima","viewCount":351,"fetching":false},{"id":"gIq5lVr3r7M","date":"2017-10-25T12:17:35Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FgIq5lVr3r7M\u002Fmqdefault.jpg","title":"Usando o Firebase como LiveOps para seu game - Vítor Bruno","description":"Vítor Bruno de Almeida - Senior Development Engineer da Samsung fala sobre \"Usando o Firebase como LiveOps para seu game\" no Android Dev Conference 2017.\n\nSaiba mais em https:\u002F\u002Feventos.imasters.com.br\u002Fandroid-devconference","shortDescription":"Vítor Bruno de Almeida - Senior Development Engineer da Samsung fala sobre \"Usando o Firebase como LiveOps para seu game\" no Android Dev Conference 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=gIq5lVr3r7M","author":"Vítor Bruno","viewCount":253,"fetching":false},{"id":"9R_1N3SI_6k","date":"2017-10-25T12:20:56Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F9R_1N3SI_6k\u002Fmqdefault.jpg","title":"Explorando GraphQL no Android com Apollo - Ubiratan Soares","description":"Ubiratan Soares - Software Engineer e Android Google Developer Expert fala sobre \"Explorando GraphQL no Android com Apollo\" no Android Dev Conference 2017.\n\nSaiba mais em https:\u002F\u002Feventos.imasters.com.br\u002Fandroid-devconference\u002F","shortDescription":"Ubiratan Soares - Software Engineer e Android Google Developer Expert fala sobre \"Explorando GraphQL no Android com Apollo\" no Android Dev Conference 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=9R_1N3SI_6k","author":"Ubiratan Soares","viewCount":1195,"fetching":false},{"id":"QVjLqY2P3nk","date":"2017-10-25T12:23:09Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FQVjLqY2P3nk\u002Fmqdefault.jpg","title":"Instant apps: O que é e por que você deveria pensar em usar - Tomaz e Vinicius","description":"Tomaz Rocha da Silva - Software Engineer da HP e Vinicius Suzuki - Lead Android Developer da HP falam sobre \"Instant apps: O que é e por que você deveria pensar em usar\" no Android Dev Conference 2017\n\nSaiba mais em https:\u002F\u002Feventos.imasters.com.br\u002Fandroid-devconference\u002F","shortDescription":"Tomaz Rocha da Silva - Software Engineer da HP e Vinicius Suzuki - Lead Android Developer da HP falam sobre \"Instant apps: O que é e por que você deveria pensar em usar\" no Android Dev Conference 2017\n\nSaiba mais em https:\u002F\u002Feventos","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=QVjLqY2P3nk","author":"Tomaz e Vinicius","viewCount":1974,"fetching":false},{"id":"ijV8FDy5ppc","date":"2017-10-25T12:32:09Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FijV8FDy5ppc\u002Fmqdefault.jpg","title":"Kotlin: 9 meses depois - Thiago Porciúncula e André Luiz Cardoso","description":"Thiago Porciúncula - Software Engineer na ArcTouch e André Luiz Cardoso - Software Engineer na ArcTouch falam sobre \"Kotlin: 9 meses depois\" no Android Dev Conference 2017.\n\nSaiba mais em https:\u002F\u002Feventos.imasters.com.br\u002Fandroid-devconference\u002F","shortDescription":"Thiago Porciúncula - Software Engineer na ArcTouch e André Luiz Cardoso - Software Engineer na ArcTouch falam sobre \"Kotlin: 9 meses depois\" no Android Dev Conference 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=ijV8FDy5ppc","author":"Thiago Porciúncula e André Luiz Cardoso","viewCount":294,"fetching":false},{"id":"PGCtyRQwRFM","date":"2017-10-25T12:34:12Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FPGCtyRQwRFM\u002Fmqdefault.jpg","title":"Coordinators pattern para Android - Matheus Cassiano","description":"Matheus Cassiano - Android Developer na Concrete, fala sobre \"Coordinators pattern para Android: como isolar completamente as camadas de navegação e apresentação do seu app\" no Android Dev Conference 2017.\n\nSaiba mais em https:\u002F\u002Feventos.imasters.com.br\u002Fandroid-devconference\u002F","shortDescription":"Matheus Cassiano - Android Developer na Concrete, fala sobre \"Coordinators pattern para Android: como isolar completamente as camadas de navegação e apresentação do seu app\" no Android Dev Conference 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=PGCtyRQwRFM","author":"Matheus Cassiano","viewCount":692,"fetching":false},{"id":"SRY1fokvXdE","date":"2017-10-25T12:35:46Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FSRY1fokvXdE\u002Fmqdefault.jpg","title":"VIPER no Android - Gabriel Bianchini e Thiago Porciúncula","description":"Gabriel Bianchini - Mobile Software Engineer na ArcTouch e Thiago Porciúncula - Software Engineer na ArcTouch, falam sobre \"VIPER no Android\" no Android Dev Conference 2017.\n\nSaiba mais em https:\u002F\u002Feventos.imasters.com.br\u002Fandroid-devconference\u002F","shortDescription":"Gabriel Bianchini - Mobile Software Engineer na ArcTouch e Thiago Porciúncula - Software Engineer na ArcTouch, falam sobre \"VIPER no Android\" no Android Dev Conference 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=SRY1fokvXdE","author":"Gabriel Bianchini e Thiago Porciúncula","viewCount":587,"fetching":false}]},"js-experience":{"prevPageToken":"","nextPageToken":"EAAaHlBUOkNBd2lFRE13T0RreVJEa3dSVU13UXpVMU9EWQ","results":12,"totalPages":13,"items":[{"id":"-AqqUqnw_3o","date":"2017-06-26T18:11:26Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F-AqqUqnw_3o\u002Fmqdefault.jpg","title":"JS Experience 2017","description":"Guilherme de Souza, CTO da RevMOb, leva conhecimento e inovação para a primeira edição do JS Experience. Veja os principais pontos abordados na sua palestra.","shortDescription":"Guilherme de Souza, CTO da RevMOb, leva conhecimento e inovação para a primeira edição do JS Experience","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=-AqqUqnw_3o","author":"Guilherme de Souza","viewCount":1728,"fetching":false},{"id":"NvxhaCL6DXE","date":"2017-06-26T18:19:47Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FNvxhaCL6DXE\u002Fmqdefault.jpg","title":"JS Experience 2017","description":"Loiane Groner, Software Developer do Citibank, fala no JS Experience sobre o por que o desenvolvimento com Ionic tende a ser mais rápido, as vantagens que o NPR tem sobre o Yarn e os principais pontos de uma programação assíncrona no Ionic.","shortDescription":"Loiane Groner, Software Developer do Citibank, fala no JS Experience sobre o por que o desenvolvimento com Ionic tende a ser mais rápido, as vantagens que o NPR tem sobre o Yarn e os principais pontos de uma programação assíncrona no Ionic","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=NvxhaCL6DXE","author":"Loiane Groner","viewCount":1247,"fetching":false},{"id":"0V7vFdeKM90","date":"2017-06-26T18:33:57Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F0V7vFdeKM90\u002Fmqdefault.jpg","title":"JS Experience 2017","description":"Zeno Rocha, Principal Developer Advocate da Liferay, conta os principais pontos abordados na sua palestra na primeira edição do JS Experience.","shortDescription":"Zeno Rocha, Principal Developer Advocate da Liferay, conta os principais pontos abordados na sua palestra na primeira edição do JS Experience","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=0V7vFdeKM90","author":"Zeno Rocha","viewCount":927,"fetching":false},{"id":"XyXPgCc1oVw","date":"2018-06-05T17:32:34Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FXyXPgCc1oVw\u002Fmqdefault.jpg","title":"ECMAScript 7 - Fernanda Bernardo","description":"Fernanda Bernardo, Engenheira de Software da Elo7, fala sobre ECMAScript 7 no JS Experience 2017. Saiba mais em: https:\u002F\u002Feventos.imasters.com.br\u002Fjsexperience\u002F2017\u002F","shortDescription":"Fernanda Bernardo, Engenheira de Software da Elo7, fala sobre ECMAScript 7 no JS Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=XyXPgCc1oVw","author":"Fernanda Bernardo","viewCount":2403,"fetching":false},{"id":"k07DBTYj9w8","date":"2018-06-05T17:38:53Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002Fk07DBTYj9w8\u002Fmqdefault.jpg","title":"Javascript Funcional - Arthur Xavier","description":"Arthur Xavier, Researcher e Developer, fala sobre Javascript Funcional no JS Experience 2017. Saiba mais em: https:\u002F\u002Feventos.imasters.com.br\u002Fjsexperience\u002F2017\u002F","shortDescription":"Arthur Xavier, Researcher e Developer, fala sobre Javascript Funcional no JS Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=k07DBTYj9w8","author":"Arthur Xavier","viewCount":3297,"fetching":false},{"id":"0VQItk9jXIM","date":"2018-06-05T17:37:32Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002F0VQItk9jXIM\u002Fmqdefault.jpg","title":"Performance Web além do carregamento - Sergio Lopes","description":"Sergio Lopes, Diretor e Professor, fala sobre Performance Web além do carregamento no JS Experience 2017. Saiba mais em: https:\u002F\u002Feventos.imasters.com.br\u002Fjsexperience\u002F2017\u002F","shortDescription":"Sergio Lopes, Diretor e Professor, fala sobre Performance Web além do carregamento no JS Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=0VQItk9jXIM","author":"Sergio Lopes","viewCount":2611,"fetching":false},{"id":"VclBv_Yjigo","date":"2018-06-05T17:34:47Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FVclBv_Yjigo\u002Fmqdefault.jpg","title":"Programação reativa com Ionic - Loiane Groner","description":"Loiane Groner, Software Developer da Citibank, fala sobre Programação reativa com Ionic no JS Experience 2017. Saiba mais em: https:\u002F\u002Feventos.imasters.com.br\u002Fjsexperience\u002F2017\u002F","shortDescription":"Loiane Groner, Software Developer da Citibank, fala sobre Programação reativa com Ionic no JS Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=VclBv_Yjigo","author":"Loiane Groner","viewCount":2483,"fetching":false},{"id":"UnyHK12CsXA","date":"2018-06-05T17:35:18Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FUnyHK12CsXA\u002Fmqdefault.jpg","title":"Angular+React+Vue: Arquitetura, Performance e Usabilidade - Painel","description":"Heloá Meneses, Fellipe Azambuja, Juscilan Moreto e William Grasel, falam sobre Angular+React+Vue: Arquitetura, Performance e Usabilidade no JS Experience 2017. Saiba mais em: https:\u002F\u002Feventos.imasters.com.br\u002Fjsexperience\u002F2017\u002F","shortDescription":"Heloá Meneses, Fellipe Azambuja, Juscilan Moreto e William Grasel, falam sobre Angular+React+Vue: Arquitetura, Performance e Usabilidade no JS Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=UnyHK12CsXA","author":"Painel","viewCount":9912,"fetching":false},{"id":"ulxRhvPn5vM","date":"2018-06-05T17:36:15Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FulxRhvPn5vM\u002Fmqdefault.jpg","title":"Programação Sustentável desde a Linguagem - Leo Balter","description":"Leo Balter, Open Web Engineer da Bocoup, fala sobre Programação Sustentável desde a Linguagem no JS Experience 2017. Saiba mais em: https:\u002F\u002Feventos.imasters.com.br\u002Fjsexperience\u002F2017\u002F","shortDescription":"Leo Balter, Open Web Engineer da Bocoup, fala sobre Programação Sustentável desde a Linguagem no JS Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=ulxRhvPn5vM","author":"Leo Balter","viewCount":702,"fetching":false},{"id":"QB98Qd07Bhk","date":"2018-06-05T17:37:48Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FQB98Qd07Bhk\u002Fmqdefault.jpg","title":"Testes em todos os níveis da aplicação - Gustavo Felizola","description":"Gustavo Felizola, Analista Desenvolvedor do Mercado Livre, fala sobre Testes em todos os níveis da aplicação, do código à produção no JS Experience 2017. Saiba mais em: https:\u002F\u002Feventos.imasters.com.br\u002Fjsexperience\u002F2017\u002F","shortDescription":"Gustavo Felizola, Analista Desenvolvedor do Mercado Livre, fala sobre Testes em todos os níveis da aplicação, do código à produção no JS Experience 2017","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=QB98Qd07Bhk","author":"Gustavo Felizola","viewCount":416,"fetching":false},{"id":"xEvbf4OVrLo","date":"2018-06-05T17:40:15Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FxEvbf4OVrLo\u002Fmqdefault.jpg","title":"Armazenamentos offline. APIs para PWA (Progressive Web Apps) - Eduardo Matos","description":"Eduardo Matos, Fullstack Developer da GetNinjas, fala sobre Armazenamentos offline. APIs para PWA (Progressive Web Apps) no JS Experience 2017. Saiba mais em: https:\u002F\u002Feventos.imasters.com.br\u002Fjsexperience\u002F2017\u002F","shortDescription":"Eduardo Matos, Fullstack Developer da GetNinjas, fala sobre Armazenamentos offline","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=xEvbf4OVrLo","author":"Eduardo Matos","viewCount":2300,"fetching":false},{"id":"BmxKt5yFoDU","date":"2018-06-05T17:44:59Z","thumbnail":"https:\u002F\u002Fi.ytimg.com\u002Fvi\u002FBmxKt5yFoDU\u002Fmqdefault.jpg","title":"Talking serious about javascript - Guilherme de Souza","description":"Guilherme de Souza (CTO da RevMob) fala um pouco sobre o seu projeto da criação de uma prótese de braço utilizando Javascript. no JS Experience 2017. Saiba mais em: https:\u002F\u002Feventos.imasters.com.br\u002Fjsexperience\u002F2017\u002F","shortDescription":"Guilherme de Souza (CTO da RevMob) fala um pouco sobre o seu projeto da criação de uma prótese de braço utilizando Javascript","url":"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=BmxKt5yFoDU","author":"Guilherme de Souza","viewCount":3531,"fetching":false}]}},"forums":[],"authorsRanking":{"first":{"articles":[{"id":160514,"title":"Inteligência Artificial e Machine Learning: O que você precisa saber","content":"\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EOlá caro leitor, estou de volta depois de um hiato de quase 4 anos, e trago muitas novidades do mundo da tecnologia! \u003C\u002Fspan\u003E\u003Cspan style=\"font-weight: 400;\"\u003EMuito tem se falado sobre a Inteligência Artificial, e é muito fácil cair na “pegadinha” de achar que Machine Learning é a mesma coisa que IA, e foi justamente isso que me motivou a trazer este artigo para vocês.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EHoje vamos falar sobre dois gigantes do mundo da tecnologia: Inteligência Artificial (IA) e Machine Learning (ML). Esses conceitos podem parecer complexos, mas prometo que vamos explorá-los de maneira simples e direta. Vamos lá entender o que são e como se diferenciam?\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cb\u003EEntendendo a Inteligência Artificial\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EA Inteligência Artificial (IA) é a capacidade de máquinas e sistemas computacionais de simular a inteligência humana. Isso inclui aprender, tomar decisões, e resolver problemas. Enquanto muitos associam IA a robôs de filmes futuristas, a realidade é mais presente e diversificada.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EUm exemplo cotidiano de IA é encontrado nos assistentes virtuais como Siri e Alexa. Eles representam a IA Fraca, especializada em tarefas específicas. Já a IA Forte, ainda em desenvolvimento, visa criar sistemas capazes de realizar uma ampla gama de tarefas de forma autônoma, imitando a inteligência humana mais amplamente.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAlém disso, a IA abrange áreas como processamento de linguagem natural e reconhecimento de padrões, impactando setores variados, desde a medicina até as finanças. A IA não é só sobre máquinas executando tarefas; é sobre sistemas que ‘aprendem’ e se adaptam. A IA Fraca já é uma realidade, enquanto a IA Forte representa uma fronteira emocionante e desafiadora no avanço tecnológico e ético.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003E\u003Cb\u003EMachine Learning (Aprendizado à Máquina)\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EMachine Learning (ML), um subconjunto fascinante da Inteligência Artificial, foca no desenvolvimento de sistemas que aprendem e melhoram a partir da experiência. Ao contrário da programação tradicional, onde as regras são definidas explicitamente, no ML, as máquinas aprendem a identificar padrões e tomar decisões a partir de dados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEssencialmente, o ML permite que computadores melhorem suas habilidades e conhecimento automaticamente, sem intervenção humana direta. Existem diferentes abordagens no ML, como o aprendizado supervisionado, onde o sistema aprende com exemplos previamente etiquetados, e o aprendizado não supervisionado, que encontra padrões em conjuntos de dados sem etiquetas.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EO impacto do ML é vasto, desde sistemas de recomendação, como os usados por serviços de streaming, até diagnósticos médicos avançados. Ao equipar as máquinas com a capacidade de aprender, o ML está não apenas transformando a maneira como interagimos com a tecnologia, mas também expandindo os limites do que as máquinas podem fazer por nós. Como um campo dinâmico e em constante evolução, o ML representa um elemento crucial da IA moderna, prometendo inovações e avanços contínuos.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cb\u003EDiferenciando IA e ML\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EAlcance: Enquanto a IA é um campo amplo com o objetivo de simular a inteligência geral humana, o ML é mais específico, concentrando-se em desenvolver sistemas que aprendem e evoluem a partir de dados.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EFuncionalidades: IA abrange uma variedade de funções, incluindo processamento de linguagem natural, reconhecimento de voz, etc. O ML, por outro lado, é focado principalmente em algoritmos de aprendizado e adaptação.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\" aria-level=\"1\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EObjetivos: A IA visa criar sistemas autônomos capazes de realizar tarefas inteligentes, enquanto o ML se dedica a desenvolver métodos para que as máquinas aprendam com os dados.\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEntender a diferença entre IA e ML é essencial para quem se interessa pelo fascinante mundo da tecnologia. O ML é uma parte crucial da IA, mas não abrange toda a sua extensão. É importante reconhecer essa distinção para ter uma visão clara sobre o avanço e as possibilidades dentro do campo tecnológico. Agora que você tem uma noção básica, que tal explorar mais esse universo?\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EEu estou publicando aulas sobre ML e IA no meu canal do Youtube semanalmente e te convido a assisti-las! Além de aulas sobre ML e IA, você também vai encontrar um montão de conteúdo sobre tecnologia!\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EPara acessar a playlist de aulas sobre ML e IA é só clicar \u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=2zMYTFuwHaQ&list=PLvZ08PHyHqDlVWMc2AxA5idUqkm_Q1hkQ\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003Eaqui\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan style=\"font-weight: 400;\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EGostou do artigo? Deixe o seu comentário abaixo, sugerindo novos temas! Será um prazer atendê-lo!\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EMuito tem se falado sobre a Inteligência Artificial, e é muito fácil cair na “pegadinha” de achar que Machine Learning é a mesma coisa que IA, e foi…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Finteligencia-artificial-e-machine-learning-o-que-voce-precisa-saber","date":"2 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02142745\u002FInteligenciaartificial3-1.jpg","externalMention":null,"author":{"id":148887,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2019\u002F01\u002F29171511\u002Fdouglas-carlos.png","name":"Douglas Carlos Men","description":"Programador, Professor e Entusiasta da Tecnologia","slug":"douglascarlosmen","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdouglascarlosmen","registered":"2019-01-24 12:49:50","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FProgramando-com-PHP-830861330582997","twitter":"https:\u002F\u002Ftwitter.com\u002Fdouglasmen_php","instagram":null,"github":null,"url":"","mail":"douglas@programandocomphp.com.br"},"articles_count":12,"views_count":14400,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Machine Learning","slug":"machine-learning","id":8908,"link":"https:\u002F\u002Fimasters.com.br\u002Fmachine-learning"}],"tags":[{"title":"AI","slug":"ai","id":451,"link":"https:\u002F\u002Fimasters.com.br\u002Fai"},{"title":"aprendizado de máquina","slug":"aprendizado-de-maquina","id":4960,"link":"https:\u002F\u002Fimasters.com.br\u002Faprendizado-de-maquina"},{"title":"artificial inteligence","slug":"artificial-inteligence","id":5473,"link":"https:\u002F\u002Fimasters.com.br\u002Fartificial-inteligence"},{"title":"IA","slug":"ia","id":4660,"link":"https:\u002F\u002Fimasters.com.br\u002Fia"},{"title":"inteligência artificial","slug":"inteligencia-artificial","id":2663,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"machine learning","slug":"machine-learning","id":4608,"link":"https:\u002F\u002Fimasters.com.br\u002Fmachine-learning"},{"title":"ml","slug":"ml","id":4716,"link":"https:\u002F\u002Fimasters.com.br\u002Fml"}],"seo":{"open_graph":{"title":"O que você precisa saber sobre Inteligência Artificial e Machine Learning","description":"Muito tem se falado sobre a Inteligência Artificial, e é muito fácil cair na “pegadinha” de achar que Machine Learning é a mesma coisa que IA, e foi...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02142745\u002FInteligenciaartificial3-1.jpg","width":800,"height":530},"modified_time":"2024-02-02T14:32:57-03:00","published_time":"2024-02-02T14:30:46-03:00"},"twitter":{"title":"O que você precisa saber sobre Inteligência Artificial e Machine Learning","description":"Muito tem se falado sobre a Inteligência Artificial, e é muito fácil cair na “pegadinha” de achar que Machine Learning é a mesma coisa que IA, e foi...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02142745\u002FInteligenciaartificial3-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Finteligencia-artificial-e-machine-learning-o-que-voce-precisa-saber","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Finteligencia-artificial-e-machine-learning-o-que-voce-precisa-saber","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial\u002Finteligencia-artificial-e-machine-learning-o-que-voce-precisa-saber"},"type":"post"}],"articlesCount":12,"name":"Douglas Carlos Men","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2019\u002F01\u002F29171511\u002Fdouglas-carlos.png","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fdouglascarlosmen","viewsCount":14400},"others":[{"id":160521,"title":"Scripts SQL e Tabelas de Sistema – Parte 1: Alterando Colunas","content":"\u003Cp id=\"E936\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E937\" class=\"qowt-font10-Arial\"\u003ETodo administrador \u003C\u002Fspan\u003E\u003Cspan id=\"E938\" class=\"qowt-font10-Arial\"\u003Eou desenvolvedor de bancos de dados, cedo ou tarde, vai precisar criar\u003C\u002Fspan\u003E\u003Cspan id=\"E939\" class=\"qowt-font10-Arial\"\u003E scripts para executar múltiplas tarefas que se repetem para vários objetos.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E940\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E941\" class=\"qowt-font10-Arial\"\u003EAlém de ser uma \u003C\u002Fspan\u003E\u003Cspan id=\"E942\" class=\"qowt-font10-Arial\"\u003Etarefa tediosa, preparar este\u003C\u002Fspan\u003E\u003Cspan id=\"E943\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E944\" class=\"qowt-font10-Arial\"\u003E script\u003C\u002Fspan\u003E\u003Cspan id=\"E945\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E946\" class=\"qowt-font10-Arial\"\u003E manualmente é um processo \u003C\u002Fspan\u003E\u003Cspan id=\"E947\" class=\"qowt-font10-Arial\"\u003Eque envolve grande risco \u003C\u002Fspan\u003E\u003Cspan id=\"E948\" class=\"qowt-font10-Arial\"\u003Ede \u003C\u002Fspan\u003E\u003Cspan id=\"E949\" class=\"qowt-font10-Arial\"\u003Eerro.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E950\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E951\" class=\"qowt-font10-Arial\"\u003EO procedimento envolve, \u003C\u002Fspan\u003E\u003Cspan id=\"E952\" class=\"qowt-font10-Arial\"\u003Eprimeiramente identificar\u003C\u002Fspan\u003E\u003Cspan id=\"E953\" class=\"qowt-font10-Arial\"\u003E,\u003C\u002Fspan\u003E\u003Cspan id=\"E954\" class=\"qowt-font10-Arial\"\u003E os objetos que precisam ser al\u003C\u002Fspan\u003E\u003Cspan id=\"E955\" class=\"qowt-font10-Arial\"\u003Eterados e então construir as instruções DDL (DROP, CREATE, ALTER\u003C\u002Fspan\u003E\u003Cspan id=\"E956\" class=\"qowt-font10-Arial\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E957\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E958\" class=\"qowt-font10-Arial\"\u003EUm método de simplificar \u003C\u002Fspan\u003E\u003Cspan id=\"E959\" class=\"qowt-font10-Arial\"\u003Eas duas tarefas\u003C\u002Fspan\u003E\u003Cspan id=\"E960\" class=\"qowt-font10-Arial\"\u003E é \u003C\u002Fspan\u003E\u003Cspan id=\"E961\" class=\"qowt-font10-Arial\"\u003Ecriando consultas sobre as tabelas de sistema do banco de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E962\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E963\" class=\"qowt-font10-Arial\"\u003E(metadados) \u003C\u002Fspan\u003E\u003Cspan id=\"E964\" class=\"qowt-font10-Arial\"\u003Ee \u003C\u002Fspan\u003E\u003Cspan id=\"E965\" class=\"qowt-font10-Arial\"\u003Eentão definir na cláusula SELECT uma cadeia de caracteres que gera estas instruções DDL.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fo-caso-das-consultas-lentas-no-synapse\"\u003EO Caso das Consultas Lentas no Synapse\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E966\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E967\" class=\"qowt-font10-Arial\"\u003EEssa técnica\u003C\u002Fspan\u003E\u003Cspan id=\"E968\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E969\" class=\"qowt-font10-Arial\"\u003Epode ser usada\u003C\u002Fspan\u003E\u003Cspan id=\"E970\" class=\"qowt-font10-Arial\"\u003E tanto para base de dados do SQL Server (on-premises)\u003C\u002Fspan\u003E\u003Cspan id=\"E971\" class=\"qowt-font10-Arial\"\u003E quanto das versões do AZURE SQL DB.\u003C\u002Fspan\u003E\u003Cspan id=\"E972\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E973\" class=\"qowt-font10-Arial\"\u003EImportante observar q\u003C\u002Fspan\u003E\u003Cspan id=\"E974\" class=\"qowt-font10-Arial\"\u003Eue \u003C\u002Fspan\u003E\u003Cspan id=\"E975\" class=\"qowt-font10-Arial\"\u003Eas tabelas de sistema cobrem praticamente todos os objetos \u003C\u002Fspan\u003E\u003Cspan id=\"E976\" class=\"qowt-font10-Arial\"\u003Edo banco \u003C\u002Fspan\u003E\u003Cspan id=\"E977\" class=\"qowt-font10-Arial\"\u003E(veja o \u003C\u002Fspan\u003E\u003Ca id=\"E978\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Frelational-databases\u002Fsystem-tables\u002Fsystem-tables-transact-sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E979\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Elink\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E980\" class=\"qowt-font10-Arial\"\u003E). P\u003C\u002Fspan\u003E\u003Cspan id=\"E981\" class=\"qowt-font10-Arial\"\u003Eortanto\u003C\u002Fspan\u003E\u003Cspan id=\"E982\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E983\" class=\"qowt-font10-Arial\"\u003Ea mesma técnica se aplica a\u003C\u002Fspan\u003E\u003Cspan id=\"E984\" class=\"qowt-font10-Arial\"\u003E uma quantidade enorme de situações\u003C\u002Fspan\u003E\u003Cspan id=\"E985\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E986\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E987\" class=\"qowt-font10-Arial\"\u003ENeste artigo, apresento \u003C\u002Fspan\u003E\u003Cspan id=\"E988\" class=\"qowt-font10-Arial\"\u003Eum script que \u003C\u002Fspan\u003E\u003Cspan id=\"E989\" class=\"qowt-font10-Arial\"\u003Evarre todas as tabelas de usuário d\u003C\u002Fspan\u003E\u003Cspan id=\"E990\" class=\"qowt-font10-Arial\"\u003Ee um \u003C\u002Fspan\u003E\u003Cspan id=\"E991\" class=\"qowt-font10-Arial\"\u003Ebanco de dados e \u003C\u002Fspan\u003E\u003Cspan id=\"E992\" class=\"qowt-font10-Arial\"\u003Ealtera o tipo de dados \u003C\u002Fspan\u003E\u003Cspan id=\"E993\" class=\"qowt-font10-Arial\"\u003Ed\u003C\u002Fspan\u003E\u003Cspan id=\"E994\" class=\"qowt-font10-Arial\"\u003Eos campos \u003C\u002Fspan\u003E\u003Cspan id=\"E995\" class=\"qowt-font10-Arial\"\u003Eque atendem \u003C\u002Fspan\u003E\u003Cspan id=\"E996\" class=\"qowt-font10-Arial\"\u003Ea \u003C\u002Fspan\u003E\u003Cspan id=\"E997\" class=\"qowt-font10-Arial\"\u003Euma \u003C\u002Fspan\u003E\u003Cspan id=\"E998\" class=\"qowt-font10-Arial\"\u003Ecerta condição.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003EScripts SQL e Tabelas de Sistema\u003C\u002Fh2\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E999\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1000\"\u003EEntendo o Caso de Uso\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1001\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1002\" class=\"qowt-font10-Arial\"\u003EImagine que \u003C\u002Fspan\u003E\u003Cspan id=\"E1003\" class=\"qowt-font10-Arial\"\u003Evocê\u003C\u002Fspan\u003E\u003Cspan id=\"E1004\" class=\"qowt-font10-Arial\"\u003E precisa fazer \u003C\u002Fspan\u003E\u003Cspan id=\"E1005\" class=\"qowt-font10-Arial\"\u003Euma migração do seu banco de dados para um novo servidor SQL Server 2022\u003C\u002Fspan\u003E\u003Cspan id=\"E1006\" class=\"qowt-font10-Arial\"\u003E (\u003C\u002Fspan\u003E\u003Ca id=\"E1007\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fpt-br\u002Fsql\u002Ft-sql\u002Fstatements\u002Falter-database-transact-sql-compatibility-level\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1008\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Enível de compatibilidade \u003C\u002Fspan\u003E\u003Cspan id=\"E1009\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003E16.x\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1010\" class=\"qowt-font10-Arial\"\u003E).\u003C\u002Fspan\u003E\u003Cspan id=\"E1011\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1012\" class=\"qowt-font10-Arial\"\u003EUm dos problemas o\u003C\u002Fspan\u003E\u003Cspan id=\"E1013\" class=\"qowt-font10-Arial\"\u003Ebservados é que \u003C\u002Fspan\u003E\u003Cspan id=\"E1014\" class=\"qowt-font10-Arial\"\u003Eexistem\u003C\u002Fspan\u003E\u003Cspan id=\"E1015\" class=\"qowt-font10-Arial\"\u003E dezenas de campos que usam o tipo de dados TEXT\u003C\u002Fspan\u003E\u003Cspan id=\"E1016\" class=\"qowt-font10-Arial\"\u003E, que está prestes a ser aposentado.\u003C\u002Fspan\u003E\u003Cspan id=\"E1017\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1018\" class=\"qowt-font10-Arial\"\u003ESerá necessário \u003C\u002Fspan\u003E\u003Cspan id=\"E1019\" class=\"qowt-font10-Arial\"\u003Ealterar\u003C\u002Fspan\u003E\u003Cspan id=\"E1020\" class=\"qowt-font10-Arial\"\u003E todos\u003C\u002Fspan\u003E\u003Cspan id=\"E1021\" class=\"qowt-font10-Arial\"\u003E eles\u003C\u002Fspan\u003E\u003Cspan id=\"E1022\" class=\"qowt-font10-Arial\"\u003E para o tipo VARCHAR(MAX)\u003C\u002Fspan\u003E\u003Cspan id=\"E1023\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1024\" class=\"qowt-font10-Arial\"\u003Epara \u003C\u002Fspan\u003E\u003Cspan id=\"E1025\" class=\"qowt-font10-Arial\"\u003Eevitar problemas futuros\u003C\u002Fspan\u003E\u003Cspan id=\"E1026\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1027\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1028\" class=\"qowt-font10-Arial\"\u003ECabe a você identificar todos os casos e providenciar o script que fará as devidas alterações.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"E1029\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1030\"\u003EPreparando o Script\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp id=\"E1031\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1032\" class=\"qowt-font10-Arial\"\u003EPara resolver este problema, basta usar as tabelas \u003C\u002Fspan\u003E\u003Cspan id=\"E1033\" class=\"qowt-font10-Arial\"\u003Esys.\u003C\u002Fspan\u003E\u003Cspan id=\"E1034\" class=\"qowt-font10-Arial\"\u003Eobjects\u003C\u002Fspan\u003E\u003Cspan id=\"E1035\" class=\"qowt-font10-Arial\"\u003E, \u003C\u002Fspan\u003E\u003Cspan id=\"E1036\" class=\"qowt-font10-Arial\"\u003Esys.columns\u003C\u002Fspan\u003E\u003Cspan id=\"E1037\" class=\"qowt-font10-Arial\"\u003E e \u003C\u002Fspan\u003E\u003Cspan id=\"E1038\" class=\"qowt-font10-Arial\"\u003Esys.types\u003C\u002Fspan\u003E\u003Cspan id=\"E1039\" class=\"qowt-font10-Arial\"\u003E, que trazem\u003C\u002Fspan\u003E\u003Cspan id=\"E1040\" class=\"qowt-font10-Arial\"\u003E respectivamente os\u003C\u002Fspan\u003E\u003Cspan id=\"E1041\" class=\"qowt-font10-Arial\"\u003E metadados de tod\u003C\u002Fspan\u003E\u003Cspan id=\"E1042\" class=\"qowt-font10-Arial\"\u003Eo\u003C\u002Fspan\u003E\u003Cspan id=\"E1043\" class=\"qowt-font10-Arial\"\u003Es \u003C\u002Fspan\u003E\u003Cspan id=\"E1044\" class=\"qowt-font10-Arial\"\u003Eos objetos do banco, \u003C\u002Fspan\u003E\u003Cspan id=\"E1045\" class=\"qowt-font10-Arial\"\u003Eos\u003C\u002Fspan\u003E\u003Cspan id=\"E1046\" class=\"qowt-font10-Arial\"\u003E campos\u003C\u002Fspan\u003E\u003Cspan id=\"E1047\" class=\"qowt-font10-Arial\"\u003E das tabelas\u003C\u002Fspan\u003E\u003Cspan id=\"E1048\" class=\"qowt-font10-Arial\"\u003E e \u003C\u002Fspan\u003E\u003Cspan id=\"E1049\" class=\"qowt-font10-Arial\"\u003Eos \u003C\u002Fspan\u003E\u003Cspan id=\"E1050\" class=\"qowt-font10-Arial\"\u003Etipos de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E1051\" class=\"qowt-font10-Arial\"\u003E reconhecidos\u003C\u002Fspan\u003E\u003Cspan id=\"E1052\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1053\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1054\" class=\"qowt-font10-Arial\"\u003ECom \u003C\u002Fspan\u003E\u003Cspan id=\"E1055\" class=\"qowt-font10-Arial\"\u003Eessas três tabelas,\u003C\u002Fspan\u003E\u003Cspan id=\"E1056\" class=\"qowt-font10-Arial\"\u003E teremos condições de identificar os objetos que nos \u003C\u002Fspan\u003E\u003Cspan class=\"qowt-font10-Arial\"\u003Einteressam (campos com tipo de dados “TEXT”\u003C\u002Fspan\u003E\u003Cspan id=\"E1057\" class=\"qowt-font10-Arial\"\u003E) e preparar a declaração DDL desejada. Esta declaração \u003C\u002Fspan\u003E\u003Cspan id=\"E1058\" class=\"qowt-font10-Arial\"\u003Edeverá seguir \u003C\u002Fspan\u003E\u003Cspan id=\"E1059\" class=\"qowt-font10-Arial\"\u003Ea seguinte sintaxe:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02144755\u002Fquadro1.jpg\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160522\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02144755\u002Fquadro1.jpg\" alt=\"\" width=\"722\" height=\"80\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1078\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1079\" class=\"qowt-font10-Arial\"\u003EInicialmente \u003C\u002Fspan\u003E\u003Cspan id=\"E1080\" class=\"qowt-font10-Arial\"\u003Ecrio\u003C\u002Fspan\u003E\u003Cspan id=\"E1081\" class=\"qowt-font10-Arial\"\u003E um\u003C\u002Fspan\u003E\u003Cspan id=\"E1082\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E1083\" class=\"qowt-font10-Arial\"\u003E expressão de tabela\u003C\u002Fspan\u003E\u003Cspan id=\"E1084\" class=\"qowt-font10-Arial\"\u003E comum\u003C\u002Fspan\u003E\u003Cspan id=\"E1085\" class=\"qowt-font10-Arial\"\u003E (\u003C\u002Fspan\u003E\u003Ca id=\"E1086\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fpt-br\u002Fsql\u002Ft-sql\u002Fqueries\u002Fwith-common-table-expression-transact-sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1087\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Ecte\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1088\" class=\"qowt-font10-Arial\"\u003E)\u003C\u002Fspan\u003E\u003Cspan id=\"E1089\" class=\"qowt-font10-Arial\"\u003E para identificar os objetos. Em seguida\u003C\u002Fspan\u003E\u003Cspan id=\"E1090\" class=\"qowt-font10-Arial\"\u003E, uso estes dados para construir\u003C\u002Fspan\u003E\u003Cspan id=\"E1091\" class=\"qowt-font10-Arial\"\u003E as declarações DDL conforme a \u003C\u002Fspan\u003E\u003Cspan id=\"E1092\" class=\"qowt-font10-Arial\"\u003EQuadro\u003C\u002Fspan\u003E\u003Cspan id=\"E1093\" class=\"qowt-font10-Arial\"\u003E1.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1094\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1095\" class=\"qowt-font10-Arial\"\u003EPara que o script possa ser facilmente reaproveitado para outras alterações de tipos de dados, incluo duas variáveis para \u003C\u002Fspan\u003E\u003Cspan id=\"E1096\" class=\"qowt-font10-Arial\"\u003Einformar qual é o tipo de dados buscado e qual é o tipo de dados que será aplicado.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1097\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1098\" class=\"qowt-font10-Arial\"\u003EUsei os colchetes em \u003C\u002Fspan\u003E\u003Cspan id=\"E1099\" class=\"qowt-font10-Arial\"\u003Etodos os objetos\u003C\u002Fspan\u003E\u003Cspan id=\"E1100\" class=\"qowt-font10-Arial\"\u003E de banco para evitar problemas como nomes\u003C\u002Fspan\u003E\u003Cspan id=\"E1101\" class=\"qowt-font10-Arial\"\u003E fora do padrão SQL (exemplo: nomes que incluam palavras reservadas ou espaços em branco).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fsql-server\u002Fanalise-de-grafos-no-azure-sql-db\"\u003EAnálise de Grafos no Azure SQL DB\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan id=\"E1103\" class=\"qowt-font10-Arial\"\u003EO \u003C\u002Fspan\u003E\u003Cspan id=\"E1104\" class=\"qowt-font10-Arial\"\u003EQuadro\u003C\u002Fspan\u003E\u003Cspan id=\"E1105\" class=\"qowt-font10-Arial\"\u003E 2 mostra \u003C\u002Fspan\u003E\u003Cspan id=\"E1106\" class=\"qowt-font10-Arial\"\u003Ea declaração completa e o output obtido.\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02145103\u002Fquadro2.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160523\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02145103\u002Fquadro2.png\" alt=\"\" width=\"721\" height=\"632\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E1414\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1415\" class=\"qowt-font10-Arial\"\u003EObserve que eu adicionei um\u003C\u002Fspan\u003E\u003Cspan id=\"E1416\" class=\"qowt-font10-Arial\"\u003E caractere ponto-e-vírgula ao final de cada declaração\u003C\u002Fspan\u003E\u003Cspan id=\"E1417\" class=\"qowt-font10-Arial\"\u003E para que \u003C\u002Fspan\u003E\u003Cspan id=\"E1418\" class=\"qowt-font10-Arial\"\u003Eelas\u003C\u002Fspan\u003E\u003Cspan id=\"E1419\" class=\"qowt-font10-Arial\"\u003E seja\u003C\u002Fspan\u003E\u003Cspan id=\"E1420\" class=\"qowt-font10-Arial\"\u003Em\u003C\u002Fspan\u003E\u003Cspan id=\"E1421\" class=\"qowt-font10-Arial\"\u003E entendida\u003C\u002Fspan\u003E\u003Cspan id=\"E1422\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1423\" class=\"qowt-font10-Arial\"\u003E pelo SQL como comando\u003C\u002Fspan\u003E\u003Cspan id=\"E1424\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1425\" class=\"qowt-font10-Arial\"\u003E independente\u003C\u002Fspan\u003E\u003Cspan id=\"E1426\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1427\" class=\"qowt-font10-Arial\"\u003E ao invés de tratar a lista de declarações como um \u003C\u002Fspan\u003E\u003Cspan id=\"E1428\" class=\"qowt-font10-Arial\"\u003Epacote \u003C\u002Fspan\u003E\u003Cspan id=\"E1429\" class=\"qowt-font10-Arial\"\u003Eúnico \u003C\u002Fspan\u003E\u003Cspan id=\"E1430\" class=\"qowt-font10-Arial\"\u003E(\u003C\u002Fspan\u003E\u003Cspan id=\"E1431\" class=\"qowt-font10-Arial\"\u003E“\u003C\u002Fspan\u003E\u003Cspan id=\"E1432\" class=\"qowt-font10-Arial\"\u003Ebatch\u003C\u002Fspan\u003E\u003Cspan id=\"E1433\" class=\"qowt-font10-Arial\"\u003E”\u003C\u002Fspan\u003E\u003Cspan id=\"E1434\" class=\"qowt-font10-Arial\"\u003E)\u003C\u002Fspan\u003E\u003Cspan id=\"E1435\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Ch2 id=\"E1436\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-9\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1437\"\u003EFinalizando o Trabalho\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1438\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1439\" class=\"qowt-font10-Arial\"\u003EComo você já observou, o resultado da consulta da \u003C\u002Fspan\u003E\u003Cspan id=\"E1440\" class=\"qowt-font10-Arial\"\u003EQuadro\u003C\u002Fspan\u003E\u003Cspan id=\"E1441\" class=\"qowt-font10-Arial\"\u003E 2 é o próprio script que será \u003C\u002Fspan\u003E\u003Cspan id=\"E1442\" class=\"qowt-font10-Arial\"\u003Eexecutado.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1443\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1444\" class=\"qowt-font10-Arial\"\u003ENeste exemplo,\u003C\u002Fspan\u003E\u003Cspan id=\"E1445\" class=\"qowt-font10-Arial\"\u003E o script gerado tem apenas 2 declarações SQL, que poderiam sim ser criadas manualmente. Mas frequentemente uso esta técnica para criar \u003C\u002Fspan\u003E\u003Cspan id=\"E1446\" class=\"qowt-font10-Arial\"\u003Elistagens com centenas de declarações.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1447\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1448\" class=\"qowt-font10-Arial\"\u003EUm ponto que considero importante mencionar é que costumo adicionar no topo do script um\u003C\u002Fspan\u003E\u003Cspan id=\"E1449\" class=\"qowt-font10-Arial\"\u003Ea declaração para usar o banco de dados correto (“USE \u003C\u002Fspan\u003E\u003Cspan id=\"E1450\" class=\"qowt-font10-Arial\"\u003E[bdX]”). \u003C\u002Fspan\u003E\u003Cspan id=\"E1451\" class=\"qowt-font10-Arial\"\u003EIsso é facilmente inserido no gerador de script\u003C\u002Fspan\u003E\u003Cspan id=\"E1452\" class=\"qowt-font10-Arial\"\u003E, como mostra este esboço (\u003C\u002Fspan\u003E\u003Cspan id=\"E1453\" class=\"qowt-font10-Arial\"\u003EQuadro\u003C\u002Fspan\u003E\u003Cspan id=\"E1454\" class=\"qowt-font10-Arial\"\u003E 3).\u003C\u002Fspan\u003E\u003Cspan id=\"E1455\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02145318\u002Fquadro31.png\"\u003E\u003Cimg class=\"alignnone size-full wp-image-160525\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02145318\u002Fquadro31.png\" alt=\"\" width=\"718\" height=\"187\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan id=\"E1507\" class=\"qowt-font10-Arial\"\u003ECaso prefira fazer o download do script completo, acesse este \u003C\u002Fspan\u003E\u003Ca id=\"E1508\" contenteditable=\"false\" href=\"https:\u002F\u002Fgithub.com\u002Fwcrivelini\u002Farticles\u002Fblob\u002Fmain\u002FSysTables_Scripts\u002FSysTabScript1.sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E1509\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Elink\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1510\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fmysql\u002Fo-caso-do-indice-temporario\"\u003EO Caso do Índice Temporário\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1511\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-9\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1512\"\u003EScripts SQL: Comentários Finais\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1513\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1514\" class=\"qowt-font10-Arial\"\u003EMinha intenção aqui é convencer os que estão iniciando no mundo SQL a dar mais atenção às tabelas de sistema\u003C\u002Fspan\u003E\u003Cspan id=\"E1515\" class=\"qowt-font10-Arial\"\u003E e usar os metadados do banco a seu favor\u003C\u002Fspan\u003E\u003Cspan id=\"E1516\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E1517\" class=\"qowt-font10-Arial\"\u003E Evidentemente estes metadados jamais devem ser alterados manualmente, sob pena de corromper seu banco de dados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1518\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1519\" class=\"qowt-font10-Arial\"\u003EPorém, c\u003C\u002Fspan\u003E\u003Cspan id=\"E1520\" class=\"qowt-font10-Arial\"\u003Eomo se \u003C\u002Fspan\u003E\u003Cspan id=\"E1521\" class=\"qowt-font10-Arial\"\u003Epode ver\u003C\u002Fspan\u003E\u003Cspan id=\"E1522\" class=\"qowt-font10-Arial\"\u003E, a ideia de geração de scripts não é nenhum bicho de sete cabeças.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1523\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1524\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1525\" class=\"qowt-font10-Arial\"\u003EÉ necessári\u003C\u002Fspan\u003E\u003Cspan id=\"E1526\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E1527\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1528\" class=\"qowt-font10-Arial\"\u003Emuita atenção na construção\u003C\u002Fspan\u003E\u003Cspan id=\"E1529\" class=\"qowt-font10-Arial\"\u003E das declarações, \u003C\u002Fspan\u003E\u003Cspan id=\"E1530\" class=\"qowt-font10-Arial\"\u003Epois\u003C\u002Fspan\u003E\u003Cspan id=\"E1531\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1532\" class=\"qowt-font10-Arial\"\u003Equalque\u003C\u002Fspan\u003E\u003Cspan id=\"E1533\" class=\"qowt-font10-Arial\"\u003Er \u003C\u002Fspan\u003E\u003Cspan id=\"E1534\" class=\"qowt-font10-Arial\"\u003Edescuido\u003C\u002Fspan\u003E\u003Cspan id=\"E1535\" class=\"qowt-font10-Arial\"\u003E tem potencial para causar danos na estrutura do banco de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E1536\" class=\"qowt-font10-Arial\"\u003E e, \u003C\u002Fspan\u003E\u003Cspan id=\"E1537\" class=\"qowt-font10-Arial\"\u003Eem\u003C\u002Fspan\u003E\u003Cspan id=\"E1538\" class=\"qowt-font10-Arial\"\u003E casos\u003C\u002Fspan\u003E\u003Cspan id=\"E1539\" class=\"qowt-font10-Arial\"\u003E extremos\u003C\u002Fspan\u003E\u003Cspan id=\"E1540\" class=\"qowt-font10-Arial\"\u003E, perda de dados.\u003C\u002Fspan\u003E\u003Cspan id=\"E1541\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1542\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1543\" class=\"qowt-font10-Arial\"\u003EMas o\u003C\u002Fspan\u003E\u003Cspan id=\"E1544\" class=\"qowt-font10-Arial\"\u003E que costuma correr com frequência\u003C\u002Fspan\u003E\u003Cspan id=\"E1545\" class=\"qowt-font10-Arial\"\u003E com estes geradores de script\u003C\u002Fspan\u003E\u003Cspan id=\"E1546\" class=\"qowt-font10-Arial\"\u003E é que estes \u003C\u002Fspan\u003E\u003Cspan id=\"E1547\" class=\"qowt-font10-Arial\"\u003Edescuidos\u003C\u002Fspan\u003E\u003Cspan id=\"E1548\" class=\"qowt-font10-Arial\"\u003E são detectados na fase de testes\u003C\u002Fspan\u003E\u003Cspan id=\"E1549\" class=\"qowt-font10-Arial\"\u003E. Os \u003C\u002Fspan\u003E\u003Cspan id=\"E1550\" class=\"qowt-font10-Arial\"\u003Escripts\u003C\u002Fspan\u003E\u003Cspan id=\"E1551\" class=\"qowt-font10-Arial\"\u003E incorretos\u003C\u002Fspan\u003E\u003Cspan id=\"E1552\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1553\" class=\"qowt-font10-Arial\"\u003Egeralmente apresentam \u003C\u002Fspan\u003E\u003Cspan id=\"E1554\" class=\"qowt-font10-Arial\"\u003Eerros de sintaxe e\u003C\u002Fspan\u003E\u003Cspan id=\"E1555\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1556\" class=\"qowt-font10-Arial\"\u003Eque, portanto, não são reconhecidos como declarações \u003C\u002Fspan\u003E\u003Cspan id=\"E1557\" class=\"qowt-font10-Arial\"\u003ESQL \u003C\u002Fspan\u003E\u003Cspan id=\"E1558\" class=\"qowt-font10-Arial\"\u003Eválidas.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1559\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1560\" class=\"qowt-font10-Arial\"\u003ENo próximo artigo\u003C\u002Fspan\u003E\u003Cspan id=\"E1561\" class=\"qowt-font10-Arial\"\u003E, o assunto é a reconstrução de índices a partir do metadados. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1562\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1563\" class=\"qowt-font10-Arial\"\u003EAté lá\u003C\u002Fspan\u003E\u003Cspan id=\"E1564\" class=\"qowt-font10-Arial\"\u003E!\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ETodo administrador ou desenvolvedor de bancos de dados, cedo ou tarde, vai precisar criar scripts para executar múltiplas tarefas…. Scripts SQL\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas","date":"2 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02150545\u002Fbancodedados-1.jpg","externalMention":null,"author":{"id":452,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30184745\u002FwagnercriveliniP-128x128.jpeg","name":"Wagner Crivelini","description":"Consultor Sênior na Microsoft, na área de Data Insights para América Latina. Especialista em bancos de dados, é colunista em diversos portais de TI do Brasil e do exterior, com mais de 100 artigos técnicos publicados. É também co-produtor do DatabaseCast, primeiro podcast brasileiro sobre bancos de dados.","slug":"wagner-crivelini","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fwagner-crivelini","registered":"2010-12-30 11:28:37","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002Fwcrivelini@gmail.com","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.wcrivelini.com.br","mail":"wcrivelini@gmail.com"},"articles_count":91,"views_count":828100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Banco de Dados","slug":"banco-de-dados","id":7209,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados"},{"title":"Data","slug":"data","id":16,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"Microsoft Azure","slug":"windows","id":7277,"link":"https:\u002F\u002Fimasters.com.br\u002Fwindows"},{"title":"SQL Server","slug":"sql-server","id":7212,"link":"https:\u002F\u002Fimasters.com.br\u002Fsql-server"}],"tags":[{"title":"azure","slug":"azure","id":2238,"link":"https:\u002F\u002Fimasters.com.br\u002Fazure"},{"title":"banco de dados","slug":"banco-de-dados-2","id":189,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados-2"},{"title":"Data","slug":"data","id":626,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"Scripts SQL","slug":"scripts-sql","id":8975,"link":"https:\u002F\u002Fimasters.com.br\u002Fscripts-sql"},{"title":"sql","slug":"sql","id":706,"link":"https:\u002F\u002Fimasters.com.br\u002Fsql"},{"title":"sql server","slug":"sql-server-2","id":324,"link":"https:\u002F\u002Fimasters.com.br\u002Fsql-server-2"},{"title":"tabela","slug":"tabela","id":751,"link":"https:\u002F\u002Fimasters.com.br\u002Ftabela"}],"seo":{"open_graph":{"title":"Scripts SQL e Tabelas de Sistema - Parte 1: Alterando Colunas","description":"Todo administrador ou desenvolvedor de bancos de dados, cedo ou tarde, vai precisar criar scripts para executar múltiplas tarefas.... Scripts SQL","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02150545\u002Fbancodedados-1.jpg","width":800,"height":533},"modified_time":"2024-02-07T11:28:44-03:00","published_time":"2024-02-02T15:06:57-03:00"},"twitter":{"title":"Scripts SQL e Tabelas de Sistema - Parte 1: Alterando Colunas","description":"Todo administrador ou desenvolvedor de bancos de dados, cedo ou tarde, vai precisar criar scripts para executar múltiplas tarefas.... Scripts SQL","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F02150545\u002Fbancodedados-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas"},"type":"post"},{"id":160546,"title":"Scripts SQL e Tabelas de Sistema – Parte 2: Criando Índices","content":"\u003Cp id=\"E1044\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1045\" class=\"qowt-font10-Arial\"\u003E\u003Cspan id=\"E1062\" class=\"qowt-font10-Arial\"\u003EOi, pessoal. Hoje, \u003C\u002Fspan\u003E\u003Cspan id=\"E1063\" class=\"qowt-font10-Arial\"\u003Eapresento\u003C\u002Fspan\u003E\u003Cspan id=\"E1064\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1065\" class=\"qowt-font10-Arial\"\u003Eo caso em que as colunas que \u003C\u002Fspan\u003E\u003Cspan id=\"E1066\" class=\"qowt-font10-Arial\"\u003Eterão suas\u003C\u002Fspan\u003E\u003Cspan id=\"E1067\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1068\" class=\"qowt-font10-Arial\"\u003Edefinições \u003C\u002Fspan\u003E\u003Cspan id=\"E1069\" class=\"qowt-font10-Arial\"\u003Ealteradas \u003C\u002Fspan\u003E\u003Cspan id=\"E1070\" class=\"qowt-font10-Arial\"\u003Eestão\u003C\u002Fspan\u003E\u003Cspan id=\"E1071\" class=\"qowt-font10-Arial\"\u003E associadas a \u003C\u002Fspan\u003E\u003Cspan id=\"E1072\" class=\"qowt-font10-Arial\"\u003Eíndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1073\" class=\"qowt-font10-Arial\"\u003E. E, mais importante de tudo, como recriar os índices \u003C\u002Fspan\u003E\u003Cspan id=\"E1074\" class=\"qowt-font10-Arial\"\u003Eassociados a tais colunas usando as \u003C\u002Fspan\u003E\u003Cspan id=\"E1075\" class=\"qowt-font10-Arial\"\u003Etabelas de sistema\u003C\u002Fspan\u003E\u003Cspan id=\"E1076\" class=\"qowt-font10-Arial\"\u003E do SQL Server\u003C\u002Fspan\u003E\u003Cspan id=\"E1077\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1045\" class=\"qowt-font10-Arial\"\u003ENo artigo anterior (\u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-1-alterando-colunas\"\u003E\u003Cspan id=\"E1046\" class=\"qowt-font10-Arial\"\u003Eveja link\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E1047\" class=\"qowt-font10-Arial\"\u003E), apresentei um exemplo \u003C\u002Fspan\u003E\u003Cspan id=\"E1048\" class=\"qowt-font10-Arial\"\u003Ecriando um\u003C\u002Fspan\u003E\u003Cspan id=\"E1049\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1050\" class=\"qowt-font10-Arial\"\u003Escript\u003C\u002Fspan\u003E\u003Cspan id=\"E1051\" class=\"qowt-font10-Arial\"\u003E para geração de declarações\u003C\u002Fspan\u003E\u003Cspan id=\"E1052\" class=\"qowt-font10-Arial\"\u003E DDL \u003C\u002Fspan\u003E\u003Cspan id=\"E1053\" class=\"qowt-font10-Arial\"\u003Epara\u003C\u002Fspan\u003E\u003Cspan id=\"E1054\" class=\"qowt-font10-Arial\"\u003E altera\u003C\u002Fspan\u003E\u003Cspan id=\"E1055\" class=\"qowt-font10-Arial\"\u003Er\u003C\u002Fspan\u003E\u003Cspan id=\"E1056\" class=\"qowt-font10-Arial\"\u003E as defini\u003C\u002Fspan\u003E\u003Cspan id=\"E1057\" class=\"qowt-font10-Arial\"\u003Eções de colunas que atendessem \u003C\u002Fspan\u003E\u003Cspan id=\"E1058\" class=\"qowt-font10-Arial\"\u003Ea \u003C\u002Fspan\u003E\u003Cspan id=\"E1059\" class=\"qowt-font10-Arial\"\u003Edeterminadas condições.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2\u003EScripts SQL e Tabelas de Sistema\u003C\u002Fh2\u003E\n\u003Ch3 id=\"E1078\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1079\"\u003EEntenda o Caso de Uso\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp id=\"E1080\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1081\" class=\"qowt-font10-Arial\"\u003EAntes de mais nada, é preciso lembrar que não se pode alterar colunas que estejam vinculadas a \u003C\u002Fspan\u003E\u003Cspan id=\"E1082\" class=\"qowt-font10-Arial\"\u003Eoutros objetos, como \u003C\u002Fspan\u003E\u003Cspan id=\"E1083\" class=\"qowt-font10-Arial\"\u003Eíndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1084\" class=\"qowt-font10-Arial\"\u003E, defaults ou qualquer tipo de \u003C\u002Fspan\u003E\u003Cspan id=\"E1086\" class=\"qowt-font10-Arial\"\u003Econstraints\u003C\u002Fspan\u003E\u003Cspan id=\"E1088\" class=\"qowt-font10-Arial\"\u003E SQL\u003C\u002Fspan\u003E\u003Cspan id=\"E1089\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1090\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1091\" class=\"qowt-font10-Arial\"\u003EVeja no \u003C\u002Fspan\u003E\u003Cspan id=\"E1092\" class=\"qowt-font10-Arial\"\u003EQ\u003C\u002Fspan\u003E\u003Cspan id=\"E1093\" class=\"qowt-font10-Arial\"\u003Euadro\u003C\u002Fspan\u003E\u003Cspan id=\"E1094\" class=\"qowt-font10-Arial\"\u003E 1\u003C\u002Fspan\u003E\u003Cspan id=\"E1095\" class=\"qowt-font10-Arial\"\u003E a seguir o resultado obtido \u003C\u002Fspan\u003E\u003Cspan id=\"E1096\" class=\"qowt-font10-Arial\"\u003Equando tento alterar uma coluna associada a um índice\u003C\u002Fspan\u003E\u003Cspan id=\"E1097\" class=\"qowt-font10-Arial\"\u003E:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06134844\u002FScript1.png\"\u003E\u003Cimg class=\"alignnone wp-image-160550 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06134844\u002FScript1.png\" alt=\"Scripts SQL\" width=\"725\" height=\"196\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1172\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1173\" class=\"qowt-font10-Arial\"\u003EA \u003C\u002Fspan\u003E\u003Cspan id=\"E1174\" class=\"qowt-font10-Arial\"\u003Esolução \u003C\u002Fspan\u003E\u003Cspan id=\"E1175\" class=\"qowt-font10-Arial\"\u003Edo problema\u003C\u002Fspan\u003E\u003Cspan id=\"E1176\" class=\"qowt-font10-Arial\"\u003E é \u003C\u002Fspan\u003E\u003Cspan id=\"E1177\" class=\"qowt-font10-Arial\"\u003Eapagar \u003C\u002Fspan\u003E\u003Cspan id=\"E1178\" class=\"qowt-font10-Arial\"\u003Eeste\u003C\u002Fspan\u003E\u003Cspan id=\"E1179\" class=\"qowt-font10-Arial\"\u003Es índices, alterar as colunas e depois recriar \u003C\u002Fspan\u003E\u003Cspan id=\"E1180\" class=\"qowt-font10-Arial\"\u003Eseus \u003C\u002Fspan\u003E\u003Cspan id=\"E1181\" class=\"qowt-font10-Arial\"\u003Eíndices.\u003C\u002Fspan\u003E\u003Cspan id=\"E1182\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1183\" class=\"qowt-font10-Arial\"\u003ENa teoria, o procedimento é bem simples, mas \u003C\u002Fspan\u003E\u003Cspan id=\"E1184\" class=\"qowt-font10-Arial\"\u003Eé preciso considerar que são necessárias três\u003C\u002Fspan\u003E\u003Cspan id=\"E1185\" class=\"qowt-font10-Arial\"\u003E operações\u003C\u002Fspan\u003E\u003Cspan id=\"E1186\" class=\"qowt-font10-Arial\"\u003E para cada \u003C\u002Fspan\u003E\u003Cspan id=\"E1187\" class=\"qowt-font10-Arial\"\u003Ecoluna\u003C\u002Fspan\u003E\u003Cspan id=\"E1188\" class=\"qowt-font10-Arial\"\u003E que se vai alterar.\u003C\u002Fspan\u003E\u003Cspan id=\"E1189\" class=\"qowt-font10-Arial\"\u003E Sendo assim, o \u003C\u002Fspan\u003E\u003Cspan id=\"E1190\" class=\"qowt-font10-Arial\"\u003Escript\u003C\u002Fspan\u003E\u003Cspan id=\"E1191\" class=\"qowt-font10-Arial\"\u003E final pode facilmente\u003C\u002Fspan\u003E\u003Cspan id=\"E1192\" class=\"qowt-font10-Arial\"\u003E conter \u003C\u002Fspan\u003E\u003Cspan id=\"E1193\" class=\"qowt-font10-Arial\"\u003Ecentenas de \u003C\u002Fspan\u003E\u003Cspan id=\"E1194\" class=\"qowt-font10-Arial\"\u003Edeclara\u003C\u002Fspan\u003E\u003Cspan id=\"E1195\" class=\"qowt-font10-Arial\"\u003Eções\u003C\u002Fspan\u003E\u003Cspan id=\"E1196\" class=\"qowt-font10-Arial\"\u003E SQL\u003C\u002Fspan\u003E\u003Cspan id=\"E1197\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1198\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1199\" class=\"qowt-font10-Arial\"\u003EAutomatizar \u003C\u002Fspan\u003E\u003Cspan id=\"E1200\" class=\"qowt-font10-Arial\"\u003Ea criação desse script\u003C\u002Fspan\u003E\u003Cspan id=\"E1201\" class=\"qowt-font10-Arial\"\u003E não\u003C\u002Fspan\u003E\u003Cspan id=\"E1202\" class=\"qowt-font10-Arial\"\u003E apenas \u003C\u002Fspan\u003E\u003Cspan id=\"E1203\" class=\"qowt-font10-Arial\"\u003Ediminui\u003C\u002Fspan\u003E\u003Cspan id=\"E1204\" class=\"qowt-font10-Arial\"\u003E o tempo de desenvolvimento \u003C\u002Fspan\u003E\u003Cspan id=\"E1205\" class=\"qowt-font10-Arial\"\u003Edo script, mas \u003C\u002Fspan\u003E\u003Cspan id=\"E1206\" class=\"qowt-font10-Arial\"\u003Etambém reduz\u003C\u002Fspan\u003E\u003Cspan id=\"E1207\" class=\"qowt-font10-Arial\"\u003E dra\u003C\u002Fspan\u003E\u003Cspan id=\"E1208\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1209\" class=\"qowt-font10-Arial\"\u003Eticamente o risco de erro\u003C\u002Fspan\u003E\u003Cspan id=\"E1210\" class=\"qowt-font10-Arial\"\u003E no momento da implantação\u003C\u002Fspan\u003E\u003Cspan id=\"E1211\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1212\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1213\" class=\"qowt-font10-Arial\"\u003EEntão\u003C\u002Fspan\u003E\u003Cspan id=\"E1214\" class=\"qowt-font10-Arial\"\u003E o script desejado terá 3 blocos principais:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch4 id=\"E1215\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1216\" class=\"qowt-font10-Arial\"\u003EBloco 1 \u003C\u002Fspan\u003E\u003Cspan id=\"E1217\" class=\"qowt-font10-Arial\"\u003E–\u003C\u002Fspan\u003E\u003Cspan id=\"E1218\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1219\" class=\"qowt-font10-Arial\"\u003Eapagar índices associados às colunas que serão alteradas\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Ch4 id=\"E1220\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1221\" class=\"qowt-font10-Arial\"\u003EBloco 2 – alterar as colunas desejadas (como vimos no artigo anterior)\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Ch4 id=\"E1222\" class=\"x-scope qowt-word-para-2 x-scope qowt-word-para-2 x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1223\" class=\"qowt-font10-Arial\"\u003EBloco 3 – reconstruir \u003C\u002Fspan\u003E\u003Cspan id=\"E1224\" class=\"qowt-font10-Arial\"\u003Eos índices apagados\u003C\u002Fspan\u003E\u003C\u002Fh4\u003E\n\u003Cp id=\"E1225\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1226\" class=\"qowt-font10-Arial\"\u003EA automação \u003C\u002Fspan\u003E\u003Cspan id=\"E1228\" class=\"qowt-font10-Arial\"\u003Edos scripts para\u003C\u002Fspan\u003E\u003Cspan id=\"E1229\" class=\"qowt-font10-Arial\"\u003E cada um destes blocos\u003C\u002Fspan\u003E\u003Cspan id=\"E1230\" class=\"qowt-font10-Arial\"\u003E é apresentada a seguir.\u003C\u002Fspan\u003E\u003Cspan id=\"E1231\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1232\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1233\"\u003EScripts SQL – Defi\u003C\u002Fspan\u003E\u003Cspan id=\"E1234\"\u003En\u003C\u002Fspan\u003E\u003Cspan id=\"E1235\"\u003Ei\u003C\u002Fspan\u003E\u003Cspan id=\"E1236\"\u003Endo\u003C\u002Fspan\u003E\u003Cspan id=\"E1237\"\u003E Escopo\u003C\u002Fspan\u003E\u003Cspan id=\"E1238\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1239\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1240\" class=\"qowt-font10-Arial\"\u003EAntes de criar os blocos 1 e 3, é necessário \u003C\u002Fspan\u003E\u003Cspan id=\"E1241\" class=\"qowt-font10-Arial\"\u003Eidentifica\u003C\u002Fspan\u003E\u003Cspan id=\"E1242\" class=\"qowt-font10-Arial\"\u003Er\u003C\u002Fspan\u003E\u003Cspan id=\"E1243\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1244\" class=\"qowt-font10-Arial\"\u003Equais\u003C\u002Fspan\u003E\u003Cspan id=\"E1245\" class=\"qowt-font10-Arial\"\u003E índices a serem \u003C\u002Fspan\u003E\u003Cspan id=\"E1246\" class=\"qowt-font10-Arial\"\u003Eimpactados\u003C\u002Fspan\u003E\u003Cspan id=\"E1247\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E1248\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1249\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1250\" class=\"qowt-font10-Arial\"\u003ENo\u003C\u002Fspan\u003E\u003Cspan id=\"E1251\" class=\"qowt-font10-Arial\"\u003E Quadro 2\u003C\u002Fspan\u003E\u003Cspan id=\"E1252\" class=\"qowt-font10-Arial\"\u003E apresento a\u003C\u002Fspan\u003E\u003Cspan id=\"E1253\" class=\"qowt-font10-Arial\"\u003E expressão de tabela comum \u003C\u002Fspan\u003E\u003Cspan id=\"E1254\" class=\"qowt-font10-Arial\"\u003E(CTE)\u003C\u002Fspan\u003E\u003Cspan id=\"E1255\" class=\"qowt-font10-Arial\"\u003E que\u003C\u002Fspan\u003E\u003Cspan id=\"E1256\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1257\" class=\"qowt-font10-Arial\"\u003Eidentifica as tabelas\u003C\u002Fspan\u003E\u003Cspan id=\"E1258\" class=\"qowt-font10-Arial\"\u003E e índices afetados pela alteração \u003C\u002Fspan\u003E\u003Cspan id=\"E1259\" class=\"qowt-font10-Arial\"\u003Ede tipos de dados \u003C\u002Fspan\u003E\u003Cspan id=\"E1260\" class=\"qowt-font10-Arial\"\u003Ed\u003C\u002Fspan\u003E\u003Cspan id=\"E1261\" class=\"qowt-font10-Arial\"\u003Eas colunas\u003C\u002Fspan\u003E\u003Cspan id=\"E1262\" class=\"qowt-font10-Arial\"\u003E, seguindo o exemplo mostrado no artigo anterior. \u003C\u002Fspan\u003E\u003Cspan id=\"E1263\" class=\"qowt-font10-Arial\"\u003EEm seguida, identifico os \u003C\u002Fspan\u003E\u003Cspan id=\"E1264\" class=\"qowt-font10-Arial\"\u003Emetadados desses \u003C\u002Fspan\u003E\u003Cspan id=\"E1265\" class=\"qowt-font10-Arial\"\u003Eíndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1266\" class=\"qowt-font10-Arial\"\u003E, para que possam ser recriados posteriormente\u003C\u002Fspan\u003E\u003Cspan id=\"E1267\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135136\u002FScript2.png\"\u003E\u003Cimg class=\"alignnone wp-image-160552 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135136\u002FScript2.png\" alt=\"Scripts SQL\" width=\"725\" height=\"610\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fdata\u002Fo-caso-das-consultas-lentas-no-synapse\"\u003EO Caso das Consultas Lentas no Synapse\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1812\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1813\" class=\"qowt-font10-Arial\"\u003EObserve que criei uma t\u003C\u002Fspan\u003E\u003Cspan id=\"E1814\" class=\"qowt-font10-Arial\"\u003Eabela temporária\u003C\u002Fspan\u003E\u003Cspan id=\"E1815\" class=\"qowt-font10-Arial\"\u003E “\u003C\u002Fspan\u003E\u003Cspan id=\"E1816\" class=\"qowt-font10-Arial\"\u003E#\u003C\u002Fspan\u003E\u003Cspan id=\"E1818\" class=\"qowt-font10-Arial\"\u003EtempIndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1820\" class=\"qowt-font10-Arial\"\u003E”\u003C\u002Fspan\u003E\u003Cspan id=\"E1821\" class=\"qowt-font10-Arial\"\u003E, porque estas\u003C\u002Fspan\u003E\u003Cspan id=\"E1822\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1823\" class=\"qowt-font10-Arial\"\u003Eas\u003C\u002Fspan\u003E\u003Cspan id=\"E1824\" class=\"qowt-font10-Arial\"\u003E informações\u003C\u002Fspan\u003E\u003Cspan id=\"E1825\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1826\" class=\"qowt-font10-Arial\"\u003Eserão usadas duas vezes, na\u003C\u002Fspan\u003E\u003Cspan id=\"E1827\" class=\"qowt-font10-Arial\"\u003E construção dos scripts dos \u003C\u002Fspan\u003E\u003Cspan id=\"E1828\" class=\"qowt-font10-Arial\"\u003Ebloco\u003C\u002Fspan\u003E\u003Cspan id=\"E1829\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E1830\" class=\"qowt-font10-Arial\"\u003E 1 \u003C\u002Fspan\u003E\u003Cspan id=\"E1831\" class=\"qowt-font10-Arial\"\u003Ee \u003C\u002Fspan\u003E\u003Cspan id=\"E1832\" class=\"qowt-font10-Arial\"\u003E3\u003C\u002Fspan\u003E\u003Cspan id=\"E1833\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1834\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1835\" class=\"qowt-font10-Arial\"\u003EOutro ponto importante é que \u003C\u002Fspan\u003E\u003Cspan id=\"E1836\" class=\"qowt-font10-Arial\"\u003Ea declaração\u003C\u002Fspan\u003E\u003Cspan id=\"E1837\" class=\"qowt-font10-Arial\"\u003E acima \u003C\u002Fspan\u003E\u003Cspan id=\"E1838\" class=\"qowt-font10-Arial\"\u003Etraz informação para \u003C\u002Fspan\u003E\u003Cspan id=\"E1839\" class=\"qowt-font10-Arial\"\u003Egera\u003C\u002Fspan\u003E\u003Cspan id=\"E1840\" class=\"qowt-font10-Arial\"\u003Eção de\u003C\u002Fspan\u003E\u003Cspan id=\"E1841\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1842\" class=\"qowt-font10-Arial\"\u003Escript\u003C\u002Fspan\u003E\u003Cspan id=\"E1843\" class=\"qowt-font10-Arial\"\u003Es que envolvam\u003C\u002Fspan\u003E\u003Cspan id=\"E1844\" class=\"qowt-font10-Arial\"\u003E apenas índices \u003C\u002Fspan\u003E\u003Cspan id=\"E1845\" class=\"qowt-font10-Arial\"\u003Enão-\u003C\u002Fspan\u003E\u003Cspan id=\"E1847\" class=\"qowt-font10-Arial\"\u003Eclusterizados\u003C\u002Fspan\u003E\u003Cspan id=\"E1849\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E1850\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E1851\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1852\" class=\"qowt-font10-Arial\"\u003EO caso dos índices \u003C\u002Fspan\u003E\u003Cspan id=\"E1854\" class=\"qowt-font10-Arial\"\u003Eclusterizados\u003C\u002Fspan\u003E\u003Cspan id=\"E1856\" class=\"qowt-font10-Arial\"\u003E requer muito mais cuidado, porque \u003C\u002Fspan\u003E\u003Cspan id=\"E1857\" class=\"qowt-font10-Arial\"\u003Eeles\u003C\u002Fspan\u003E\u003Cspan id=\"E1858\" class=\"qowt-font10-Arial\"\u003E ordenam os dados diretamente nas páginas de dados. Em outras palavras, fisicamente, o índice \u003C\u002Fspan\u003E\u003Cspan id=\"E1860\" class=\"qowt-font10-Arial\"\u003Eclusterizado\u003C\u002Fspan\u003E\u003Cspan id=\"E1862\" class=\"qowt-font10-Arial\"\u003E é a própria tabela. Portanto, não dá para simplesmente exclu\u003C\u002Fspan\u003E\u003Cspan id=\"E1863\" class=\"qowt-font10-Arial\"\u003Eí-los \u003C\u002Fspan\u003E\u003Cspan id=\"E1864\" class=\"qowt-font10-Arial\"\u003Esem que haja perda de dados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E1866\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E1867\"\u003EBloco 1 – \u003C\u002Fspan\u003E\u003Cspan id=\"E1868\"\u003EScript para Excluir Índices\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E1869\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E1870\" class=\"qowt-font10-Arial\"\u003ENe\u003C\u002Fspan\u003E\u003Cspan id=\"E1871\" class=\"qowt-font10-Arial\"\u003Este primeiro bloco\u003C\u002Fspan\u003E\u003Cspan id=\"E1872\" class=\"qowt-font10-Arial\"\u003E, eu monto um\u003C\u002Fspan\u003E\u003Cspan id=\"E1873\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E1874\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1875\" class=\"qowt-font10-Arial\"\u003Edeclaração \u003C\u002Fspan\u003E\u003Cspan id=\"E1876\" class=\"qowt-font10-Arial\"\u003Eque \u003C\u002Fspan\u003E\u003Cspan id=\"E1877\" class=\"qowt-font10-Arial\"\u003Egera \u003C\u002Fspan\u003E\u003Cspan id=\"E1878\" class=\"qowt-font10-Arial\"\u003Eo script\u003C\u002Fspan\u003E\u003Cspan id=\"E1879\" class=\"qowt-font10-Arial\"\u003E de exclusão de \u003C\u002Fspan\u003E\u003Cspan id=\"E1880\" class=\"qowt-font10-Arial\"\u003Eíndices. \u003C\u002Fspan\u003E\u003Cspan id=\"E1881\" class=\"qowt-font10-Arial\"\u003ETal script precisa conter declarações com a \u003C\u002Fspan\u003E\u003Cspan id=\"E1882\" class=\"qowt-font10-Arial\"\u003Esintaxe apresentada a seguir\u003C\u002Fspan\u003E\u003Cspan id=\"E1883\" class=\"qowt-font10-Arial\"\u003E (veja Quadro 3)\u003C\u002Fspan\u003E\u003Cspan id=\"E1884\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135317\u002Fscript3.png\"\u003E\u003Cimg class=\"alignnone wp-image-160553 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135317\u002Fscript3.png\" alt=\"Scripts SQL\" width=\"722\" height=\"90\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan id=\"E1910\" class=\"qowt-font10-Arial\"\u003EAgora\u003C\u002Fspan\u003E\u003Cspan id=\"E1911\" class=\"qowt-font10-Arial\"\u003E, no Quadro 4,\u003C\u002Fspan\u003E\u003Cspan id=\"E1912\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1913\" class=\"qowt-font10-Arial\"\u003Euso uma nova CTE para \u003C\u002Fspan\u003E\u003Cspan id=\"E1914\" class=\"qowt-font10-Arial\"\u003Ele\u003C\u002Fspan\u003E\u003Cspan id=\"E1915\" class=\"qowt-font10-Arial\"\u003Er\u003C\u002Fspan\u003E\u003Cspan id=\"E1916\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E1917\" class=\"qowt-font10-Arial\"\u003Ed\u003C\u002Fspan\u003E\u003Cspan id=\"E1918\" class=\"qowt-font10-Arial\"\u003Ea tabela \u003C\u002Fspan\u003E\u003Cspan id=\"E1919\" class=\"qowt-font10-Arial\"\u003Etemporária “\u003C\u002Fspan\u003E\u003Cspan id=\"E1920\" class=\"qowt-font10-Arial\"\u003E#\u003C\u002Fspan\u003E\u003Cspan id=\"E1922\" class=\"qowt-font10-Arial\"\u003EtempIndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1924\" class=\"qowt-font10-Arial\"\u003E” \u003C\u002Fspan\u003E\u003Cspan id=\"E1925\" class=\"qowt-font10-Arial\"\u003Eapenas \u003C\u002Fspan\u003E\u003Cspan id=\"E1926\" class=\"qowt-font10-Arial\"\u003Eas informações necessárias para apagar estes \u003C\u002Fspan\u003E\u003Cspan id=\"E1927\" class=\"qowt-font10-Arial\"\u003Eíndices\u003C\u002Fspan\u003E\u003Cspan id=\"E1928\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003Cspan id=\"E1929\" class=\"qowt-font10-Arial\"\u003EDepois defino uma cadeia de caracteres que escreva a declaração DDL desejada. \u003C\u002Fspan\u003E\u003Cspan id=\"E1930\" class=\"qowt-font10-Arial\"\u003EA adição do \u003C\u002Fspan\u003E\u003Cspan id=\"E1931\" class=\"qowt-font10-Arial\"\u003Ecaractere\u003C\u002Fspan\u003E\u003Cspan id=\"E1932\" class=\"qowt-font10-Arial\"\u003E CHAR(10) é exatamente para inserção de linhas \u003C\u002Fspan\u003E\u003Cspan id=\"E1933\" class=\"qowt-font10-Arial\"\u003Eextras\u003C\u002Fspan\u003E\u003Cspan id=\"E1934\" class=\"qowt-font10-Arial\"\u003E no script.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135421\u002Fscript4.png\"\u003E\u003Cimg class=\"alignnone wp-image-160554 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135421\u002Fscript4.png\" alt=\"Scripts SQL\" width=\"722\" height=\"657\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fsql-server\u002Fanalise-de-grafos-no-azure-sql-db\"\u003EAnálise de Grafos no Azure SQL DB\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E2220\" class=\"x-scope qowt-word-para-3 qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E2221\"\u003EScripts SQL – Bloco 3 – \u003C\u002Fspan\u003E\u003Cspan id=\"E2222\"\u003EScript para Recriar Índices\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E2223\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2224\" class=\"qowt-font10-Arial\"\u003EA criação de índices \u003C\u002Fspan\u003E\u003Cspan id=\"E2225\" class=\"qowt-font10-Arial\"\u003Eno\u003C\u002Fspan\u003E\u003Cspan id=\"E2226\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2227\" class=\"qowt-font10-Arial\"\u003ESQL \u003C\u002Fspan\u003E\u003Cspan id=\"E2228\" class=\"qowt-font10-Arial\"\u003Eon-premises \u003C\u002Fspan\u003E\u003Cspan id=\"E2229\" class=\"qowt-font10-Arial\"\u003Ee\u003C\u002Fspan\u003E\u003Cspan id=\"E2230\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2231\" class=\"qowt-font10-Arial\"\u003EAzure SQL\u003C\u002Fspan\u003E\u003Cspan id=\"E2232\" class=\"qowt-font10-Arial\"\u003E oferece múltiplas opções para o desenvolvedor.\u003C\u002Fspan\u003E\u003Cspan id=\"E2233\" class=\"qowt-font10-Arial\"\u003E (\u003C\u002Fspan\u003E\u003Ca id=\"E2234\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002FPT-BR\u002Fsql\u002Ft-sql\u002Fstatements\u002Fcreate-index-transact-sql?view=sql-server-ver16\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E2235\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003EClique aqui para saber mais\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E2236\" class=\"qowt-font10-Arial\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2237\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2238\" class=\"qowt-font10-Arial\"\u003EMesmo \u003C\u002Fspan\u003E\u003Cspan id=\"E2239\" class=\"qowt-font10-Arial\"\u003Econsidera\u003C\u002Fspan\u003E\u003Cspan id=\"E2240\" class=\"qowt-font10-Arial\"\u003Endo\u003C\u002Fspan\u003E\u003Cspan id=\"E2241\" class=\"qowt-font10-Arial\"\u003E apenas\u003C\u002Fspan\u003E\u003Cspan id=\"E2242\" class=\"qowt-font10-Arial\"\u003E índices\u003C\u002Fspan\u003E\u003Cspan id=\"E2243\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2244\" class=\"qowt-font10-Arial\"\u003Ecomuns (algumas vezes chamados de \u003C\u002Fspan\u003E\u003Cspan id=\"E2245\" class=\"qowt-font10-Arial\"\u003E“B-\u003C\u002Fspan\u003E\u003Cspan id=\"E2247\" class=\"qowt-font10-Arial\"\u003Etree\u003C\u002Fspan\u003E\u003Cspan id=\"E2249\" class=\"qowt-font10-Arial\"\u003E” \u003C\u002Fspan\u003E\u003Cspan id=\"E2250\" class=\"qowt-font10-Arial\"\u003Eou \u003C\u002Fspan\u003E\u003Cspan id=\"E2251\" class=\"qowt-font10-Arial\"\u003E“\u003C\u002Fspan\u003E\u003Cspan id=\"E2253\" class=\"qowt-font10-Arial\"\u003Erowstore\u003C\u002Fspan\u003E\u003Cspan id=\"E2255\" class=\"qowt-font10-Arial\"\u003E”, para diferenciar dos índices “\u003C\u002Fspan\u003E\u003Cspan id=\"E2257\" class=\"qowt-font10-Arial\"\u003Ecolumnstore\u003C\u002Fspan\u003E\u003Cspan id=\"E2259\" class=\"qowt-font10-Arial\"\u003E”)\u003C\u002Fspan\u003E\u003Cspan id=\"E2260\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2261\" class=\"qowt-font10-Arial\"\u003Ee não\u003C\u002Fspan\u003E\u003Cspan id=\"E2262\" class=\"qowt-font10-Arial\"\u003E–\u003C\u002Fspan\u003E\u003Cspan id=\"E2264\" class=\"qowt-font10-Arial\"\u003Eclusteridados\u003C\u002Fspan\u003E\u003Cspan id=\"E2266\" class=\"qowt-font10-Arial\"\u003E, \u003C\u002Fspan\u003E\u003Cspan id=\"E2267\" class=\"qowt-font10-Arial\"\u003Eexistem\u003C\u002Fspan\u003E\u003Cspan id=\"E2268\" class=\"qowt-font10-Arial\"\u003E diversas maneiras de customizá-los\u003C\u002Fspan\u003E\u003Cspan id=\"E2269\" class=\"qowt-font10-Arial\"\u003E às\u003C\u002Fspan\u003E\u003Cspan id=\"E2270\" class=\"qowt-font10-Arial\"\u003E sua\u003C\u002Fspan\u003E\u003Cspan id=\"E2271\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E2272\" class=\"qowt-font10-Arial\"\u003E necessidade\u003C\u002Fspan\u003E\u003Cspan id=\"E2273\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E2274\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2275\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2276\" class=\"qowt-font10-Arial\"\u003EPara simplificar a construção\u003C\u002Fspan\u003E\u003Cspan id=\"E2277\" class=\"qowt-font10-Arial\"\u003E do\u003C\u002Fspan\u003E\u003Cspan id=\"E2278\" class=\"qowt-font10-Arial\"\u003E gerador de\u003C\u002Fspan\u003E\u003Cspan id=\"E2279\" class=\"qowt-font10-Arial\"\u003E scripts\u003C\u002Fspan\u003E\u003Cspan id=\"E2280\" class=\"qowt-font10-Arial\"\u003E de criação de índices, vou considerar aqui apenas 03\u003C\u002Fspan\u003E\u003Cspan id=\"E2281\" class=\"qowt-font10-Arial\"\u003E cenários:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch5 id=\"E2282\" class=\"qowt-li-13_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E2283\" class=\"qowt-font10-Arial\"\u003EÍ\u003C\u002Fspan\u003E\u003Cspan id=\"E2284\" class=\"qowt-font10-Arial\"\u003Endices \u003C\u002Fspan\u003E\u003Cspan id=\"E2286\" class=\"qowt-font10-Arial\"\u003Erowstore\u003C\u002Fspan\u003E\u003Cspan id=\"E2288\" class=\"qowt-font10-Arial\"\u003E não \u003C\u002Fspan\u003E\u003Cspan id=\"E2290\" class=\"qowt-font10-Arial\"\u003Eclusterizados\u003C\u002Fspan\u003E\u003Cspan id=\"E2292\" class=\"qowt-font10-Arial\"\u003E com ordenação ascendente ou descendente\u003C\u002Fspan\u003E\u003C\u002Fh5\u003E\n\u003Ch5 id=\"E2293\" class=\"qowt-li-13_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E2294\" class=\"qowt-font10-Arial\"\u003EÍndices \u003C\u002Fspan\u003E\u003Cspan id=\"E2296\" class=\"qowt-font10-Arial\"\u003Erowstore\u003C\u002Fspan\u003E\u003Cspan id=\"E2298\" class=\"qowt-font10-Arial\"\u003E não \u003C\u002Fspan\u003E\u003Cspan id=\"E2300\" class=\"qowt-font10-Arial\"\u003Eclusterizados\u003C\u002Fspan\u003E\u003Cspan id=\"E2302\" class=\"qowt-font10-Arial\"\u003E com valores únicos\u003C\u002Fspan\u003E\u003C\u002Fh5\u003E\n\u003Ch5 id=\"E2303\" class=\"qowt-li-13_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E2304\" class=\"qowt-font10-Arial\"\u003EÍndices \u003C\u002Fspan\u003E\u003Cspan id=\"E2306\" class=\"qowt-font10-Arial\"\u003Erowstore\u003C\u002Fspan\u003E\u003Cspan id=\"E2308\" class=\"qowt-font10-Arial\"\u003E não \u003C\u002Fspan\u003E\u003Cspan id=\"E2310\" class=\"qowt-font10-Arial\"\u003Eclusterizados\u003C\u002Fspan\u003E\u003Cspan id=\"E2312\" class=\"qowt-font10-Arial\"\u003E incluindo colunas adicionais\u003C\u002Fspan\u003E\u003C\u002Fh5\u003E\n\u003Cp id=\"E2313\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2314\" class=\"qowt-font10-Arial\"\u003EAs informações necessárias para identificar os detalhes de criação de qualquer índice do banco de dados estão disponíveis na tabela de sistema \u003C\u002Fspan\u003E\u003Cspan id=\"E2315\" class=\"qowt-font10-Arial\"\u003E“\u003C\u002Fspan\u003E\u003Cspan id=\"E2317\" class=\"qowt-font10-Arial\"\u003Esys.index_columns\u003C\u002Fspan\u003E\u003Cspan id=\"E2319\" class=\"qowt-font10-Arial\"\u003E”\u003C\u002Fspan\u003E\u003Cspan id=\"E2320\" class=\"qowt-font10-Arial\"\u003E. Caso você não tenha observado, esta \u003C\u002Fspan\u003E\u003Cspan id=\"E2321\" class=\"qowt-font10-Arial\"\u003Etabela\u003C\u002Fspan\u003E\u003Cspan id=\"E2322\" class=\"qowt-font10-Arial\"\u003E já foi utilizada para criação da tabela temporá\u003C\u002Fspan\u003E\u003Cspan id=\"E2323\" class=\"qowt-font10-Arial\"\u003Eria “\u003C\u002Fspan\u003E\u003Cspan id=\"E2324\" class=\"qowt-font10-Arial\"\u003E#\u003C\u002Fspan\u003E\u003Cspan id=\"E2326\" class=\"qowt-font10-Arial\"\u003EtempIndices\u003C\u002Fspan\u003E\u003Cspan id=\"E2328\" class=\"qowt-font10-Arial\"\u003E”.\u003C\u002Fspan\u003E\u003Cspan id=\"E2329\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2330\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2331\" class=\"qowt-font10-Arial\"\u003EAs\u003C\u002Fspan\u003E\u003Cspan id=\"E2332\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2333\" class=\"qowt-font10-Arial\"\u003Ecolunas\u003C\u002Fspan\u003E\u003Cspan id=\"E2334\" class=\"qowt-font10-Arial\"\u003E principais desta última tabela são \u003C\u002Fspan\u003E\u003Cspan id=\"E2336\" class=\"qowt-font10-Arial\"\u003Eobject_id\u003C\u002Fspan\u003E\u003Cspan id=\"E2338\" class=\"qowt-font10-Arial\"\u003E, \u003C\u002Fspan\u003E\u003Cspan id=\"E2340\" class=\"qowt-font10-Arial\"\u003Eindex_id\u003C\u002Fspan\u003E\u003Cspan id=\"E2342\" class=\"qowt-font10-Arial\"\u003E e \u003C\u002Fspan\u003E\u003Cspan id=\"E2344\" class=\"qowt-font10-Arial\"\u003Eindex_column_id\u003C\u002Fspan\u003E\u003Cspan id=\"E2346\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003Cspan id=\"E2347\" class=\"qowt-font10-Arial\"\u003E Eles identificam o ID da tabela, o ID do índice\u003C\u002Fspan\u003E\u003Cspan id=\"E2348\" class=\"qowt-font10-Arial\"\u003E daquela tabela e o ID das colunas que compõem este índice\u003C\u002Fspan\u003E\u003Cspan id=\"E2349\" class=\"qowt-font10-Arial\"\u003E. Com \u003C\u002Fspan\u003E\u003Cspan id=\"E2350\" class=\"qowt-font10-Arial\"\u003Eelas\u003C\u002Fspan\u003E\u003Cspan id=\"E2351\" class=\"qowt-font10-Arial\"\u003E é possível fazer buscas\u003C\u002Fspan\u003E\u003Cspan id=\"E2352\" class=\"qowt-font10-Arial\"\u003E combinando tabela\u003C\u002Fspan\u003E\u003Cspan id=\"E2353\" class=\"qowt-font10-Arial\"\u003E temporária\u003C\u002Fspan\u003E\u003Cspan id=\"E2354\" class=\"qowt-font10-Arial\"\u003E com outras tabelas de sistema, caso isso seja necessário.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2355\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2356\" class=\"qowt-font10-Arial\"\u003EÍndices podem ser criados sobre múltipl\u003C\u002Fspan\u003E\u003Cspan id=\"E2357\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E2358\" class=\"qowt-font10-Arial\"\u003Es \u003C\u002Fspan\u003E\u003Cspan id=\"E2359\" class=\"qowt-font10-Arial\"\u003Ecolunas\u003C\u002Fspan\u003E\u003Cspan id=\"E2360\" class=\"qowt-font10-Arial\"\u003E e, neste caso, \u003C\u002Fspan\u003E\u003Cspan id=\"E2361\" class=\"qowt-font10-Arial\"\u003Enossa\u003C\u002Fspan\u003E\u003Cspan id=\"E2362\" class=\"qowt-font10-Arial\"\u003E tabela \u003C\u002Fspan\u003E\u003Cspan id=\"E2363\" class=\"qowt-font10-Arial\"\u003Etemporária apresentará mais de uma linha por índice\u003C\u002Fspan\u003E\u003Cspan id=\"E2364\" class=\"qowt-font10-Arial\"\u003E. Porém, noss\u003C\u002Fspan\u003E\u003Cspan id=\"E2365\" class=\"qowt-font10-Arial\"\u003Eo\u003C\u002Fspan\u003E\u003Cspan id=\"E2366\" class=\"qowt-font10-Arial\"\u003E gerador \u003C\u002Fspan\u003E\u003Cspan id=\"E2367\" class=\"qowt-font10-Arial\"\u003Ede scripts precisa combinar estas colunas numa única lista\u003C\u002Fspan\u003E\u003Cspan id=\"E2368\" class=\"qowt-font10-Arial\"\u003E para \u003C\u002Fspan\u003E\u003Cspan id=\"E2369\" class=\"qowt-font10-Arial\"\u003Eescrever uma declaração SQL válida.\u003C\u002Fspan\u003E\u003Cspan id=\"E2370\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2371\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2372\" class=\"qowt-font10-Arial\"\u003EPara \u003C\u002Fspan\u003E\u003Cspan id=\"E2373\" class=\"qowt-font10-Arial\"\u003Eresolver esta questão\u003C\u002Fspan\u003E\u003Cspan id=\"E2374\" class=\"qowt-font10-Arial\"\u003E, eu \u003C\u002Fspan\u003E\u003Cspan id=\"E2375\" class=\"qowt-font10-Arial\"\u003Euso aqui\u003C\u002Fspan\u003E\u003Cspan id=\"E2376\" class=\"qowt-font10-Arial\"\u003E a fun\u003C\u002Fspan\u003E\u003Cspan id=\"E2377\" class=\"qowt-font10-Arial\"\u003Eção\u003C\u002Fspan\u003E\u003Cspan id=\"E2378\" class=\"qowt-font10-Arial\"\u003E de agregação\u003C\u002Fspan\u003E\u003Cspan id=\"E2379\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Ca id=\"E2380\" contenteditable=\"false\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fsql\u002Ft-sql\u002Ffunctions\u002Fstring-agg-transact-sql?view=sql-server-ver16\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E2381\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003ESTRING_AGG\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E2382\" class=\"qowt-font10-Arial\"\u003E,\u003C\u002Fspan\u003E\u003Cspan id=\"E2383\" class=\"qowt-font10-Arial\"\u003E disponível em qualquer banco\u003C\u002Fspan\u003E\u003Cspan id=\"E2384\" class=\"qowt-font10-Arial\"\u003E de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E2385\" class=\"qowt-font10-Arial\"\u003E que tenha nível de compatibilidade 14.X\u003C\u002Fspan\u003E\u003Cspan id=\"E2386\" class=\"qowt-font10-Arial\"\u003E ou superior (SQL Server 2017).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2387\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2388\" class=\"qowt-font10-Arial\"\u003EA sintaxe \u003C\u002Fspan\u003E\u003Cspan id=\"E2389\" class=\"qowt-font10-Arial\"\u003Edessa função \u003C\u002Fspan\u003E\u003Cspan id=\"E2390\" class=\"qowt-font10-Arial\"\u003Eé bem simples, basta informar a \u003C\u002Fspan\u003E\u003Cspan id=\"E2391\" class=\"qowt-font10-Arial\"\u003Ecoluna que se quer agregar e qual o separador que será usado. No presente caso, o separador \u003C\u002Fspan\u003E\u003Cspan id=\"E2392\" class=\"qowt-font10-Arial\"\u003Edesejado é\u003C\u002Fspan\u003E\u003Cspan id=\"E2393\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2394\" class=\"qowt-font10-Arial\"\u003Eo caractere vírgula (‘,’).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E2395\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2396\" class=\"qowt-font10-Arial\"\u003EO mesmo problema acontece caso o índice tenha colunas incluídas (cláusula INCLUDE). \u003C\u002Fspan\u003E\u003Cspan id=\"E2397\" class=\"qowt-font10-Arial\"\u003EA função STRING_AGG novamente resolve o problema.\u003C\u002Fspan\u003E\u003Cspan id=\"E2398\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E2399\" class=\"qowt-font10-Arial\"\u003EA distinção entre as colunas indexadas e as colunas incluídas no índice é feita com a informação \u003C\u002Fspan\u003E\u003Cspan id=\"E2400\" class=\"qowt-font10-Arial\"\u003Eda coluna \u003C\u002Fspan\u003E\u003Cspan id=\"E2402\" class=\"qowt-font10-Arial\"\u003Eis_included_column\u003C\u002Fspan\u003E\u003Cspan id=\"E2404\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003Cspan id=\"E2405\" class=\"qowt-font10-Arial\"\u003ESe o valor for 0 (falso), a coluna é indexada, se for 1 (verdadeiro), a coluna é incluída.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2407\" class=\"qowt-font10-Arial\"\u003EEntão eu \u003C\u002Fspan\u003E\u003Cspan id=\"E2408\" class=\"qowt-font10-Arial\"\u003Ec\u003C\u002Fspan\u003E\u003Cspan id=\"E2409\" class=\"qowt-font10-Arial\"\u003Eomeço a \u003C\u002Fspan\u003E\u003Cspan id=\"E2410\" class=\"qowt-font10-Arial\"\u003Ecri\u003C\u002Fspan\u003E\u003Cspan id=\"E2411\" class=\"qowt-font10-Arial\"\u003Eaçã\u003C\u002Fspan\u003E\u003Cspan id=\"E2412\" class=\"qowt-font10-Arial\"\u003Eo \u003C\u002Fspan\u003E\u003Cspan id=\"E2413\" class=\"qowt-font10-Arial\"\u003Edo \u003C\u002Fspan\u003E\u003Cspan id=\"E2414\" class=\"qowt-font10-Arial\"\u003Emeu gerad\u003C\u002Fspan\u003E\u003Cspan id=\"E2415\" class=\"qowt-font10-Arial\"\u003Eor de scripts usando expressões de tabela \u003C\u002Fspan\u003E\u003Cspan class=\"qowt-font10-Arial\"\u003Ecomum (CTE) separadas para colunas indexadas e \u003C\u002Fspan\u003E\u003Cspan id=\"E2416\" class=\"qowt-font10-Arial\"\u003Eincluídas\u003C\u002Fspan\u003E\u003Cspan id=\"E2417\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E2418\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2419\" class=\"qowt-font10-Arial\"\u003EO\u003C\u002Fspan\u003E\u003Cspan id=\"E2420\" class=\"qowt-font10-Arial\"\u003E Quadro 5\u003C\u002Fspan\u003E\u003Cspan id=\"E2421\" class=\"qowt-font10-Arial\"\u003E mostra \u003C\u002Fspan\u003E\u003Cspan id=\"E2422\" class=\"qowt-font10-Arial\"\u003Eum exemplo com estas\u003C\u002Fspan\u003E\u003Cspan id=\"E2423\" class=\"qowt-font10-Arial\"\u003E duas \u003C\u002Fspan\u003E\u003Cspan id=\"E2425\" class=\"qowt-font10-Arial\"\u003ECTEs\u003C\u002Fspan\u003E\u003Cspan id=\"E2427\" class=\"qowt-font10-Arial\"\u003E e o resultado que elas retornariam\u003C\u002Fspan\u003E\u003Cspan id=\"E2428\" class=\"qowt-font10-Arial\"\u003E. O\u003C\u002Fspan\u003E\u003Cspan id=\"E2429\" class=\"qowt-font10-Arial\"\u003Ebserve que o SELECT final \u003C\u002Fspan\u003E\u003Cspan id=\"E2430\" class=\"qowt-font10-Arial\"\u003Eneste quadro \u003C\u002Fspan\u003E\u003Cspan id=\"E2431\" class=\"qowt-font10-Arial\"\u003Eainda não \u003C\u002Fspan\u003E\u003Cspan id=\"E2432\" class=\"qowt-font10-Arial\"\u003Elida com geração das declarações SQL.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135728\u002Fscript5.png\"\u003E\u003Cimg class=\"alignnone wp-image-160555 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135728\u002Fscript5.png\" alt=\"Scripts SQL\" width=\"585\" height=\"698\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E2998\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E2999\" class=\"qowt-font10-Arial\"\u003ETrês informações\u003C\u002Fspan\u003E\u003Cspan id=\"E3000\" class=\"qowt-font10-Arial\"\u003E interessantes \u003C\u002Fspan\u003E\u003Cspan id=\"E3001\" class=\"qowt-font10-Arial\"\u003Esobre \u003C\u002Fspan\u003E\u003Cspan id=\"E3002\" class=\"qowt-font10-Arial\"\u003Eos\u003C\u002Fspan\u003E\u003Cspan id=\"E3003\" class=\"qowt-font10-Arial\"\u003E índices\u003C\u002Fspan\u003E\u003Cspan id=\"E3004\" class=\"qowt-font10-Arial\"\u003E do quadro acima\u003C\u002Fspan\u003E\u003Cspan id=\"E3005\" class=\"qowt-font10-Arial\"\u003E:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3006\" class=\"qowt-li-1_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E3007\" class=\"qowt-font10-Arial\"\u003EO índice da linha 2 \u003C\u002Fspan\u003E\u003Cspan id=\"E3008\" class=\"qowt-font10-Arial\"\u003Eé composto de cinco colunas\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3009\" class=\"qowt-li-1_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E3010\" class=\"qowt-font10-Arial\"\u003EO índice\u003C\u002Fspan\u003E\u003Cspan id=\"E3011\" class=\"qowt-font10-Arial\"\u003E da linha 4 \u003C\u002Fspan\u003E\u003Cspan id=\"E3012\" class=\"qowt-font10-Arial\"\u003Eé \u003C\u002Fspan\u003E\u003Cspan id=\"E3013\" class=\"qowt-font10-Arial\"\u003Eque usa a\u003C\u002Fspan\u003E\u003Cspan id=\"E3014\" class=\"qowt-font10-Arial\"\u003E cláusula INCLUDE\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003Cdiv id=\"contentsContainer\" class=\"style-scope qowt-page\"\u003E\n\u003Cdiv id=\"contents\" class=\"style-scope qowt-page\"\u003E\n\u003Cp id=\"E3015\" class=\"qowt-li-1_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\"\u003E\u003Cspan id=\"E3016\" class=\"qowt-font10-Arial\"\u003ENenhum dos índices usa ordenação descendente de campos\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3017\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3018\" class=\"qowt-font10-Arial\"\u003EAntes de\u003C\u002Fspan\u003E\u003Cspan id=\"E3019\" class=\"qowt-font10-Arial\"\u003E gerar o script desejado\u003C\u002Fspan\u003E\u003Cspan id=\"E3020\" class=\"qowt-font10-Arial\"\u003E,\u003C\u002Fspan\u003E\u003Cspan id=\"E3021\" class=\"qowt-font10-Arial\"\u003E é \u003C\u002Fspan\u003E\u003Cspan id=\"E3022\" class=\"qowt-font10-Arial\"\u003Enecessário \u003C\u002Fspan\u003E\u003Cspan id=\"E3023\" class=\"qowt-font10-Arial\"\u003Eidentificar \u003C\u002Fspan\u003E\u003Cspan id=\"E3024\" class=\"qowt-font10-Arial\"\u003Eas propriedades dos índices e eliminar duplicidades. O Quadro \u003C\u002Fspan\u003E\u003Cspan id=\"E3025\" class=\"qowt-font10-Arial\"\u003E6 é, na realidade uma continuação do quadro anterior, por isso mostro apenas a citação das \u003C\u002Fspan\u003E\u003Cspan id=\"E3027\" class=\"qowt-font10-Arial\"\u003ECTEs\u003C\u002Fspan\u003E\u003Cspan id=\"E3029\" class=\"qowt-font10-Arial\"\u003E descritas anteriormente. (\u003C\u002Fspan\u003E\u003Cspan id=\"E3030\" class=\"qowt-font10-Arial\"\u003ECaso queira ver o script completo, \u003C\u002Fspan\u003E\u003Ca id=\"E3031\" contenteditable=\"false\" href=\"https:\u002F\u002Fgithub.com\u002Fwcrivelini\u002Farticles\u002Fblob\u002Fmain\u002FSysTables_Scripts\u002FSysTabScript2.sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E3032\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Eclique nesse link\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E3033\" class=\"qowt-font10-Arial\"\u003E).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135920\u002Fscript6.png\"\u003E\u003Cimg class=\"alignnone wp-image-160556 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06135920\u002Fscript6.png\" alt=\"Scripts SQL\" width=\"642\" height=\"758\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3586\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3587\" class=\"qowt-font10-Arial\"\u003EPara fazer o download do script completo, acesse este \u003C\u002Fspan\u003E\u003Ca id=\"E3588\" contenteditable=\"false\" href=\"https:\u002F\u002Fgithub.com\u002Fwcrivelini\u002Farticles\u002Fblob\u002Fmain\u002FSysTables_Scripts\u002FSysTabScript2.sql\" target=\"_blank\" rel=\"noopener noreferrer\"\u003E\u003Cspan id=\"E3589\" class=\"qowt-font10-Arial qowt-stl-Hyperlink\"\u003Elink\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003Cspan id=\"E3590\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E3591\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-3\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E3592\"\u003EComo Executar os Scripts DDL\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3594\" class=\"qowt-font10-Arial\"\u003EDependendo da maneira como voc\u003C\u002Fspan\u003E\u003Cspan id=\"E3595\" class=\"qowt-font10-Arial\"\u003Eê deseja usar o\u003C\u002Fspan\u003E\u003Cspan id=\"E3596\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3597\" class=\"qowt-font10-Arial\"\u003E script\u003C\u002Fspan\u003E\u003Cspan id=\"E3598\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3599\" class=\"qowt-font10-Arial\"\u003E gerado\u003C\u002Fspan\u003E\u003Cspan id=\"E3600\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan class=\"qowt-font10-Arial\"\u003E, é preciso atenção \u003C\u002Fspan\u003E\u003Cspan class=\"qowt-font10-Arial\"\u003Ea alguns detalhes. Caso deseje exibir o resultado do\u003C\u002Fspan\u003E\u003Cspan id=\"E3602\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3603\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E3605\" class=\"qowt-font10-Arial\"\u003ESELECT\u003C\u002Fspan\u003E\u003Cspan id=\"E3606\" class=\"qowt-font10-Arial\"\u003E`s\u003C\u002Fspan\u003E\u003Cspan id=\"E3608\" class=\"qowt-font10-Arial\"\u003E acima e copiar o\u003C\u002Fspan\u003E\u003Cspan id=\"E3609\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3610\" class=\"qowt-font10-Arial\"\u003E script\u003C\u002Fspan\u003E\u003Cspan id=\"E3611\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3612\" class=\"qowt-font10-Arial\"\u003E gerado\u003C\u002Fspan\u003E\u003Cspan id=\"E3613\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3614\" class=\"qowt-font10-Arial\"\u003E, tenha certeza \u003C\u002Fspan\u003E\u003Cspan id=\"E3615\" class=\"qowt-font10-Arial\"\u003Ede alterar o \u003C\u002Fspan\u003E\u003Cspan id=\"E3616\" class=\"qowt-font10-Arial\"\u003Emodo de exibição da janela de resultados \u003C\u002Fspan\u003E\u003Cspan id=\"E3617\" class=\"qowt-font10-Arial\"\u003Eda sua\u003C\u002Fspan\u003E\u003Cspan id=\"E3618\" class=\"qowt-font10-Arial\"\u003E ferramenta \u003C\u002Fspan\u003E\u003Cspan id=\"E3619\" class=\"qowt-font10-Arial\"\u003Epara TEXTO.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3620\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3621\" class=\"qowt-font10-Arial\"\u003ECaso sua intenção seja executar de imediato o script gerado, é preciso guardar o texto gerado numa variável (que chamei de \u003C\u002Fspan\u003E\u003Cspan id=\"E3622\" class=\"qowt-font10-Arial\"\u003E@sql\u003C\u002Fspan\u003E\u003Cspan id=\"E3623\" class=\"qowt-font10-Arial\"\u003E) e, ao final, imprimir o conteúdo dessa variável e executá-la em seguida.\u003C\u002Fspan\u003E\u003Cspan id=\"E3624\" class=\"qowt-font10-Arial\"\u003E P\u003C\u002Fspan\u003E\u003Cspan id=\"E3625\" class=\"qowt-font10-Arial\"\u003Eara\u003C\u002Fspan\u003E\u003Cspan id=\"E3626\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E3627\" class=\"qowt-font10-Arial\"\u003Eo caso \u003C\u002Fspan\u003E\u003Cspan id=\"E3628\" class=\"qowt-font10-Arial\"\u003Edo bloco 1, \u003C\u002Fspan\u003E\u003Cspan id=\"E3629\" class=\"qowt-font10-Arial\"\u003Eveja no quadro abaixo como \u003C\u002Fspan\u003E\u003Cspan id=\"E3630\" class=\"qowt-font10-Arial\"\u003Eficaria \u003C\u002Fspan\u003E\u003Cspan id=\"E3631\" class=\"qowt-font10-Arial\"\u003Eo gerador de script\u003C\u002Fspan\u003E\u003Cspan id=\"E3632\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3633\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06140356\u002Fscript7.png\"\u003E\u003Cimg class=\"alignnone wp-image-160557 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06140356\u002Fscript7.png\" alt=\"Scripts SQL\" width=\"723\" height=\"301\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"E3792\" class=\"qowt-stl-Heading1 x-scope qowt-word-para-18\" role=\"heading\" aria-level=\"1\"\u003E\u003Cspan id=\"E3793\"\u003ECo\u003C\u002Fspan\u003E\u003Cspan id=\"E3794\"\u003Ementários Finais\u003C\u002Fspan\u003E\u003C\u002Fh2\u003E\n\u003Cp id=\"E3795\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3796\" class=\"qowt-font10-Arial\"\u003ENeste artigo, apresentei \u003C\u002Fspan\u003E\u003Cspan id=\"E3797\" class=\"qowt-font10-Arial\"\u003Eum exemplo mais complexo de uso das tabelas de sistemas.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3798\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3799\" class=\"qowt-font10-Arial\"\u003EV\u003C\u002Fspan\u003E\u003Cspan id=\"E3800\" class=\"qowt-font10-Arial\"\u003Eários \u003C\u002Fspan\u003E\u003Cspan id=\"E3801\" class=\"qowt-font10-Arial\"\u003Epequenos truques\u003C\u002Fspan\u003E\u003Cspan id=\"E3802\" class=\"qowt-font10-Arial\"\u003E foram adicionados\u003C\u002Fspan\u003E\u003Cspan id=\"E3803\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E3804\" class=\"qowt-font10-Arial\"\u003Eno gerador de scripts\u003C\u002Fspan\u003E\u003Cspan id=\"E3805\" class=\"qowt-font10-Arial\"\u003E,\u003C\u002Fspan\u003E\u003Cspan id=\"E3806\" class=\"qowt-font10-Arial\"\u003E incluindo:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3807\" class=\"qowt-li-4_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E3808\" class=\"qowt-font10-Arial\"\u003Einserção de \u003C\u002Fspan\u003E\u003Cspan id=\"E3809\" class=\"qowt-font10-Arial\"\u003Ecaracteres especiais no \u003C\u002Fspan\u003E\u003Cspan id=\"E3810\" class=\"qowt-font10-Arial\"\u003Escript\u003C\u002Fspan\u003E\u003Cspan id=\"E3811\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E3812\" class=\"qowt-font10-Arial\"\u003Epara torná-lo mais legível\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3813\" class=\"qowt-li-4_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E3814\" class=\"qowt-font10-Arial\"\u003Ecomo\u003C\u002Fspan\u003E\u003Cspan id=\"E3815\" class=\"qowt-font10-Arial\"\u003E contornar o problema d\u003C\u002Fspan\u003E\u003Cspan id=\"E3816\" class=\"qowt-font10-Arial\"\u003Ea\u003C\u002Fspan\u003E\u003Cspan id=\"E3817\" class=\"qowt-font10-Arial\"\u003E \u003C\u002Fspan\u003E\u003Cspan id=\"E3818\" class=\"qowt-font10-Arial\"\u003Ecriação\u003C\u002Fspan\u003E\u003Cspan id=\"E3819\" class=\"qowt-font10-Arial\"\u003E de listas\u003C\u002Fspan\u003E\u003Cspan id=\"E3820\" class=\"qowt-font10-Arial\"\u003E de colunas\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3821\" class=\"qowt-li-4_0 qowt-list qowt-stl-ListParagraph x-scope qowt-word-para-2\" role=\"listitem\" aria-roledescription=\"Bullet\"\u003E\u003Cspan id=\"E3822\" class=\"qowt-font10-Arial\"\u003Enovas \u003C\u002Fspan\u003E\u003Cspan id=\"E3823\" class=\"qowt-font10-Arial\"\u003Eformas de executar \u003C\u002Fspan\u003E\u003Cspan id=\"E3824\" class=\"qowt-font10-Arial\"\u003Eo gerador\u003C\u002Fspan\u003E\u003Cspan id=\"E3825\" class=\"qowt-font10-Arial\"\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3826\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3827\" class=\"qowt-font10-Arial\"\u003EEu considero que é \u003C\u002Fspan\u003E\u003Cspan id=\"E3828\" class=\"qowt-font10-Arial\"\u003Emuito \u003C\u002Fspan\u003E\u003Cspan id=\"E3829\" class=\"qowt-font10-Arial\"\u003Eimportante \u003C\u002Fspan\u003E\u003Cspan id=\"E3830\" class=\"qowt-font10-Arial\"\u003Eque \u003C\u002Fspan\u003E\u003Cspan id=\"E3831\" class=\"qowt-font10-Arial\"\u003Edesenvolvedores e administradores\u003C\u002Fspan\u003E\u003Cspan id=\"E3832\" class=\"qowt-font10-Arial\"\u003E saibam utilizar os metadados da base SQL\u003C\u002Fspan\u003E\u003Cspan id=\"E3833\" class=\"qowt-font10-Arial\"\u003E. E\u003C\u002Fspan\u003E\u003Cspan id=\"E3834\" class=\"qowt-font10-Arial\"\u003E, insisto em repetir, \u003C\u002Fspan\u003E\u003Cspan id=\"E3835\" class=\"qowt-font10-Arial\"\u003Eeste conhecimento pode ser útil na execução de inúmeras operações repetitivas.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp id=\"E3836\" class=\"x-scope qowt-word-para-2\"\u003E\u003Cspan id=\"E3837\" class=\"qowt-font10-Arial\"\u003EAté aqui, apresentei exemplos para lidar com operações dentro de um \u003C\u002Fspan\u003E\u003Cspan id=\"E3838\" class=\"qowt-font10-Arial\"\u003Eúnico \u003C\u002Fspan\u003E\u003Cspan id=\"E3839\" class=\"qowt-font10-Arial\"\u003Ebanco de dados\u003C\u002Fspan\u003E\u003Cspan id=\"E3840\" class=\"qowt-font10-Arial\"\u003E. \u003C\u002Fspan\u003E\u003Cspan id=\"E3841\" class=\"qowt-font10-Arial\"\u003ENo\u003C\u002Fspan\u003E\u003Cspan id=\"E3842\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3843\" class=\"qowt-font10-Arial\"\u003E próximo\u003C\u002Fspan\u003E\u003Cspan id=\"E3844\" class=\"qowt-font10-Arial\"\u003Es\u003C\u002Fspan\u003E\u003Cspan id=\"E3845\" class=\"qowt-font10-Arial\"\u003E artigo\u003C\u002Fspan\u003E\u003Cspan id=\"E3846\" class=\"qowt-font10-Arial\"\u003Es,\u003C\u002Fspan\u003E\u003Cspan id=\"E3847\" class=\"qowt-font10-Arial\"\u003E vou falar d\u003C\u002Fspan\u003E\u003Cspan id=\"E3848\" class=\"qowt-font10-Arial\"\u003Ea geração de\u003C\u002Fspan\u003E\u003Cspan id=\"E3849\" class=\"qowt-font10-Arial\"\u003E scripts\u003C\u002Fspan\u003E\u003Cspan id=\"E3850\" class=\"qowt-font10-Arial\"\u003E que tenham escopo de execução\u003C\u002Fspan\u003E\u003Cspan id=\"E3851\" class=\"qowt-font10-Arial\"\u003E para toda instância SQL, ou seja, scripts que atuam sobre múltiplas bases de dados.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EHoje, apresento o caso em que as colunas que terão suas definições alteradas….. e como recriar índices associados a colunas usando tabelas SQL Server.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-2-criando-indices","date":"6 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06142144\u002Ftabelas2.jpg","externalMention":null,"author":{"id":452,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30184745\u002FwagnercriveliniP-128x128.jpeg","name":"Wagner Crivelini","description":"Consultor Sênior na Microsoft, na área de Data Insights para América Latina. Especialista em bancos de dados, é colunista em diversos portais de TI do Brasil e do exterior, com mais de 100 artigos técnicos publicados. É também co-produtor do DatabaseCast, primeiro podcast brasileiro sobre bancos de dados.","slug":"wagner-crivelini","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fwagner-crivelini","registered":"2010-12-30 11:28:37","social":{"linkedin":null,"youtube":null,"facebook":"","twitter":"https:\u002F\u002Ftwitter.com\u002Fwcrivelini@gmail.com","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.wcrivelini.com.br","mail":"wcrivelini@gmail.com"},"articles_count":91,"views_count":828100,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Banco de Dados","slug":"banco-de-dados","id":7209,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados"},{"title":"Data","slug":"data","id":16,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"}],"tags":[{"title":"Azure SQL","slug":"azure-sql","id":8739,"link":"https:\u002F\u002Fimasters.com.br\u002Fazure-sql"},{"title":"banco de dados","slug":"banco-de-dados-2","id":189,"link":"https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados-2"},{"title":"Data","slug":"data","id":626,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"database","slug":"database","id":348,"link":"https:\u002F\u002Fimasters.com.br\u002Fdatabase"},{"title":"database sql server","slug":"database-sql-server","id":7188,"link":"https:\u002F\u002Fimasters.com.br\u002Fdatabase-sql-server"},{"title":"sql server","slug":"sql-server-2","id":324,"link":"https:\u002F\u002Fimasters.com.br\u002Fsql-server-2"}],"seo":{"open_graph":{"title":"Scripts SQL e Tabelas de Sistema - Parte 2: Criando Índices","description":"Hoje, apresento o caso em que as colunas que terão suas definições alteradas..... e como recriar índices associados a colunas usando tabelas SQL Server.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06142144\u002Ftabelas2.jpg","width":800,"height":533},"modified_time":"2024-02-07T11:27:03-03:00","published_time":"2024-02-06T15:13:00-03:00"},"twitter":{"title":"Scripts SQL e Tabelas de Sistema - Parte 2: Criando Índices","description":"Hoje, apresento o caso em que as colunas que terão suas definições alteradas..... e como recriar índices associados a colunas usando tabelas SQL Server.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06142144\u002Ftabelas2.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-2-criando-indices","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-2-criando-indices","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fbanco-de-dados\u002Fscripts-sql-e-tabelas-de-sistema-parte-2-criando-indices"},"type":"post"},{"id":160565,"title":"5 tópicos úteis para usar em React apps com Firebase e Firestore","content":"\u003Cp id=\"097d\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003ENeste artigo, vamos ver 5 usos do Firebase que foram muito úteis para mim em alguns projetos, foi o que eu chamei de 5 tópicos para usar em React apps com Firebase e Firestore. Vamos lá!\u003C\u002Fp\u003E\n\u003Ch2 id=\"1198\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003EReact – Introdução\u003C\u002Fh2\u003E\n\u003Cp id=\"af63\" class=\"pw-post-body-paragraph xk xl sw lm b xm za xo xp xq zb xs xt kw zc xv xw lb zd xy xz lg ze yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EO primeiro passo é instalar os packages que nós precisamos:\u003C\u002Fp\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"8330\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eyarn add react-redux-fireba\r\nse\u003C\u002Fspan\u003E\u003Cspan id=\"b531\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Eyarn add redux-firesto\r\nre\u003C\u002Fspan\u003E\u003Cspan id=\"f964\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Eyarn add firebase\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"ee64\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EPodemos usar o `npm install`para isso também. 😉\u003C\u002Fp\u003E\n\u003Ch2 id=\"f61a\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003EReact – Configuração\u003C\u002Fh2\u003E\n\u003Cp id=\"4b7e\" class=\"pw-post-body-paragraph xk xl sw lm b xm za xo xp xq zb xs xt kw zc xv xw lb zd xy xz lg ze yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EAgora, vamos criar nosso arquivo de configuração. No meu caso eu nomeei como \u003Ccode class=\"ef zu zv zw zl b\"\u003Efirebase-config.js\u003C\u002Fcode\u003E.\u003C\u002Fp\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"b65e\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { createStore, combineReducers, compose } from ‘redux’\r\nimport { reduxFirestore, firestoreReducer, createFirestoreInstance } from ‘redux-firestore’\r\nimport { firebaseReducer } from ‘react-redux-firebase’\r\nimport firebase from ‘firebase\u002Fapp’\r\nimport ‘firebase\u002Fauth’\r\nimport ‘firebase\u002Fdatabase’\r\nimport ‘firebase\u002Ffirestore’\u003C\u002Fspan\u003E\u003Cspan id=\"4d04\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst firebaseConfig = {\r\n apiKey: process.env.REACT_APP_FIREBASE_apiKey,\r\n authDomain: process.env.REACT_APP_FIREBASE_authDomain,\r\n databaseURL: process.env.REACT_APP_FIREBASE_databaseURL,\r\n projectId: process.env.REACT_APP_FIREBASE_projectId,\r\n storageBucket: process.env.REACT_APP_FIREBASE_storageBucket,\r\n messagingSenderId: process.env.REACT_APP_FIREBASE_messagingSenderId,\r\n appId: process.env.REACT_APP_FIREBASE_appId,\r\n measurementId: process.env.REACT_APP_FIREBASE_measurementId,\r\n}; \u002F\u002F from Firebase Console\u003C\u002Fspan\u003E\u003Cspan id=\"500c\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst rfConfig = {} \u002F\u002F optional redux-firestore Config Options\u003C\u002Fspan\u003E\u003Cspan id=\"a0e4\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E\u002F\u002F \r\nInitialize firebase instance\r\nfirebase.initializeApp(firebaseConfig)\u003C\u002Fspan\u003E\u003Cspan id=\"8b27\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E\u002F\u002F Initialize Cloud Firestore through Firebase\r\nfirebase.firestore();\u003C\u002Fspan\u003E\u003Cspan id=\"9046\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E\u002F\u002F Add reduxFirestore store enhancer to store creator\r\nconst createStoreWithFirebase = compose(\r\n reduxFirestore(firebase, rfConfig), \u002F\u002F firebase instance as first argument, \r\nrfConfig as optional second)(createStore)\u003C\u002Fspan\u003E\u003Cspan id=\"ca12\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E\u002F\u002F \r\nAdd Firebase to reducers\r\nconst rootReducer = combineReducers({\u003C\u002Fspan\u003E\u003Cspan id=\"410b\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efirebase: firebaseReducer,\r\nfirestore: firestoreReducer\u003C\u002Fspan\u003E\u003Cspan id=\"22b2\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E})\u003C\u002Fspan\u003E\u003Cspan id=\"8d40\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E\u002F\u002F Create store with reducers and initial state\r\nconst initialState = {}\r\nconst store = createStoreWithFirebase(rootReducer, initialState)\u003C\u002Fspan\u003E\u003Cspan id=\"782a\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst rrfConfig = {\r\n enableLogging: false,\r\n userProfile: ‘users’, \u002F\u002F root that user profiles are written to\r\n updateProfileOnLogin: false, \u002F\u002F enable\u002Fdisable updating of profile on login\r\n useFirestoreForProfile: true, \u002F\u002F Save profile to Firestore instead of Real Time Database\r\n useFirestoreForStorageMeta: true \u002F\u002F \r\nMetadata associated with storage file uploads goes to Firestore\r\n}\u003C\u002Fspan\u003E\u003Cspan id=\"74d7\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst rrfProps = {\r\n firebase,\r\n config: rrfConfig,\r\n dispatch: store.dispatch,\r\n createFirestoreInstance\r\n}\u003C\u002Fspan\u003E\u003Cspan id=\"f1e8\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Eexport { store, rrfProps };\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003EUma pequena observação no código sobre \u003Ccode class=\"ef zu zv zw zl b\"\u003EuserProfile: 'users'\u003C\u002Fcode\u003E. Essa configuração permite gravar os dados de perfil (como nome, telefone, etc..) em uma collection automaticamente.\u003Cbr \u002F\u003E\nAgora precisamos configurar o arquivo \u003Ccode class=\"ef zu zv zw zl b\"\u003Eindex.js\u003C\u002Fcode\u003E, verifiquemos as mudanças abaixo:\u003C\u002Fp\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"936b\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport React from ‘react’;\r\nimport { ReactReduxFirebaseProvider } from ‘react-redux-firebase’\r\nimport ReactDOM from ‘react-dom’;\r\nimport Root from ‘.\u002FRoot’;\r\nimport * as serviceWorker from ‘.\u002FserviceWorker’;\r\nimport { Provider } from ‘react-redux’;\r\nimport { store, rrfProps } from ‘.\u002Ffirebase-config’;\u003C\u002Fspan\u003E\u003Cspan id=\"027e\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003EReactDOM.render(\r\n <Provider store={store}>\r\n <ReactReduxFirebaseProvider {…rrfProps}>\r\n <Root \u002F>\r\n <\u002FReactReduxFirebaseProvider>\r\n <\u002FProvider>\r\n , document.getElementById(‘root’));\u003C\u002Fspan\u003E\u003Cspan id=\"b7f7\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003EserviceWorker.unregister();\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fmobile\u002Ftutorial-crud-em-app-android-e-ios-com-react-native-parte-4\"\u003E\u003Cem\u003E\u003Cstrong\u003ETutorial CRUD em app Android e iOS com React Native (Parte 4)\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"1841\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003EUsando\u003C\u002Fh3\u003E\n\u003Cp id=\"38e1\" class=\"pw-post-body-paragraph xk xl sw lm b xm za xo xp xq zb xs xt kw zc xv xw lb zd xy xz lg ze yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EPor último nós verificamos aqui como usar isso em alguns casos como:\u003C\u002Fp\u003E\n\u003Ch2 id=\"ea63\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003E1. Redirecionar o login\u003C\u002Fh2\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"9310\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { isEmpty, isLoaded } from 'react-redux-firebase';\r\nimport { useSelector } from 'react-redux';\u003C\u002Fspan\u003E\u003Cspan id=\"c090\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction Login(props) {\r\n const auth = useSelector(state => state.firebase && state.firebase.auth)\u003C\u002Fspan\u003E\u003Cspan id=\"aa0e\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003EuseEffect(() => {\r\n if (isLoaded(auth) && !isEmpty(auth)) \r\n history.push(routeNames.DASHBOARD)\r\n }, [auth]);\u003C\u002Fspan\u003E\u003Cspan id=\"56e0\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Ch2 id=\"413f\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003E2. Usando Autenticação\u003C\u002Fh2\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"dd37\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { useFirebase } from 'react-redux-firebase';\u003C\u002Fspan\u003E\u003Cspan id=\"2c92\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction Login(props) \r\n{\u003C\u002Fspan\u003E\u003Cspan id=\"96a4\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst firebase = useFirebase();\u003C\u002Fspan\u003E\u003Cspan id=\"6d86\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction loginWithGoogle() {\r\n firebase.login({ provider: 'google', type: 'popup' }).catch(e => {\r\n let msg = handleAuthError (e.code);\r\n message.error(msg);\u003C\u002Fspan\u003E\u003Cspan id=\"4f13\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E});\u003C\u002Fspan\u003E\u003Cspan id=\"85de\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003Cspan id=\"da4f\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"d2bb\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003E\u003Cstrong class=\"lm kl\"\u003EExplicando o código:\u003C\u002Fstrong\u003E Neste método estamos usando o login com o Google, repare no \u003Ccode class=\"ef zu zv zw zl b\"\u003Ecatch\u003C\u002Fcode\u003E estamos lançando uma mensagem, caso não dê erro ele automaticamente atualizará o state firebase.auth. 🙂\u003C\u002Fp\u003E\n\u003Ch2 id=\"2ebe\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003E3. Usando real-time\u003C\u002Fh2\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"b007\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { useSelector } from 'react-redux';\r\nimport { useFirestoreConnect, useFirestore, useFirebase } \r\nfrom 'react-redux-firebase';\u003C\u002Fspan\u003E\u003Cspan id=\"e686\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction Tests(props) \r\n{\u003C\u002Fspan\u003E\u003Cspan id=\"328a\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003EuseFirestoreConnect(() => [{ collection: 'tests', orderBy: [['createdAt', 'desc']] },])\r\n let tests = useSelector(state => state.firestore.ordered.tests);\u003C\u002Fspan\u003E\u003Cspan id=\"92de\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Ereturn\r\n(<>{JSON.stringify(tests)}<\u002F>);\u003C\u002Fspan\u003E\u003Cspan id=\"5185\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"aed6\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003E\u003Cstrong class=\"lm kl\"\u003EExplicando o código:\u003C\u002Fstrong\u003E Neste caso nós estamos como que ‘ouvindo’ a collection \u003Ccode class=\"ef zu zv zw zl b\"\u003Etests\u003C\u002Fcode\u003E ordenando ela por data decrescente. Sempre que houve uma inclusão, exclusão ou atualização nessa collection no firebase, nós obteremos aqui o que foi feito na variavel \u003Ccode class=\"ef zu zv zw zl b\"\u003Etests\u003C\u002Fcode\u003E.\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002Fsimplificando-componentes-com-react-hooks\"\u003ESimplificando componentes com React Hooks\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"bf7c\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003E4. Usando Firestore\u003C\u002Fh2\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"cf32\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { useFirestore } from 'react-redux-firebase'\u003C\u002Fspan\u003E\u003Cspan id=\"0887\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction Test(props) {\r\n const firestore = useFirestore();\u003C\u002Fspan\u003E\u003Cspan id=\"e6cc\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction addComment(comment) {\r\n const comments = [...props.test.comments];\r\n comments.push(comment)\u003C\u002Fspan\u003E\u003Cspan id=\"eafc\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efirestore.collection('tests')\r\n.doc(props.test.id).set({ ...props.test, comments }).then(data => \r\n{\u003C\u002Fspan\u003E\u003Cspan id=\"424d\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Emessage.success('Comentário enviado!');\u003C\u002Fspan\u003E\u003Cspan id=\"8d3b\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}).catch(e => {\r\n handleAuthError(e.code);\r\n }).finally(() => {\r\n \u002F\u002FsetLoading(false);\r\n });\r\n }\u003C\u002Fspan\u003E\u003Cspan id=\"7620\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"b475\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003E\u003Cstrong class=\"lm kl\"\u003EExplicando o código: \u003C\u002Fstrong\u003ENeste exemplo estamos adicionando um comentário no firestore.\u003C\u002Fp\u003E\n\u003Ch2 id=\"1493\" class=\"ye yf sw be yg yh yi yj kq yk yl ym kv yn yo yp yq yr ys yt yu yv yw yx yy yz bj\"\u003E5. React – Usando as informações de perfil\u003C\u002Fh2\u003E\n\u003Cpre class=\"zf zg zh zi zj zk zl zm zn ax ff bj\"\u003E\u003Ccode\u003E\u003Cspan id=\"ef11\" class=\"zo yf sw zl b et zp zq l zr zs\" data-selectable-paragraph=\"\"\u003Eimport { useSelector } from 'react-redux';\u003C\u002Fspan\u003E\u003Cspan id=\"2622\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Efunction MenuBar(props) \r\n{\u003C\u002Fspan\u003E\u003Cspan id=\"1a5c\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003Econst profile = useSelector(state => state.firebase.profile);\r\n return (<>{JSON.stringify(profile)}<\u002F>);\u003C\u002Fspan\u003E\u003Cspan id=\"7ae9\" class=\"zo yf sw zl b et zt zq l zr zs\" data-selectable-paragraph=\"\"\u003E}\u003C\u002Fspan\u003E\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\n\u003Cp id=\"8886\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EVeja como é simples usando os dados de perfil do usuário logado no código acima.\u003C\u002Fp\u003E\n\u003Cp id=\"0bd7\" class=\"pw-post-body-paragraph xk xl sw lm b xm xn xo xp xq xr xs xt kw xu xv xw lb xx xy xz lg ya yb yc yd er bj\" data-selectable-paragraph=\"\"\u003EIsso é tudo. Eu espero ter ajudado. Obrigado.\u003C\u002Fp\u003E\n\u003Cp data-selectable-paragraph=\"\"\u003E\n","excerpt":"\u003Cp\u003ENeste artigo, vamos ver 5 usos do Firebase que foram muito úteis para mim em alguns projetos, foi o que eu chamei de 5 tópicos para usar em React apps com Firebase e Firestore.\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002F5-topicos-uteis-para-usar-em-react-apps-com-firebase-e-firestore-2","date":"6 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06150125\u002Freact-1.jpg","externalMention":null,"author":{"id":146799,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06151859\u002Federtaveira1.jpeg","name":"Eder Taveira","description":"Eder Taveira é Desenvolvedor Full Stack. Formado em Ciências da Computação pela UFPa e Pós-graduando em Análise de sistemas Orientados a Objetos pela IESB. Trabalha com Java desde 2013 e PHP desde 2010 e com NodeJS desde 2016. Gosta muito de escrever artigos sobre diversas tecnologias (AngularJS, MongoDB, PHP, Java, Mobile Hibrido e Nativo) em seu blog edertaveira.com.","slug":"edertaveira","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Federtaveira","registered":"2015-01-22 15:39:40","social":{"linkedin":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Federtaveira","youtube":null,"facebook":"","twitter":"","instagram":null,"github":"https:\u002F\u002Fgithub.com\u002Federtaveira","url":"http:\u002F\u002Fwww.edertaveira.com","mail":"edertaveira@gmail.com"},"articles_count":10,"views_count":10000,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Front End","slug":"front-end","id":7304,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end"},{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"Cloud Firestore","slug":"cloud-firestore","id":8589,"link":"https:\u002F\u002Fimasters.com.br\u002Fcloud-firestore"},{"title":"firebase","slug":"firebase","id":4790,"link":"https:\u002F\u002Fimasters.com.br\u002Ffirebase"},{"title":"Firestore","slug":"firestore","id":8757,"link":"https:\u002F\u002Fimasters.com.br\u002Ffirestore"},{"title":"front","slug":"front","id":402,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront"},{"title":"front end","slug":"front-end-2","id":1383,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end-2"},{"title":"javascrip","slug":"javascrip","id":3416,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascrip"},{"title":"js","slug":"js","id":3311,"link":"https:\u002F\u002Fimasters.com.br\u002Fjs"},{"title":"react","slug":"react","id":3321,"link":"https:\u002F\u002Fimasters.com.br\u002Freact"}],"seo":{"open_graph":{"title":"React apps : 5 tópicos úteis para usar com Firebase e Firestore","description":"Neste artigo, vamos ver 5 usos do Firebase que foram muito úteis para mim em alguns projetos, foi o que eu chamei de 5 tópicos para usar em React apps com..","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06150125\u002Freact-1.jpg","width":800,"height":533},"modified_time":"2024-02-06T16:50:15-03:00","published_time":"2024-02-06T15:11:51-03:00"},"twitter":{"title":"React apps : 5 tópicos úteis para usar com Firebase e Firestore","description":"Neste artigo, vamos ver 5 usos do Firebase que foram muito úteis para mim em alguns projetos, foi o que eu chamei de 5 tópicos para usar em React apps com..","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F06150125\u002Freact-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002F5-topicos-uteis-para-usar-em-react-apps-com-firebase-e-firestore-2","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002F5-topicos-uteis-para-usar-em-react-apps-com-firebase-e-firestore-2","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Ffront-end\u002F5-topicos-uteis-para-usar-em-react-apps-com-firebase-e-firestore-2"},"type":"post"},{"id":160577,"title":"Webscrapping com Node.js e Puppeteer","content":"\u003Cp\u003EEste artigo é uma continuação do tutorial de \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fwebscrapping-com-node-js\u002F\"\u003EWebscrapping com Node.js\u003C\u002Fa\u003E que escrevi outro dia. Crawlers e webscrappers são peças fundamentais para a \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fcomo-criar-um-mecanismo-de-busca\u002F\"\u003Econstrução de mecanismos de busca\u003C\u002Fa\u003E e já há algum tempo que estava para escrever sobre eles a pedido de leitores e amigos.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso porque crio tais bots desde 2010, desde que \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Flancamento-do-busca-acelerada\u002F\"\u003Ecomecei o projeto do Busca Acelerada\u003C\u002Fa\u003E pela primeira vez e de lá para cá não parei, tendo lançado diversos projetos para diversas empresas (como o \u003Ca href=\"http:\u002F\u002Fbuildin.com.br\u002F\"\u003EBuildIn\u003C\u002Fa\u003E para a Softplan), e até mesmo alguns projetos pessoais (como o SóFamosos).\u003C\u002Fp\u003E\n\u003Cp\u003EMas por que um segundo tutorial sobre o mesmo assunto? Não ensinei tudo que tinha de ensinar no primeiro?\u003C\u002Fp\u003E\n\u003Cp\u003EQuase. E neste tutorial vou explicar o problema com aquele primeiro webscrapper e mostrar outra alternativa.\u003C\u002Fp\u003E\n\u003Cp\u003EVamos lá!\u003C\u002Fp\u003E\n\u003Ch2\u003EWebscrapping com Node.js e Puppeteer\u003C\u002Fh2\u003E\n\u003Ch3 id=\"o-grande-problema-do-webscrapping\"\u003EO grande problema do webscrapping\u003C\u002Fh3\u003E\n\u003Cp\u003EO webscrapper que ensinei a criar no tutorial anterios é bem básico e sofre de alguns males bem comuns que quem já deve ter feito webscrapping antes deve conhecer: execução de scripts que tornam o HTML dinâmico.\u003C\u002Fp\u003E\n\u003Cp\u003EClaro, existem outros problemas também, como o bloqueio do bot após crawling excessivo, mas considerando que quase a totalidade dos sites atuais possuem execução de scripts para tornar suas páginas dinâmicas (usando libs e frameworks como React, Angular e Vue), é quase certo que você mais cedo ou mais tarde terá problemas com o seu webscrapper enxergando um HTML x e você no navegador enxergando um HTML y, o que dificultará seu trabalho de capturar os dados corretamente.\u003C\u002Fp\u003E\n\u003Cp\u003EExplicando melhor: quando você acessa um site via servidor, usando um script como o webscrapper do post anterior, você não executa o código front-end da página, não manipula o DOM final, não dispara as chamadas JS, etc. O seu robô apenas lê as informações que foram geradas no servidor do site-alvo, o que pode fazer com que seu robô nem tenha nada de útil pra ler na página caso a mesma seja uma SPA (Single Page Application) por exemplo.\u003C\u002Fp\u003E\n\u003Cp\u003EA solução: Headless Browsers!\u003C\u002Fp\u003E\n\u003Cp\u003EOs browsers web como conhecemos possuem 3 tarefas principais:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003Edada uma URL, acessar uma página HTML (funcionalidade principal, o tronco do browser);\u003C\u002Fli\u003E\n\u003Cli\u003Ecarregar o DOM e executar os scripts front-end (os membros);\u003C\u002Fli\u003E\n\u003Cli\u003Erenderizar visualmente o DOM (a cabeça);\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003EOs primeiros browsers antigos, que eram em modo texto, só faziam o primeiro item. O browser que você está usando pra ler este post faz os três. Um headless browser faz somente os dois primeiros, ou seja, ele apenas não possui uma interface gráfica, mas carrega o HTML, o DOM e executa todos os scripts de front-end.\u003C\u002Fp\u003E\n\u003Cp\u003EEsse tipo de browser é como se fosse um console application rodando em modo silencioso, apenas um processo no seu sistema operacional que age como um browser. No fundo ele é um browser, apenas não tem UI.\u003C\u002Fp\u003E\n\u003Cp\u003EMuito útil para testes automatizados de interface, é comum os headless browsers exporem bibliotecas de manipulação do DOM como JQuery para permitir que através de scripts o programador consiga usar a página carregada pelo headless browser, como executar cliques em botões, preencher campos, etc; tudo isso sem estar enxergando uma UI ou sequer estar usando mouse e teclado.\u003C\u002Fp\u003E\n\u003Cp\u003ENão é preciso ser um gênio para entender que podemos usar headless browsers para fazer webscrapping, certo? Com esse tipo de tecnologia conseguiremos que nosso bot leia a versão final do HTML, da mesma forma que um usuário “veria” no navegador, após a execução dos scripts de front-end. Não apenas isso, mas você consegue fazer com que seu bot não apenas leia conteúdo, mas que use a página em si, clicando em botões e selecionando opções, por exemplo.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003ESe DOM, HTML, front-end e outros termos utilizados aqui não forem de seu domínio, dificilmente você conseguirá criar um crawler realmente bom. Em meu livro de \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Flivro-nodejs\"\u003E\u003Cstrong\u003EProgramação Web com Node.js\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E, cubro estes e outros aspectos essenciais da programação web, caso te interesse.\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"escolhendo-um-headless-browser\"\u003EEscolhendo um headless browser\u003C\u002Fh3\u003E\n\u003Cp\u003EExistem diversas opções de headless browsers no mercado. A maioria é open-source e baseada no Webkit, a mesma base na qual o Apple Safari e o Google Chrome foram construídos, o que garante uma grande fidelidade em relação ao uso de web browser comuns para carregar o HTML+JS.\u003C\u002Fp\u003E\n\u003Cp\u003EAlgumas opções disponíveis são:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\"http:\u002F\u002Fphantomjs.org\u002F\"\u003EPhantomJS\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fslimerjs.org\u002F\"\u003ESlimerJS\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fsourceforge.net\u002Fprojects\u002Fhtmlunit\u002F\"\u003EHtmlUnit\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"http:\u002F\u002Fzombie.js.org\u002F\"\u003EZombieJS\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fdevelopers.google.com\u002Fweb\u002Fupdates\u002F2017\u002F04\u002Fheadless-chrome\"\u003EHeadless Chrome\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003EDestes, o SlimerJS usa a plataforma Gecko da Mozilla ao invés do Webkit, enquanto que o PhantomJS e o HtmlUnit são famosos por se integrarem ao Selenium, uma popular ferramenta de automação de testes. Além disso, o Phantom é o único que eu usei profissionalmente em uma startup que trabalhei que usava este headless browser para tirar screenshots de páginas web.\u003C\u002Fp\u003E\n\u003Cp\u003ENo entanto, meu intuito de escrever este post era justamente para aprender a usar outro headless browser que não o Phantom, pois este possui alguns problemas conhecidos como não-conformidade com ES6, obrigatoriedade de uso do JQuery e nenhuma novidade desde 2018 (o projeto está parado). Esses problemas (que não são o fim do mundo, mas que me motivaram a buscar outra tecnologia) são comentados \u003Ca href=\"https:\u002F\u002Fmedium.com\u002Fmatheus-rossi\u002Fweb-scraping-com-nodejs-e-phantomjs-b0bf5ab8312e\"\u003Eneste excelente post do Matheus Rossi\u003C\u002Fa\u003E. Então se você realmente quer aprender a usar o PhantomJS, leia o post que acabei de citar.\u003C\u002Fp\u003E\n\u003Cp\u003EUma coisa que descobri recentemente é que desde a versão 59 do navegador Google Chrome que foi disponibilizada a opção de rodar o navegador do Google sem a interface gráfica funcionando, em modo headless. Usar o Chrome em modo headless é o sonho de muito testador por aí, pois representa rodar scripts de testes automatizados no navegador mais popular do mundo, com a maior fidelidade possível em relação ao que o usuário final vai usar.\u003C\u002Fp\u003E\n\u003Cp\u003ECerto, headless browser escolhido, como fazer um webscrapper que use-o para carregar o mesmo DOM que um usuário do Chrome veria?\u003C\u002Fp\u003E\n\u003Ch3 id=\"manipulando-o-headless-browser-via-nodejs\"\u003EManipulando o headless browser via Node.js\u003C\u002Fh3\u003E\n\u003Cp\u003ENo mesmo \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FGoogleChrome\u002Fpuppeteer\"\u003EGithub do Google Chrome\u003C\u002Fa\u003E existe um projeto chamado \u003Cstrong\u003EPuppeteer\u003C\u002Fstrong\u003E, que em uma tradução livre seria um manipulador de marionetes, ou um mestre dos fantoches. Ele é essencialmente um módulo Node.js que permite manipular tanto o Headless Chrome quanto o Chrome “normal” para fazer tarefas como:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003Egerar screenshots e PDFs de páginas web;\u003C\u002Fli\u003E\n\u003Cli\u003Efazer crawling em cima de páginas com Ajax e SPAs;\u003C\u002Fli\u003E\n\u003Cli\u003Eautomatizar o uso de UIs web;\u003C\u002Fli\u003E\n\u003Cli\u003Efazer webscrapping com alta fidelidade;\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003EPara que o Puppeteer funcione você precisa ter o \u003Ca href=\"http:\u002F\u002Fnodejs.org\u002F\"\u003ENode.js \u003C\u002Fa\u003Einstalado na sua máquina. Também costumo utilizar o VS Code para escrever os códigos, ensino a instalar estas duas ferramentas no vídeo abaixo.\u003C\u002Fp\u003E\n\u003Cp\u003EDepois que tiver o Node instalado, vamos criar um novo projeto Node.js chamado webscrapper2, criar um index.js vazio dentro dele, navegar via terminal até essa pasta e rodar um ‘npm init -y’ para configurá-lo com as opções default.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003ESe você nunca programou em Node.js antes, sugiro começar pelos \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fpost\u002Fo-que-e-nodejs-e-outras-5-duvidas-fundamentais\u002F\"\u003Etutoriais mais iniciantes de meu blog\u003C\u002Fa\u003E ou mesmo pelo \u003Ca href=\"https:\u002F\u002Fwww.luiztools.com.br\u002Flivro-nodejs\"\u003Emeu livro\u003C\u002Fa\u003E, que pega o iniciante pela mão e ensina desde JS tradicional até diversos módulos do Node.\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAgora rode o comando abaixo para instalar o Puppeteer no seu projeto, sendo que ele automaticamente irá baixar sua própria versão do Chrome, independente se você já possuir uma (ou seja, a instalação irá demorar um pouco mais que o normal para módulos NPM):\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003Enpm install puppeteer\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EUsá-lo é muito simples, no seu index.js, inclua o seguinte código que representa a estrutura básica do nosso webscrapper:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003Econst puppeteer = require('puppeteer');\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003Easync function scrap() {\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst browser = await puppeteer.launch({ headless: \"new\" });\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst page = await browser.newPage();\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Eawait page.goto('http:\u002F\u002Fbooks.toscrape.com\u002F');\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Eawait page.waitForNetworkIdle();\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003E\u002F\u002F Scrap\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Ebrowser.close();\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econsole.log(result);\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Ereturn result;\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003E};\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003Escrap();\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENa primeira linha carregamos a dependência do módulo puppeteer. No bloco seguinte, criamos a função assíncrona que fará todo o trabalho de verdade, com a lógica de acesso à página e scrapping (comentado).\u003C\u002Fp\u003E\n\u003Cp\u003ENeste primeiro momento, essa função scrap apenas executa o Headless Chrome, acessa uma nova página com a URL de um site fake de livros e espera até que a rede se acalme (idle, páre de fazer ou esperar requisições) antes de se fechar. Ainda não há a lógica de scrapping aqui.\u003C\u002Fp\u003E\n\u003Cp\u003ENo bloco final, executamos a função e quando ela terminar, o valor retornado pela função scrap será impresso no console. Se você executar o projeto agora, terá um erro de que result está undefined, mas isso é esperado já que sequer declaramos ele em lugar algum, mas o teste é válido pois te mostrará que passou por todas as linhas anteriores com sucesso.\u003C\u002Fp\u003E\n\u003Cp\u003EAntes de fazer a versão completa da função scrap, temos de entender o que vamos capturar de informações da página em questão.\u003C\u002Fp\u003E\n\u003Ch3 id=\"fazendo-html-scrapping\"\u003EFazendo HTML Scrapping\u003C\u002Fh3\u003E\n\u003Cp\u003EO site Books to Scrape serve para o único propósito de ajudar desenvolvedores a praticar webscrapping. Ele mostra um catálogo de livros, como na imagem abaixo:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"aligncenter wp-image-2985 size-large lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-1024x598.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-300x175.png 300w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-768x449.png 768w\" alt=\"Books to Scrape\" width=\"720\" height=\"420\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-1024x598.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-300x175.png 300w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fbooks-to-scrape-768x449.png 768w\" data-sizes=\"auto\" data-eio-rwidth=\"1024\" data-eio-rheight=\"598\" data-pagespeed-url-hash=\"1184842108\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAcesse ele no seu navegador Chrome e com o clique direito do mouse sobre a área do primeiro livro da listagem, mais especificamente sobre o título dele e selecione a opção Inspecionar\u002FInspect.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso irá abrir a aba Elements do Google Developer Tools onde você poderá entender como construir um seletor que diga ao seu web scrapper onde estão os dados que ele deve ler. Neste caso, vamos ler apenas os nomes dos livros. Se você não está acostumado com CSS e\u002Fou seletores (no melhor estilo JQuery), você pode usar o recurso Copy > Selector que aparece no painel elements para gerar o seletor para você, como mostra a imagem abaixo.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cimg class=\"aligncenter wp-image-2986 size-large lazy lazyautosizes lazyloaded loaded animated fadeIn\" src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-1024x603.png\" sizes=\"auto\" srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-300x177.png 300w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-768x452.png 768w\" alt=\"Copiando o selector\" width=\"720\" height=\"424\" data-src=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-1024x603.png\" data-srcset=\"https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape.png 1024w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-300x177.png 300w, https:\u002F\u002Fwww.luiztools.com.br\u002Fwp-content\u002Fuploads\u002F2017\u002F11\u002Fcopy-selector-scrape-768x452.png 768w\" data-sizes=\"auto\" data-eio-rwidth=\"1024\" data-eio-rheight=\"603\" data-pagespeed-url-hash=\"1323270817\" data-was-processed=\"true\" \u002F\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENesse caso específico não usarei a sugestão do Chrome que é bem engessada. Usarei um seletor bem mais simples: “h3 > a”, ou seja, vou pegar o link\u002Fâncora de cada H3 do HTML dessa página. Os H3 dessa página são exatamente os títulos dos livros.\u003C\u002Fp\u003E\n\u003Cp\u003ESe analisarmos em detalhes este bloco que queremos extrair o título, veremos que o texto interno da âncora nem sempre é o título fiel pois, por uma questão de espaço, algumas vezes ele está truncado com reticências no final. Sendo assim, o atributo HTML que vamos ler com o scraper é o title da âncora, que esse sim sempre possui o título completo.\u003C\u002Fp\u003E\n\u003Cp\u003EVamos atualizar nosso código de scrapping para pegarmos esta informação:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003E \u002F\u002Fscrap\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst result = await page.evaluate(() => {\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Ereturn document.querySelector('h3 > a').title\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003E})\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAnalisando apenas o bloco de código de scrapping, criamos uma função que executa um código JavaScript sobre a página que carregamos. A execução de scripts é realizada usando a função evaluate. Nesse código JavaScript, estamos usando a função querySelector no documento e o seletor que criamos anteriormente para acessar um componente do DOM da página. Sobre este componente, queremos o seu atributo title.\u003C\u002Fp\u003E\n\u003Cp\u003ESe você rodar este código Node agora verá que ele retornará apenas o nome do primeiro livro, “A Light in the Attic”. Isso porque a função querySelector retorna apenas o primeiro componente que ela encontra com aquele seletor.\u003C\u002Fp\u003E\n\u003Cp\u003EO código abaixo resolve isso:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003E\u002F\u002Fscrap\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst result = await page.evaluate(() => {\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst books = [];\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Edocument.querySelectorAll('h3 > a').forEach(book => books.push(book.title));\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Ereturn books\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003E});\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAnalisando apenas o bloco de código de scrapping, criamos uma função que executa um código JavaScript sobre a página que carregamos. A execução de scripts é realizada usando a função evaluate. Nesse código JavaScript, estamos usando a função querySelector no documento e o seletor que criamos anteriormente para acessar um componente do DOM da página. Sobre este componente, queremos o seu atributo title.\u003C\u002Fp\u003E\n\u003Cp\u003ESe você rodar este código Node agora verá que ele retornará apenas o nome do primeiro livro, “A Light in the Attic”. Isso porque a função querySelector retorna apenas o primeiro componente que ela encontra com aquele seletor.\u003C\u002Fp\u003E\n\u003Cp\u003EO código abaixo resolve isso:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ccode\u003E\u002F\u002Fscrap\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst result = await page.evaluate(() => {\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Econst books = [];\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Edocument.querySelectorAll('h3 > a').forEach(book => books.push(book.title));\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003Ereturn books\u003C\u002Fcode\u003E\u003Cbr \u002F\u003E\n\u003Ccode\u003E});\u003C\u002Fcode\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EAqui, usei a querySelectorAll, sobre a qual apliquei um forEach. Para cada livro encontrado com aquele seletor, eu adiciono o title do livro em um array de livros, retornado ao fim do evaluate.\u003C\u002Fp\u003E\n\u003Cp\u003ECom isso, se você executar novamente este script verá que ele retorna o título de todos os livros da primeira página do site, concluindo este post.\u003C\u002Fp\u003E\n\u003Cp\u003EQual seria o próximo passo? Navegar pelas demais páginas, coletando os títulos dos outros livros. Esta é a tarefa principal de um webcrawler ou webspider: crawl (rastejar). Ao algoritmo de webscrapping cabe apenas coletar os dados. Mas esse desagio eu deixo para você.\u003C\u002Fp\u003E\n\u003Cp\u003EAté a próxima!\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EEste artigo é uma continuação do tutorial de Webscrapping com Node.js que escrevi outro dia. Crawlers e webscrappers são peças fundamentais para…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fwebscrapping-com-node-js-e-puppeteer","date":"7 fev, 2024","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F07132129\u002FNode.JS-pexels-markus-spiske-1089440-1.jpg","externalMention":null,"author":{"id":148188,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2022\u002F10\u002F11183022\u002FLuizTools.jpg","name":"Luiz Fernando Duarte Junior","description":"Pós-graduado em computação, trabalha com software desde 2006 nas mais variadas tecnologias. Empreendedor, autor e professor, quando não está ocupado programando, está escrevendo ou gravando sobre programação para seu canal e blog LuizTools.","slug":"luizfernando","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fluizfernando","registered":"2017-04-28 19:43:26","social":{"linkedin":null,"youtube":null,"facebook":"http:\u002F\u002Ffb.com\u002Fluiztools","twitter":"https:\u002F\u002Ftwitter.com\u002Fluiztools","instagram":null,"github":null,"url":"http:\u002F\u002Fwww.luiztools.com.br\u002F","mail":"contato@luiztools.com.br"},"articles_count":94,"views_count":883600,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"Back-End","slug":"back-end","id":7158,"link":"https:\u002F\u002Fimasters.com.br\u002Fback-end"},{"title":"Front End","slug":"front-end","id":7304,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end"},{"title":"JavaScript","slug":"javascript","id":7220,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript"}],"tags":[{"title":"BACK","slug":"back","id":8976,"link":"https:\u002F\u002Fimasters.com.br\u002Fback"},{"title":"back-end","slug":"back-end","id":404,"link":"https:\u002F\u002Fimasters.com.br\u002Fback-end"},{"title":"front","slug":"front","id":402,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront"},{"title":"front end","slug":"front-end-2","id":1383,"link":"https:\u002F\u002Fimasters.com.br\u002Ffront-end-2"},{"title":"javascript","slug":"javascript-2","id":214,"link":"https:\u002F\u002Fimasters.com.br\u002Fjavascript-2"},{"title":"node.js","slug":"node-js","id":1032,"link":"https:\u002F\u002Fimasters.com.br\u002Fnode-js"},{"title":"Puppeteer","slug":"puppeteer","id":7787,"link":"https:\u002F\u002Fimasters.com.br\u002Fpuppeteer"},{"title":"webscrapping","slug":"webscrapping","id":5806,"link":"https:\u002F\u002Fimasters.com.br\u002Fwebscrapping"}],"seo":{"open_graph":{"title":"TUTORIAL: Webscrapping com Node.js e Puppeteer","description":"Este artigo é uma continuação do tutorial de Webscrapping com Node.js que escrevi outro dia. Crawlers e webscrappers são peças fundamentais para...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F07132129\u002FNode.JS-pexels-markus-spiske-1089440-1.jpg","width":800,"height":533},"modified_time":"2024-02-07T13:27:55-03:00","published_time":"2024-02-07T13:27:55-03:00"},"twitter":{"title":"TUTORIAL: Webscrapping com Node.js e Puppeteer","description":"Este artigo é uma continuação do tutorial de Webscrapping com Node.js que escrevi outro dia. Crawlers e webscrappers são peças fundamentais para...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F07132129\u002FNode.JS-pexels-markus-spiske-1089440-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fwebscrapping-com-node-js-e-puppeteer","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fwebscrapping-com-node-js-e-puppeteer","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fjavascript\u002Fwebscrapping-com-node-js-e-puppeteer"},"type":"post"},{"id":160322,"title":"Escrevendo software para durar; tópicos de um programa resiliente","content":"\u003Cp\u003EAqui apresentarei alguns tópicos que acredito serem importantes na hora de desenvolver um software de forma que ele seja bastante resiliente e que dure por vários anos. Os tópicos não estão em uma ordem particular e são a minha opinião embasada pela minha experiência como desenvolvedor.\u003C\u002Fp\u003E\n\u003Cp\u003EEncare esse texto como um conjunto de ideias que coletei pelos anos, eu tentei deixar elas o mais genéricas possível, mas não tenho a pretensão de que elas se apliquem a qualquer cenário. Acredito que elas se encaixam melhor se sua equipe é pequena e você precisa entregar rápido.\u003C\u002Fp\u003E\n\u003Cp\u003EEu tentei deixar o texto genérico, mas muitos dos tópicos são para Golang, minha linguagem favorita no momento.\u003C\u002Fp\u003E\n\u003Ch2 id=\"foco-na-simplicidade\"\u003ESoftware – Foco na simplicidade\u003C\u002Fh2\u003E\n\u003Cp\u003EEscreva o software da forma mais simples que você puder, com o mínimo de camadas e abstrações. O motivo é que absolutamente nada vem de graça, toda nova camada, toda nova abstração, tudo tem um preço, geralmente pago em tempo de desenvolvimento, mais tempo de manutenção, mais complexidade, e pior, tempo de \u003Cem\u003Edown-time\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EO software deve fazer estritamente o necessário para cumprir a sua função, nada além disso.\u003C\u002Fp\u003E\n\u003Ch2 id=\"mantenha-o-stack-baixo\"\u003ESoftware – Mantenha o \u003Cem\u003Estack\u003C\u002Fem\u003E baixo\u003C\u002Fh2\u003E\n\u003Cp\u003EQuanto menos ferramentas necessárias para seu software funcionar, melhor.\u003C\u002Fp\u003E\n\u003Cp\u003EPor exemplo, pode parecer fácil resolver possíveis problemas de escalabilidade com uma fila e \u003Cem\u003Eworkers\u003C\u002Fem\u003E que a consomem. Mas além de muitas vezes ser desnecessário colocar uma fila significa que você adicionou na sua estrutura vários itens que antes você não tinha que se preocupar. Agora você precisa lidar com conexões de rede, chaves de segurança para ler e escrever no serviço da fila, etc.\u003C\u002Fp\u003E\n\u003Cp\u003EClaro que não significa que você nunca usará filas ou outras estruturas similares, mas é preciso considerar muito bem se é realmente necessário porque a carga de complexidade, código e problemas administrativos que não tem nenhuma relação com programação aumentarão consideravelmente.\u003C\u002Fp\u003E\n\u003Ch3 id=\"reduza-a-superfície-de-ataque\"\u003ESoftware – Reduza a superfície de ataque\u003C\u002Fh3\u003E\n\u003Cp\u003EManter o \u003Cem\u003Estack\u003C\u002Fem\u003E baixo também tem implicações fortes em segurança, pergunte para qualquer especialista em \u003Cem\u003ESRE\u003C\u002Fem\u003E se ele prefere lidar com a segurança de vários serviços interligados ou se ele prefere cuidar de um conjunto pequeno de serviços.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fseguranca\u002Fa-seguranca-do-software-comeca-protegendo-contas-de-desenvolvedor\"\u003EA segurança do software começa protegendo contas de desenvolvedor\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"esqueça-o-fantasma-da-escalabilidade\"\u003EEsqueça o fantasma da escalabilidade\u003C\u002Fh2\u003E\n\u003Cp\u003ESabe aquele ditado de que otimização é a raiz de todo mal? Otimizar para escalabilidade sem mensurar só porque “acho que precisa” é muito mais sério. Uma \u003Cem\u003EAPI REST\u003C\u002Fem\u003E feita em Go e gravando em um banco de dados como PostgreSQL bem escritos aceitam uma quantidade incrível de conexões por segundo mesmo estando em uma máquina simples com 1Gb RAM e 1 core. Se o banco estiver em uma máquina separada, ou melhor ainda se for contratado como \u003Cem\u003ESAAS\u003C\u002Fem\u003E a carga que esse pequeno servidor aguenta é enorme.\u003C\u002Fp\u003E\n\u003Cp\u003EÉ muito comum um sistema ser projetado com vários microsserviços, filas, serviço para armazenar chave\u002Fvalor \u003Cem\u003Ein memory\u003C\u002Fem\u003E, um serviço de \u003Cem\u003Evault\u003C\u002Fem\u003E para centralizar as chaves dos vários serviços, etc.\u003C\u002Fp\u003E\n\u003Cp\u003EDaí gasta uma fortuna em infra e um tempo enorme lidando com orquestração disso tudo. Precisará de um especialista em segurança para garantir que tudo está bem configurado e nada vazará.\u003C\u002Fp\u003E\n\u003Cp\u003EE no fim servir poucas conexões simultâneas.\u003C\u002Fp\u003E\n\u003Ch2 id=\"prefira-o-monólito\"\u003EPrefira o monólito\u003C\u002Fh2\u003E\n\u003Cp\u003EMonólito, microsserviços, FAAS, são apenas escolhas de arquitetura. Todas têm vantagens e desvantagens, mas se for possível escolha o monólito, o motivo é que a comunicação entre as partes do sistema é muito mais simples no monólito.\u003C\u002Fp\u003E\n\u003Cp\u003EAs outras opções incluem camadas de comunicação que precisam ser gerenciadas, tem impacto na segurança, no desempenho e temos uma tendência muito grande de subestimar esses custos.\u003C\u002Fp\u003E\n\u003Cp\u003ESei o quanto é tentador ter vários microsserviços, cada um com uma responsabilidade. Mas se mal projetado você acaba com um “monólito distribuído”, ou seja, você tem todos os problemas do monólito, só que agora está tudo distribuído e no lugar de ter as vantagens dos microsserviços você ficou apenas com as desvantagens.\u003C\u002Fp\u003E\n\u003Cp\u003EQuando for projetar camadas de serviços, sempre pense se o custo de lidar com segurança, rede, etc compensa a separação em serviços distintos e sempre seja muito crítico.\u003C\u002Fp\u003E\n\u003Cp\u003EPor exemplo, faz todo sentido para uma empresa grande, com vários produtos, ter um microsserviço especializado em autenticação consultado por todos os outros, esse serviço fica atrás de um firewall, conta com \u003Cem\u003Eload balance\u003C\u002Fem\u003E, tem várias Instâncias redundantes, etc.\u003C\u002Fp\u003E\n\u003Cp\u003EMas normalmente não é o que temos aqui no Brasil, o que mais vejo são pequenas empresas e \u003Cem\u003Estart-ups\u003C\u002Fem\u003E que tem carga bem moderada.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fcloud\u002Fpor-que-escolher-uma-plataforma-software-as-a-service\"\u003EPor que escolher uma plataforma Software as a Service\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"dividir-o-sistema-por-responsabilidades\"\u003EDividir o sistema por responsabilidades\u003C\u002Fh2\u003E\n\u003Cp\u003EUma boa forma de organizar o sistema e criar bibliotecas independentes que possam ser reusadas é dividir o sistema por responsabilidades e cada peça de software ter apenas uma responsabilidade.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso também se aplica se você resolver criar microsserviços, cada um deve ter apenas uma responsabilidade. Pode parecer óbvio falando assim, mas no dia a dia, com as demandas chegando e a sempre crescente cobrança por velocidade de entrega, é importante não ceder à tentação de \u003Cem\u003Etomar atalhos\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EMesmo quando no monólito, bibliotecas que acumulam responsabilidades diferentes são ruins.\u003C\u002Fp\u003E\n\u003Ch2 id=\"evite-dividir-a-equipe\"\u003EEvite dividir a equipe\u003C\u002Fh2\u003E\n\u003Cp\u003EDividir o sistema por responsabilidades é bom, mas isso não se aplica a equipe, isso pode não ser possível dependendo do tamanho da empresa, mas é melhor ter uma única equipe em que todo mundo troque informações rapidamente.\u003C\u002Fp\u003E\n\u003Ch3 id=\"comunicação\"\u003EComunicação\u003C\u002Fh3\u003E\n\u003Cp\u003EComunicação tem um grande impacto na qualidade do software. A falta de comunicação facilmente faz com que o esforço seja duplicado, é dessa forma que o Windows acabou com 6 controles de áudio diferentes. A boa comunicação faz com que nem todos entendam\u002Fsaibam as prioridades da empresa e as dificuldades que os outros desenvolvedores estão passando.\u003C\u002Fp\u003E\n\u003Cp\u003ETudo bem ter equipes distintas se a empresa é grande o suficiente, mas é preciso lembrar que a comunicação entre equipes é mais custosa que comunicação entre membros da mesma equipe. Aliás, \u003Cem\u003Eproduct owner\u003C\u002Fem\u003E, \u003Cem\u003Eproduct manager\u003C\u002Fem\u003E, \u003Cem\u003Escrum master\u003C\u002Fem\u003E, ou seja lá como for chamado o cargo da pessoa que passa as demandas para os desenvolvedores de software, ele tem que ficar o mais próximo possível dos devs. de preferência estando junto deles o dia todo.\u003C\u002Fp\u003E\n\u003Cp\u003EExistem formas de atenuar o problema da comunicação, por exemplo, uma coisa que funciona muito bem é todo mundo na mesma sala de chat, mesmo com as pessoas distantes fisicamente basta abrir o áudio e falar com as pessoas. Isso além de estreitar os laços da equipe, evita o “telefone sem fio”, evita marcar reuniões inúteis, etc.\u003C\u002Fp\u003E\n\u003Cp\u003EEu já testei essa dinâmica em duas empresas diferentes com muito sucesso, você inicia seu dia, entra na sala de chat, coloca seu microfone no mudo e fica trabalhando, se alguém te chama é a mesma dinâmica de chamar uma pessoa da mesa do lado.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E\u003Cspan style=\"text-decoration: underline;\"\u003E\u003Cstrong\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fsoftware\u002F5-razoes-pelas-quais-o-software-hibrido-e-o-combustivel-da-proxima-geracao-de-software\"\u003E5 razões pelas quais o software híbrido é o combustível da próxima geração de software\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Ch2 id=\"prefira-tecnologia-testada-e-tediosa\"\u003EPrefira tecnologia testada e tediosa\u003C\u002Fh2\u003E\n\u003Cp\u003ETemos uma tendência de querer usar as tecnologias mais novas e cintilantes. Programador gosta de novidades e tecnologia. Dai assiste uma palestra e fica doido para colocar a nova tecnologia em qualquer coisa.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso é péssimo para a resiliência do \u003Cem\u003Esoftware\u003C\u002Fem\u003E que se está construindo. Idealmente toda tecnologia usada no software devia ser \u003Cem\u003Etediosa\u003C\u002Fem\u003E no sentido de que não traz nenhuma novidade, os programadores dominam ela quase que completamente, já foi \u003Cem\u003Etestada em batalha\u003C\u002Fem\u003E inúmeras vezes e não tem o menor risco de deixar de ser mantida, ou ter uma guinada inesperada nos próximos anos.\u003C\u002Fp\u003E\n\u003Cp\u003EPor exemplo, se você pegar um bom livro de \u003Cem\u003EPostgreSQL\u003C\u002Fem\u003E de cinco anos atrás ele provavelmente ainda será totalmente relevante hoje, um bom livro de \u003Cem\u003EBash\u003C\u002Fem\u003E resiste uma década fácil e um bom livro de C é eterno. E eu realmente espero que Go siga a mesma linha.\u003C\u002Fp\u003E\n\u003Ch3 id=\"comandos-do-sistema-operacional\"\u003EComandos do sistema operacional\u003C\u002Fh3\u003E\n\u003Cp\u003EPor falar em \u003Cem\u003EBash\u003C\u002Fem\u003E, aprenda a usar bem os comandos do sistema operacional, muitas vezes é melhor escrever um pequeno script e usar o que já existe que desenvolver você mesmo.\u003C\u002Fp\u003E\n\u003Cp\u003ELEIA TAMBÉM: \u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fdesign\u002Farquitetura-de-software-estilos-e-padroes-de-design\"\u003EArquitetura de Software: estilos e padrões de design\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3 id=\"filas-e-workers\"\u003EFilas e \u003Cem\u003EWorkers\u003C\u002Fem\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EMelhor que todo o peso de adicionar um serviço de filas na sua estrutura é usar o banco de dados que você já deve estar usando de qualquer forma.\u003C\u002Fp\u003E\n\u003Cp\u003ENo meu caso que o banco escolhido é o \u003Cem\u003EPostgreSQL\u003C\u002Fem\u003E principalmente por motivos históricos, eu uso uma combinação de \u003Cem\u003Eselect… for update\u003C\u002Fem\u003E e \u003Cem\u003Eselect… skip locked”\u003C\u002Fem\u003E para processar registros com segurança sem travas de \u003Cem\u003Elocks\u003C\u002Fem\u003E de registro, também adiciono um simples campo para registrar o status atual do registro que precisa ser processado e pronto.\u003C\u002Fp\u003E\n\u003Cp\u003EOutro mecanismo interessante, principalmente quando você precisa consumir serviços de terceiros para processar o registro, é criar um campo com o histórico do processamento.\u003C\u002Fp\u003E\n\u003Cp\u003EUm campo texto que você concatena coisas como o resultado de uma chamada a uma API, erros, etc. É bem agradável o erro no mesmo registro que está causando ele.\u003C\u002Fp\u003E\n\u003Cp\u003ESe o processamento não precisa ser rápido, é melhor chamar o \u003Cem\u003Eworker\u003C\u002Fem\u003E via \u003Cem\u003Ecrontab\u003C\u002Fem\u003E do que ele ficar em \u003Cem\u003Eloop\u003C\u002Fem\u003E esperando que algum registro precise ser processado. A grande vantagem de usar crontab é seu programa não ficar na memória o tempo todo, ele sempre inicia em um estado limpo e o próprio e você não corre o menor risco de um \u003Cem\u003Ememory leak\u003C\u002Fem\u003E crescer a ponto de ser um problema.\u003C\u002Fp\u003E\n\u003Ch3 id=\"fts\"\u003EFTS\u003C\u002Fh3\u003E\n\u003Cp\u003ENo lugar de usar ElastcSearch tanto o PostgreSQL como o SQLite são ótimos para \u003Cem\u003Efull text search\u003C\u002Fem\u003E. Recentemente precisei criar um pequeno servidor de logs para acumular logs de vários sistemas e o mais importante poder recuperar essa informação facilmente.\u003C\u002Fp\u003E\n\u003Cp\u003EUsei o SQLite e um pequeno servidor Go e o resultado foi muito bom, uma única tabela tipo FTS recebe os registros com um campo o log em si, outro para armazenar a data e outro para o nome do sistema que produziu o log.\u003C\u002Fp\u003E\n\u003Cp\u003ECom esse pequeno sistema ficou muito simples de procurar por ocorrências, erros e ter uma visão do estado geral do sistema.\u003C\u002Fp\u003E\n\u003Ch2 id=\"não-use-panic\"\u003ENão use \u003Cem\u003Epanic\u003C\u002Fem\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003EQuando estiver programando em Go, trate todos os erros, eu sei o quanto é repetitivo, às vezes tratamos erros que se acontecerem é o sistema operacional que está com problemas, mas não sei dizer quantas vezes deixei de tratar um erro que parecia impossível de acontecer e claro que ele aconteceu.\u003C\u002Fp\u003E\n\u003Ch2 id=\"não-recupere-depois-de-panic\"\u003ENão recupere depois de \u003Cem\u003Epanic\u003C\u002Fem\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003EÀs vezes escrevemos sistemas que não podem ficar fora do ar, essa é a justificativa para o sistema se recuperar de um \u003Cem\u003Epanic\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EMas o \u003Cem\u003Epanic\u003C\u002Fem\u003E serve para te dizer que alguma coisa muito errada aconteceu e precisa de sua atenção, idealmente quando um programa da \u003Cem\u003Epanic\u003C\u002Fem\u003E o correto é escrever um teste que reproduza o problema e então tratar o erro.\u003C\u002Fp\u003E\n\u003Cp\u003EPara o sistema continuar no ar, use um gerenciador de serviços como o \u003Ca href=\"http:\u002F\u002Fsupervisord.org\u002F\"\u003Esupervisor\u003C\u002Fa\u003E, por exemplo.\u003C\u002Fp\u003E\n\u003Cp\u003EDessa forma, com o passar do tempo seu sistema vai se tornar mais e mais resiliente.\u003C\u002Fp\u003E\n\u003Ch2 id=\"trate-o-erro-onde-ele-ocorre\"\u003ETrate o erro onde ele ocorre\u003C\u002Fh2\u003E\n\u003Cp\u003EQuando eu programava em C++ eu desabilitava o \u003Cem\u003Etry catch\u003C\u002Fem\u003E direto no \u003Cem\u003Egcc\u003C\u002Fem\u003E com o parâmetro \u003Cem\u003E-fno-exceptions\u003C\u002Fem\u003E, é sempre preferível tratar erros onde eles ocorrem. Em Go, por exemplo, nunca use uma função para esconder o \u003Cem\u003Eif err != nil\u003C\u002Fem\u003E. Isso criará uma indireção que tornará o código menos explícito.\u003C\u002Fp\u003E\n\u003Ch2 id=\"nunca-confie-em-dados-que-você-recebe\"\u003ENunca confie em dados que você recebe\u003C\u002Fh2\u003E\n\u003Cp\u003ENão importa se é um \u003Cem\u003EAPI REST\u003C\u002Fem\u003E ou funções internas do seu programa, nunca confie no usuário, mesmo que esse usuário seja você no futuro. Todos os dados devem ser validados.\u003C\u002Fp\u003E\n\u003Ch3 id=\"sempre-valide-tipos-de-interface\"\u003ESempre valide tipos de interface\u003C\u002Fh3\u003E\n\u003Cp\u003EQuando uma função Go recebe um parâmetro que é uma interface, o próprio compilador trata de assegurar que seja do tipo correto. O problema mesmo é quando usamos uma interface vazia. E daí fazemos cast para algum tipo específico. Se você não testar o tipo e ele não for o que você espera ou for \u003Cem\u003Enil\u003C\u002Fem\u003E o programa gerará um \u003Cem\u003Epanic\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EAlém disso, internamente interfaces são ponteiros, então ela pode ser \u003Cem\u003Enil\u003C\u002Fem\u003E.\u003C\u002Fp\u003E\n\u003Ch3 id=\"sempre-cheque-nil\"\u003ESempre cheque \u003Cem\u003Enil\u003C\u002Fem\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003ESempre que receber um ponteiro ou uma interface, verifique se é \u003Cem\u003Enil\u003C\u002Fem\u003E antes de usar ou tentar converter.\u003C\u002Fp\u003E\n\u003Cp\u003EUma boa prática para detectar esses problemas é passar linters no código, o \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgolangci\u002Fgolangci-lint\"\u003Egolangci-lint\u003C\u002Fa\u003E aplica vários linters que detectam esses e vários outros problemas.\u003C\u002Fp\u003E\n\u003Ch3 id=\"sempre-verifique-o-tamanho-de-arrays\"\u003ESempre verifique o tamanho de \u003Cem\u003Earrays\u003C\u002Fem\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EGeralmente programadores estão acostumados a verificar o tamanho de \u003Cem\u003Earrays\u003C\u002Fem\u003E em \u003Cem\u003Efor loop\u003C\u002Fem\u003E, mas esquecem de verificar se recebem o \u003Cem\u003Earray\u003C\u002Fem\u003E se estão interessandos apenas no primeiro item.\u003C\u002Fp\u003E\n\u003Ch2 id=\"não-quebre-sua-api\"\u003ENão quebre sua API\u003C\u002Fh2\u003E\n\u003Cp\u003EQuando criar uma API seja minimalista, evite adicionar funcionalidades extras que possam parecer interessantes durante a implementação, mantenha uma especificação enxuta. Se você sobrecarrega sua API de funcionalidades, fica mais custoso fazer mudanças atualizações no seu código no futuro.\u003C\u002Fp\u003E\n\u003Ch3 id=\"não-tenha-versões-da-mesma-api\"\u003ENão tenha versões da mesma API\u003C\u002Fh3\u003E\n\u003Cp\u003EPoucas coisas dão tanto trabalho quanto manter duas versões diferentes da mesma API, mas as coisas mudam, e muitas vezes é inevitável que você precise mudar alguma coisa que potencialmente quebre a API e você precise manter duas (ou mais) versões. No lugar disso, tente projetar a API de forma que consiga receber acréscimos, geralmente não há problema em adicionar um campo a mais em uma resposta de uma chamada ou mesmo adicionar uma funcionalidade nova desde que as existentes continuem funcionando e testadas. Os devs. (internos e dos clientes) vão agradecer.\u003C\u002Fp\u003E\n\u003Ch2 id=\"testes-são-fundamentais\"\u003ETestes são fundamentais\u003C\u002Fh2\u003E\n\u003Cp\u003ETestes são fundamentais, mas foque primeiro em testar as funcionalidades não código.\u003C\u002Fp\u003E\n\u003Cp\u003EEm linguagens compiladas a cobertura de testes não precisa ser muito grande, porque o compilador já pegou todos os erros de sintaxe, esquecimentos, etc.\u003C\u002Fp\u003E\n\u003Cp\u003EJá em uma linguagem de script é preciso ser mais rigoroso.\u003C\u002Fp\u003E\n\u003Cp\u003EQualquer função que tenha um SQL dentro dela precisa ser completamente testada, o motivo é que mesmo se você estiver usando uma linguagem compilada o código SQL é um pedacinho de código interpretado dentro do seu programa compilado, o compilador não tem como saber se aquele trecho é válido.\u003C\u002Fp\u003E\n\u003Ch2 id=\"mantenha-o-cartão-corporativo-abastecido\"\u003EMantenha o cartão corporativo abastecido\u003C\u002Fh2\u003E\n\u003Cp\u003ENão tem nenhuma relação com programação, mas coloquei esse ponto aqui porque tenho certeza que vários programadores sênior vão rir ao ler isso e lembrar das vezes que ficaram procurando o motivo do sistema ter caído. Só para descobrir que era porque a pessoa encarregada do cartão corporativo deixou ele sem fundos.\u003C\u002Fp\u003E\n\u003Ch2 id=\"referências\"\u003EReferências\u003C\u002Fh2\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fcrg.eti.br\u002Fpost\u002Farquivos-ocultos-no-unix\u002F\"\u003EArquivos ocultos no UNIX\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fcrg.eti.br\u002Fpost\u002Fescrevendo-software-para-durar\u002Funix_prog_design.pdf\"\u003EProgram design in the UNIX environment\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=v24wrd3RwGo\"\u003EHow Go Programs Keep Working\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=5IUj1EZwpJY\"\u003EThe Only Unbreakable Law\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fwww.radicalsimpli.city\u002F\"\u003ERadical Simplicity in Technology\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fsuckless.org\u002Fphilosophy\u002F\"\u003Esuckless.org\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n","excerpt":"\u003Cp\u003EAqui apresentarei alguns tópicos que acredito serem importantes na hora de desenvolver um software de forma que ele seja bastante resiliente e que dure…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fescrevendo-software-para-durar-topicos-de-um-programa-resiliente","date":"13 dez, 2023","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F13111009\u002Fsoftware-1.jpg","externalMention":null,"author":{"id":148141,"thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2018\u002F05\u002F30180934\u002Fcesar-gimenes-128x128.jpg","name":"Cesar Gimenes","description":"Trabalha com tecnologia desde a década de 90. Já atuou na área de educação e participou de projetos de mobilidade de grande volume para laboratórios farmacêuticos. Criou games tanto para PC, como para iOS. Hoje está direcionando seus esforços em plataformas de Sistemas Embarcados, IoT, microservices e cloud computing. É um entusiasta de tecnologias como Golang e Docker.","slug":"cesargimenes","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fcesargimenes","registered":"2017-03-23 14:25:13","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Ffacebook.com\u002Fcrgimenes","twitter":"https:\u002F\u002Ftwitter.com\u002Fcrgimenes","instagram":null,"github":null,"url":"","mail":"crg@crg.eti.br"},"articles_count":22,"views_count":48400,"certifications":null,"conquests":null,"office":null},"categories":[{"title":"APIs e Microsserviços","slug":"apis-microsservicos","id":4257,"link":"https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos"},{"title":"Go Golang","slug":"go-golang","id":8896,"link":"https:\u002F\u002Fimasters.com.br\u002Fgo-golang"},{"title":"PostgreSQL","slug":"postgresql","id":7213,"link":"https:\u002F\u002Fimasters.com.br\u002Fpostgresql"},{"title":"Software","slug":"software","id":7243,"link":"https:\u002F\u002Fimasters.com.br\u002Fsoftware"}],"tags":[{"title":"api","slug":"api","id":187,"link":"https:\u002F\u002Fimasters.com.br\u002Fapi"},{"title":"api rest","slug":"api-rest","id":2973,"link":"https:\u002F\u002Fimasters.com.br\u002Fapi-rest"},{"title":"arrays","slug":"arrays","id":2758,"link":"https:\u002F\u002Fimasters.com.br\u002Farrays"},{"title":"escalabilidade","slug":"escalabilidade","id":2074,"link":"https:\u002F\u002Fimasters.com.br\u002Fescalabilidade"},{"title":"go","slug":"go","id":3239,"link":"https:\u002F\u002Fimasters.com.br\u002Fgo"},{"title":"golang","slug":"golang","id":4556,"link":"https:\u002F\u002Fimasters.com.br\u002Fgolang"},{"title":"microsserviços","slug":"microsservicos","id":5006,"link":"https:\u002F\u002Fimasters.com.br\u002Fmicrosservicos"},{"title":"monolito","slug":"monolito","id":8098,"link":"https:\u002F\u002Fimasters.com.br\u002Fmonolito"},{"title":"panic","slug":"panic","id":8948,"link":"https:\u002F\u002Fimasters.com.br\u002Fpanic"},{"title":"postgresql","slug":"postgresql-2","id":1089,"link":"https:\u002F\u002Fimasters.com.br\u002Fpostgresql-2"},{"title":"saas","slug":"saas","id":1082,"link":"https:\u002F\u002Fimasters.com.br\u002Fsaas"},{"title":"software","slug":"software-2","id":274,"link":"https:\u002F\u002Fimasters.com.br\u002Fsoftware-2"},{"title":"stack","slug":"stack","id":1580,"link":"https:\u002F\u002Fimasters.com.br\u002Fstack"},{"title":"tecnologia","slug":"tecnologia-2","id":185,"link":"https:\u002F\u002Fimasters.com.br\u002Ftecnologia-2"},{"title":"testes","slug":"testes","id":1591,"link":"https:\u002F\u002Fimasters.com.br\u002Ftestes"}],"seo":{"open_graph":{"title":"Escrevendo software para durar; tópicos de um programa resiliente","description":"Aqui apresentarei alguns tópicos que acredito serem importantes na hora de desenvolver um software de forma que ele seja bastante resiliente e que dure...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F13111009\u002Fsoftware-1.jpg","width":800,"height":530},"modified_time":"2023-12-13T11:50:10-03:00","published_time":"2023-12-13T11:50:10-03:00"},"twitter":{"title":"Escrevendo software para durar; tópicos de um programa resiliente","description":"Aqui apresentarei alguns tópicos que acredito serem importantes na hora de desenvolver um software de forma que ele seja bastante resiliente e que dure...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F13111009\u002Fsoftware-1.jpg"}},"articleSocial":{"facebook":"https:\u002F\u002Fwww.facebook.com\u002Fsharer?u=https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fescrevendo-software-para-durar-topicos-de-um-programa-resiliente","twitter":"https:\u002F\u002Ftwitter.com\u002Fshare?url=https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fescrevendo-software-para-durar-topicos-de-um-programa-resiliente","linkedin":"https:\u002F\u002Fwww.linkedin.com\u002FshareArticle?url=https:\u002F\u002Fimasters.com.br\u002Fgo-golang\u002Fescrevendo-software-para-durar-topicos-de-um-programa-resiliente"},"type":"post"}]},"events":{},"certificatedUsers":[],"news":[{"id":163867,"title":"Nova técnica desativa malwares mineradores de criptomoedas","content":"\u003Cp dir=\"ltr\"\u003E\u003Cem\u003EMalwares mineradores de criptomoedas | Campanha maliciosa ativa há seis anos foi encerrada pela Akamai com método inovador que zerou os ganhos dos cibercriminosos em questão de segundos\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EUma nova tática, que funciona a partir de um notebook simples, foi capaz de encerrar uma campanha maliciosa de mineração de criptomoedas que estava ativa há mais de seis anos. A abordagem utilizou o envio de “bad shares” (cálculos incorretos de mineração) para desativar completamente os sistemas dos cibercriminosos, reduzindo a geração de ativos em questão de segundos. Como resultado, os criminosos deixaram de lucrar cerca de US$ 26 mil por ano, segundo a empresa que desenvolveu a estratégia, a \u003Ca href=\"https:\u002F\u002Fwww.akamai.com\u002Fpt\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.akamai.com\u002Fpt&source=gmail&ust=1752070363329000&usg=AOvVaw2rS4LJ88rue21BNYWqXHN7\"\u003EAkamai\u003C\u002Fa\u003E, especializada em cibersegurança e soluções em nuvem.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EApresentado na terceira parte da série \u003Ca href=\"https:\u002F\u002Fwww.akamai.com\u002Fblog\u002Fsecurity-research\u002Fcryptominers-anatomy-shutting-down-mining-botnets\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.akamai.com\u002Fblog\u002Fsecurity-research\u002Fcryptominers-anatomy-shutting-down-mining-botnets&source=gmail&ust=1752070363329000&usg=AOvVaw1BX4mgCaG0WgxueOpluaWX\"\u003E“Anatomia dos Criptominers”\u003C\u002Fa\u003E, o método não depende de ações de terceiros para funcionar. A partir de um dispositivo contaminado pelo minerador malicioso Oracle Loader, os pesquisadores usaram as proteções automáticas aplicadas à infraestrutura de mineração, que as protegem contra sobrecarga ou indisponibilidades, para gerar o banimento automático e rápido das carteiras em que os cibercriminosos recebem seus lucros, bem como dos proxies usados por eles para esconder suas origens.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EA geração de ativos nestes sistemas se dá pela validação de shares, cálculos enviados pelos dispositivos e autenticados nas pools, como são chamados os servidores ligados às criptomoedas. São tarefas complexas, que se tornam ainda mais pesadas nos casos das “bad shares”, erros que também podem acontecer no processo legítimo de mineração e podem levar a suspensões temporárias como medida de proteção.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EA técnica desenvolvida pela Akamai gerou uma chuva de solicitações inválidas para ativar as defesas dos servidores e, no caso do Oracle Loader, o impacto foi imediato. O volume de transações caiu de 3,3 milhões de hashes por segundo para zero.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003E“Normalmente, dependemos de administradores de pools e serviços externos para realizar o banimento das contas dos cibercriminosos. São tarefas complexas e que levam tempo, já que dependem da ação de terceiros”, explica Maor Dahan, pesquisador sênior da Akamai e um dos desenvolvedores do método. “A tática apresenta uma opção melhor, que compromete a eficácia destas botnets ao ponto de encerrá-las completamente.”\u003C\u002Fp\u003E\n\u003Ch3 dir=\"ltr\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EFerramenta possibilitou infiltração em redes de mineração maliciosa\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp dir=\"ltr\"\u003EO desenvolvimento do método também levou à criação de uma ferramenta chamada XMRogue, voltada especialmente para combater o XMRig, um dos principais malwares de mineração maliciosa do cenário atual. Ela permite que os pesquisadores se passem por vítimas, ganhando acesso a proxies usados pelos cibercriminosos para envio das “bad shares”.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EA partir daí, o envio em grandes volumes  de  cálculos inválidos redirecionados para as pools de mineração permite que as operações maliciosas sejam identificadas e derrubadas pelos sistemas automatizados de segurança. A ferramenta desenvolvida pela Akamai também é capaz de burlar os sistemas do próprio XMRig, que descartam hashes de baixa complexidade ou consideradas inválidas, como forma de maximizar o potencial de mineração dos dispositivos infectados.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EO resultado dos testes realizados pelos pesquisadores foi uma queda de 76% nos lucros dos cibercriminosos. A estimativa da empresa é que, caso proxies e sistemas adicionais fossem localizados e atingidos pela técnica, os ganhos poderiam ser zerados, gerando impacto significativo nas ações maliciosas.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003E“A ameaça dos mineradores deve seguir crescendo, mas agora pode ser combatida, tornando os ataques menos eficazes para os cibercriminosos”, completa Dahan. “Esse método utiliza topologia e políticas já existentes para forçar os atacantes a abandonarem completamente as campanhas, já que sua continuidade passa a depender de mudanças radicais que podem não ser vantajosas financeiramente, além de gerarem riscos de identificação.”\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EAs provas de conceito, assim como o código do XMRogue e demais detalhes dos testes realizados, já estão disponíveis na série \u003Ca href=\"https:\u002F\u002Fwww.akamai.com\u002Fblog\u002Fsecurity-research\u002Fcryptominers-anatomy-shutting-down-mining-botnets\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.akamai.com\u002Fblog\u002Fsecurity-research\u002Fcryptominers-anatomy-shutting-down-mining-botnets&source=gmail&ust=1752070363329000&usg=AOvVaw1BX4mgCaG0WgxueOpluaWX\"\u003E“Anatomia dos Criptominers”\u003C\u002Fa\u003E, dividida em três partes publicadas no blog da Akamai.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ECampanha maliciosa … zerou os ganhos dos cibercriminosos… malwares mineradores de criptomoedas que estava ativa há mais de seis anos. \u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fnova-tecnica-desativa-malwares-mineradores-de-criptomoedas","date":"8 jul, 2025","relativeTime":"há 2 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F08124628\u002FMalware-1.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"},{"title":"Segurança","slug":"seguranca","id":7269,"link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca"}],"seo":{"open_graph":{"title":"Nova técnica desativa malwares mineradores de criptomoedas","description":"Campanha maliciosa ... zerou os ganhos dos cibercriminosos... malwares mineradores de criptomoedas que estava ativa há mais de seis anos.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F08124628\u002FMalware-1.jpg","width":800,"height":533},"modified_time":"2025-07-08T13:22:32-03:00","published_time":"2025-07-08T13:21:40-03:00"},"twitter":{"title":"Nova técnica desativa malwares mineradores de criptomoedas","description":"Campanha maliciosa ... zerou os ganhos dos cibercriminosos... malwares mineradores de criptomoedas que estava ativa há mais de seis anos.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F08124628\u002FMalware-1.jpg"}},"type":"imasters_news"},{"id":163824,"title":"5 cursos gratuitos de tecnologia para turbinar seu currículo nas férias de julho","content":"\u003Cp\u003ECom julho se aproximando, muitos já têm em mente como vão aproveitar as férias. Seja viajando ou não, atividades não faltam para se distrair durante o mês. Mas, para quem deseja ir além e usar o tempo livre para aprimorar seus conhecimentos, uma boa opção é recorrer aos cursos online voltados para o desenvolvimento profissional.\u003C\u002Fp\u003E\n\u003Ch2\u003E5 cursos gratuitos de tecnologia\u003C\u002Fh2\u003E\n\u003Cp\u003EUma excelente alternativa é acessar as capacitações gratuitas oferecidas pela plataforma Eu Capacito, iniciativa social do Instituto Itaqui, dedicada à formação de profissionais para a economia digital. Conteúdos de \u003Cem\u003Ebig techs\u003C\u002Fem\u003E como a \u003Cstrong\u003EMicrosoft\u003C\u002Fstrong\u003E e  \u003Cstrong\u003EIBM\u003C\u002Fstrong\u003E estão disponíveis no site. E o melhor: você pode fazer de qualquer lugar.\u003C\u002Fp\u003E\n\u003Cp\u003EOs cursos têm foco na área de tecnologia, do nível básico ao avançado, e podem ser realizados em apenas algumas horas. Separamos algumas opções para ajudar a turbinar seu currículo nestas férias:\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cstrong\u003E1. Curso fluêncIA (Microsoft)\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EO curso foi criado com o intuito de ser um primeiro passo na aprendizagem sobre o universo da Inteligência Artificial. O conteúdo oferece maior aprofundamento em IA, abordando questões como: sistemas inteligentes, inteligência artificial generativa, buscas online e ética em IA. Tem duração de 1 hora e 15 minutos. \u003Ca href=\"https:\u002F\u002Fwww.eucapacito.com.br\u002Fcursos\u002Fcurso-fluencia\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.eucapacito.com.br\u002Fcursos\u002Fcurso-fluencia\u002F&source=gmail&ust=1751042218532000&usg=AOvVaw0haQHafNCN-4fNB1n83-4g\"\u003EAcesse aqui.\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cstrong\u003E2. Introdução à análise de dados (Microsoft)\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003ENeste curso, você aprenderá sobre as habilidades, tarefas e processos de um analista de dados para ajudar na tomada de decisões confiáveis para o negócio. A capacitação tem duração de 57 minutos e oferece certificado ao final. \u003Ca href=\"https:\u002F\u002Fwww.eucapacito.com.br\u002Fcursos\u002Fcintroducao-a-analise-de-dados-da-microsoft\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.eucapacito.com.br\u002Fcursos\u002Fcintroducao-a-analise-de-dados-da-microsoft\u002F&source=gmail&ust=1751042218532000&usg=AOvVaw3SDgJ9R5JFGZZoJyio7aCK\"\u003EAcesse aqui.\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cstrong\u003E3. Introdução à nuvem (IBM)\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EEste curso apresenta os principais conceitos da computação em nuvem, para que o usuário adquira o conhecimento básico. Você aprenderá sobre a definição e as características essenciais da ferramenta, sua história, tendências emergentes e o caso de negócios para computação em nuvem. O curso tem duração de 3 horas e oferece certificado ao final. \u003Ca href=\"https:\u002F\u002Fwww.eucapacito.com.br\u002Fcursos\u002Fintroducao-a-nuvem-ibm\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.eucapacito.com.br\u002Fcursos\u002Fintroducao-a-nuvem-ibm\u002F&source=gmail&ust=1751042218532000&usg=AOvVaw25cZZQ-y6GY0dlsV4ePtkW\"\u003EAcesse aqui. \u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cstrong\u003E4. Noções básicas de Python (IBM)\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EUma introdução ao Python, linguagem de programação mais popular, de código aberto, de forma simples e fácil de entender. Tem duração de 9 horas e oferece certificado ao final. \u003Ca href=\"https:\u002F\u002Fwww.eucapacito.com.br\u002Fcursos\u002Fnocoes-basicas-de-python\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.eucapacito.com.br\u002Fcursos\u002Fnocoes-basicas-de-python\u002F&source=gmail&ust=1751042218532000&usg=AOvVaw1lJOoyNZ8tmHqP_G03q6R_\"\u003EAcesse aqui. \u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cstrong\u003E5. Trabalhando em um mundo digital – Habilidades Profissionais (IBM)\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003ENeste curso, além de aprimorar a habilidade técnica, você poderá se aprofundar mais no desenvolvimento pessoal, mergulhando em questões como: colaboração efetiva, pensamento crítico e criativo, habilidades interpessoais e qualidade e agilidade na apresentação do trabalho. A capacitação tem duração de 8 horas e oferece certificado ao final. \u003Ca href=\"https:\u002F\u002Fwww.eucapacito.com.br\u002Fcursos\u002Ftrabalhando-em-um-mundo-digital\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.eucapacito.com.br\u002Fcursos\u002Ftrabalhando-em-um-mundo-digital\u002F&source=gmail&ust=1751042218532000&usg=AOvVaw0Dkubj7N1Ls9hkCYfrVEwO\"\u003EAcesse aqui. \u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cstrong\u003ESobre o Eu Capacito\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EO Eu Capacito é uma das iniciativas sociais do Instituto Itaqui, organização sem fins lucrativos dedicada a projetos educacionais de impacto na área de tecnologia. A plataforma online oferece mais de 200 cursos gratuitos com o objetivo de capacitar uma legião de pessoas para a economia digital. Apoiado por diversas empresas da iniciativa privada, o Eu Capacito promove qualificação na área de tecnologia, fluência digital, empreendedorismo e soft skills. A meta do Eu Capacito é beneficiar 10 milhões de pessoas em 10 anos.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ECom julho se aproximando… uma boa opção é recorrer aos cursos online voltados para o desenvolvimento profissional. 5 cursos gratuitos de tecnologia\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002F5-cursos-gratuitos-de-tecnologia-para-turbinar-seu-curriculo-nas-ferias-de-julho","date":"8 jul, 2025","relativeTime":"há 2 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26134536\u002Fcursos-f%C3%A9rias.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Data","slug":"data","id":16,"link":"https:\u002F\u002Fimasters.com.br\u002Fdata"},{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"},{"title":"Python","slug":"py","id":7232,"link":"https:\u002F\u002Fimasters.com.br\u002Fpy"},{"title":"Software","slug":"software","id":7243,"link":"https:\u002F\u002Fimasters.com.br\u002Fsoftware"},{"title":"Tecnologia","slug":"tecnologia","id":4254,"link":"https:\u002F\u002Fimasters.com.br\u002Ftecnologia"},{"title":"Tendências","slug":"tendencias","id":7264,"link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias"}],"seo":{"open_graph":{"title":"5 cursos gratuitos de tecnologia para turbinar currículo nas férias de julho","description":"Com julho se aproximando... uma boa opção é recorrer aos cursos online voltados para o desenvolvimento profissional. 5 cursos gratuitos de tecnologia","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26134536\u002Fcursos-f%C3%A9rias.jpg","width":800,"height":533},"modified_time":"2025-06-26T13:49:54-03:00","published_time":"2025-07-08T09:14:57-03:00"},"twitter":{"title":"5 cursos gratuitos de tecnologia para turbinar currículo nas férias de julho","description":"Com julho se aproximando... uma boa opção é recorrer aos cursos online voltados para o desenvolvimento profissional. 5 cursos gratuitos de tecnologia","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26134536\u002Fcursos-f%C3%A9rias.jpg"}},"type":"imasters_news"},{"id":163817,"title":"Pesquisa revela que cargo na área de tecnologia é o mais bem pago na Região Sul do Brasil","content":"\u003Cp\u003E\u003Ci\u003EDados levantados pela Icon Talent mostram que, no 1º semestre de 2025, as ocupações na área de tecnologia ficaram no topo com remunerações que passam de R$ 30 mil\u002Fmês; saiba quais são os outros destaques e tendências para o 2º semestre.\u003C\u002Fi\u003E\u003C\u002Fp\u003E\n\u003Cdiv\u003E\n\u003Cp\u003EUma pesquisa exclusiva da Icon Talent, empresa de recrutamento e inteligência em RH, revela que os maiores salários da Região Sul no primeiro semestre de 2025 estão concentrados em cargos nas áreas de tecnologia, engenharia e liderança comercial. Head de Tecnologia — com salário médio de R$ 32 mil\u002Fmês — lidera o ranking, seguido por Gerente de Operações comerciais, com R$ 26 mil\u002Fmês, e Gerente de Projetos de TI, na terceira colocação, com R$ 22 mil\u002Fmês.\u003C\u002Fp\u003E\n\u003Cp\u003EA pesquisa foi realizada com base em milhares de dados coletados pela Icon Talent em seus processos seletivos reais e pesquisas salariais especializadas em cidades como Curitiba, Joinville, Florianópolis e Porto Alegre. O levantamento considera empresas de médio porte (com faturamento entre R$ 50 milhões e R$ 200 milhões, e entre 100 e 500 colaboradores), abrangendo regimes CLT e PJ.\u003C\u002Fp\u003E\n\u003Cp\u003EChristina Curcio, CEO da Icon Talent, explica que o cenário da remuneração está em transformação. “Algumas funções vêm se destacando com aumentos acima da média, impulsionadas pela escassez de talentos e pela alta demanda em setores estratégicos”, afirma a especialista.\u003C\u002Fp\u003E\n\u003Cp\u003EAs funções na área de tecnologia, por exemplo, são o grande destaque. Entre os cinco cargos mais bem pagos, três pertencem ao segmento. A alta demanda por profissionais dessa área já vem sendo apontada há anos. O estudo “Demanda de Talentos em TIC e Estratégia ΣTCEM”, da Brasscom, mostrou que as empresas de tecnologia precisariam de cerca de 797 mil profissionais entre 2021 e 2025, com um déficit anual estimado em 106 mil pessoas — ou 530 mil no acumulado do período.\u003C\u002Fp\u003E\n\u003Cp\u003E“A escassez de talentos, somada à alta procura, faz com que os salários da área de tecnologia subam de forma consistente. Hoje, todas as empresas, independentemente do setor, precisam de profissionais do segmento. Ter talentos capacitados tornou-se essencial — por isso as vagas estão, e devem continuar, em alta”, explica Janaina Lima, COO da Icon Talent.\u003C\u002Fp\u003E\n\u003Cp\u003EA pesquisa também identificou as soft skills mais buscadas para esses cargos em ascensão. São elas: pensamento analítico e resolução de problemas, liderança de times híbridos, fluência em dados e tomada de decisão orientada por evidências, além de comunicação assertiva e habilidade de negociação.\u003C\u002Fp\u003E\n\u003Cp\u003E“É interessante constatar que as empresas buscam profissionais com conhecimentos específicos em suas áreas de atuação, mas também com capacidade de liderança e tomada de decisão. Mesmo com o fim da pandemia, identificamos que os regimes híbridos vieram para ficar, especialmente quando falamos em cargos de nível júnior e pleno, e no formato remoto para cargos de nível sênior e especialistas. Sendo assim, ter essas soft skills apuradas para lidar com times que trabalham à distância é um diferencial”, pondera Christina.\u003C\u002Fp\u003E\n\u003Cp\u003EO ranking completo ainda abrange os cargos de Especialista em Dados (IA), Gerente de RH, Engenheiro de Software Sênior, Engenheiro de Automação, Executivo de Contas Enterprise (TI), Analista Financeiro Sênior e Coordenador de Logística.\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EDados levantados pela Icon Talent mostram que, no 1º semestre de 2025, as ocupações na área de tecnologia ficaram no topo com remunerações que passam de…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fpesquisa-revela-que-cargo-na-area-de-tecnologia-e-o-mais-bem-pago-na-regiao-sul-do-brasil","date":"7 jul, 2025","relativeTime":"há 3 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26131929\u002Ftecnologia1.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"DevSecOps","slug":"devsecops","id":1,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops"}],"seo":{"open_graph":{"title":"Cargo na área de tecnologia é o mais bem pago na Região Sul do Brasil","description":"Dados levantados pela Icon Talent mostram que, no 1º semestre de 2025, as ocupações na área de tecnologia ficaram no topo com remunerações que passam de...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26131929\u002Ftecnologia1.jpg","width":800,"height":533},"modified_time":"2025-06-26T13:20:34-03:00","published_time":"2025-07-07T09:15:59-03:00"},"twitter":{"title":"Cargo na área de tecnologia é o mais bem pago na Região Sul do Brasil","description":"Dados levantados pela Icon Talent mostram que, no 1º semestre de 2025, as ocupações na área de tecnologia ficaram no topo com remunerações que passam de...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26131929\u002Ftecnologia1.jpg"}},"type":"imasters_news"},{"id":163814,"title":"Afinal, o celular ouve mesmo? NordVPN explica como os anúncios sabem tudo sobre você","content":"\u003Cp style=\"font-weight: 400;\"\u003E\u003Cstrong\u003E\u003Cu\u003ESim, é verdade! O celular ouve as conversas e transforma tudo em anúncios\u003C\u002Fu\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E\u003Cem\u003EEstudo da NordVPN comprovou que dispositivos das big techs são capazes de ‘ouvir’ as conversas dos usuários para convertê-las em anúncios\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003ECertamente todos já foram surpreendidos por uma situação inusitada na qual, após conversar sobre algo aleatório, que não é do cotidiano e, logo após, navegando pela internet ou acessando o e-mail se deparar com uma propaganda relacionada com aquilo que conversava e então questionar se o telefone é capaz de ouvir as conversas.\u003C\u002Fp\u003E\n\u003Ch2\u003EO celular ouve mesmo?\u003C\u002Fh2\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EPara saber se isso realmente acontece ou se não passa de uma coincidência, pesquisadores da NordVPN criaram um experimento para desvendar esse ‘mistério’ da era digital. Para isso, temas como animais favoritos, países aleatórios e itens de moda foram discutidos intencionalmente próximos aos aparelhos para medir o tempo até que aparecessem anúncios relacionados.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EE o resultado foi certeiro! Após conversas sobre certos assuntos, os pesquisadores passaram a receber anúncios patrocinados, de destinos de viagem a ONGs de proteção animal. Portanto, sim, o celular ouve tudo para oferecer anúncios personalizados.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EMas isso não é ilegal? Não. Sabe aqueles termos de uso que é preciso clicar na caixinha e dizer “Eu concordo”? Pois bem, desde que o usuário tenha consentido com o uso de dados pessoais nos aplicativos, as big techs podem sim escutar as conversas e usar os dados para oferecer propagandas.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EFaça o teste\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EA NordVPN alerta que qualquer pessoa pode fazer esse teste e recomenda revisar as permissões dos apps instalados.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EMas como isso funciona? O microfone embutido dos celulares permanece ativo o tempo todo, pronto para escutar comandos de voz para assistentes virtuais — que também captam conversas de fundo para gerar anúncios personalizados com base no que se fala.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EPara flagrar essa tecnologia em ação, um membro da equipe falou sobre destinos turísticos aleatórios, como a Arábia Saudita. Poucos dias depois, anúncios do Booking.com sobre hotéis em AlUla começaram a aparecer no Facebook.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EOutro pesquisador mencionou o tema “orangotangos” repetidamente e, no dia seguinte, recebeu anúncios de instituições de caridade voltadas à causa animal.\u003C\u002Fp\u003E\n\u003Ch3 style=\"font-weight: 400;\"\u003E\u003Cstrong\u003E4 passos para saber se o celular está espionando\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli\u003EEscolha um tema único\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EFale sobre algo que nunca pesquisou ou comentou perto do celular.\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003EConverse sobre o tema\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EDurante alguns dias, mencione o assunto com palavras-chave próximas ao celular.\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003EUse o celular normalmente\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp style=\"font-weight: 400;\"\u003ENão pesquise nem interaja com conteúdos sobre o tema testado. Apenas fale.\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003EObserve os anúncios\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EPreste atenção nos anúncios nos próximos dias. Se o tema surgir, seu celular pode estar ouvindo.\u003C\u002Fp\u003E\n\u003Ch3 style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003EDicas de privacidade\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E\u003Cstrong\u003E \u003C\u002Fstrong\u003E“A maioria já viu um anúncio sobre algo que só foi falado, nunca pesquisado. Isso é um alerta: seu dispositivo pode estar acessando mais dados do que deveria”, afirma Marijus Briedis, CTO da NordVPN.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EPara evitar isso, Briedis recomenda 6 dicas para manter sua privacidade no smartphone:\u003C\u002Fp\u003E\n\u003Cul style=\"font-weight: 400;\"\u003E\n\u003Cli\u003EBaixe apenas de lojas oficiais: apps fora da Google Play ou App Store podem conter malwares.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cul style=\"font-weight: 400;\"\u003E\n\u003Cli\u003ERevise permissões regularmente: desconfie de apps que pedem acesso ao microfone, câmera ou localização sem motivo claro.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cul style=\"font-weight: 400;\"\u003E\n\u003Cli\u003EGerencie os dados de assistentes de voz: apague o histórico de voz da Alexa ou do Google com frequência.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cul style=\"font-weight: 400;\"\u003E\n\u003Cli\u003EUse um bom VPN: o NordVPN criptografa seus dados e protege conexões públicas.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cul style=\"font-weight: 400;\"\u003E\n\u003Cli\u003EAtualize sempre: versões antigas do sistema têm brechas que facilitam ataques.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cul style=\"font-weight: 400;\"\u003E\n\u003Cli\u003EAtive ferramentas nativas de segurança: como autenticação em dois fatores e backups criptografados.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E\u003Cstrong\u003E\u003Cu\u003ESobre a NordVPN\u003C\u002Fu\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EA NordVPN é o provedor de serviços VPN mais avançado do planeta, usado por milhões de usuários de internet no mundo todo. A NordVPN fornece dupla criptografia VPN e Onion Over VPN, garantindo privacidade com rastreamento zero. Um dos principais recursos do produto é a Proteção Contra Ameaças, que bloqueia sites maliciosos, malware, rastreadores e anúncios maliciosos. É muito fácil de usar, oferece um dos melhores preços do mercado e possui mais de 6,2 mil servidores em 111 países. Para mais informações, acesse: \u003Ca href=\"http:\u002F\u002Fnordvpn.com\u002F\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=http:\u002F\u002Fnordvpn.com&source=gmail&ust=1751036282382000&usg=AOvVaw0ttbJN7IVAu8PniKyt0v6R\"\u003Enordvpn.com\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ESim, é verdade! O celular ouve as conversas e transforma tudo em anúnciosEstudo da NordVPN comprovou que dispositivos das big techs são capazes de…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fafinal-o-celular-ouve-mesmo-nordvpn-explica-como-os-anuncios-sabem-tudo-sobre-voce","date":"3 jul, 2025","relativeTime":"há 7 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26130227\u002Fcelular-ouve.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"}],"seo":{"open_graph":{"title":"O celular ouve mesmo? como anúncios sabem tudo sobre você","description":"Sim, é verdade! O celular ouve as conversas e transforma tudo em anúnciosEstudo da NordVPN comprovou que dispositivos das big techs são capazes de...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26130227\u002Fcelular-ouve.jpg","width":800,"height":533},"modified_time":"2025-06-26T13:03:00-03:00","published_time":"2025-07-03T09:15:45-03:00"},"twitter":{"title":"O celular ouve mesmo? como anúncios sabem tudo sobre você","description":"Sim, é verdade! O celular ouve as conversas e transforma tudo em anúnciosEstudo da NordVPN comprovou que dispositivos das big techs são capazes de...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26130227\u002Fcelular-ouve.jpg"}},"type":"imasters_news"},{"id":163811,"title":"Brasil registra crescimento de 282% em matrículas em IA Generativa, segundo Coursera","content":"\u003Cp\u003EA plataforma de aprendizado online Coursera, divulgou hoje seu \u003Ca href=\"https:\u002F\u002Fwww.coursera.org\u002Fskills-reports\u002Fglobal\u002Fpdf\u002Fgsr-2025-latam-es\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.coursera.org\u002Fskills-reports\u002Fglobal\u002Fpdf\u002Fgsr-2025-latam-es&source=gmail&ust=1751036222519000&usg=AOvVaw3jNk1BUEiaWmc_04CtMwkF\"\u003ERelatório Global de Habilidades anual\u003C\u002Fa\u003E, revelando um aumento de 282% nas matrículas em cursos de Inteligência Artificial Generativa (IA Gen) no Brasil em relação ao ano anterior.\u003C\u002Fp\u003E\n\u003Cp\u003EEsse ritmo de capacitação em IA Generativa supera o aumento de 135% registrado na América do Norte e os 195% no mundo todo.\u003C\u002Fp\u003E\n\u003Cp\u003EEsse crescimento acelerado posiciona o Brasil entre os maiores adotantes de IA Generativa na América Latina e reflete uma mudança mais ampla em direção ao aprendizado focado em IA e à transformação digital no país.\u003C\u002Fp\u003E\n\u003Ch2\u003EIA Generativa\u003C\u002Fh2\u003E\n\u003Cp\u003EBaseado em insights da comunidade global da Coursera, composta por mais de 170 milhões de alunos, o relatório acompanha tendências emergentes de habilidades em mais de 100 países.\u003C\u002Fp\u003E\n\u003Cp\u003EEm sua sétima edição, o Relatório de 2025 classifica o Brasil na 63ª posição mundial em proficiência geral em habilidades e na 9ª posição na América Latina.\u003C\u002Fp\u003E\n\u003Cp\u003EOs alunos brasileiros demonstram 68% de proficiência em negócios, 57% em tecnologia e 59% em ciência de dados. No novo Índice de Maturidade em IA da Coursera, o país ocupa o 2º lugar na América Latina, sinalizando um forte impulso para se tornar um dos líderes regionais em IA.\u003C\u002Fp\u003E\n\u003Cp\u003EA transformação de habilidades no Brasil está sendo impulsionada por esforços coordenados entre governo e setor privado para modernizar a força de trabalho e preencher lacunas críticas de talentos digitais.\u003C\u002Fp\u003E\n\u003Cp\u003EÀ medida que a IA e a automação continuam a reformular o mercado de trabalho, os alunos estão reagindo. As matrículas em cursos de inteligência artificial (IA) e aprendizado de máquina (ML) cresceram 199%, as de cibersegurança aumentaram 111%, pensamento crítico 26% e pensamento criativo 35%, refletindo um compromisso crescente com o desenvolvimento de capacidades humanas e técnicas.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EFuturo do Trabalho\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EEssas prioridades estão alinhadas com as descobertas do Relatório sobre o Futuro do Trabalho de 2025 do Fórum Econômico Mundial, que destaca a escassez de habilidades como uma das principais barreiras à transformação dos negócios no Brasil, com \u003Ca href=\"https:\u002F\u002Freports.weforum.org\u002Fdocs\u002FWEF_Future_of_Jobs_Report_2025.pdf\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Freports.weforum.org\u002Fdocs\u002FWEF_Future_of_Jobs_Report_2025.pdf&source=gmail&ust=1751036222520000&usg=AOvVaw1I9KUxjIgWLz6_Rmf0iP6u\"\u003E91% das empresas investindo ativamente na requalificação e atualização de suas equipes\u003C\u002Fa\u003E para se adaptarem às mudanças impulsionadas pela IA.\u003C\u002Fp\u003E\n\u003Cp\u003EQuase 90% dos empregadores brasileiros esperam expandir seus esforços de capacitação nos próximos cinco anos, ressaltando a necessidade urgente de criar caminhos inclusivos e acessíveis para o desenvolvimento de habilidades em IA, tecnologia e competências digitais em escala.\u003C\u002Fp\u003E\n\u003Cp\u003E“O impulso do Brasil em IA e habilidades digitais é tanto impressionante quanto encorajador. Um aumento de 282% nas matrículas em IA Gen mostra que os alunos não estão esperando pelo futuro do trabalho – eles estão moldando-o ativamente”, disse Christian Hernández, Diretor da América Latina na Coursera. “Estamos vendo uma forte colaboração entre setores, empresas requalificando suas equipes, educadores inovando em suas abordagens e indivíduos investindo em habilidades que realmente importam. Na Coursera, temos orgulho de apoiar o Brasil na formação de uma força de trabalho mais inclusiva, ágil e preparada para liderar na era da IA.”\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EPrincipais descobertas sobre o Brasil:\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cul\u003E\n\u003Cli aria-level=\"1\"\u003E\u003Cstrong\u003EBrasil avança fortemente em habilidades de IA Gen, mas ainda há disparidades de gênero:\u003C\u002Fstrong\u003E Embora as matrículas em IA Gen entre os brasileiros tenham crescido fortemente em relação ao ano anterior, as mulheres representam apenas 25% desses alunos — apesar de constituírem 50% da base de alunos da Coursera no país. Isso indica a necessidade de ampliar o acesso das mulheres às habilidades em tecnologias emergentes.\u003C\u002Fli\u003E\n\u003Cli aria-level=\"1\"\u003E\u003Cstrong\u003ECredenciais alinhadas à carreira ganham espaço:\u003C\u002Fstrong\u003E As matrículas em Certificados Profissionais no Brasil aumentaram 29%, refletindo o forte interesse dos alunos em percursos de aprendizado flexíveis, práticos e voltados para o mercado de trabalho. No entanto, apenas 18% dessas matrículas são de mulheres, o que destaca uma oportunidade de reduzir a disparidade de gênero em programas de preparação para o trabalho.\u003C\u002Fli\u003E\n\u003Cli aria-level=\"1\"\u003E\u003Cstrong\u003EAlunos desenvolvem combinação de habilidades técnicas e de liderança:\u003C\u002Fstrong\u003E Os cursos mais populares no Brasil incluem comunicação, desenvolvimento de liderança, aprendizado profundo (deep learning) e visualização de dados, refletindo a demanda por habilidades multidisciplinares que combinam pensamento estratégico com fluência tecnológica.\u003C\u002Fli\u003E\n\u003Cli aria-level=\"1\"\u003E\u003Cstrong\u003EHabilidades humanas são essenciais para o futuro:\u003C\u002Fstrong\u003E Os brasileiros estão cada vez mais focados em capacidades centradas no ser humano, como pensamento crítico (aumento de 26%), automotivação (aumento de 6%) e inteligência emocional — habilidades essenciais para adaptação em ambientes de trabalho transformados pela IA.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003ECom 6,7 milhões de alunos da Coursera no país e idade média de 36 anos, a população jovem e motivada do Brasil está preparada para prosperar em uma economia global cada vez mais digital e em rápida transformação. À medida que a demanda por habilidades avançadas acelera em diversos setores, o Brasil está bem posicionado para fortalecer seu ecossistema de inovação, preencher lacunas críticas de talentos e avançar rumo a um futuro digital mais inclusivo, competitivo e resiliente.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EBaixe o relatório completo em espanhol e explore insights específicos por país ou região\u003C\u002Fstrong\u003E\u003Ca href=\"https:\u002F\u002Fwww.coursera.org\u002Fskills-reports\u002Fglobal\u002Fpdf\u002Fgsr-2025-latam-es\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.coursera.org\u002Fskills-reports\u002Fglobal\u002Fpdf\u002Fgsr-2025-latam-es&source=gmail&ust=1751036222520000&usg=AOvVaw2A4fQnXhT_Qhp6_FkIGdFI\"\u003E\u003Cstrong\u003E [aqui]\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Ch5\u003E\u003Cstrong\u003EMetodologia\u003C\u002Fstrong\u003E\u003C\u002Fh5\u003E\n\u003Cp\u003E\u003Cspan style=\"font-size: 8pt;\"\u003EO Relatório Global de Habilidades 2025 baseia-se em dados de 170 milhões de alunos da Coursera entre março de 2024 e fevereiro de 2025, identificando habilidades-chave em mais de 100 países e seis regiões. Ele apoia empresas, governos e instituições educacionais no desenvolvimento de programas que ajudem as pessoas a prosperar em meio a mudanças rápidas. O relatório classifica 109 países com base na proficiência dos alunos em 274 habilidades nas áreas de negócios, tecnologia e ciência de dados. As classificações combinam dados da plataforma Coursera com métricas confiáveis de terceiros, como o Banco Mundial e a Organização Mundial da Propriedade Intelectual (OMPI), oferecendo uma visão abrangente da proficiência em habilidades. Pela primeira vez, o relatório também introduz um novo Índice de Maturidade em IA, que analisa a preparação geral de um país em inovação, aprendizado e pesquisa em IA. Esse índice utiliza dados da Coursera juntamente com métricas do Fundo Monetário Internacional (FMI) e da Organização para a Cooperação e Desenvolvimento Econômico (OCDE).\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ECoursera divulga o Relatório Global de Habilidades, revelando um aumento de 282% nas matrículas em cursos de Inteligência Artificial Generativa no Brasil\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fbrasil-registra-crescimento-de-282-em-matriculas-em-ia-generativa-segundo-coursera","date":"2 jul, 2025","relativeTime":"há 8 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26121321\u002FMichael-S-Unsplash-2.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Generative AI","slug":"generative-ai","id":8941,"link":"https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai"},{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"}],"seo":{"open_graph":{"title":"Brasil registra crescimento de 282% em matrículas em IA Generativa","description":"Coursera divulga o Relatório Global de Habilidades, revelando um aumento de 282% nas matrículas em cursos de IA Generativa no Brasil","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26121321\u002FMichael-S-Unsplash-2.jpg","width":800,"height":533},"modified_time":"2025-06-26T12:15:34-03:00","published_time":"2025-07-02T09:15:35-03:00"},"twitter":{"title":"Brasil registra crescimento de 282% em matrículas em IA Generativa","description":"Coursera divulga o Relatório Global de Habilidades, revelando um aumento de 282% nas matrículas em cursos de IA Generativa no Brasil","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26121321\u002FMichael-S-Unsplash-2.jpg"}},"type":"imasters_news"},{"id":163804,"title":"Por que meu computador ou celular fica mais lento com o tempo?","content":"\u003Cp style=\"font-weight: 400;\"\u003EJá reparou que, com o passar dos meses, seu celular ou computador começa a ficar mais lento? Às vezes, tudo o que você faz é abrir uma aba no navegador e o aparelho começa a travar. Mas calma, você não está sozinho nessa! A culpa, em boa parte, não é do seu aparelho, mas sim de alguns fatores que vão se acumulando e deixando o desempenho dele um pouco devagar.\u003C\u002Fp\u003E\n\u003Ch2\u003EComputador ou celular mais lento\u003C\u002Fh2\u003E\n\u003Cp style=\"font-weight: 400;\"\u003ESegundo Marco Giroto, especialista em tecnologia e fundador da escola de programação, robótica, tecnologia e inovação SuperGeeks, os aparelhos, com o tempo, acumulam arquivos e processos que acabam sobrecarregando a memória e o processador e explica:\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E“Isso acontece porque, com o uso diário, muitos programas e apps ficam rodando em segundo plano sem que a gente perceba. Isso consome recursos preciosos, fazendo com que o aparelho tenha que ‘trabalhar mais’ para fazer tarefas simples”.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EAlém disso, outro motivo para a lentidão é o famoso “acúmulo de lixo digital”, que são arquivos temporários, cookies, cache de apps e até aqueles arquivos que você nem sabe que estão lá, mas que ocupam um bom espaço. Esses arquivos são criados durante o uso, mas nem sempre são apagados corretamente, fazendo o sistema ficar mais pesado.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E“Outro motivo é a atualização dos sistemas e apps. Apesar de parecerem algo bom, elas podem exigir mais poder de processamento do que o seu aparelho tem disponível. Isso é algo que a gente não controla muito, mas, é sempre bom dar uma olhada nas atualizações e, se possível, gerenciar os apps que estão consumindo mais bateria e dados”, complementa Marco.\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_163807\" aria-describedby=\"caption-attachment-163807\" style=\"width: 500px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26113024\u002Fcelular-travando.jpg\"\u003E\u003Cimg class=\"wp-image-163807\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26113024\u002Fcelular-travando.jpg\" alt=\"\" width=\"500\" height=\"281\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-163807\" class=\"wp-caption-text\"\u003EExemplo de um celular de modelo antigo, com o funcionamento travado. Imagem: Divulgação\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EAlém de todos esses fatores, outro ponto importante que contribui para a lentidão do seu dispositivo é a \u003Cstrong\u003Eobsolescência programada\u003C\u002Fstrong\u003E. Isso acontece quando os fabricantes criam produtos com uma vida útil limitada, com o objetivo de incentivar o consumo de novos modelos, como se fossem “viciados”.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EComo resultado, mesmo que seu aparelho ainda funcione, ele pode não ser capaz de acompanhar as exigências dos novos aplicativos e atualizações, tornando-se \u003Cstrong\u003Eobsoleto \u003C\u002Fstrong\u003Emais rapidamente (daí que vem o nome). “Esse é um fator que, muitas vezes, vai além do acúmulo de dados, tornando o aparelho mais lento e com dificuldades para rodar os sistemas mais recentes”, afirma o especialista.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EMas nem tudo está perdido! \u003Cem\u003EGiroto\u003C\u002Fem\u003E sugere algumas dicas simples para manter a performance do seu aparelho em alta: limpar o cache dos apps, fazer uma manutenção regular, desinstalar apps que você não usa e até fazer uma restauração de fábrica de vez em quando pode ajudar a dar uma renovada na máquina.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EAlém disso, ele também sugere considerar o momento de substituir o dispositivo, já que com o tempo a tecnologia evolui e pode não compensar manter um aparelho que não atende mais às suas necessidades.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003ENo final das contas, a lentidão é uma consequência natural do uso constante e das tecnologias que vão se atualizando. Mas com um pouco de cuidado e manutenção, dá para dar aquele gás na performance do seu dispositivo.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EJá reparou que, com o passar dos meses, seu celular ou computador começa a ficar mais lento? Às vezes, tudo o que você faz é abrir uma aba no navegador…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fpor-que-meu-computador-ou-celular-fica-mais-lento-com-o-tempo","date":"1 jul, 2025","relativeTime":"há 9 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26112600\u002Fcelular-mais-lento.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"DevSecOps","slug":"devsecops","id":1,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops"},{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"}],"seo":{"open_graph":{"title":"Por que meu computador ou celular fica mais lento com o tempo?","description":"Já reparou que, com o passar dos meses, seu celular ou computador começa a ficar mais lento? Às vezes, tudo o que você faz é abrir uma aba no navegador...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26112600\u002Fcelular-mais-lento.jpg","width":800,"height":533},"modified_time":"2025-06-26T11:32:12-03:00","published_time":"2025-07-01T09:15:21-03:00"},"twitter":{"title":"Por que meu computador ou celular fica mais lento com o tempo?","description":"Já reparou que, com o passar dos meses, seu celular ou computador começa a ficar mais lento? Às vezes, tudo o que você faz é abrir uma aba no navegador...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F26112600\u002Fcelular-mais-lento.jpg"}},"type":"imasters_news"},{"id":163801,"title":"Ataques DDoS com menos de 5 minutos aumentam quase 40%","content":"\u003Ch2\u003EEm meio ao ataques do “novo DDoS”, soluções do passado não protegem mais contra ameaças do futuro\u003C\u002Fh2\u003E\n\u003Cdiv\u003E\n\u003Cp\u003EOs ataques DDoS (Distributed Denial of Service) continuam sendo uma das ameaças mais recorrentes e sofisticadas no universo da cibersegurança.\u003C\u002Fp\u003E\n\u003Cp\u003EDe acordo com o relatório \u003Ca href=\"https:\u002F\u002Fnsfocusglobal.com\u002Fcompany-overview\u002Fresources\u002F2024-global-ddos-landscape-report\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fnsfocusglobal.com\u002Fcompany-overview\u002Fresources\u002F2024-global-ddos-landscape-report\u002F&source=gmail&ust=1751032441129000&usg=AOvVaw3zh1N77u4Y_N4kUSEqy7iZ\"\u003E\u003Cem\u003EGlobal DDoS Landscape\u003C\u002Fem\u003E\u003C\u002Fa\u003E, da NSFOCUS, do ano passado para cá, houve um aumento expressivo tanto na frequência quanto na complexidade dos ataques.\u003C\u002Fp\u003E\n\u003Cp\u003EO material reúne as informações obtidas a partir de um profundo estudo sobre o mercado de cibersegurança, baseado nas tendências de tráfego global e na base de clientes da empresa, e levantou três pontos que chamaram a atenção:\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003ECrescimento de ataques ultracurtos e massivos\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EOs chamados \u003Cstrong\u003Eataques relâmpago\u003C\u002Fstrong\u003E (burst attacks), que duram menos de 5 minutos, cresceram 36,5%.\u003C\u002Fp\u003E\n\u003Cp\u003EApesar de breves, eles geraram picos de tráfego extremamente elevados, dificultando a detecção e exigindo respostas automatizadas em tempo real.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EMultiplicação de vetores de ataque\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EOs ataques \u003Cstrong\u003Emultivetoriais\u003C\u002Fstrong\u003E (multi-vector attacks), que combinam diferentes tipos de técnicas – como inundações UDP, TCP e ataques a camada de aplicação (Layer 7) – representaram mais de 55% dos casos.\u003C\u002Fp\u003E\n\u003Cp\u003EIsso mostra uma clara intenção de sobrecarregar diferentes pontos da infraestrutura de rede e aplicação simultaneamente.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003ECrescimento de ataques contra aplicações e APIs\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EA camada de aplicação e interfaces de programação (APIs) tornaram-se alvos preferenciais. Isso se deve à sua criticidade nos serviços digitais e à dificuldade de distinguir tráfego legítimo do malicioso nesse nível.\u003C\u002Fp\u003E\n\u003Cp\u003EEm muitos casos, bots avançados simulam o comportamento humano para driblar mecanismos tradicionais de mitigação.\u003C\u002Fp\u003E\n\u003Cp\u003ENeste momento, o grande desafio das equipes de cibersegurança é adequar modelos antigos que não funcionam mais. Segundo Raphael Tedesco, diretor de negócios da NSFOCUS, a maioria das organizações ainda depende de soluções pontuais, como firewalls tradicionais ou balanceadores de carga, ineficazes contra ataques distribuídos, multivetoriais e de camada de aplicação.\u003C\u002Fp\u003E\n\u003Cp\u003E“Além disso, a dependência exclusiva de soluções locais (on-premises) limita a capacidade de resposta contra ataques de grande escala”, ressalta.\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_163802\" aria-describedby=\"caption-attachment-163802\" style=\"width: 500px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26110015\u002FRaphael-Tedesco-Diretor-de-negocios-da-NSFOCUS-para-America-Latina.jpg\"\u003E\u003Cimg class=\"wp-image-163802\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26110015\u002FRaphael-Tedesco-Diretor-de-negocios-da-NSFOCUS-para-America-Latina.jpg\" alt=\"\" width=\"500\" height=\"333\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-163802\" class=\"wp-caption-text\"\u003ERaphael Tedesco, Diretor de negócios da NSFOCUS para América Latina | Imagem: Divulgação\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cp\u003EOutro ponto crítico é a falsa sensação de segurança. Empresas que não sofreram incidentes recentes tendem a subestimar a sofisticação dos atacantes e a velocidade com que novas ferramentas criminosas são disponibilizadas como serviço, como no modelo DDoS-as-a-Service.\u003C\u002Fp\u003E\n\u003Cp\u003EDiante desse cenário, é essencial que as empresas tenham uma abordagem \u003Cstrong\u003Eproativa, distribuída e inteligente\u003C\u002Fstrong\u003E para a defesa contra DDoS. Algumas recomendações incluem:\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003EMitigação híbrida (cloud + on-premises):\u003C\u002Fstrong\u003E Serviços de proteção em nuvem com aplicações locais permitem escalar a resposta conforme o tipo e o volume do ataque.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EInspeção inteligente de tráfego:\u003C\u002Fstrong\u003E Soluções com análise comportamental e uso de IA ajudam a identificar padrões anômalos e distinguir bots de usuários legítimos.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EProteção específica para aplicações e APIs:\u003C\u002Fstrong\u003E Firewalls de aplicação web (WAFs), gateways de API e serviços de proteção L7 devem ser integrados ao plano de defesa.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ESimulações e testes regulares:\u003C\u002Fstrong\u003E Testes controlados de resistência são fundamentais para avaliar a eficácia das defesas existentes e preparar a equipe de resposta a incidentes.\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EMonitoramento contínuo e resposta automatizada:\u003C\u002Fstrong\u003E A visibilidade em tempo real e a tomada de decisões automatizadas são essenciais para conter ataques curtos e intensos.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003EOs ataques DDoS deixaram de ser apenas uma tática de desestabilização para se tornarem uma arma estratégica – utilizada por grupos hacktivistas, criminosos financeiros e em campanhas coordenadas de guerra cibernética.\u003C\u002Fp\u003E\n\u003Cp\u003E“Dessa forma, as empresas que não evoluírem suas defesas continuarão vulneráveis a ataques que, mesmo durando poucos minutos, podem gerar prejuízos financeiros e reputacionais imensos”, finaliza Tedesco.\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EEm meio ao ataques do "novo DDoS", soluções do passado não protegem mais contra ameaças do futuro. Ataques DDoS com menos de 5 minutos aumentam quase 40%\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fataques-ddos-com-menos-de-5-minutos-aumentam-quase-40","date":"30 jun, 2025","relativeTime":"há 10 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26110713\u002FAtaques-DDos.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"DevSecOps","slug":"devsecops","id":1,"link":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops"},{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"},{"title":"Segurança","slug":"seguranca","id":7269,"link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca"}],"seo":{"open_graph":{"title":"Ataques DDoS com menos de 5 minutos aumentam quase 40%","description":"Em meio ao ataques do \"novo DDoS\", soluções do passado não protegem mais contra ameaças do futuro. Ataques DDoS com menos de 5 minutos aumentam quase 40%","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26110713\u002FAtaques-DDos.jpg","width":800,"height":533},"modified_time":"2025-06-26T11:08:54-03:00","published_time":"2025-06-30T09:15:40-03:00"},"twitter":{"title":"Ataques DDoS com menos de 5 minutos aumentam quase 40%","description":"Em meio ao ataques do \"novo DDoS\", soluções do passado não protegem mais contra ameaças do futuro. Ataques DDoS com menos de 5 minutos aumentam quase 40%","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26110713\u002FAtaques-DDos.jpg"}},"type":"imasters_news"},{"id":163795,"title":"Gartner prevê que 75% dos conteúdos de analytics usarão GenAI para inteligência contextual aprimorada até 2027","content":"\u003Cp style=\"font-weight: 400;\"\u003ESetenta e cinco por cento dos novos conteúdos de \u003Cem\u003Eanalytics\u003C\u002Fem\u003E serão contextualizados para aplicações inteligentes por meio de \u003Ca href=\"https:\u002F\u002Fwww.gartner.com\u002Fen\u002Fnewsroom\u002Fpress-releases\u002F2025-03-31-gartner-forecasts-worldwide-genai-spending-to-reach-644-billion-in-2025\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.gartner.com\u002Fen\u002Fnewsroom\u002Fpress-releases\u002F2025-03-31-gartner-forecasts-worldwide-genai-spending-to-reach-644-billion-in-2025&source=gmail&ust=1750956542889000&usg=AOvVaw10TeuEhT2fObFvy6P3gGrv\"\u003EInteligência Artificial Generativa\u003C\u002Fa\u003E (GenAI) até 2027, permitindo uma conexão combinável entre insights e ações, de acordo com o \u003Cstrong\u003EGartner, Inc\u003C\u002Fstrong\u003E.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E“Estamos passando de uma era em que as ferramentas de análise ajudavam profissionais de negócios a tomar decisões, para um futuro em que analytics impulsionado por GenAI se tornará perceptivo e adaptativo. Isso possibilitará decisões dinâmicas e autônomas que têm o potencial de transformar software corporativo e de consumo, processos de negócios e modelos operacionais”, diz Georgia O’Callaghan, Diretora Analista do Gartner.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EUma pesquisa do Gartner com 403 líderes de analytics ou Inteligência Artificial (IA), realizada entre outubro e dezembro de 2024, revelou que mais de 50% relatam que suas empresas usam ferramentas de IA para \u003Cem\u003Einsights\u003C\u002Fem\u003E automatizados e consultas em linguagem natural (Geração de Linguagem Natural – NLG) para analytics ou \u003Ca href=\"https:\u002F\u002Fwww.gartner.com\u002Fen\u002Fnewsroom\u002Fpress-releases\u002F2025-03-03-gartner-identifies-three-areas-to-help-data-and-analytics-leaders-scale-ai\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.gartner.com\u002Fen\u002Fnewsroom\u002Fpress-releases\u002F2025-03-03-gartner-identifies-three-areas-to-help-data-and-analytics-leaders-scale-ai&source=gmail&ust=1750956542889000&usg=AOvVaw3l6Bx8dx5NJWFkYuqkGvGf\"\u003Edesenvolvimento de Inteligência Artificial\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EMesmo com esses recursos, a natureza estática do \u003Cem\u003Eanalytics\u003C\u002Fem\u003E atual muitas vezes não consegue entregar resultados verdadeiramente dinâmicos e automatizados.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EO Gartner prevê que os recursos de \u003Cem\u003Eaugmented analytics\u003C\u002Fem\u003E evoluirão para plataformas de \u003Cem\u003Eanalytics\u003C\u002Fem\u003E autônomas até 2027, que gerenciarão e executarão totalmente 20% dos processos de negócios.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EO futuro perceptivo do \u003Cem\u003Eanalytics\u003C\u002Fem\u003E proporcionará benefícios por ser proativo, colaborativo, conectado, contextual e contínuo.\u003C\u002Fp\u003E\n\u003Ch2 style=\"font-weight: 400;\"\u003E\u003Cstrong\u003EAnalytics perceptivo impulsionado por IA\u003C\u002Fstrong\u003E\u003C\u002Fh2\u003E\n\u003Cfigure id=\"attachment_163796\" aria-describedby=\"caption-attachment-163796\" style=\"width: 779px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26101117\u002FGartner-1.png\"\u003E\u003Cimg class=\"wp-image-163796 size-full\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26101117\u002FGartner-1.png\" alt=\"\" width=\"779\" height=\"351\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-163796\" class=\"wp-caption-text\"\u003EFonte: Gartner (Junho 2025)\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E“O analytics perceptivo usará agentes de IA e outras tecnologias impulsionadas pela GenAI para monitorar continuamente as condições em evolução e perceber o ambiente-alvo, como mudanças no mercado e no comportamento do cliente ou interrupções na cadeia de suprimentos”, diz O’Callaghan.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E“A orientação e a análise podem então ser ajustadas de forma autônoma em resposta, criando uma infraestrutura analítica mais resiliente e responsiva. À medida que esses recursos surgem e são adotados pelas empresas, seu potencial para remodelar as operações de negócios e impulsionar o crescimento só tende a se expandir.”\u003C\u002Fp\u003E\n\u003Ch3 style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003ERisco abrangente do analytics perceptivo\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EDe acordo com a pesquisa do Gartner, o risco abrangente que se aplica ao \u003Cem\u003Eanalytics\u003C\u002Fem\u003E perceptivo é a dependência excessiva de ações autônomas sem validação suficiente, o que pode resultar em consequências negativas não intencionais, danos à reputação e escrutínio regulatório.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EO risco de “desvio de agente” é uma preocupação séria, em que as percepções e ações de um sistema se desviam gradualmente dos resultados desejados devido à evolução dos dados ou a interações imprevistas. O Gartner afirma que os agentes guardiões estão surgindo para lidar com esse problema inerente aos sistemas de IA. Esses agentes monitoram e aplicam especificamente políticas e regras para garantir que os sistemas operem dentro de um conjunto de barreiras de proteção.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E“A criação de agentes guardiões precisará ser um ponto focal importante das novas iniciativas de governança para os líderes de Data & Analytics (D&A), à medida que o \u003Ca href=\"https:\u002F\u002Fwww.gartner.com\u002Fen\u002Fnewsroom\u002Fpress-releases\u002F2025-03-05-gartner-identifies-top-trends-in-data-and-analytics-for-2025\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.gartner.com\u002Fen\u002Fnewsroom\u002Fpress-releases\u002F2025-03-05-gartner-identifies-top-trends-in-data-and-analytics-for-2025&source=gmail&ust=1750956542889000&usg=AOvVaw1IbT2qAiPwbm_EVDuX41bD\"\u003Eanalytics\u003C\u002Fa\u003E agêntico e perceptivo se tornarem a forma padrão de fornecimento de \u003Cem\u003Einsights\u003C\u002Fem\u003E em todas as plataformas”, complementa O’Callaghan.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003ETemas como esse e outros que exploram o cenário em evolução de riscos e estratégias, além de \u003Cem\u003Einsights\u003C\u002Fem\u003E práticos ​​sobre como lidar com os desafios de ambientes cibernéticos cada vez mais complexos serão destaque na \u003Cstrong\u003EConferência\u003C\u002Fstrong\u003E \u003Cstrong\u003EGartner Segurança & Gestão de Risco\u003C\u002Fstrong\u003E, que será realizada nos dias 05 e 06 de agosto, em São Paulo. Mais informações estão disponíveis em: \u003Ca href=\"https:\u002F\u002Fwww.gartner.com\u002Fpt-br\u002Fconferences\u002Fla\u002Fsecurity-risk-management-brazil\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.gartner.com\u002Fpt-br\u002Fconferences\u002Fla\u002Fsecurity-risk-management-brazil&source=gmail&ust=1750956542889000&usg=AOvVaw2qSB_g_JGFNC3cRuu4lCQF\"\u003Ehttps:\u002F\u002Fwww.gartner.com\u002Fpt-br\u002Fconferences\u002Fla\u002Fsecurity-risk-management-brazil\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EOs clientes do Gartner podem ler mais em “\u003Ca href=\"https:\u002F\u002Fwww.gartner.com\u002Fdocument-reader\u002Fdocument\u002F6538702\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.gartner.com\u002Fdocument-reader\u002Fdocument\u002F6538702&source=gmail&ust=1750956542889000&usg=AOvVaw1ucopli0Cj7ANKaqNR5Lkw\"\u003EPerception is the New Superpower for the Future of Analytics and BI\u003C\u002Fa\u003E”. Informações adicionais estão disponíveis no webinar gratuito do Gartner “\u003Ca href=\"https:\u002F\u002Fwww.gartner.com\u002Fen\u002Fwebinar\u002F718038\u002F1610594\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.gartner.com\u002Fen\u002Fwebinar\u002F718038\u002F1610594&source=gmail&ust=1750956542889000&usg=AOvVaw0cqkFtRJGp9c8DUx37cKh9\"\u003EThe Gartner Top Data & Analytics Predictions for 2025\u003C\u002Fa\u003E”.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ESetenta e cinco por cento dos novos conteúdos de analytics serão contextualizados para aplicações inteligentes por meio de Inteligência Artificial Genera…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fgartner-preve-que-75-dos-conteudos-de-analytics-usarao-genai-para-inteligencia-contextual-aprimorada-ate-2027","date":"26 jun, 2025","relativeTime":"há 14 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26102955\u002Fgartner-3.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Analytics","slug":"analytics","id":7285,"link":"https:\u002F\u002Fimasters.com.br\u002Fanalytics"},{"title":"Generative AI","slug":"generative-ai","id":8941,"link":"https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai"},{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"},{"title":"Tendências","slug":"tendencias","id":7264,"link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias"}],"seo":{"open_graph":{"title":"Gartner prevê que 75% dos conteúdos de analytics usarão GenAI","description":"Setenta e cinco por cento dos novos conteúdos de analytics serão contextualizados para aplicações inteligentes por meio de Inteligência Artificial Genera...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26102955\u002Fgartner-3.jpg","width":800,"height":533},"modified_time":"2025-06-26T10:33:30-03:00","published_time":"2025-06-26T10:33:30-03:00"},"twitter":{"title":"Gartner prevê que 75% dos conteúdos de analytics usarão GenAI","description":"Setenta e cinco por cento dos novos conteúdos de analytics serão contextualizados para aplicações inteligentes por meio de Inteligência Artificial Genera...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F26102955\u002Fgartner-3.jpg"}},"type":"imasters_news"},{"id":163786,"title":"Codecon Summit 2025 – The Hacker Way","content":"\u003Ch3\u003E\u003Cb\u003EUm evento para se incomodar, aguçar sua curiosidade e se conectar com os maiores nomes da tecnologia\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EA \u003Ca href=\"https:\u002F\u002Fcodecon.dev\u002Fsummit\"\u003ECodecon Summit 2025\u003C\u002Fa\u003E chega com força total: nos dias 18 e 19 de julho, na Viasoft Experience em Curitiba – PR, o evento reunirá até 2.000 desenvolvedores e desenvolvedoras em um dos maiores encontros de tecnologia do Sul do Brasil.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ENa sua quarta edição, o evento está maior do que nunca. Serão mais de 25 palestras e painéis, desafios de programação, jogos, enigmas e experiências únicas para devs e devas, em todos os níveis de carreira.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_163787\" aria-describedby=\"caption-attachment-163787\" style=\"width: 500px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F25163636\u002Fcodecon-capa-2.jpg\"\u003E\u003Cimg class=\"wp-image-163787\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F25163636\u002Fcodecon-capa-2.jpg\" alt=\"\" width=\"500\" height=\"333\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-163787\" class=\"wp-caption-text\"\u003Eimagem: Divulgação\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Ch2\u003E\u003Cb\u003EO que é a Codecon Summit?\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EA Codecon Summit é um festival que une código, comunidade e diversão, com conteúdo técnico aprofundado e atividades que estimulam criatividade, networking e aprendizagem. O tema deste ano é “The Hacker Way”: celebrar a curiosidade, a vontade de entender como as coisas funcionam e transformar essa energia em ação.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003EUm lugar onde você poderá aprender com quem é destaque na programação, confira os experts nacionais e internacionais confirmados:\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EErick Wendel (JavaScript Educator – EW Academy)\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EDaiane Santos (Engenharia de Segurança Mobile)\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EZeno Rocha (CEO @ Resend)\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003ECamila Campos (Software Engineer @ Coinbase)\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003Cli style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003EWaldemar Neto, Rafael Ponte, Fernanda Kipper, Jeferson Fernando e muitos outros\u003C\u002Fspan\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp\u003E\u003Cspan style=\"font-weight: 400;\"\u003ESe você quer impulsionar a sua carreira na tecnologia, participar da Codecon Summit 2025 é um ótimo ponto de partida! Faça parte da comunidade tech mais inquieta e criativa do Brasil.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cspan style=\"color: #000000;\"\u003EAproveite o \u003Cstrong\u003Edesconto para leitores do iMasters\u003C\u002Fstrong\u003E, utilizando o \u003Cstrong\u003Ecupom IMASTERS50\u003C\u002Fstrong\u003E, aplicado direto \u003Cstrong\u003E\u003Ca style=\"color: #000000;\" href=\"https:\u002F\u002Feventos.codecon.dev\u002Fcodecon-summit-25?cp=IMASTERS50\"\u003Eneste link\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E.\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cb\u003EInformações úteis:\u003C\u002Fb\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003ELocal:\u003C\u002Fstrong\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Viasoft Experience – Curitiba\u002FPR\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EData:\u003C\u002Fstrong\u003E\u003Cspan style=\"font-weight: 400;\"\u003E 18 e 19 de julho de 2025\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EPúblico:\u003C\u002Fstrong\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Devs e Devas em todos os níveis de carreira\u003C\u002Fspan\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EInscrições:\u003C\u002Fstrong\u003E\u003Cspan style=\"font-weight: 400;\"\u003E Abertas no site \u003C\u002Fspan\u003E\u003Ca href=\"https:\u002F\u002Fcodecon.dev\u002Fsummit\"\u003E\u003Cspan style=\"font-weight: 400;\"\u003Ecodecon.dev\u002Fsummit\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EA Codecon Summit 2025 chega com força total: nos dias 18 e 19 de julho, na Viasoft Experience em Curitiba – PR, o evento reunirá até 2.000 desenv…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fcodecon-summit-2025-the-hacker-way","date":"25 jun, 2025","relativeTime":"há 14 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F25163911\u002Fcodecon-capa-1.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"}],"seo":{"open_graph":{"title":"Codecon Summit 2025 – The Hacker Way | Evento Tech","description":"A Codecon Summit 2025 chega com força total: nos dias 18 e 19 de julho, na Viasoft Experience em Curitiba - PR, o evento reunirá até 2.000 desenv...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F25163911\u002Fcodecon-capa-1.jpg","width":800,"height":533},"modified_time":"2025-06-25T16:40:17-03:00","published_time":"2025-06-25T16:40:17-03:00"},"twitter":{"title":"Codecon Summit 2025 – The Hacker Way | Evento Tech","description":"A Codecon Summit 2025 chega com força total: nos dias 18 e 19 de julho, na Viasoft Experience em Curitiba - PR, o evento reunirá até 2.000 desenv...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F25163911\u002Fcodecon-capa-1.jpg"}},"type":"imasters_news"},{"id":163770,"title":"CGI.br prorroga até 30 de junho prazo da consulta sobre princípios para regulação de redes sociais","content":"\u003Cp\u003EO prazo da consulta sobre princípios para a regulação de redes sociais, lançados pelo Comitê Gestor da Internet no Brasil (CGI.br) em maio de 2025, foi prorrogado. Os interessados em enviar suas contribuições terão até o dia 30 de junho para enviar opiniões, propostas e comentários sobre o tema. É só acessar a plataforma \u003Ca href=\"https:\u002F\u002Fdialogos.cgi.br\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fdialogos.cgi.br\u002F&source=gmail&ust=1750180931964000&usg=AOvVaw0VdYDbiEll5Mhs9lB6Iiq9\"\u003Ehttps:\u002F\u002Fdialogos.cgi.br\u002F\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Ch2\u003EPrincípios para regulação de redes sociais\u003C\u002Fh2\u003E\n\u003Cp\u003EO CGI.br destaca que a regulação deve ser orientada por princípios que garantam a defesa da soberania nacional, da democracia e do Estado Democrático de Direito, bem como a proteção dos direitos fundamentais, a promoção de um ambiente informacional saudável, a preservação da liberdade de expressão e o estímulo à inovação.\u003C\u002Fp\u003E\n\u003Cp\u003E“Decidimos ampliar o prazo para garantir mais participação. Compreendemos que é fundamental que haja espaço para a sociedade expressar suas opiniões sobre um tema tão relevante. Acreditamos que esse tipo de iniciativa ajuda a criar um ambiente digital mais seguro e equilibrado, e esperamos que as contribuições da consulta possam fazer diferença na construção de uma regulação que proteja os direitos dos usuários”, afirma a coordenadora do CGI.br, Renata Mielli.\u003C\u002Fp\u003E\n\u003Cp\u003EO coordenador do Grupo de Trabalho sobre Regulação de Plataformas do CGI.br, Henrique Faulhaber, destaca a importância da participação de todos os setores. “Estamos especialmente interessados em contribuições que envolvam tanto o conteúdo dos princípios, quanto a clareza da linguagem utilizada — que deve ser concisa, direta, acessível e livre de ambiguidades ou redundâncias. Contamos com a colaboração de todos para construirmos, de forma coletiva, uma carta de princípios que sirva como fundamento para uma futura recomendação de diretrizes para a regulação das redes sociais”.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cstrong\u003EPrincípios\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003ENo documento da proposta preliminar, as redes sociais são definidas como “aplicações ou serviços digitais acessíveis via Internet que permitem a criação, publicação, compartilhamento e circulação de conteúdos gerados por usuários, além da interação social entre pessoas, grupos ou perfis públicos”. O material enfatiza que elas “operam por meio de mecanismos de recomendação, moderação e amplificação algorítmica, frequentemente monetizados por publicidade ou serviços pagos, e desempenham papel central na formação de redes de informação, expressão, influência e mercado”.\u003C\u002Fp\u003E\n\u003Cp\u003EConfira abaixo os 10 princípios elaborados pelo Comitê Gestor da Internet no Brasil:\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003ESoberania e segurança nacional\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ELiberdade de expressão, privacidade e direitos humanos\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EAutodeterminação informacional\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EIntegridade da Informação\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EInovação e desenvolvimento social\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003ETransparência e prestação de contas\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EInteroperabilidade e portabilidade\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EPrevenção de danos e responsabilidade\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EProporcionalidade regulatória\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003EAmbiente regulatório e Governança Multissetorial\u003C\u002Fstrong\u003E\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3\u003E\u003Cstrong\u003ESobre o Comitê Gestor da Internet no Brasil – CGI.br\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EO Comitê Gestor da Internet no Brasil, responsável por estabelecer diretrizes estratégicas relacionadas ao uso e desenvolvimento da Internet no Brasil, coordena e integra todas as iniciativas de serviços Internet no País, promovendo a qualidade técnica, a inovação e a disseminação dos serviços ofertados. Com base nos princípios do multissetorialismo e transparência, o CGI.br representa um modelo de governança da Internet democrático, elogiado internacionalmente, em que todos os setores da sociedade são partícipes de forma equânime de suas decisões. Uma de suas formulações são os 10 Princípios para a Governança e Uso da Internet (\u003Ca href=\"https:\u002F\u002Fcgi.br\u002Fresolucoes\u002Fdocumento\u002F2009\u002F003\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fcgi.br\u002Fresolucoes\u002Fdocumento\u002F2009\u002F003&source=gmail&ust=1750180931964000&usg=AOvVaw27ftE9hpND9ddHWGpK4dhj\"\u003E\u003Cstrong\u003Ehttps:\u002F\u002Fcgi.br\u002Fresolucoes\u002F\u003Cwbr \u002F\u003Edocumento\u002F2009\u002F003\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E). Mais informações em \u003Ca href=\"https:\u002F\u002Fcgi.br\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fcgi.br\u002F&source=gmail&ust=1750180931964000&usg=AOvVaw2quiIRb5dHf_9pdbUYDZkg\"\u003E\u003Cstrong\u003Ehttps:\u002F\u002Fcgi.br\u002F\u003C\u002Fstrong\u003E\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16145518\u002Fredes-sociais.jpg\"\u003E\u003Cimg class=\"alignnone size-full wp-image-163779\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16145518\u002Fredes-sociais.jpg\" alt=\"Regulação de redes sociais: CGI.br prorroga prazo da consulta\" width=\"800\" height=\"533\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EPrazo da consulta sobre princípios para a regulação de redes sociais, lançados pelo Comitê Gestor da Internet no Brasil (CGI.br) em maio de 2025, foi…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fcgi-br-prorroga-ate-30-de-junho-prazo-da-consulta-sobre-principios-para-regulacao-de-redes-sociais","date":"25 jun, 2025","relativeTime":"há 15 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16145518\u002Fredes-sociais.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"},{"title":"Tecnologia","slug":"tecnologia","id":4254,"link":"https:\u002F\u002Fimasters.com.br\u002Ftecnologia"},{"title":"Tendências","slug":"tendencias","id":7264,"link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias"}],"seo":{"open_graph":{"title":"Regulação de redes sociais: CGI.br prorroga prazo da consulta","description":"Prazo da consulta sobre princípios para a regulação de redes sociais, lançados pelo Comitê Gestor da Internet no Brasil (CGI.br) em maio de 2025, foi...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16145518\u002Fredes-sociais.jpg","width":800,"height":533},"modified_time":"2025-06-16T14:56:55-03:00","published_time":"2025-06-25T09:15:54-03:00"},"twitter":{"title":"Regulação de redes sociais: CGI.br prorroga prazo da consulta","description":"Prazo da consulta sobre princípios para a regulação de redes sociais, lançados pelo Comitê Gestor da Internet no Brasil (CGI.br) em maio de 2025, foi...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16145518\u002Fredes-sociais.jpg"}},"type":"imasters_news"},{"id":163767,"title":"Prêmio Executivo de TI 2025: inscrições abertas para a principal premiação do setor","content":"\u003Cp\u003EEstão abertas as inscrições para o Prêmio Executivo de TI do Ano 2025, uma das premiações mais prestigiadas do setor no Brasil. Promovido pelo IT Forum desde 2001, o prêmio — considerado o “Oscar” da tecnologia — reconhece os líderes por trás dos projetos mais inovadores e disruptivos do País. Interessados podem se inscrever até o dia 13 de julho.\u003C\u002Fp\u003E\n\u003Cp\u003EA edição deste ano contará com 26 categorias, sendo 21 voltadas à CIOs, divididas em 20 setores de atuação e uma que irá premiar o projeto mais alinhado a temas voltados à sustentabilidade. As demais categorias são específicas para a indústria de TI, incluindo: Hardware, Software, Serviços, Integradores e Sustentabilidade.\u003C\u002Fp\u003E\n\u003Ch2\u003EPrêmio Executivo de TI 2025\u003C\u002Fh2\u003E\n\u003Cp\u003ETodos os executivos serão divididos pela área de atuação, com três finalistas em cada categoria, e avaliados por um júri especializado, composto pela equipe do IT Forum, ex-CIOs, professores e consultores do setor. Os jurados levam em consideração a biografia, presença social, relevância da empresa, resultados sob a gestão, iniciativas e práticas ESG, cases relevantes e tempo de função. Para se inscrever é necessário estar ocupando o cargo na empresa por pelo menos um ano.\u003C\u002Fp\u003E\n\u003Cp\u003EA premiação ocorrerá no dia 23 de outubro, no Distrito Itaqui. Em 2024, participaram da premiação empresas como Itaú Unibanco, Ipiranga, Gerdau, Vale, Fundação Bradesco e outras gigantes, além de dar espaço para o reconhecimento de companhias menores como Cogna, Coopercitrus, Veste Estilo, Villefort, Tupy, entre outras.\u003C\u002Fp\u003E\n\u003Cp\u003EPara concorrer, executivos podem se inscrever pelos links\u003Ca href=\"https:\u002F\u002Fwww.sphinxnaweb.com\u002Fsurveyserver\u002Fs\u002Fitmidia\u002FExecutivo_de_TI_2025\u002Fimprensa.htm\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.sphinxnaweb.com\u002Fsurveyserver\u002Fs\u002Fitmidia\u002FExecutivo_de_TI_2025\u002Fimprensa.htm&source=gmail&ust=1750168268713000&usg=AOvVaw2kpBpLIDLyrrtiT0BvJULy\"\u003E CIO\u003C\u002Fa\u003E ou\u003Ca href=\"https:\u002F\u002Fwww.sphinxnaweb.com\u002Fsurveyserver\u002Fs\u002Fitmidia\u002FExecutivo_de_TI_2025_Industria\u002Fimprensa.htm\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.sphinxnaweb.com\u002Fsurveyserver\u002Fs\u002Fitmidia\u002FExecutivo_de_TI_2025_Industria\u002Fimprensa.htm&source=gmail&ust=1750168268713000&usg=AOvVaw3igNlcczEJesQnY11lLBU_\"\u003E INDÚSTRIA DE TI\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16110237\u002Fit-forum-07679-1-B.jpg\"\u003E\u003Cimg class=\"alignnone wp-image-163768\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16110237\u002Fit-forum-07679-1-B.jpg\" alt=\"Prêmio Executivo de TI 2025: inscrições abertas para a principal premiação do setor\" width=\"800\" height=\"533\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EEstão abertas as inscrições para o Prêmio Executivo de TI do Ano 2025, uma das premiações mais prestigiadas do setor no Brasil. Promovido pelo IT Forum…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fpremio-executivo-de-ti-2025-inscricoes-abertas-para-a-principal-premiacao-do-setor","date":"24 jun, 2025","relativeTime":"há 16 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16110237\u002Fit-forum-07679-1-B.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"},{"title":"Tecnologia","slug":"tecnologia","id":4254,"link":"https:\u002F\u002Fimasters.com.br\u002Ftecnologia"}],"seo":{"open_graph":{"title":"Prêmio Executivo de TI 2025: inscrições abertas para premiação do setor","description":"Estão abertas as inscrições para o Prêmio Executivo de TI do Ano 2025, uma das premiações mais prestigiadas do setor no Brasil. Promovido pelo IT Forum...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16110237\u002Fit-forum-07679-1-B.jpg","width":800,"height":533},"modified_time":"2025-06-16T11:13:40-03:00","published_time":"2025-06-24T09:05:13-03:00"},"twitter":{"title":"Prêmio Executivo de TI 2025: inscrições abertas para premiação do setor","description":"Estão abertas as inscrições para o Prêmio Executivo de TI do Ano 2025, uma das premiações mais prestigiadas do setor no Brasil. Promovido pelo IT Forum...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F16110237\u002Fit-forum-07679-1-B.jpg"}},"type":"imasters_news"},{"id":163753,"title":"Sebrae, Google e Alura lançam curso grátis para capacitar pequenos negócios em IA","content":"\u003Cp\u003E\u003Ci\u003ECurso \u002F Imersão on-line e gratuita também conta com apoio e premiação da Samsung e ensina como ferramentas como Gemini e Google Perfil da Empresa podem acelerar a digitalização de negócios locais\u003C\u002Fi\u003E\u003C\u002Fp\u003E\n\u003Cdiv\u003E\n\u003Cp\u003ESegundo a Goldman Sachs, em 2024, 69% dos pequenos negócios utilizam  inteligência artificial (IA) em pelo menos uma das áreas da empresa, um salto de 13% em relação ao ano anterior. Para acelerar ainda mais a adoção da tecnologia entre as PMEs, Sebrae, Google e Alura, com apoio da Samsung, estão lançando \u003Cstrong\u003E“Imersão Empreendedora em IA”\u003C\u002Fstrong\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EGratuito, on-line e com certificado, o curso é voltado para empreendedores que querem utilizar as ferramentas baseadas em inteligência artificial e recursos on-line para impulsionar seus pequenos negócios. As inscrições estarão abertas entre \u003Cstrong\u003E10 e \u003C\u002Fstrong\u003E\u003Cstrong\u003E30 de junho\u003C\u002Fstrong\u003E e podem ser feitas pelo \u003Ca href=\"https:\u002F\u002Fbusiness.alura.com.br\u002Fimersao-empreendedora-em-ia?utm_campaign=14005613-b2b_lead_ontime_imersao_emp_ia&utm_source=imprensa&utm_medium=release\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fbusiness.alura.com.br\u002Fimersao-empreendedora-em-ia?utm_campaign%3D14005613-b2b_lead_ontime_imersao_emp_ia%26utm_source%3Dimprensa%26utm_medium%3Drelease&source=gmail&ust=1749654915542000&usg=AOvVaw0EaQgZYglNKdDwJ80rRJ3J\"\u003Elink\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003EAs aulas serão disponibilizadas entre 30 de junho e 4 de julho, com uma \u003Cem\u003Elive\u003C\u002Fem\u003E de abertura e formato on-demand. O conteúdo foi pensado para empreendedores em níveis iniciante e intermediário de conhecimento nas ferramentas do Google e que querem dar o próximo passo no digital.\u003C\u002Fp\u003E\n\u003Ch2\u003ECurso grátis sobre IA\u003C\u002Fh2\u003E\n\u003Cp\u003EA iniciativa tem como objetivo ensinar, de forma prática e acessível, como usar ferramentas úteis para todo pequeno negócio em busca de presença no ambiente digital, como  o \u003Ca href=\"https:\u002F\u002Fwww.google.com\u002Fintl\u002Fpt-br_br\u002Fbusiness\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.google.com\u002Fintl\u002Fpt-br_br\u002Fbusiness\u002F&source=gmail&ust=1749654915542000&usg=AOvVaw1kUOl1jyeZosMytdz1GT_O\"\u003EGoogle Perfil de Empresa\u003C\u002Fa\u003E e o Google Maps, além de ferramentas de inteligência artificial como Gemini e Samsung Galaxy AI para automatizar processos.\u003C\u002Fp\u003E\n\u003Cp\u003EA proposta é mostrar como essas tecnologias podem ser aplicadas para automatizar processos, aumentar a visibilidade online e apoiar decisões mais estratégicas no dia a dia das empresas.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E“Otimizar processos, fortalecer a comunicação com os clientes e saber como usar todo o potencial de novas tecnologias é importante para os resultados de um negócio. Ao desenvolver competências em ferramentas digitais, os empreendedores têm a chance de transformar sua operação, ganhar agilidade e eficiência, impulsionando seus resultados”, diz Tavane Gurdos, diretora geral da Alura + FIAP Para Empresas.\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EO diretor-técnico do Sebrae, Bruno Quick, reforça o raciocínio: “O programa evidencia como a capacitação em inovação deixou de ser um diferencial para se tornar fundamental para qualquer empreendedor que deseja se manter competitivo e expandir sua atuação, especialmente em um mercado tão dinâmico e em constante transformação como o que vivemos hoje”, complementa.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003ECronograma das atividades\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003ECom a participação de especialistas e nomes de referência do mercado, a imersão é composta por cinco aulas temáticas, cada uma voltada para um aspecto prático do uso da tecnologia nos negócios. Confira a programação:\u003C\u002Fp\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003E30\u002F06 | Empreendedorismo inteligente – acelere sua presença digital com Google: \u003C\u002Fstrong\u003Epainel ao vivo com especialistas para inspirar empreendedores a fortalecer sua presença digital utilizando Google Business Profile e Gemini;\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003E01\u002F07 | Seu perfil está ativado – mas está trabalhando por você?: \u003C\u002Fstrong\u003Ecompreender a importância da presença digital e ter acesso a dicas e fundamentos para atrair mais clientes com o perfil da empresa atualizado, relevante e pronto para escalar, além de iniciar o uso estratégico do Gemini;\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003E02\u002F07 | Dominando presença e visibilidade na busca digital:\u003C\u002Fstrong\u003E entender como aparecer nos resultados de pesquisa do Google, além de conhecer o processo completo do cadastro e a otimização de perfis no Google Maps com suporte do Gemini;\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003E03\u002F07 | O que a Inteligência Artificial do Google pode fazer por você e seus clientes?: \u003C\u002Fstrong\u003Eaprender a utilizar a biblioteca de prompts para aumentar a produtividade e melhorar o relacionamento com Cliente, Marketing e Atendimento para economizar tempo e vender mais, além de ficar por dentro de como o Gemini pode automatizar conteúdo, comunicação e processos operacionais;\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Cstrong\u003E04\u002F07 | Gerencie os negócios pelo smartphone Android com o uso da IA: \u003C\u002Fstrong\u003Edescobrir na prática como integrar o Perfil da Empresa no WhatsApp e nas redes sociais para automatizar e otimizar agendamentos e melhorar o atendimento aos clientes e, ainda, entender como conectar ferramentas do Google com apoio do Gemini para ampliar performance utilizando apenas o Android.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp\u003E“Queremos ajudar mais e mais pequenos negócios a ampliar sua presença digital e obter sucesso online. Fazer bom uso de recursos, como o Perfil da Empresa, e explorar as possibilidades de uso de ferramentas de IA como o Gemini são medidas simples com resultados transformadores para todo empreendedor”, afirma Eitan Blanche, líder de parcerias da Busca do Google.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003EPremiação dos melhores projetos\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EPara garantir o certificado de participação, os inscritos deverão cumprir um desafio prático: criar ou atualizar o Ponto de Interesse do seu negócio no Google Maps. A entrega inclui link, print do perfil atualizado e breve relato (com até cinco linhas) sobre as melhorias implementadas.\u003C\u002Fp\u003E\n\u003Cp\u003EOs projetos mais destacados concorrem a prêmios oferecidos pela Samsung. São eles: Samsung Galaxy S25 Ultra Enterprise Edition (1º colocado), Samsung TAB S10 FE Enterprise Edition (2º ao 5º colocados) e Samsung Galaxy A56 250G Enterprise Edition (6º ao 10º colocados).\u003C\u002Fp\u003E\n\u003Cp\u003EAlém disso, todos os participantes terão acesso a cupons de desconto no \u003Ca href=\"https:\u002F\u002Fempresas.samsung.com.br\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fempresas.samsung.com.br&source=gmail&ust=1749654915543000&usg=AOvVaw3I3_JYfSoFWK6qUcLNjlbQ\"\u003Eportal da Samsung para empresas\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E“A inteligência artificial é um dos principais fomentadores da nova onda de transformação digital das empresas. No entanto, como agora esta tecnologia está disponível, literalmente, na palma de nossas mãos e a custos mais acessíveis, as pequenas e médias empresas tornam-se grandes beneficiadas. É por isso que estamos muito felizes em colaborar com essa iniciativa de capacitação, pois mais do que ter acesso à ferramenta, é fundamental o conhecimento sobre como melhor explorar os recursos de novas tecnologias acessíveis e seguras”, comenta Kaue Souza Melo, diretor sênior de B2B para a Samsung Brasil.\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EOs vencedores serão anunciados até o dia 25 de julho, por meio de comunicação via email. Para conferir mais informações sobre a imersão e a inscrição, basta acessar o \u003Ca href=\"https:\u002F\u002Fbusiness.alura.com.br\u002Fimersao-empreendedora-em-ia?utm_campaign=14005613-b2b_lead_ontime_imersao_emp_ia&utm_source=imprensa&utm_medium=release\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fbusiness.alura.com.br\u002Fimersao-empreendedora-em-ia?utm_campaign%3D14005613-b2b_lead_ontime_imersao_emp_ia%26utm_source%3Dimprensa%26utm_medium%3Drelease&source=gmail&ust=1749654915543000&usg=AOvVaw3PkRk25UN8x7tGGMKhLVhA\"\u003Elink\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cstrong\u003ESERVIÇO\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003E\u003Cstrong\u003E“Imersão \u003C\u002Fstrong\u003E\u003Cstrong\u003EEmpreendedora em IA”\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EQuando: \u003C\u002Fstrong\u003Eaulas disponibilizadas entre 30 de junho a 04 de julho.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EInscrições: \u003C\u002Fstrong\u003Eentre 10 e 30 de junho neste \u003Ca href=\"https:\u002F\u002Fbusiness.alura.com.br\u002Fimersao-empreendedora-em-ia?utm_campaign=14005613-b2b_lead_ontime_imersao_emp_ia&utm_source=imprensa&utm_medium=release\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fbusiness.alura.com.br\u002Fimersao-empreendedora-em-ia?utm_campaign%3D14005613-b2b_lead_ontime_imersao_emp_ia%26utm_source%3Dimprensa%26utm_medium%3Drelease&source=gmail&ust=1749654915543000&usg=AOvVaw3PkRk25UN8x7tGGMKhLVhA\"\u003Elink\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EInvestimento: gratuito\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003ECurso \u002F Imersão on-line e gratuita sobre IA também conta com apoio e premiação da Samsung e ensina como ferramentas como Gemini e Google Perfil da…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fsebrae-google-e-alura-lancam-curso-gratis-para-capacitar-pequenos-negocios-em-ia","date":"23 jun, 2025","relativeTime":"há 17 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10153531\u002FCurso-gratis-sobre-IA.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Generative AI","slug":"generative-ai","id":8941,"link":"https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai"},{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"}],"seo":{"open_graph":{"title":"Curso para capacitar pequenos negócios em IA e presença digital","description":"Curso \u002F Imersão on-line e gratuita sobre IA também conta com apoio e premiação da Samsung e ensina como ferramentas como Gemini e Google Perfil da...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10153531\u002FCurso-gratis-sobre-IA.jpg","width":800,"height":533},"modified_time":"2025-06-10T15:54:44-03:00","published_time":"2025-06-23T09:21:08-03:00"},"twitter":{"title":"Curso para capacitar pequenos negócios em IA e presença digital","description":"Curso \u002F Imersão on-line e gratuita sobre IA também conta com apoio e premiação da Samsung e ensina como ferramentas como Gemini e Google Perfil da...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10153531\u002FCurso-gratis-sobre-IA.jpg"}},"type":"imasters_news"},{"id":163743,"title":"Brasil já tem quase 400 empresas de Inteligência Artificial voltadas ao marketing, revela mapeamento inédito","content":"\u003Cp\u003E\u003Ci\u003EO Scape Report IA Marketing 2025, desenvolvido pela Pipeline Capital, com apoio do IAB Brasil, mapeou empresas de 13 segmentos de IA aplicada ao marketing, facilitando a visualização estratégica de concorrentes e parceiros\u003C\u002Fi\u003E\u003C\u002Fp\u003E\n\u003Cp\u003EA Pipeline Capital, com apoio do IAB Brasil, lançou um mapeamento inédito que apresenta 396 empresas relevantes no ecossistema brasileiro da Inteligência Artificial para o marketing. O “Scape Report IA Marketing 2025” organiza as companhias em 13 segmentos estratégicos, facilitando a busca por potenciais compradores, parceiros de negócios e oportunidades de inovação em todo o setor.\u003C\u002Fp\u003E\n\u003Cp\u003EEntre as categorias com maior número de empresas mapeadas estão Marketing & Vendas (62), Generative (62), AI Analytics (51), Ecommerce Retail (35) e Finance and Process (33), que juntas concentram a maior parte dos negócios do ecossistema brasileiro de Inteligência Artificial. Além dessas, o mapeamento também inclui segmentos como Logística (27), Health (22), CX Solutions (21), IoT (17), AI Consulting (23), Security (13) e IAs robustas (6), evidenciando a diversidade e abrangência do setor nacional.\u003C\u002Fp\u003E\n\u003Cp\u003ECom atualizações constantes, o Scape Report permite que as companhias visualizem concorrentes e parceiros de forma rápida e eficiente.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cem\u003E“A inteligência artificial revolucionou o marketing e, para lidar com novos paradigmas e demandas, centenas de empresas ou nasceram ou passaram a ter a IA como parte central de sua atuação nesses últimos anos. De forma inédita, conseguimos mapear quais são os players que estão à frente desse ecossistema organizado, oferecendo informações fundamentais para se compreender melhor o cenário da IA no Brasil”, afirma Alon Sochaczewski, fundador e CEO da Pipeline Capital.\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp\u003E“O IAB Brasil, mais uma vez, colabora diretamente para um desenho claro da cadeia de fornecimento dos segmentos. Este tipo de iniciativa promove a educação e o entendimento dos papéis de cada agente dentro do nosso ecossistema digital”, diz Denise Porto Hruby, CEO do IAB Brasil.\u003C\u002Fp\u003E\n\u003Cp\u003EA colaboração entre IAB e Pipeline, que começou em 2021, também produziu edições do Scape Report de Martechs e Adtechs. A\u003Ca href=\"https:\u002F\u002F24004829.fs1.hubspotusercontent-na1.net\u002Fhubfs\u002F24004829\u002FScape_Report_Martech%20-%20Adtech%202024_V0-1.pdf?utm_campaign=Scape%20Report%20-%20Martech%20Adtech%202024%20-%20Brasil&utm_medium=email&_hsenc=p2ANqtz-_IT1Wx_0R4x9vBjApfKsn-3t6d7XTyM7KPKR5hXyV_fGvuiLbMWJWGQn0GJPo0fF1umJS8VAv7bPQGo2e_JPt1LjfH2Q&_hsmi=322444608&utm_content=322444608&utm_source=hs_automation\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002F24004829.fs1.hubspotusercontent-na1.net\u002Fhubfs\u002F24004829\u002FScape_Report_Martech%2520-%2520Adtech%25202024_V0-1.pdf?utm_campaign%3DScape%2520Report%2520-%2520Martech%2520Adtech%25202024%2520-%2520Brasil%26utm_medium%3Demail%26_hsenc%3Dp2ANqtz-_IT1Wx_0R4x9vBjApfKsn-3t6d7XTyM7KPKR5hXyV_fGvuiLbMWJWGQn0GJPo0fF1umJS8VAv7bPQGo2e_JPt1LjfH2Q%26_hsmi%3D322444608%26utm_content%3D322444608%26utm_source%3Dhs_automation&source=gmail&ust=1749650876696000&usg=AOvVaw06_V-nnUGwSojh2mBIimPc\"\u003E última versão\u003C\u002Fa\u003E, lançada em setembro de 2024, traz companhias de 10 segmentos e 47 subsegmentos do universo de marketing, publicidade e tecnologia.\u003C\u002Fp\u003E\n\u003Cp\u003EEm sua versão online, o Scape Report IA Marketing será permanentemente atualizado. As empresas que se inscreverem por meio do formulário passarão por uma curadoria. Caso sejam aprovadas, entrarão na próxima versão do Scape Report.\u003C\u002Fp\u003E\n\u003Cp\u003EO Scape Report IA Marketing 2025 pode ser acessado \u003Ca href=\"https:\u002F\u002Fconteudo.pipeline.capital\u002Fscape-report-ia-marketing-2025\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fconteudo.pipeline.capital\u002Fscape-report-ia-marketing-2025&source=gmail&ust=1749650876696000&usg=AOvVaw346xfZ0EPEKRI9QXbU_6Eb\"\u003Eaqui\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EO Scape Report IA Marketing 2025, desenvolvido pela Pipeline Capital, com apoio do IAB Brasil, mapeou empresas de 13 segmentos de IA aplicada ao marketing\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fbrasil-ja-tem-quase-400-empresas-de-inteligencia-artificial-voltadas-ao-marketing-revela-mapeamento-inedito","date":"20 jun, 2025","relativeTime":"há 20 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10115821\u002FIA-mkt-1.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Generative AI","slug":"generative-ai","id":8941,"link":"https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai"},{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Marketing Digital","slug":"midia-e-marketing-digital","id":7283,"link":"https:\u002F\u002Fimasters.com.br\u002Fmidia-e-marketing-digital"},{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"}],"seo":{"open_graph":{"title":"Brasil já tem quase 400 empresas de Inteligência Artificial voltadas ao MKT","description":"O Scape Report IA Marketing 2025, desenvolvido pela Pipeline Capital, com apoio do IAB Brasil, mapeou empresas de 13 segmentos de IA aplicada ao marketing","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10115821\u002FIA-mkt-1.jpg","width":800,"height":533},"modified_time":"2025-06-16T10:57:44-03:00","published_time":"2025-06-20T09:25:17-03:00"},"twitter":{"title":"Brasil já tem quase 400 empresas de Inteligência Artificial voltadas ao MKT","description":"O Scape Report IA Marketing 2025, desenvolvido pela Pipeline Capital, com apoio do IAB Brasil, mapeou empresas de 13 segmentos de IA aplicada ao marketing","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10115821\u002FIA-mkt-1.jpg"}},"type":"imasters_news"},{"id":163712,"title":"Vazamento global: Brasil lidera com mais de 7 bilhões de cookies roubados","content":"\u003Cp style=\"font-weight: 400;\"\u003E\u003Cem\u003EPesquisa da NordVPN revela que o Brasil ocupa o 1º lugar entre 235 países no vazamento de cookies, com mais de 7 bilhões de registros, dos quais 550 milhões ainda estão ativos\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E\u003Cem\u003E \u003C\u002Fem\u003EO Brasil desponta como o país com o maior volume de cookies vazados no mundo, conforme aponta nova pesquisa realizada pela NordVPN. De acordo com os dados, entre os quase 94 bilhões de cookies vazados encontrados na dark web, mais de 7 bilhões são originários de usuários brasileiros.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EO levantamento também revela que aproximadamente 550 milhões desses cookies ainda estão ativos e vinculados a atividades reais de usuários.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EApesar dos cookies serem vistos como úteis para melhorar experiências online, muitos não percebem que hackers podem explorá-los para roubar dados pessoais e acessar sistemas seguros.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003ENo contexto brasileiro, o volume de vazamentos é significativamente maior em relação aos demais países, com Índia, Indonésia, Estados Unidos e Vietnã, completando a lista dos cinco primeiros colocados.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EApesar de parecer inofensivos, os cookies vazados não contêm apenas informações triviais. Entre os dados expostos estão nomes completos, endereços de e-mail, senhas, cidades e até mesmo endereços físicos dos usuários.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EPortanto, esses dados podem ser utilizados por criminosos para cometer fraudes, roubo de identidade e invasões de contas online, colocando em risco a segurança digital de milhões de pessoas.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EO especialista em cibersegurança da NordVPN, Adrianus Warmenhoven, alerta sobre os perigos dessa exposição. “Cookies podem parecer inofensivos, mas, nas mãos erradas, eles se tornam verdadeiras chaves digitais para nossas informações mais privadas.”, explica.\u003C\u002Fp\u003E\n\u003Ch3 style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003ENúmero de cookies vazados em alta\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EA pesquisa revela que o número de cookies vazados subiu drasticamente nos últimos anos. Em 2024, eram 54 bilhões, enquanto em 2025 o número já ultrapassa os 94 bilhões — um aumento de 74%. Grande parte dos cookies vazados está relacionada a grandes plataformas, como Google (4,5 bilhões), YouTube (1,33 bilhões), Microsoft (1,1 bilhões) e Bing (1 bilhão).\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EO estudo também identificou que 38 tipos de malwares foram usados para roubar os cookies. O Redline lidera a lista, responsável por mais de 41,6 bilhões de vazamentos. Outros malwares, como Vidar (10 bilhões) e LummaC2 (9 bilhões), também contribuíram para a coleta de dados sensíveis.\u003C\u002Fp\u003E\n\u003Ch3 style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003EO que são cookies e por que são importantes?\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EOs cookies são pequenos arquivos de texto que os sites armazenam no navegador do usuário para lembrar preferências, detalhes de login e comportamento de navegação.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EEsses arquivos desempenham um papel essencial na personalização da experiência online, permitindo que as páginas carreguem mais rapidamente e mantenham as configurações personalizadas do usuário.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EOs cookies facilitam a navegação ao manter o usuário conectado, salvar itens no carrinho de compras e oferecer recomendações personalizadas com base no histórico de navegação. Sem eles, as interações online seriam menos práticas e personalizadas.\u003C\u002Fp\u003E\n\u003Ch3 style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003ETipos de cookies mais comuns:\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cul style=\"font-weight: 400;\"\u003E\n\u003Cli\u003ECookies de sessão: Expiram ao fechar o navegador e são usados para manter o usuário conectado durante a navegação.\u003C\u002Fli\u003E\n\u003Cli\u003ECookies persistentes: Permanecem no dispositivo após fechar o navegador, lembrando preferências e login em visitas futuras.\u003C\u002Fli\u003E\n\u003Cli\u003ECookies de rastreamento: Monitoram as atividades online para oferecer anúncios direcionados e entender o comportamento do usuário.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EEmbora sejam úteis, os cookies podem representar riscos se caírem nas mãos erradas.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EHackers podem roubar esses arquivos para acessar contas pessoais sem precisar de login, já que muitos cookies contêm tokens de sessão que mantêm a conexão ativa.\u003C\u002Fp\u003E\n\u003Ch3 style=\"font-weight: 400;\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003EFormas simples de proteger seus dados\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EDiante dos dados alarmantes, a NordVPN recomenda que os usuários devem adotar formas simples de proteção que podem ajudar a prevenir roubo de dados.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003E“As pessoas costumam fechar o navegador, mas a sessão ainda está ativa. Limpar os dados do site ajuda a minimizar os riscos”, diz Warmenhoven.\u003C\u002Fp\u003E\n\u003Cul style=\"font-weight: 400;\"\u003E\n\u003Cli\u003EUse senhas fortes e únicas para cada conta e ative a autenticação multifator (MFA).\u003C\u002Fli\u003E\n\u003Cli\u003EEvite compartilhar informações pessoais e clicar em links suspeitos.\u003C\u002Fli\u003E\n\u003Cli\u003EMantenha seus dispositivos atualizados para bloquear malwares antes que comprometam seu sistema.\u003C\u002Fli\u003E\n\u003Cli\u003ELimpe regularmente os dados do site para reduzir a chance de acesso não autorizado.\u003C\u002Fli\u003E\n\u003Cli\u003EVerifique as configurações de privacidade das contas online para garantir que apenas serviços confiáveis possam acessar seus dados.\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003Ch3 style=\"font-weight: 400;\"\u003E\u003Cstrong\u003EMetodologia\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EOs dados da pesquisa realizada entre 23 e 30 de abril foram compilados em parceria com a NordStellar, uma plataforma de gerenciamento de exposição a ameaças.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EOs pesquisadores utilizaram dados coletados de canais do Telegram onde hackers anunciam quais informações roubadas estão disponíveis para venda. Isso levou a um conjunto de dados com informações sobre mais de 93,76 bilhões de cookies.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EOs pesquisadores analisaram se os cookies estavam ativos ou inativos, qual malware foi usado para roubá-los, de qual país eles eram, bem como quais dados continham sobre a empresa que os criou, o sistema operacional do usuário e as categorias de palavras-chave atribuídas aos usuários.\u003C\u002Fp\u003E\n\u003Cp style=\"font-weight: 400;\"\u003EA NordVPN não comprou cookies roubados nem acessou o conteúdo dos cookies, examinando apenas os tipos de dados contidos neles.\u003C\u002Fp\u003E\n\u003Cp\u003E \u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EVazamento global | Pesquisa da NordVPN revela que o Brasil ocupa o 1º lugar entre 235 países no vazamento de cookies, com mais de 7 bilhões de…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fvazamento-global-brasil-lidera-com-mais-de-7-bilhoes-de-cookies-roubados","date":"18 jun, 2025","relativeTime":"há 22 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04114741\u002Fseguran%C3%A7a.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"},{"title":"Segurança","slug":"seguranca","id":7269,"link":"https:\u002F\u002Fimasters.com.br\u002Fseguranca"}],"seo":{"open_graph":{"title":"Vazamento global: Brasil lidera com mais de 7 Bi de cookies roubados","description":"Vazamento global | Pesquisa da NordVPN revela que o Brasil ocupa o 1º lugar entre 235 países no vazamento de cookies, com mais de 7 bilhões de...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04114741\u002Fseguran%C3%A7a.jpg","width":800,"height":533},"modified_time":"2025-06-04T11:55:04-03:00","published_time":"2025-06-18T09:39:00-03:00"},"twitter":{"title":"Vazamento global: Brasil lidera com mais de 7 Bi de cookies roubados","description":"Vazamento global | Pesquisa da NordVPN revela que o Brasil ocupa o 1º lugar entre 235 países no vazamento de cookies, com mais de 7 bilhões de...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04114741\u002Fseguran%C3%A7a.jpg"}},"type":"imasters_news"},{"id":163692,"title":"Medo de substituição por IA pressiona saúde mental dos trabalhadores e desafia o RH","content":"\u003Cp\u003E\u003Ci\u003EMedo de substituição por IA: Pesquisa indica que 17% dos brasileiros temem ser substituídos pela Inteligência Artificial em seus empregos; 35% estão estudando sobre IA para se preparar melhor para o futuro\u003C\u002Fi\u003E\u003C\u002Fp\u003E\n\u003Cdiv\u003E\n\u003Cp\u003EO avanço acelerado da inteligência artificial no ambiente corporativo tem desencadeado uma reação silenciosa, mas preocupante: o medo de ser substituído.\u003C\u002Fp\u003E\n\u003Cp\u003EDe forma crescente, trabalhadores de diferentes áreas relatam ansiedade e insegurança diante da possibilidade de substituição por tecnologias cada vez mais autônomas.\u003C\u002Fp\u003E\n\u003Cp\u003EO impacto não é apenas operacional – ele já se faz sentir no bem-estar mental dos times, desafiando diretamente o departamento de Recursos Humanos das empresas.\u003C\u002Fp\u003E\n\u003Ch2\u003EMedo de Substituição por IA\u003C\u002Fh2\u003E\n\u003Cp\u003EAinda que a IA traga ganhos inegáveis de produtividade, eficiência e redução de tarefas repetitivas, seu uso também abre espaço para dúvidas existenciais sobre o futuro das profissões.\u003C\u002Fp\u003E\n\u003Cp\u003ESegundo \u003Ca href=\"https:\u002F\u002Fnordvpn.com\u002Fpt-br\u002Fblog\u002Festudo-nordvpn-o-uso-de-ia-e-biometria-no-brasil\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fnordvpn.com\u002Fpt-br\u002Fblog\u002Festudo-nordvpn-o-uso-de-ia-e-biometria-no-brasil\u002F&source=gmail&ust=1749122757076000&usg=AOvVaw0zTFFgk-lbbsB3_djn9Tjr\"\u003Epesquisa da NordVPN\u003C\u002Fa\u003E, 17% dos brasileiros temem ser substituídos pela IA em seus empregos, enquanto 27% acreditam que a tecnologia está evoluindo rápido demais.\u003C\u002Fp\u003E\n\u003Cp\u003EAlém disso, 35% dos entrevistados estão estudando sobre IA para se preparar melhor para o futuro. O sentimento é mais evidente em setores administrativos e de atendimento, onde os avanços da automação se tornaram mais visíveis no dia a dia.\u003C\u002Fp\u003E\n\u003Cp\u003E“O medo de ser substituído não é irracional – ele vem de um processo de mudança real e muito rápido. Mas a maneira como as empresas lidam com esse sentimento faz toda a diferença”, explica Renan Conde, especialista em gestão de pessoas e CEO Brasil da Factorial, startup unicórnio desenvolvedora de software para gestão e centralização de processos de RH e DP.\u003C\u002Fp\u003E\n\u003Cp\u003EPara ele, o papel do RH nesse contexto é essencial: acolher, escutar e trazer clareza. “As pessoas precisam entender como a IA pode atuar ao lado delas, e não contra, mas de fato, humanos que se comportam como máquinas, serão substituídos”, completa.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EAusência de diálogo\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EAinda que muitas empresas estejam adotando soluções de inteligência artificial com foco em ganho de eficiência, nem sempre essa transição é acompanhada de uma comunicação clara com os times. A ausência de diálogo e de iniciativas que envolvam os colaboradores no processo de inovação pode acentuar sensações de exclusão e incerteza.\u003C\u002Fp\u003E\n\u003Cp\u003EPara Conde, é nesse ponto que o papel do RH se torna estratégico – não apenas como executor de mudanças, mas também como guardião do equilíbrio emocional das equipes.\u003C\u002Fp\u003E\n\u003Cp\u003EEle explica que os líderes de RH precisam estar atentos aos sinais: queda de produtividade, aumento de afastamentos e perda de engajamento podem ser reflexos diretos da ansiedade relacionada ao futuro profissional. “Muitas vezes, a causa não está na carga de trabalho em si, mas na insegurança sobre o que está por vir”, pontua.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003EO que as empresas podem (e devem) fazer\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EDiante desse novo cenário, especialistas defendem que os times de gestão adotem uma abordagem mais humana e ativa, com ações que vão além do discurso.\u003C\u002Fp\u003E\n\u003Cp\u003EEmpresas como a Microsoft criaram programas internos que incentivam os funcionários a participarem ativamente no desenvolvimento e teste de novas soluções de IA, fortalecendo a sensação de pertencimento e inovação compartilhada.\u003C\u002Fp\u003E\n\u003Cp\u003EJá o Google incentiva seus engenheiros a dedicar tempo a projetos pessoais que possam impactar a empresa, promovendo um ambiente de inovação contínua.\u003C\u002Fp\u003E\n\u003Cp\u003EOutro ponto importante é manter a comunicação clara e transparente sobre as transformações em curso. Spotify e Netflix, por exemplo, são conhecidos por promoverem uma comunicação extremamente aberta sobre mudanças tecnológicas e suas implicações, o que ajuda a construir confiança e engajamento.\u003C\u002Fp\u003E\n\u003Cp\u003EPor fim, a saúde mental precisa ser uma prioridade para garantir um ambiente saudável e inovador. Algumas empresas estão investindo em parcerias com plataformas para oferecer apoio emocional estruturado, reconhecendo que a saúde mental é um pilar essencial para a inovação sustentável.\u003C\u002Fp\u003E\n\u003Cp\u003E“Quando as pessoas entendem que a tecnologia pode libertá-las de tarefas mecânicas e abrir espaço para o pensamento estratégico, a relação com a IA muda completamente. Transforma-se em uma ferramenta de potencialização, e não de substituição”, ressalta Conde. Para os próximos anos, a tendência é que esse dilema se intensifique.\u003C\u002Fp\u003E\n\u003Cp\u003EAs empresas que conseguirem equilibrar eficiência tecnológica com cuidado genuíno com as pessoas estarão mais preparadas não apenas para inovar, mas para reter talentos, manter o engajamento e construir culturas organizacionais mais resilientes. ♦\u003C\u002Fp\u003E\n\u003Chr \u002F\u003E\n\u003Cp\u003E\u003Cstrong\u003ELEIA TAMBÉM\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fo-que-as-ias-dizem-sobre-voce-a-nova-fronteira-da-reputacao-digital-ja-comecou\"\u003EO que as IAs dizem sobre você? A nova fronteira da reputação digital já começou\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fchatgpt-estreia-no-ranking-de-marcas-mais-valiosas-do-kantar-brandz-global-em-60o-lugar\"\u003EChatGPT estreia no ranking de marcas mais valiosas do Kantar BrandZ Global em 60º lugar\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003Cli\u003E\u003Ca href=\"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fsaiba-como-criar-senhas-mais-seguras-para-evitar-ataques-ciberneticos\"\u003ESaiba como criar senhas mais seguras para evitar ataques cibernéticos\u003C\u002Fa\u003E\u003C\u002Fli\u003E\n\u003C\u002Ful\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003EMedo de substituição por IA: Pesquisa indica que 17% dos brasileiros temem ser substituídos pela Inteligência Artificial em seus empregos; 35% estão…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fmedo-de-substituicao-por-ia-pressiona-saude-mental-dos-trabalhadores-e-desafia-o-rh","date":"17 jun, 2025","relativeTime":"há 23 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04093615\u002FSubstituido-por-IA.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Generative AI","slug":"generative-ai","id":8941,"link":"https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai"},{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"}],"seo":{"open_graph":{"title":"Medo de substituição por IA pressiona saúde mental dos trabalhadores","description":"Medo de substituição por IA: Pesquisa indica que 17% dos brasileiros temem ser substituídos pela Inteligência Artificial em seus empregos; 35% estão...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04093615\u002FSubstituido-por-IA.jpg","width":800,"height":533},"modified_time":"2025-06-04T09:50:01-03:00","published_time":"2025-06-17T09:15:07-03:00"},"twitter":{"title":"Medo de substituição por IA pressiona saúde mental dos trabalhadores","description":"Medo de substituição por IA: Pesquisa indica que 17% dos brasileiros temem ser substituídos pela Inteligência Artificial em seus empregos; 35% estão...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04093615\u002FSubstituido-por-IA.jpg"}},"type":"imasters_news"},{"id":163689,"title":"O que as IAs dizem sobre você? A nova fronteira da reputação digital já começou","content":"\u003Cp\u003E\u003Ci\u003Ereputação digital | O uso dos buscadores tradicionais, como o Google, poderá ser reduzido em até 25% até 2026, segundo a Gartner. Especialista analisa a tendência e indica previsões\u003C\u002Fi\u003E\u003C\u002Fp\u003E\n\u003Cdiv\u003E\n\u003Cp\u003ENovas tecnologias vêm redefinindo a maneira como interagimos com a informação e construímos percepções online. De acordo com Renan Bulgueroni, CEO da Hawkz, empresa especializada em reputação digital no Brasil e Espanha, a forma como uma reputação digital é construída e percebida na web vem passando por uma mudança importante, principalmente com a ascensão das inteligências artificiais generativas, assistentes de voz e mecanismos de busca cada vez mais inteligentes.\u003C\u002Fp\u003E\n\u003Ch2\u003EReputação Digital\u003C\u002Fh2\u003E\n\u003Cp\u003EA reputação digital — antes limitada ao que aparecia nas primeiras páginas do Google — agora é processada, interpretada e entregue em tempo real por algoritmos conversacionais, diretamente em sua sala, no carro ou até no relógio.\u003C\u002Fp\u003E\n\u003Cp\u003E“Essas tecnologias não apenas moldam a nossa percepção, mas respondem à essência do comportamento humano: buscar segurança, sentido e clareza nas relações. Se antes usávamos o Google como um oráculo moderno, hoje o oráculo responde em tempo real, com contexto e linguagem natural”, avalia Renan Bulgueroni.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003EA neurociência por trás do “dar um Google”\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EO que parece um costume moldado pela modernidade, na verdade — de acordo com o especialista — é um comportamento ancestral com raízes neurocientíficas. A busca por previsibilidade e segurança, aliada às facilidades das buscas digitais, se tornou um filtro essencial nas decisões pessoais e profissionais.\u003C\u002Fp\u003E\n\u003Cp\u003EDiante da alta competitividade do mercado, os usuários buscam tomar decisões mais confiáveis, e a pesquisa ajuda a validar percepções e evitar surpresas, seja ao buscar um médico, um advogado, uma empresa ou pessoa com quem queria se relacionar. Todos querem estar certos de que estão escolhendo a melhor opção, e a reputação digital entra como uma ferramenta de confirmação.\u003C\u002Fp\u003E\n\u003Cp\u003E“O LinkedIn, por exemplo, mostra o que o candidato quer exibir. Já o Google mostra tudo: processos judiciais, redes sociais, menções, reportagens. A busca se tornou parte essencial desta triagem para os RHs das empresas. Inclusive, esse comportamento se aplica também na vida social. Após conhecer alguém, é normal fazer uma busca rápida pelo nome da pessoa”, completa Bulgueroni.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003EDa digitação aos comandos de voz\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003ESegundo uma previsão divulgada pela consultoria Gartner, até 2026, o uso dos buscadores tradicionais poderá ser reduzido em até 25%, sendo progressivamente substituídos por agentes com inteligência artificial, impulsionados por assistentes de voz e chatbots.\u003C\u002Fp\u003E\n\u003Cp\u003ESegundo Renan, essa projeção deve ser interpretada com cautela, já que o impacto real dependerá do ritmo de adoção pelos usuários e da capacidade das grandes plataformas de reinventarem suas experiências de busca — como é o caso do Google, que já avança nesse caminho com o AI Overview, sistema que fornece respostas no primeiro resultado com base em IA generativa.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003EReputação digital | o \u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003Enovo ecossistema\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003ESiri, Alexa e Google Assistente estão passando por uma reinvenção. Antes limitados, agora contam com integração com IAs generativas:\u003C\u002Fp\u003E\n\u003Cp\u003E– Siri está sendo reformulada com IA (projeto Apple Intelligence).\u003Cbr \u002F\u003E\n– Alexa está sendo integrada com LLMs mais potentes, como Claude e modelos proprietários.\u003Cbr \u002F\u003E\n– O Google Assistente já está em fusão com o Gemini.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cstrong\u003EEsse novo ecossistema se conecta da seguinte forma:\u003C\u002Fstrong\u003E\u003C\u002Fh3\u003E\n\u003Col\u003E\n\u003Cli aria-level=\"1\"\u003EComando de voz →\u003C\u002Fli\u003E\n\u003Cli aria-level=\"1\"\u003EIA generativa →\u003C\u002Fli\u003E\n\u003Cli aria-level=\"1\"\u003EMecanismo de busca →\u003C\u002Fli\u003E\n\u003Cli aria-level=\"1\"\u003EResposta contextualizada\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 14pt;\"\u003E\u003Cstrong\u003EEsse é o novo fluxo:\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Col\u003E\n\u003Cli aria-level=\"1\"\u003EO assistente de voz recebe o comando (ex: “Pesquisar sobre fulano”).\u003C\u002Fli\u003E\n\u003Cli aria-level=\"1\"\u003EEle ativa um modelo de IA (GPT-4, Gemini etc.).\u003C\u002Fli\u003E\n\u003Cli aria-level=\"1\"\u003EO modelo busca em fontes da web (Google, Bing).\u003C\u002Fli\u003E\n\u003Cli aria-level=\"1\"\u003EA IA interpreta e responde com base em contexto e relevância.\u003C\u002Fli\u003E\n\u003C\u002Fol\u003E\n\u003Cp\u003EApós detalhar a nova dinâmica, o CEO indica que essas integrações mostram que, para garantir uma boa reputação digital, não basta “estar bem” no Google. É preciso gerenciar a sua presença online como um ativo estratégico — porque agora ela será lida e interpretada por algoritmos conversacionais, além de ser consultada em metabuscadores.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003EReputação Digital | O esforço mínimo, a recompensa máxima\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EDo ponto de vista comportamental e neurocientífico, quanto menor o esforço para obter uma informação, maior a chance de o comportamento se repetir — é assim que os seres humanos criam o famoso hábito. Sendo assim, o comportamento automático foca exatamente nesta facilidade de buscar e encontrar informações sobre alguém.\u003C\u002Fp\u003E\n\u003Cp\u003E“Se antes era preciso ir ao computador, depois ao celular, agora basta falar — e a resposta vem embalada em linguagem natural. A imagem de pessoas e empresas está sendo lida, interpretada e distribuída por robôs, em escala, com base no que eles encontram (ou não). A reputação não é apenas um reflexo de quem você é, e sim a percepção que os algoritmos têm sobre você”, finaliza ele.\u003C\u002Fp\u003E\n\u003C\u002Fdiv\u003E\n","excerpt":"\u003Cp\u003ENovas tecnologias vêm redefinindo a maneira como interagimos com a informação e construímos percepções online… a forma como uma reputação digital…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fo-que-as-ias-dizem-sobre-voce-a-nova-fronteira-da-reputacao-digital-ja-comecou","date":"16 jun, 2025","relativeTime":"há 24 dias","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04091905\u002Freputa%C3%A7%C3%A3o-online.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Generative AI","slug":"generative-ai","id":8941,"link":"https:\u002F\u002Fimasters.com.br\u002Fgenerative-ai"},{"title":"Inteligência Artificial","slug":"inteligencia-artificial","id":8909,"link":"https:\u002F\u002Fimasters.com.br\u002Finteligencia-artificial"},{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"}],"seo":{"open_graph":{"title":"O que as IAs dizem sobre você? A nova fronteira da reputação digital","description":"Novas tecnologias vêm redefinindo a maneira como interagimos com a informação e construímos percepções online... a forma como uma reputação digital...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04091905\u002Freputa%C3%A7%C3%A3o-online.jpg","width":800,"height":533},"modified_time":"2025-06-04T09:45:35-03:00","published_time":"2025-06-16T09:01:27-03:00"},"twitter":{"title":"O que as IAs dizem sobre você? A nova fronteira da reputação digital","description":"Novas tecnologias vêm redefinindo a maneira como interagimos com a informação e construímos percepções online... a forma como uma reputação digital...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F04091905\u002Freputa%C3%A7%C3%A3o-online.jpg"}},"type":"imasters_news"},{"id":163680,"title":"4 dicas para preparar equipes para o futuro","content":"\u003Cp dir=\"ltr\"\u003E\u003Cem\u003EEquipes para o futuro\u003C\u002Fem\u003E | O mercado de trabalho está em plena transformação, impulsionado principalmente pela convergência de avanços tecnológicos. De acordo com o The Future of Jobs Report 2025, divulgado pelo Fórum Econômico Mundial, até 2030 22% dos empregos atuais serão profundamente transformados, com a criação de 170 milhões de novas funções e a extinção de 92 milhões, resultando em um saldo positivo de 78 milhões.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003ENeste cenário de oportunidades e desafios, preparar equipes para o futuro exige estratégias proativas que combinem aprendizado contínuo, desenvolvimento humano, adoção inteligente de tecnologia e uma cultura organizacional inovadora.\u003C\u002Fp\u003E\n\u003Ch2 dir=\"ltr\"\u003EEquipes para o futuro\u003C\u002Fh2\u003E\n\u003Cp dir=\"ltr\"\u003EPara \u003Ca href=\"https:\u002F\u002Fbr.linkedin.com\u002Fin\u002Fsergio-ricardo-fernandes-9993a44\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fbr.linkedin.com\u002Fin\u002Fsergio-ricardo-fernandes-9993a44&source=gmail&ust=1749047573648000&usg=AOvVaw2pLgCjwGcSgNInHdcBvPM1\"\u003ESergio Fernandes\u003C\u002Fa\u003E, cofundador do \u003Ca href=\"https:\u002F\u002Fgrupomooven.com.br\u002F\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fgrupomooven.com.br\u002F&source=gmail&ust=1749047573648000&usg=AOvVaw0PStmo-M40483VVNPhNUy1\"\u003EGrupo Mooven\u003C\u002Fa\u003E, consultoria para transformação de negócios, o futuro pertence aos profissionais que continuamente aprendem, renovam, inovam e se conectam com propósito.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003E“Contar com equipes preparadas para essa nova realidade é mais do que uma resposta às mudanças,  é uma necessidade fundamental para construir organizações mais resilientes, criativas e alinhadas às  demandas de um mundo em constante transformação”. Confira as 4 dicas do executivo:\u003C\u002Fp\u003E\n\u003Ch3 dir=\"ltr\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E1. Requalificação e aprendizado contínuo\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp dir=\"ltr\"\u003EA velocidade das mudanças tecnológicas e a automação de tarefas exigem que os profissionais se atualizem constantemente.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EUm estudo da Fundação Dom Cabral, de 2024, revelou que 65% dos trabalhadores consideram essencial adquirir novas habilidades para permanecerem competitivos, enquanto 78% buscam oportunidades de treinamento oferecidas por suas empresas.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EPara atender a essa demanda, as organizações podem implementar programas de upskilling (aprimoramento de conhecimentos existentes) e reskilling (aprendizado de novas competências).\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003ENeste contexto, é possível explorar parcerias com plataformas de educação online ou a criação de academias internas de treinamento focadas em habilidades específicas do setor.\u003C\u002Fp\u003E\n\u003Ch3 dir=\"ltr\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E2. Habilidades comportamentais e socioemocionais para ambientes complexos\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp dir=\"ltr\"\u003EEm um mundo onde a tecnologia assume tarefas repetitivas, as habilidades comportamentais e socioemocionais — como pensamento crítico, resiliência, criatividade, comunicação eficaz e inteligência emocional — tornam-se sustentáculos preponderantes e diferenciais estratégicos para o profissional.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EAinda segundo o The Future of Jobs Report 2025, essas competências serão indispensáveis para navegar em ambientes de trabalho dinâmicos, onde a colaboração interdisciplinar e a resolução de problemas complexos são a norma.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EE isso pode ser feito por meio de treinamentos práticos, como workshops de liderança adaptativa e dinâmicas de equipe que estimulem a empatia e a inovação.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EAlém disso, criar ambientes colaborativos, inclusivos, com trocas de experiências, onde diversas perspectivas e experiências adquiridas sejam valorizadas, fortalece a capacidade das equipes enfrentarem desafios com criatividade e resiliência.\u003C\u002Fp\u003E\n\u003Ch3 dir=\"ltr\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E3. Letramento tecnológico e a integração estratégica da IA\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp dir=\"ltr\"\u003EA adoção de inovações como a inteligência artificial generativa está redefinindo papéis e processos em todos os setores.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EUm relatório do Gartner de 2025 apontou que 80% das empresas planejam integrar IA em suas operações até 2027, tornando o letramento tecnológico essencial.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EMais do que entender ferramentas, os profissionais precisam saber aplicá-las estrategicamente para otimizar tempo, melhorar a tomada de decisão e aumentar a produtividade.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EPara preparar as equipes, as organizações podem oferecer treinamentos práticos sobre o uso de soluções de IA, como assistentes virtuais ou plataformas de automação, com ênfase em casos práticos específicos do negócio.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EProgramas de mentoria e laboratórios de inovação podem ajudar a desmistificar a tecnologia, mostrando como ela complementa o trabalho humano, em vez de substituí-lo.\u003C\u002Fp\u003E\n\u003Ch3 dir=\"ltr\"\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E4. Fomentar uma cultura de inovação e liderança Inspiradora\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp dir=\"ltr\"\u003EInteligência de negócio, capacidade de entrega e inovação com propósito são motores do crescimento em um mercado competitivo, e sua base está em uma cultura que incentiva o foco em resultados, a experimentação e a colaboração contínua.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003ENeste sentido, uma liderança inspiradora, confiável e participativa é essencial para alinhar equipes a uma visão compartilhada e motivá-las em tempos de incerteza.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EPara construir e consolidar este ambiente, as empresas podem criar espaços para ideação, programas de intraempreendedorismo e mentorias, onde os colaboradores são incentivados a atuar como equipe, propor soluções que resolvem dores reais do negócio, desenvolvendo acoountability, motivação pelas conquistas e o ganho acelerado de experiência.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003EAlém disso, líderes devem ser capacitados para atuar como facilitadores, promovendo a diversidade de ideias e oferecendo feedback construtivo.\u003C\u002Fp\u003E\n\u003Cp dir=\"ltr\"\u003E\n","excerpt":"\u003Cp\u003EEquipes para o futuro | O mercado de trabalho está em plena transformação, impulsionado principalmente pela convergência de avanços tecnológicos. \u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002F4-dicas-para-preparar-equipes-para-o-futuro","date":"12 jun, 2025","relativeTime":"há um mês","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03133135\u002Fequipes-para-o-futuro.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Carreira Dev","slug":"carreira-dev","id":7265,"link":"https:\u002F\u002Fimasters.com.br\u002Fcarreira-dev"},{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"},{"title":"Tendências","slug":"tendencias","id":7264,"link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias"}],"seo":{"open_graph":{"title":"4 dicas para preparar equipes para o futuro","description":"Equipes para o futuro | O mercado de trabalho está em plena transformação, impulsionado principalmente pela convergência de avanços tecnológicos.","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03133135\u002Fequipes-para-o-futuro.jpg","width":800,"height":533},"modified_time":"2025-06-03T15:08:39-03:00","published_time":"2025-06-12T09:07:55-03:00"},"twitter":{"title":"4 dicas para preparar equipes para o futuro","description":"Equipes para o futuro | O mercado de trabalho está em plena transformação, impulsionado principalmente pela convergência de avanços tecnológicos.","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03133135\u002Fequipes-para-o-futuro.jpg"}},"type":"imasters_news"},{"id":163685,"title":"Rio Preto Tech Summit 2025 reúne nomes de peso","content":"\u003Cp data-start=\"156\" data-end=\"412\"\u003EReconhecido como o maior evento de tecnologia e inovação do interior paulista, o Rio Preto Tech Summit 2025 já tem data para ser realizado.\u003C\u002Fp\u003E\n\u003Cp\u003EApós o sucesso das edições anteriores, com destaque para a de 2024, que dobrou de tamanho e consolidou São José do Rio Preto como um polo tecnológico emergente, a expectativa para 2025 é ainda mais alta.\u003C\u002Fp\u003E\n\u003Ch2\u003ERio Preto Tech Summit 2025\u003C\u002Fh2\u003E\n\u003Cp\u003ENomes de peso já estão confirmados como palestrantes, como Leandro Karnal e Arthur Igreja. Organizado pela Apeti (Associação dos Profissionais e Empresas de Tecnologia da Informação), o Rio Preto Tech Summit tem desempenhado papel essencial no fortalecimento do ecossistema de inovação da região.\u003C\u002Fp\u003E\n\u003Cp\u003ENa edição de 2024, mais de 2.500 pessoas participaram ao longo dos dois dias de evento, reforçando a relevância nacional do encontro.\u003C\u002Fp\u003E\n\u003Cp\u003EO evento de 2025 está marcado para os dias 6 e 7 de agosto e será realizado no Complexo da Swift. No ano passado, a área da feira de negócios cresceu de 613 m² para 1.290 m², com o número de estandes saltando de 34 para 45. Para este ano, a organização prevê uma ampliação ainda maior, com mais de 80% dos estandes já comercializados antes mesmo do lançamento oficial.\u003C\u002Fp\u003E\n\u003Cp\u003EA programação contará com uma série de palestras e painéis voltados às tendências em tecnologia, inovação e transformação digital. Haverá também workshops interativos, voltados ao aprofundamento prático em temas estratégicos, além da feira de negócios – um espaço para empresas apresentarem suas soluções e novidades em tecnologia. A edição 2025 também promete novos espaços temáticos.\u003C\u002Fp\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003EProgramação confirmada\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EA edição de 2025 terá como destaques as palestras de Leandro Karnal e Arthur Igreja, que abordarão inovação, liderança e os desafios atuais da transformação digital.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003ELeandro Karnal\u003C\u002Fstrong\u003E, historiador e professor, é conhecido por sua abordagem clara e provocativa sobre comportamento, cultura e futuro do trabalho. Autor de diversos livros e presença marcante na mídia e no digital, Karnal promete levantar reflexões sobre como a tecnologia impacta a vida profissional e os negócios.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Cstrong\u003EArthur Igreja\u003C\u002Fstrong\u003E, especialista em inovação e cofundador da AAA Inovação, é outro nome confirmado. Com passagens por Harvard e Stanford, e palestras em eventos internacionais, é autor do livro \u003Cem\u003EConveniência é o Nome do Negócio\u003C\u002Fem\u003E. No Summit, ele deve tratar das tendências que estão moldando o futuro das empresas.\u003C\u002Fp\u003E\n\u003Cp\u003EO Rio Preto Tech Summit 2025 será realizado nos dias 6 e 7 de agosto, no Complexo da Swift, com expectativa de público ainda maior, estandes praticamente esgotados e uma programação intensa, que inclui palestras, painéis, workshops e uma feira ampliada com startups, grandes empresas e investidores.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003EReconhecido como o maior evento de tecnologia e inovação do interior paulista, o Rio Preto Tech Summit 2025 será lançado oficialmente no dia…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Frio-preto-tech-summit-2025-reune-nomes-de-peso","date":"11 jun, 2025","relativeTime":"há um mês","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03145338\u002Friopreto-1.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"}],"seo":{"open_graph":{"title":"Rio Preto Tech Summit 2025 reúne nomes de peso","description":"Reconhecido como o maior evento de tecnologia e inovação do interior paulista, o Rio Preto Tech Summit 2025 será lançado oficialmente no dia...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03145338\u002Friopreto-1.jpg","width":825,"height":550},"modified_time":"2025-06-03T15:05:47-03:00","published_time":"2025-06-11T09:14:36-03:00"},"twitter":{"title":"Rio Preto Tech Summit 2025 reúne nomes de peso","description":"Reconhecido como o maior evento de tecnologia e inovação do interior paulista, o Rio Preto Tech Summit 2025 será lançado oficialmente no dia...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03145338\u002Friopreto-1.jpg"}},"type":"imasters_news"},{"id":163747,"title":"USP São Carlos sedia pela 10ª vez a etapa regional da Olimpíada Brasileira de Robótica","content":"\u003Cp\u003E\u003Cem\u003ECom 200 equipes inscritas, o evento coordenado pelo ICMC reunirá jovens estudantes nos dias 14 e 15 de junho para desafios práticos de tecnologia aplicada à robótica; a entrada é gratuita\u003C\u002Fem\u003E\u003C\u002Fp\u003E\n\u003Cp\u003ENa década passada, São Carlos abraçou um projeto que, ano após ano, transformou vidas, escolas e futuros. Em cada edição da Olimpíada Brasileira de Robótica (OBR), o município e sua região viram nascer talentos, despertar vocações e acender a chama da curiosidade científica em milhares de jovens. Nos dias 14 e 15 de junho, a USP São Carlos será a sede da 10ª etapa regional da competição, que se consolidou como um dos principais eventos de incentivo à ciência e tecnologia entre estudantes do ensino fundamental, médio e técnico.\u003C\u002Fp\u003E\n\u003Cp\u003ECoordenada pela professora Roseli Romero, do Instituto de Ciências Matemáticas e de Computação (ICMC) da USP, a etapa é aberta aos visitantes com entrada gratuita. O público poderá acompanhar de perto a modalidade prática de resgate, que desafiará 200 equipes com alunos dos ensinos fundamental, médio e técnico de São Carlos e região, dos sete aos 17 anos.\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_163750\" aria-describedby=\"caption-attachment-163750\" style=\"width: 500px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10121040\u002Frob%C3%B3tica-2.jpeg\"\u003E\u003Cimg class=\"wp-image-163750\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10121040\u002Frob%C3%B3tica-2.jpeg\" alt=\"\" width=\"500\" height=\"281\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-163750\" class=\"wp-caption-text\"\u003Eimagem: Divulgação\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Ch2\u003EOlimpíada Brasileira de Robótica\u003C\u002Fh2\u003E\n\u003Cp\u003EEm 2025, a etapa de São Carlos conta com aumento de 11% em relação ao número total de equipes inscritas ano passado, quando 180 times participaram. Os 200 times inscritos este ano representam mais que o dobro da primeira edição, quando 99 equipes foram registradas nesta regional.\u003C\u002Fp\u003E\n\u003Cp\u003ESegundo Roseli, aproximadamente 8 mil alunos passaram pela etapa regional ao longo desses dez anos, muitos dos quais estão hoje cursando universidades na área de ciências exatas. “Já tivemos equipes que chegaram à final nacional da OBR”, destaca a professora.\u003C\u002Fp\u003E\n\u003Cp\u003EEla explica que o sucesso da OBR em São Carlos foi sustentado por uma rede de incentivo à ciência e à robótica: “Para montar a competição por 10 anos, foi necessário contar com o apoio do Departamento de Ciências de Computação (SCC) do ICMC, da infraestrutura do ICMC e da Escola de Engenharia de São Carlos, de alunos de graduação e de pós-graduação do campus e também de patrocinadores. Com a continuidade desse trabalho, a regional de São Carlos se tornou a maior do Estado. Por isso, deixo meu agradecimento sincero a todas as pessoas que têm contribuído para esse feito.”\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_163751\" aria-describedby=\"caption-attachment-163751\" style=\"width: 350px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10121153\u002Frob%C3%B3tica-4.jpeg\"\u003E\u003Cimg class=\"wp-image-163751\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10121153\u002Frob%C3%B3tica-4.jpeg\" alt=\"\" width=\"350\" height=\"467\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-163751\" class=\"wp-caption-text\"\u003EImagem: Divulgação\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003EComo será a disputa\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EA OBR tem como objetivo transformar a robótica educacional em um tema acessível e estimulante dentro da sala de aula, com a intenção de descobrir jovens talentos e atualizar o processo de ensino e aprendizagem brasileiro. Trata-se de uma forma de apresentar um mundo de possibilidades para os alunos,  uma porta de entrada para as carreiras científico-tecnológicas.\u003C\u002Fp\u003E\n\u003Cp\u003EAssim como ocorreu em 2024, as equipes que participam da disputa são formadas por, no mínimo, dois alunos e, no máximo, quatro estudantes. Também é exigida, para cada time, a participação de um professor ou técnico, vinculado ou não a uma instituição de ensino.\u003C\u002Fp\u003E\n\u003Cp\u003EDurante a competição, os participantes são desafiados a demonstrar a eficácia de seus robôs autônomos (sem operação remota ou direta). Há juízes que avaliam o desempenho, levando em consideração a qualidade da programação robótica, a estratégia de navegação adotada e a capacidade de criação de soluções práticas em tempo real.\u003C\u002Fp\u003E\n\u003Cp\u003EA etapa regional da OBR em São Carlos será dividida em dois níveis de disputa, organizados de acordo com a escolaridade dos participantes. O nível 1 é voltado a alunos do 1º ao 8º ano do ensino fundamental, enquanto o nível 2 contempla estudantes do 8º e 9º ano do ensino fundamental e todos os alunos do ensino médio ou técnico.\u003C\u002Fp\u003E\n\u003Cp\u003EA principal diferença entre os dois níveis está no grau de dificuldade dos desafios práticos. No nível 1, o robô autônomo deve realizar uma missão de resgate simulada, em que precisa encontrar uma vítima em meio a obstáculos diversos, como curvas, rampas, terrenos irregulares e áreas de difícil acesso — tudo isso sem qualquer controle remoto.\u003C\u002Fp\u003E\n\u003Cp\u003EJá no nível 2, a complexidade aumenta significativamente. Além de localizar a vítima, o robô deve resgatá-la e transportá-la com segurança até uma área que simula um hospital. Para isso, precisa superar caminhos sem saída, terrenos desconhecidos, desvios obrigatórios e trechos nos quais a rota não pode ser previamente identificada, exigindo decisões rápidas e estratégias mais sofisticadas. Essa dinâmica torna a prova ainda mais desafiadora, exigindo dos alunos um domínio maior da lógica, programação e engenharia aplicada.\u003C\u002Fp\u003E\n\u003Cp\u003EAs equipes com melhor desempenho nas etapas regionais garantirão vaga para a etapa estadual da OBR, prevista para acontecer dia 23 de agosto, no Centro Universitário Barão de Mauá, em São Paulo. Já os destaques da fase estadual seguirão para representar o Estado na final nacional da OBR, que acontecerá de 13 a 19 de outubro, na cidade de Vitória, no Espírito Santo.\u003C\u002Fp\u003E\n\u003Cfigure id=\"attachment_163752\" aria-describedby=\"caption-attachment-163752\" style=\"width: 400px\" class=\"wp-caption alignnone\"\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10121306\u002Frob%C3%B3tica-3.jpeg\"\u003E\u003Cimg class=\"wp-image-163752\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10121306\u002Frob%C3%B3tica-3.jpeg\" alt=\"\" width=\"400\" height=\"533\" \u002F\u003E\u003C\u002Fa\u003E\u003Cfigcaption id=\"caption-attachment-163752\" class=\"wp-caption-text\"\u003Eimagem: Divulgação\u003C\u002Ffigcaption\u003E\u003C\u002Ffigure\u003E\n\u003Ch3\u003E\u003Cspan style=\"font-size: 18pt;\"\u003E\u003Cstrong\u003ECurso preparatório\u003C\u002Fstrong\u003E\u003C\u002Fspan\u003E\u003C\u002Fh3\u003E\n\u003Cp\u003EPara apoiar a preparação das equipes e estimular novos talentos, o ICMC disponibilizou um \u003Cstrong\u003E\u003Ca href=\"https:\u002F\u002Fwww.icmc.usp.br\u002Fnoticias\u002F6973-prepare-se-para-a-olimpiada-brasileira-de-robotica-em-curso-da-usp-sao-carlos-inscricoes-abertas-ate-dia-24-de-abril\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\u002F\u002Fwww.google.com\u002Furl?q=https:\u002F\u002Fwww.icmc.usp.br\u002Fnoticias\u002F6973-prepare-se-para-a-olimpiada-brasileira-de-robotica-em-curso-da-usp-sao-carlos-inscricoes-abertas-ate-dia-24-de-abril&source=gmail&ust=1749648527265000&usg=AOvVaw0uxDmJRzXAuA1b2aFeBc4i\"\u003Ecurso preparatório\u003C\u002Fa\u003E\u003C\u002Fstrong\u003E voltado a estudantes do ensino fundamental I e II, médio e técnico, com foco na montagem de robôs e em noções básicas de programação. As aulas também incluíram aplicações práticas, proporcionando uma vivência direta dos desafios que os alunos enfrentarão na competição.\u003C\u002Fp\u003E\n\u003Cp\u003ECoordenado pela professora Roseli, o curso foi ministrado por Raphael Montanari, mestre em Ciências de Computação e integrante do Centro de Robótica (CROB) da USP, e por Eliel Jose de Souza Francoso, estudante da Escola de Engenharia de São Carlos (EESC). A edição atual do curso preparatório termina no sábado, dia 7 de junho, praticamente às vésperas do início oficial da etapa regional, oferecendo aos alunos a chance de chegar à competição com mais segurança e conhecimento técnico.\u003C\u002Fp\u003E\n\u003Cp\u003EA etapa em São Carlos da OBR 2025 conta com o apoio do Departamento de Ciências de Computação (SCC) do ICMC, da EESC, do Centro de Robótica (CROB-USP) e da Prefeitura do Campus de São Carlos da USP.\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ECom 200 equipes inscritas, evento reunirá jovens estudantes nos dias 14 e 15 de junho para desafios práticos de tecnologia aplicada à robótica\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fusp-sao-carlos-sedia-pela-10a-vez-a-etapa-regional-da-olimpiada-brasileira-de-robotica","date":"10 jun, 2025","relativeTime":"há um mês","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10120624\u002Frob%C3%B3tica.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"},{"title":"Tecnologia","slug":"tecnologia","id":4254,"link":"https:\u002F\u002Fimasters.com.br\u002Ftecnologia"},{"title":"Tendências","slug":"tendencias","id":7264,"link":"https:\u002F\u002Fimasters.com.br\u002Ftendencias"}],"seo":{"open_graph":{"title":"USP São Carlos sedia etapa regional da Olimpíada Brasileira de Robótica","description":"Com 200 equipes inscritas, evento reunirá jovens estudantes nos dias 14 e 15 de junho para desafios práticos de tecnologia aplicada à robótica","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10120624\u002Frob%C3%B3tica.jpg","width":800,"height":533},"modified_time":"2025-06-10T12:14:37-03:00","published_time":"2025-06-10T12:09:10-03:00"},"twitter":{"title":"USP São Carlos sedia etapa regional da Olimpíada Brasileira de Robótica","description":"Com 200 equipes inscritas, evento reunirá jovens estudantes nos dias 14 e 15 de junho para desafios práticos de tecnologia aplicada à robótica","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F10120624\u002Frob%C3%B3tica.jpg"}},"type":"imasters_news"},{"id":163682,"title":"NEON | Teresina será palco do maior evento de inovação e empreendedorismo do Nordeste","content":"\u003Cp\u003ENos dias 3 e 4 de julho, o Centro de Convenções de Teresina sediará a terceira edição do NEON (Nordeste ON), considerado o maior evento de inovação e empreendedorismo da região. A expectativa é reunir mais de 15 mil pessoas e mais de 200 startups de todo o Brasil, fortalecendo o ecossistema de inovação e conectando empreendedores a investidores, aceleradoras e instituições públicas e privadas.\u003C\u002Fp\u003E\n\u003Cp\u003EO lançamento oficial do evento aconteceu nesta terça-feira (22), durante uma solenidade no Palácio de Karnak, com a presença do governador Rafael Fonteles.\u003Cbr \u002F\u003E\n\u003Cstrong\u003E“Acreditamos fortemente que o desenvolvimento depende dos padrões de inovação tecnológica. Por isso, receber esse evento nacional será muito importante para continuarmos na evolução da inovação e do empreendedorismo no estado do Piauí”,\u003C\u002Fstrong\u003E \u003Ca href=\"https:\u002F\u002Fwww.pi.gov.br\u002Fteresina-vai-sediar-o-maior-evento-de-inovacao-e-empreendedorismo-do-nordeste-nos-dias-3-e-4-de-julho\u002F\"\u003Eafirmou o governador\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\n\u003Cp\u003ECo-realizado pelo Governo do Estado do Piauí, por meio da Investe Piauí, e pelo Sebrae, o NEON será um espaço de oportunidades para exposição de soluções tecnológicas, rodadas de negócios, mentorias, palestras e conexões estratégicas. Essa será a maior edição já realizada no Centro de Convenções de Teresina.\u003C\u002Fp\u003E\n\u003Cp\u003EO diretor técnico do Sebrae Nacional, Bruno Quick, comentou o avanço da região no cenário de inovação. \u003Cstrong\u003E“Há quatro anos, 8% das startups do Brasil estavam aqui, hoje já são quase 30%. O investimento em educação, como temos visto no Piauí – no ensino fundamental, médio, técnico e superior – somado à criatividade e à iniciativa do povo nordestino, especialmente dessa juventude que enfrenta os desafios, têm gerado inovação. O Nordeste tem ampliado sua atuação e a organização dos ecossistemas na região tem avançado rapidamente”,\u003C\u002Fstrong\u003E afirmou.\u003C\u002Fp\u003E\n\u003Cp\u003EPara Júlio César Filho, superintendente do Sebrae Piauí, o evento destaca o protagonismo do estado na área. \u003Cstrong\u003E“O Piauí é hoje um celeiro de inovação e tecnologia. Com a realização do NEON, teremos a oportunidade de mostrar todo o nosso potencial para o Nordeste e para o Brasil.”,\u003C\u002Fstrong\u003E afirmou.\u003C\u002Fp\u003E\n\u003Cp\u003EPara mais informações sobre o evento, os interessados podem acessar o Portal do Sebrae no Piauí (\u003Ca href=\"https:\u002F\u002Fsebrae.com.br\u002Fsites\u002FPortalSebrae\u002Fufs\u002Fpi?codUf=19\"\u003Epi.sebrae.com.br\u003C\u002Fa\u003E) ou acompanhar os canais digitais da instituição.\u003C\u002Fp\u003E\n\u003Cp\u003E\u003Ca href=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03141239\u002Fneon-2.jpg\"\u003E\u003Cimg class=\"alignnone wp-image-163683\" src=\"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03141239\u002Fneon-2.jpg\" alt=\"\" width=\"500\" height=\"333\" \u002F\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\n","excerpt":"\u003Cp\u003ENos dias 3 e 4 de julho, o Centro de Convenções de Teresina sediará a terceira edição do NEON (Nordeste ON), considerado o maior evento de inovação e…\u003C\u002Fp\u003E\n","link":"https:\u002F\u002Fimasters.com.br\u002Fnoticia\u002Fneon-teresina-sera-palco-do-maior-evento-de-inovacao-e-empreendedorismo-do-nordeste","date":"10 jun, 2025","relativeTime":"há um mês","thumbnail":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03141239\u002Fneon-2.jpg","author":{"id":2,"thumbnail":"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F5cc2551d3dc7218f4d2c8e5c89afc97a?s=96&d=mm&r=g","name":"Redação iMasters","description":"Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram\u002FThreads @portalimasters","slug":"redacao_imasters","url":"https:\u002F\u002Fimasters.com.br\u002Fperfil\u002Fredacao_imasters","registered":"2011-01-31 02:58:58","social":{"linkedin":null,"youtube":null,"facebook":"https:\u002F\u002Fwww.facebook.com\u002FPortaliMasters\u002F","twitter":"https:\u002F\u002Ftwitter.com\u002Fredacaoimasters","instagram":null,"github":null,"url":"https:\u002F\u002Fimasters.com.br","mail":"redacao@imasters.com.br"}},"categories":[{"title":"Notícias","slug":"noticias","id":8756,"link":"https:\u002F\u002Fimasters.com.br\u002Fnoticias"}],"seo":{"open_graph":{"title":"NEON | Teresina será palco do maior evento de inovação do Nordeste","description":"Nos dias 3 e 4 de julho, o Centro de Convenções de Teresina sediará a terceira edição do NEON (Nordeste ON), considerado o maior evento de inovação e...","type":"article","locale":"pt_BR","site_name":"iMasters - We are Developers","image":{"src":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03141239\u002Fneon-2.jpg","width":800,"height":533},"modified_time":"2025-06-03T14:21:19-03:00","published_time":"2025-06-10T09:06:44-03:00"},"twitter":{"title":"NEON | Teresina será palco do maior evento de inovação do Nordeste","description":"Nos dias 3 e 4 de julho, o Centro de Convenções de Teresina sediará a terceira edição do NEON (Nordeste ON), considerado o maior evento de inovação e...","type":"summary_large_image","image":"https:\u002F\u002Fstatic.imasters.com.br\u002Fwp-content\u002Fuploads\u002F2025\u002F06\u002F03141239\u002Fneon-2.jpg"}},"type":"imasters_news"}]},"page":{"success":false,"data":{}},"magazine":{"success":false,"magazines":[]},"schedule":{"success":false,"data":{}},"searchResult":{"success":false,"totalPosts":0,"totalPage":0,"currentPage":1,"posts":[],"term":"","orderBy":"recents","currentFilter":"articles","isLoading":true,"isLoadingPagination":false},"singleNews":{"success":false,"data":{}},"listNews":{"success":false,"isFetchingPagination":false,"maxPages":0,"page":1,"data":[]},"sponsors":{"success":false,"data":{}},"header":{"success":true,"menus":{"main":[{"ID":138755,"order":1,"parent":0,"title":"Back-End","url":"https:\u002F\u002Fimasters.com.br\u002Fback-end","attr":"package","target":"","classes":"package","xfn":"","description":"Tecnologias utilizadas no backend da aplicação","object_id":7158,"object":"category","type":"taxonomy","type_label":"Categoria","children":[]},{"ID":138756,"order":2,"parent":0,"title":"Mobile","url":"https:\u002F\u002Fimasters.com.br\u002Fmobile","attr":"package","target":"","classes":"package","xfn":"","description":"Conteúdos sobre Desenvolvimento Mobile nas plataformas iOS (iPhone e iPad) e Android.","object_id":4255,"object":"category","type":"taxonomy","type_label":"Categoria","children":[]},{"ID":139476,"order":3,"parent":0,"title":"Front End","url":"https:\u002F\u002Fimasters.com.br\u002Ffront-end","attr":"package","target":"","classes":"package","xfn":"","description":"Conteúdos sobre HTML5, CSS3, Javascript, JQuery, Web Standards e SEO.","object_id":7304,"object":"category","type":"taxonomy","type_label":"Categoria","children":[]},{"ID":138764,"order":4,"parent":0,"title":"DevSecOps","url":"https:\u002F\u002Fimasters.com.br\u002Fdevsecops","attr":"package","target":"","classes":"package","xfn":"","description":"","object_id":1,"object":"category","type":"taxonomy","type_label":"Categoria","children":[]},{"ID":139204,"order":5,"parent":0,"title":"Design & UX","url":"https:\u002F\u002Fimasters.com.br\u002Fdesign-ux","attr":"package","target":"","classes":"package","xfn":"","description":"Conteúdos sobre User Experience, Arquitetura de Informação, Usabilidade, Acessibilidade, Design Responsivo, Teoria do Design e Photoshop.","object_id":7252,"object":"category","type":"taxonomy","type_label":"Categoria","children":[]},{"ID":138759,"order":6,"parent":0,"title":"Data","url":"https:\u002F\u002Fimasters.com.br\u002Fdata","attr":"package","target":"","classes":"package","xfn":"","description":"Conteúdos sobre Banco de Dados Oracle, MySQL, SQL Server, MongoDB, DB2 e Postgre SQL, sobre BI e análise de dados.","object_id":16,"object":"category","type":"taxonomy","type_label":"Categoria","children":[]},{"ID":138758,"order":7,"parent":0,"title":"APIs e Microsserviços","url":"https:\u002F\u002Fimasters.com.br\u002Fapis-microsservicos","attr":"package","target":"","classes":"package","xfn":"","description":"Dicas e tutoriais sobre APIs públicas como Facebook, Twitter, PayPal, Buscapé, Google, etc e arquitetura de microsserviços, com códigos de exemplo, vídeos, cursos.","object_id":4257,"object":"category","type":"taxonomy","type_label":"Categoria","children":[]}],"secondary":[{"ID":138752,"order":1,"parent":0,"title":"Fórum iMasters","url":"https:\u002F\u002Fforum.imasters.com.br\u002F","attr":"","target":"_blank","classes":"","xfn":"","description":"","object_id":138752,"object":"custom","type":"custom","type_label":"Link personalizado","children":[]},{"ID":139067,"order":2,"parent":0,"title":"Portal E-Commerce Brasil","url":"http:\u002F\u002Fwww.ecommercebrasil.com.br","attr":"","target":"","classes":"","xfn":"","description":"","object_id":139067,"object":"custom","type":"custom","type_label":"Link personalizado","children":[]},{"ID":156289,"order":3,"parent":0,"title":"iMasters Business","url":"http:\u002F\u002Fbusiness.imasters.com.br","attr":"","target":"","classes":"","xfn":"","description":"","object_id":156289,"object":"custom","type":"custom","type_label":"Link personalizado","children":[]}]}},"webinar":{"success":false,"data":{}},"webinars":{"success":false,"isFetchingPagination":false,"maxPages":0,"page":1,"data":{"next":[],"prev":[]}},"tv":{"sectionNameLeft":{"small":"Vídeos","large":"iMasters TV"},"itemsLeft":[{"text":"Em Destaque","slug":"recents"},{"text":"Mais Vistos","slug":"most-viewed"}],"sectionNameRight":{"small":"","large":""},"itemsRight":[{"text":"Mais Recentes","slug":"recents"},{"text":"7Masters","slug":"7-masters"},{"text":"PHP Experience","slug":"php-experience"},{"text":"Android DevConference","slug":"android-devconference"},{"text":"Busca","slug":"search"}],"currentVideo":"recents","currentListVideo":"recents"}} window.__SERVER_VARS__ = {"applicationRestUrl":"https:\u002F\u002Fadmin.imasters.com.br\u002Fwp-json","applicationBaseUrl":"https:\u002F\u002Fadmin.imasters.com.br"}