// AGOSTO 2018
R$24,00
1 // POR DENTRO DO W3C
// ANO 07
// EDIÇÃO 27 > Gra p h QL : R E S T i n p e a c e ?
GraphQL: REST in peace? QUAL SERÁ O FUTURO DO MERCADO?
26
36
68
Google e IoT: do ADK ao Android Things
A pergunta que não quer calar: Docker serve apenas para apps Web?
Sou programador. Por que devo entender o negócio?
Mobilidade é tudo iMasters #27 Agosto 2018
Docker
Por falar em dev...
2 // POR DENTRO DO W3C
iMasters #27 Agosto 2018
// 3
EDITORIAL
P
PARA ESTA EDIÇÃO DA REVISTA IMASTERS, TROUXEMOS ALGUNS GRANDES NOMES DO MERCADO PARA FALAR SOBRE OS MAIS DIVERSOS ASSUNTOS... Júlio de Lima, Renato Groffe e Ericson da Fonseca são os convidados especiais deste número. Alex Lattaro, Ricardo Ogliari, W3C e Kemel Zaidan são nossos colunistas e mais uma vez marcam presença. A matéria de capa, por conta do grande Gabriel Rodrigues Couto, trata sobre GraphQL e como ele, aos poucos, vai tomar o mercado do REST (aliás, você concorda?!). Na coluna Comunidades, conheça a Campinas Front-end! Outra participação que você não pode perder é a nossa entrevistada, Alda Rocha, falando um pouco sobre mercado, Codamos, representatividade e planos. Conheça a nossa nova coluna, Da Redação! Em que nosso time de desenvolvedores vai, em cada edição, trazer um tema diferente, pertinente ao mercado e com uma opinião muito particular. A gente preparou esta edição com carinho e esperamos, de verdade, que ela te agregue. Que sua leitura seja tão prazerosa quanto foi pra equipe iMasters prepará-la!
Abraços e até a próxima! Mariana Anselmo Editora da Revista iMasters www.imasters.com.br | redacao@imasters.com.br
iMasters #27 Agosto 2018
4 // EXPEDIENTE
// AGOSTO 2018
// ANO 07
// EDIÇÃO 27 > G R A P H Q L : R E S T I N P E A C E ?
Tiago Baeta Publisher
CORPO EDITORIAL
Mariana Anselmo (MTB 0083858/SP) Jornalista Responsável Mariana Anselmo Editor
Mariana Anselmo Editor Nathália Torezani Revisão Reinaldo Silotto Conteúdo
Nathália Torezani Revisão Alex Lattaro, André Araújo, Diego Pinho, Ericson da Fonseca, Gabriel Rodrigues Couto, H. Fatima, Júlio de Lima, Kemel Zaidan, Lucy Narita, Rafael Grisotto, Renato Groffe, Ricardo Ogliari, Robson Araújo e Vandré Miguel Ramos Colaboradores Zupi Projeto Gráfico e Diagramação Eskenazi Indústria Gráfica Gráfica
Rodrigo PokemãoBr Conteúdo
Rua: Oscar Freire, 2379 Cep: 05409-012 Cerqueira Cesar +55 11 3063-5941 redacao@imasters.com.br @iMasters /PortaliMasters Os artigos assinados são de responsabilidade dos autores e não refletem necessa-
Grupo iMasters Organização
riamente a opinião da revista. É proibida a reprodução total ou parcial de textos, fotos e ilustrações por qualquer meio, sem
1.800 exemplares ISSN 1981-0288
www.zupidesign.com +55 11 3926 0174
iMasters #27 Agosto 2018
prévia autorização dos autores ou dos editores da publicação.
DROPS DO MERCADO
// 5
iMasters #27 Agosto 2018
6 //
SUMÁRIO COLUNAS 18
Reinaldo Ferraz POR DENTRO DO W3C Recursos de acessibilidade na Web para designers, desenvolvedores e produtores de conteúdo da WAI
E N T R E V I S TA com Alda Rocha
8 Codamos: a busca (e a luta) pela inclusão no mundo dev
20
André Araújo
26
AZURE
Serverless com Azure Functions
Ricardo Ogliari, MOBILIDADE É TUDO Google e IoT: do ADK ao Android Things
60
Alex Lattaro INTELIGÊNCIA NADA ARTIFICIAL Implementação e análise de RNA com Python
14
68
CLEAN ARCHITECTURE
Ericson da Fonseca e Robson Araújo
Introdução a Clean Architecture
Diego Pinho FALANDO EM DEV... Sou programador. Por que devo entender o negócio?
78
Kemel Zaidan CÓDIGO ABERTO Blockchain Applications
iMasters #27 Agosto 2018
36
Renato Groffe DOCKER
76
DA REDAÇÃO O mundo open source nunca esteve tão forte
Docker serve apenas para aplicações Web?
// 7
SEÇÕES
74
COMUNIDADES Por dentro do Campinas Front-End
40
Vandré Miguel Ramos
80
7MASTERS Encontro iMasters de especialistas
82
POR AÍ Brasileiro usa blockchain e desenvolve sistema de defesa cooperativo na Universidade de Zurique
SOFTWARE
ALM - Application Lifecycle Management A importância do lifecycle no desenvolvimento de software
56
Julio de Lima TÉCNICAS DE TESTES
54
H. Fatima CMS
Comparação de CMS: WordPress x Joomla x Drupal
Técnicas de teste para desenvolvedores
70
Rafael Grisotto e Lucy Narita DESENVOLVIMENTO
Instrumentação de serviços com Micrometer, Spring Boot e Kotlin
44
Gabriel Rodrigues Couto CAPA GraphQL: REST in peace?
iMasters #27 Agosto 2018
8 // ENTREVISTA
Codamos: a busca (e a luta) pela inclusão no mundo dev Mariana Anselmo, para revista iMasters
A
Alda Rocha é UX researcher e UX writer e está no mercado de TI e desenvolvimento há alguns anos... E com experiência de quem já viu e vivenciou muita coisa nesse meio, ela decidiu criar o Codamos. O projeto visa dar voz e promover a inclusão para as mais diversas minorias no mundo dev por meio da representatividade. Alba acredita no mundo colaborativo, na força do voluntariado e, principalmente, na importância de perguntar e ouvir como meio para crescer e aprender. Nessa entrevista, ela conta um pouco mais sobre o Codamos (como o projeto atua, em quais frentes, sua abrangência e alguns planos), além de lançar um olhar para o mercado (passado, presente e futuro) e os planos para a própria UX researcher. Revista iMasters: Você é uma das pioneiras no mercado de TI brasileiro. De quando você começou para o cenário atual, quão relevantes e efetivas foram as mudanças no mercado? Alda Rocha: Antes de tudo, obrigada pela pioneira. Eu nem sei se realmente sou isso, sabe?! Tudo bem que estou
iMasters #27 Agosto 2018
há muito tempo na área de TI direta ou indiretamente; pelo menos uns 18 anos. Mas junto comigo existem muitas mulheres que também estavam ali e são pioneiras também mesmo não subindo ao palco. Quando a gente fala sobre o que melhorou, eu acho que melhorou um pouco a visibilidade do problema. Antigamente ignorávamos que mulheres em TI era um assunto que deveria ser conversado e questionado. O problema existia; as dores e abusos também. Estava tudo lá, mas não era conversado, não era abordado em grandes canais, meios, eventos, não era tido como relevante para ser tema de palestras e para dialogar abertamente dentro da comunidade. Os homens não viam como importante falar sobre machismo, mansplanig, abuso de poder, invalidação de discurso, protagonismo, humilhação, equidade salarial e outros tópicos. Hoje, posso falar que ainda temos muitas limitações, mas conseguimos jogar uma luz neste assunto e conseguimos mostrar a importância da representatividade e do papel das mulheres nas áreas de tecnologia e exatas.
// 9
Revista iMasters: O que você acredita que nos impede de avançar mais? Alda Rocha: A falta de representatividade em outras esferas de minorias na tecnologia. Quando eu, mulher branca, subo em um palco e falo sobre mulheres em TI, eu consigo diretamente impactar uma fatia das minorias; mas existem vários cortes que não se sentem representados dentro das comunidades tecnológicas. Grupos periféricos, comunidade negra e LGBTQ+ sofrem com a falta de representantes que ajudem a levantar as bandeiras. Faltam movimentos sociais e seguros para as outras vertentes das minorias. Eu, como mulher branca que mesmo tendo sofrido por ser mulher em TI, ainda sou privilegiada por N motivos, por exemplo, pelo fato de que tenho condições de ter um computador para trabalhar. Como podemos fazer com que a diversidade realmente avance em todas as áreas e para todas(os)? Esse é nosso desafio. Revista iMasters: Como surgiu a ideia de criar o Codamos e como foi a receptividade do público ao projeto? Alda Rocha: O Codamos surgiu em um hackathon para resolvermos uma necessidade real da nossa comunidade: como saber que o evento é seguro, diverso ou que vai me aceitar? Resolvi me juntar com algumas pessoas e montamos uma vitrine de eventos onde o usuário vê os que vão acontecer tagueados com o tipo de inclusão e diversidade que ele dispõe, por exemplo, eventos gratuitos, com mulheres na grade e que incentivam as comunidades negras, LGBTQ e periféricas.
É tudo voluntário e não recebemos um real pelas coisas que trabalhamos dentro do projeto. Nosso único incentivo é ver a comunidade de eventos e meetups brasileira mais segura e acolhedora para todos. Está sendo um desafio! E o público parece gostar bastante do projeto. Estamos aprendendo a ser inclusivos para as pessoas e para TI. Ainda vamos errar, aprender, evoluir e amadurecer… É aprendizado! E por estar diretamente ligado a mim, muitas pessoas questionam se é algo realmente inclusivo, pois eu só represento uma pequena parte da diversidade. Não temos a velocidade que gostaríamos, pois como é voluntário, temos pouco tempo para nos dedicar, mas, em breve, abriremos uma rodada de voluntários de outros estados que talvez possa ajudar a melhorar o ritmo das implementações de novidades e eventos cadastrados. A gente quer divulgar a comunidade e dar destaque maior para iniciativas fora de São Paulo. iMasters #27 Agosto 2018
10 // ENTREVISTA
iMasters #27 Agosto 2018
// 11
Revista iMasters: Inclusão e diversidade são uma preocupação recente por parte das empresas. Muitas estão começando agora a se atentar para a importância de trabalhar esses dois fatores. Como o Codamos, que prega tanto um, quanto outro, ajuda o mercado a se atentar para isso? Alda Rocha: Ainda não temos um trabalho forte nesse ponto, vamos ter em breve. O que fazemos hoje e ser bem verdadeiros quando uma empresa nos busca para fazer parceria. Tentamos entender o que querem e explicamos que não adianta falar que é diverso ou que quer diversidade sem saber cuidar das pessoas de verdade. Temos muitas pessoas procurando vagas de emprego inclusivas, mas poucas empresas realmente têm condições de acolher a diversidade. Acho importante tentar, mas precisa ser um trabalho a longo prazo e que inclua não só a pessoa, mas cuide do time e outras pessoas que vão estar em volta para acontecer um aprendizado e amadurecimento em conjunto. Não adianta a empresa alegar ser diversa se ela contrata pessoas que são intolerantes e que defendem racismo, machismo e outros preconceitos. Estou estudando para ter uma formação em inclusão e diversidade aplicada a usabilidade e espero daqui há dois anos conseguir me formar e conseguir implementar com mais profissionalismo essa proposta de solução tanto no Codamos quanto nos parceiros e empresas abertas a evoluir.
Revista iMasters: Você, que está lidando diretamente com essa inclusão; qual a sua percepção desse cenário? Estamos avançando? Alda Rocha: Estamos sim, mas é bem lentamente. Ainda temos conflitos primários e coisas que nem achávamos que em 2018 a gente teria que explicar, mas infelizmente tem uma parte da comunidade e de empresas que ficam pra trás quando o assunto é inclusão. Essas pessoas (e empresas) não estão nem abertas a diálogo e se recusam ouvir outros pontos de vistas. Uma pena. E isso faz com que o avanço seja mais lento, mas temos na outra ponta mulheres se organizando, grupos de apoio nascendo, iniciativas para minorias que estão ganhando corpo e apoio, eu vejo que estamos nos movendo sim. Da pra caminhar mais, mas vai ser aos poucos para poder acontecer certo. Revista iMasters: O que você acha que empresas e profissionais, cada um na sua alçada, podem fazer para aumentar a diversidade e a inclusão no mercado de TI e desenvolvimento em uma forma geral? Alda Rocha: Perguntar e ouvir. Hoje infelizmente não fazemos perguntas e sem as perguntas não aprendemos. Como falar de gênero se não ouvimos iMasters #27 Agosto 2018
12 // ENTREVISTA
muito sobre isso? Como falar sobre o que as mulheres negras sofrem ou os gays se não falamos e nem ouvimos nada disso? O primeiro passo é ouvir e dar lugar de fala para essas pessoas para começarmos a entender os problemas e unir forças para ajudar. Comecem dentro da empresa de vocês com conversas abertas, ou se não sentirem confortáveis, fechadas; mas ouçam as pessoas e tracem planos para ajuda-las a terem seus espaços conquistados e respeitados pelos demais. Apoiem causas sociais, falem sobre política, ensinem o que é o direito de cada um dentro dos espaços e ajudem a ter mais diálogo entre as pessoas. Revista iMasters: Quais os planos para a Codamos? Como vocês se veem no futuro? Alda Rocha: O Codamos vai ter que crescer para poder se tornar finalmente opensource para que a comunidade possa de fato tomar posse do projeto. Não significa que vou me afastar dele, mas algumas coisas fazem mais sentido se cada projeto ou grupo pudesse tomar conta. Esse movimento de migração já está acontecendo, mas bem aos poucos. Como todos os mantenedores do projeto trabalham e o Codamos é um projeto paralelo, a gente faz as coisas com calma. Vamos renovar os colaboradores e voluntários e estamos escrevendo manuais e outras informações de onboarding para poder deixar as coisas mais autônomas. Queremos ainda ser uma vitrine, não só de eventos, mas de podcast, pessoas, comunidades, grupos, cursos, bootcamp, workshops e queremos ser um lugar para saber onde achar por onde começar ou continuar em TI. Finalmente, queremos implementar nossa tão sonhada busca orgânica. Nosso plano é ter uma equipe mais diiMasters #27 Agosto 2018
versa que possa realmente chegar onde precisamos falar de inclusão. Em breve, vamos abrir o slack para comunidade e automatizar algumas partes da plataforma. No futuro, queremos ser o primeiro lugar aonde uma pessoa que vá entrar para uma comunidade e queira participar de eventos seguros busque pra ir. Queremos dar mentoria e aulas sobre inclusão etc. Revista iMasters: E para a Alda Rocha, particularmente, quais os planos futuros? Alda Rocha: Evoluir mais ainda na minha carreira. Tenho trabalhado com pesquisa e estou bem dedicada a mudar a vida das pessoas com informações, métricas e dados colhidos e cruzados e com várias metodologias aplicadas para que a pessoa consiga ter uma boa experiência digital. Sei que vai chegar um momento que vou ter que decidir o que fazer: se largo trabalho para cuidar 100% do Codamos ou se continuo me dividindo entre trabalho, palestras, Codamos, filhas, cachorro, namorado... Mas até o momento, tenho dado conta e acho que consigo levar mais algum tempo assim. Estou cada dia mais apaixonada pelas possibilidades que ser UX researcher tem me apresentado e, olhando para o futuro, tenho como meta treinar uma inteligência artificial para que ela responda “emocionalmente” para uma pessoa bem próximo do comportamental humano. Quero estudar a fundo NPL (Natural Language Processing) e tenho gostado bastante de resolver problemas complexos observando o comportamento dos usuários. Quero dar aulas de UX, de pesquisa e palestrar mais! Ufa! rs
// 13
iMasters #27 Agosto 2018
14 // CLEAN ARCHITECTURE
INTRODUÇÃO A CLEAN ARCHITECTURE Por Ericson da Fonseca, Desenvolvedor de software e Robson Araújo, Desenvolvedor e arquiteto de soluções web e desktop
Criada em meados de 2012 por Robert Cecil Martin (“Uncle Bob”), a Clean Architecture tem como principais finalidades ser independente de frameworks, facilmente testável, independentemente da interface do usuário, ou seja, a interface do usuário pode mudar à vontade sem que isso reflita no resto do sistema, ser independente de banco de dados, já que ela mantém todas as regras de negócio na
∂ Fonte: https://bit.ly/2a1px8t
iMasters #27 Agosto 2018
própria aplicação e, por último, ser independente de qualquer agente externo, sendo que as regras de negócio não “enxergam” o “mundo exterior”. Resumindo, a Clean Architecture é um tipo de arquitetura de software amplamente independente. Neste artigo, mostraremos o conceito dessa arquitetura e também um exemplo de como implementá-la no mundo real.
// 15
Dependências Na imagem da página ao lado, temos o desenho de como a Clean Architecture funciona. Note que as setas horizontais da imagem que representam as dependências entre as camadas vêm de “fora para dentro”, ou seja, a camada Framework “enxerga” somente a Interface Adapters, que por sua vez “enxerga” somente a User Cases, que finalmente “enxerga” apenas a Entites. Esta é a principal regra da Clean Architecture, e talvez sua única: o Princípio da Dependência. As camadas internas não devem ter qualquer dependência das externas, nem indiretas, como nomes de variáveis, funções ou termos. Provavelmente você terá mais abstrações nas camadas internas e mais implementações nas externas, utilizando injeção de dependência para fazer tudo funcionar. Entities Camada que encapsula as entidades e regras de negócio. O principal entendimento aqui é que essa camada deve conter tudo que seja pertinente ao sistema como um todo de uma maneira mais genérica, ou seja, deve conter as regras que tenham menos possiblidades de mudança quando algo externo mudar, como algo na interface do usuário. Em um grande sistema, que reusa código da empresa, aqui poderiam residir as bibliotecas que são consumidas pela aplicação, mas que a aplicação não irá modificar, como algum framework ou outros domínios de negócio. Em uma aplicação menor, podem ser apenas interfaces e classes que tenham que ser utilizadas em todas as camadas, como a interface de um repositório.
Interface Adapters Camada que tem como finalidade converter dados da maneira mais acessível e conveniente possível para as camadas Entities e User Cases. Um exemplo seria o uso do AutoMapper, onde eu poderia controlar as estruturas transmitidas entre User Cases e Entities com o interface do usuário, por exemplo. Frameworks Essa camada é composta por ferramentas como banco de dados, interface do usuário etc. Nessa camada, a ideia ée ter o mínimo de código possível, apenas o necessário para interligar as camadas e injetar as implementações necessárias nas camadas interiores. Usando a Clean Architecture no mundo real Para facilitarmos o entendimento, criamos um exemplo bem simples de um sistema escolar, no qual vamos cadastrar novas turmas. A estrutura base do projeto foi divida nas camadas: Core, Entities, UseCases e Web, conforme nos mostra a imagem abaixo:
User cases Essa camada é a que contém as regras de negócios mais específicas do sistema. É aqui que todos os casos de uso do sistema são implementados. É esperado que apenas mudanças de requisitos afetem essa camada. No entanto, assim como na Entities, alterações nas camadas externas não devem afetar essa camada. iMasters #27 Agosto 2018
16 // CLEAN ARCHITECTURE
A camada Core foi incluída a fim de ter um nível de abstração ainda maior do que a Entities. Essa camada possui apenas um repositório padrão (IRepository), um interactor que vai receber uma entrada e nos devolver uma resposta (IInteraction) e uma entidade que possui as propriedades que serão utilizadas por todas as classes (IEntity). Outra coisa interessante nessa camada é que ela contém todos os pacotes que serão utilizados pelas outras camadas, já que, conforme dito anteriormente, as dependências são de “fora para dentro”. Na camada Entities, temos as Classes que de fato compõem o sistema - observe que ela conhece a camada Core, uma vez que ela é menos abstrata. Na camada UseCases, possuímos todas as nossas regras de negócio. Observe que temos apenas três arquivos para a entidade Turma, sendo um arquivo de Input que vai receber os dados (CadastrarTurmaInput), um Interactor (CadastrarTurmaInteractor) que contém todas as regras de negócio implementadas - por exemplo, ao cadastrar uma Turma será que existe um professor disponível? Ou será que já não existe uma turma para mesma data? - e por último um arquivo de output (CadastrarTurmaOutput) que vai transformar os dados para que possa ser exibido. (possam ser exibidos? Fiquei em dúvida se isso se refere a dados). Nossa última camada, a Web, vai apenas consumir os dados transformados pela camada anterior e exibi-los para o usuário. Ela também é responsável, nesta implementação simplificada, por injetar os repositórios para consumo nos interactors, e os interactors para consumo pelos controllers. Conforme vimos no exemplo do sistema escolar, cada camada possui uma única responsabilidade sempre respeitando suas dependências, mantendo assim uma divisão total de responsabilidades, miniiMasters #27 Agosto 2018
mizando ao máximo qualquer alteração externa com interface com o usuário, banco de dados etc. Caso queiram baixar o código utilizado no exemplo, ele pode ser encontrado através do link https://github.com/campinasdotnet/CleanArchitecture. Fontes: https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture. html
Ericson da Fonseca trabalha com desenvolvimento de software há 10 anos, sempre voltado para tecnologias Microsoft como SQL Server, SharePoint, ASP Clássico, ASP.NET, já tendo participado de diversos projetos nacionais e internacionais para grandes multinacionais. Tirou a certificação Microsoft C# (70483) e recentemente vem se aprofundando em soluções Cloud no Azure. Ericson também é palestrante ativo nas comunidades de tecnologias e coorganizador do Meetup Campinas.NET.
ericsondafonseca@gmail.com
Robson Araújo é desenvolvedor e arquiteto de soluções web e desktop, atuando com tecnologias Microsoft desde 2001, além de palestrante e instrutor. Possui 25 certificações Microsoft, como MCSD Web e Mobile, e é MCT desde 2011, lecionando na região de Campinas e São Paulo. Trabalhou na Microsoft Brasil como Premier Field Engineer, e juntamente com o time de Modern Apps, é coautor do livro ‘Desenvolvimento Efetivo na Plataforma Microsoft’.
robson.araujo@venturus.org.br
DROPS DO MERCADO
// 17
TUDO EM UM ÚNICO APLICATIVO Quem ouve não acredita, mas essa realidade já existe e pode estar no seubolso quando quiser. O Rapiddo é o super aplicativo do Grupo Movile que reúne diversos serviços em apenas um APP, com parceiros de qualidade, para facilitar a sua vida. Estão integrados na aplicação: iFood, Marmotex, 99, UOL Notícias, Superplayer, além de sistema de rearga para todas as principais operadoras de celular. Grande parte dos serviços utilizados no Rapiddo tem como benefício dinheiro de volta. O dinheiro que você recebe de cashback vai para sua carteira virtual e pode ser usado em todos os serviços disponíveis no APP. Dessa forma, é possível sempre economizar com o Rapiddo: seja dinheiro, uma vez que parte de sua compra retorna pra você em créditos; seja tempo, já que não é necessário se cadastrar ou colocar seus dados em vários APPs; seja espaço em seu smartphone, afinal, está tudo apenas em 1.
EMBRATEL LANÇA FLEX CLOUD
Nuvem segura e confiável com total controle e autonomia, pagamento sob demanda e flexibilidade. Baseada em tecnologia de Software Defined Network (SDN) e suite Openstack, com o objetivo de fornecer infraestrutura de computação, armazenamento e rede com robustez e escalabilidade, sendo capaz de ser utilizado em implementações de nuvem pública, privada ou híbrida. É possível integrar o Flex Cloud com ambientes tradicionais dentro ou fora do Data Center Embratel.
YAPAY CRIA MÓDULO DE PAGAMENTOS TRANSPARENTE PARA PLATAFORMAS OPENSOURCES
A Yapay, Plataforma de Pagamentos da Locaweb, disponibiliza ao mercado de E-commerce a versão transparente de seu checkout. A ferramenta proporciona aos usuários de plataformas OpenSources como WooCommerce e Magento a possibilidade de aumentarem suas conversões de venda em até 35%. Além de oferecer ao comprador uma forma rápida e segura na hora de realizar suas compras online. A Yapay disponibiliza também uma análise antifraude e a cobertura de chargeback garantida, que viabiliza tanto ao vendedor quanto ao comprador uma experiência segura na hora da compra. Outras vantagens oferecidas são o suporte e atendimento, por meio de uma equipe especializada, associado ao foco no aumento das conversões de seus lojistas, que contam com taxas de aprovação acima das praticadas no mercado de meios de pagamento. Quanto às formas de pagamento, a Yapay dispõe das principais bandeiras de cartões disponíveis no mercado, Transferência Eletrônica e Boleto Registrado, conforme as novas normas da Febraban.
BACKUPS AUTOMÁTICOS SALVOS NA NUVEM Você já se viu em meio a um erro, uma queda de servidor ou um prejuízo causado por um hacker? Se sim, sabe o quão vulnerável a ameaças externas um site pode estar. Para evitar esse tipo de situação, previna-se com backups salvos diretamente na nuvem com o CodeGuard, ferramenta que cria e armazena backups, conta com opções de restauração e monitora todas as alterações do site em tempo real. Com um painel de controle totalmente gerenciável, ele permite que sites e arquivos específicos sejam recuperados instantaneamente em apenas alguns cliques. Ele ainda oferece prioridade na execução do backup, teste de restauração e rastreamento de IP. Para maiores informações, acesse hostgator.com.br/backup-online.
iMasters #27 Agosto 2018
18 // POR DENTRO DO W3C
Recursos de acessibilidade na Web para designers, desenvolvedores e produtores de conteúdo da WAI Por Reinaldo Ferraz, Especialista em desenvolvimento web do W3C Brasil
A
A Iniciativa de Acessibilidade na Web do W3C (WAI) reformulou seu site e deixou muito mais fácil a forma de consultar materiais direcionados a designers, desenvolvedores e outras áreas relacionadas à Web. O antigo site da WAI era uma tristeza. Remetia aos sites da década de 2000, com colunas laterais e nenhuma responsividade. Levou um bom tempo para que o site pudesse ter uma repaginada, o que aconteceu em maio de 2018. Finalmente, o site ficou com uma interface muito mais moderna e tirou aquele estigma de “site acessível é feio”. Mas eu não vim aqui para falar do design do site da WAI. O que mais me surpreendeu nessa reestruturação de conteúdo foi a quantidade de material direcionado a designers, produtores de conteúdo, desenvolvedores, setores
iMasters #27 Agosto 2018
gerenciais de empresas e responsáveis por políticas públicas, educadores e principalmente usuários. Tudo isso foi possível marcando seu conteúdo com filtros para cada uma das áreas. Esse conteúdo não é novo, mas ficou muito mais fácil de localizar. Eu gostaria de listar algumas das coisas mais bacanas que encontrei nesse novo site. Para produtores de conteúdo - https:// www.w3.org/WAI/roles/writers/ Muitas vezes, quem escreve ou produz conteúdo para a Web nunca se preocupou com o fato de que o seu texto poderia ter barreiras de acessibilidade. Sim, ele pode ter. As diretrizes de acessibilidade para essa categoria apontam para a necessidade de legendas em vídeo, audiodescrição e alternativas para o conteúdo
// 19
não textual. Claro! Afinal, se eu publicar uma foto em um artigo ou em um canal de notícia, eu preciso me certificar de que o texto alternativo adequado estará disponível. E não existe pessoa melhor para tomar essa decisão do que o produtor do conteúdo (ou da foto). Para designers - https://www.w3.org/ WAI/roles/designers/ É comum ouvir que acessibilidade é uma questão técnica e que o designer não tem função nesse sentido. Grande engano. O designer precisa garantir que aquela arte que vai ser codificada não tenha barreiras (e que muitas vezes não são técnicas, e sim perceptíveis) para os usuários. Uma boa adequação dos rótulos e campos de formulários e uma paleta de cores que não confunda pessoas que não enxergam determinadas cores são ótimos exemplos. No caso das cores, o designer tem um papel mais importante ainda: garantir que a informação não seja transmitida ao usuário somente por cores. Desenvolvedores - https://wwww3.org/ WAI/roles/developers/ Para essa categoria, os filtros são um prato cheio de informação. Fica muito fácil compreender como solucionar um problema técnico de forma simples e como essas mudanças podem interferir na acessibilidade, como definir o idioma da página, garantir que o usuário consiga navegar por teclado, estrutura de cabeçalhos adequada, e por aí vai. Tomadores de decisão - https://www. w3.org/WAI/roles/managers/ Esse link é para mandar para o seu superior, que muitas vezes não entende a importância da acessibilidade. Lá estão disponíveis materiais sobre como planejar e manter a acessibilidade de um sistema de forma muito simples e clara. E também sem aquele monte de jargões técnicos
que talvez alguns deles não conheçam. Não vou entrar em detalhes nas demais áreas, mas creio que essas quatro são muito importantes para o público que consome o conteúdo do iMasters, sejam eles designers, produtores de conteúdo, desenvolvedores ou gerentes. Mas o que eu gostaria de destacar no final deste artigo é a quantidade de tutoriais e material educacional sobre acessibilidade. Existe uma página só para agrupar os vídeos educativos sobre acessibilidade na Web (Web Accessibility Perspectives - https://www. w3.org/WAI/perspective-videos/), tutoriais com exemplos e códigos que funcionam na prática (Tutorials - https:// www.w3.org/WAI/tutorials/) e uma área só para testes e verificação de acessibilidade (Test & Evaluate - https://www. w3.org/WAI/test-evaluate/). Eu poderia escrever muito mais sobre os recursos para quem está aprendendo ou quer esclarecer uma dúvida sobre acessibilidade, mas acho que uma boa navegada e tempo para estudar o material disponível no site é a melhor recomendação. Assim, você direciona suas pesquisas para sua área de atuação ou interesse. Bons estudos!
Reinaldo Ferraz é formado em desenho e computação gráfica e pós-graduado em design de hipermídia pela Universidade Anhembi Morumbi, em São Paulo. Trabalha com desenvolvimento web desde 1998. Coordena as iniciativas de acessibilidade na Web do NIC.br e projetos relacionados a Open Web Platform, Digital Publishing e Web das Coisas. É representante do NIC.br em grupos de trabalho do W3C internacional em Acessibilidade na Web, Digital Publishing e Web das Coisas. Apaixonado por acessibilidade, usabilidade, padrões web, HTML, CSS e café sem açúcar.
reinaldo@nic.br iMasters #27 Agosto 2018
20 // AZURE
SERVERLESS COM AZURE FUNCTIONS Por André Araújo, Líder técnico de Nuvem e Plataforma Azure da Lambda3
De tempos em tempos, surgem novas buzzwords no mundo da tecnologia, nas quais todos embarcam e seguem uma nova tendência. É o caso de Serverless, uma das palavras-chave mais populares atualmente. O conceito ficou mais conhecido com a introdução do AWS Lambda, em 2014. No geral, refere-se a um modelo de computação em nuvem, no qual o provedor gerencia de forma dinâmica a alocação de recursos para executar uma determinada tarefa. Relativamente novo, vem sendo representado por funções de código disponibilizadas como serviço, que podem ser executadas sob demanda e de maneira automatizada. Embora o termo esteja mais associado ao conceito de Function as a Service (FaaS), a Microsoft também trouxe Serverless para o mundo dos containers com o Azure Container Instance, que permite implantar um container sem ter que se preocupar com o nó onde ele será executado. Outro destaque é o Azure Logic Apps, ferramenta de integração com uma abordagem Codeless, que permite a orquestração de fluxos e processos de forma simples e visual. A solução atualmente possui mais de 150 conectores (SQL Server, Salesforce, Oracle, SAP e muitos outros). No momento, a principal implementação Serverless no Azure é o Azure Functions. Com ele, o desenvolvedor pode escrever funções na linguagem de sua preferência, e a plataforma se encarrega de fornecer um ambiente para execução. O portal inclui um editor de código para as funções e um console para acompanhar os resultados. O desenvolvedor não lida iMasters #27 Agosto 2018
com detalhes de infraestrutura, e o custo é com base no consumo de recursos (por segundo) e na quantidade de execuções. O serviço inclui uma franquia gratuita de 1 milhão de chamadas e 400.000 GB/s de consumo por mês. Além de ter a redução do custo operacional, da complexidade e até mesmo do lead-time como benefícios, não se preocupar com questões de plataforma permite manter o foco no domínio e na lógica das funções. Destaques ao se utilizar Azure Functions: Runtime de desenvolvimento: é possível experimentar o serviço antes de usá-lo na nuvem. O Azure Functions Runtime permite aproveitar a simplicidade e a flexibilidade da plataforma localmente, sem necessidade de hospedar as funções no Azure durante etapas de desenvolvimento e teste. Com base de código open source, o ambiente pode ser implantado na própria máquina, fornecendo uma experiência de desenvolvimento quase idêntica à do serviço em nuvem disponível no portal. Tolerância a falhas e escalabilidade: as funções registram logs e podem emitir alertas em casos de exceção. O fluxo não é interrompido, e outra função nunca é afetada. O ambiente oferece escalabilidade, com modelos de execução síncrono e assíncrono. As funções também podem ser executadas em paralelo. Ainda que seja difícil prever o consumo de funções expostas na Internet, a plataforma escala automaticamente, atendendo picos de alta e diminuindo sua
// 21
∂ Edição de Azure Functions no portal do Azure. Editor completo para desenvolver e executar funções
capacidade de processamento quando a demanda cair. Isso ajuda na redução de custos e na otimização do consumo. Várias linguagens: qualquer plataforma Serverless deve oferecer algumas opções de linguagem. Com o Azure Functions, não é diferente: linguagens populares como C#, JavaScript, Java e F# são suportadas. Outras linguagens estão sendo incorporadas aos poucos e se encontram em fase experimental, como é o caso de Python, PHP, Bash e PowerShell. Segurança: a plataforma faz uso de toda infraestrutura que o Azure tem para oferecer. Consumidores estão seguros no que diz respeito a autenticação,
autorização e identidade dos usuários. Além disso, protocolos baseados em OAuth e o uso de CrossOrigin Resource Sharing (CORS) são suportados. O CORS permite que código JavaScript em um navegador interaja sem problemas com Azure Functions acessíveis pela Internet. Opções de gatilho: através de gatilhos, é possível executar funções automaticamente em resposta a algo que ocorreu. Além da opção agendada ou manual, Azure Functions podem ser disparadas por conta de eventos específicos, como um item adicionado em uma fila ou um arquivo alterado em uma conta de armazenamento no Azure. Existem opções de integração com vários produtos do Azure, além do iMasters #27 Agosto 2018
22 // AZURE
∂ Azure Functions Runtime permite experimentar Azure Functions localmente. A experiência de uso é muito próxima da disponível no portal do Azure
suporte a webhooks (o que viabiliza cenários com serviços externos e ferramentas de terceiros). Padrões reconhecidos: tanto JSON quanto REST (através de HTTP e HTTPS) são suportados para a troca de informações. Já que não fazem uso de tecnologia proprietária, Azure Functions podem ser consumidas de forma transparente. Alta disponibilidade: como não pode ocorrer queda de serviço por inatividade em hipótese alguma, a infraestrutura do Azure é responsável por garantir que todo o poder computacional das funções esteja disponível em 99,95% do tempo. Esses são apenas alguns dos pontos relevantes. As funções também oferecem endpoints e ferramentas que suportam processos de automação, podendo fazer parte das principais práticas de DevOps. Ainda que o Azure ofereça um ambiente completo e disponibilize uma série de facilidades no uso de funções, existem outras opções no mercado. AWS Lambda, iMasters #27 Agosto 2018
IronFuntions, Apache OpenWhisk e Google Cloud Functions estão entre elas. Para as empresas, está se tornando cada vez mais difícil escolher a melhor alternativa. Como as funções podem fazer uma diferença significativa em aplicações modernas, não só os itens destacados acima, mas também todo o ecossistema do provedor de nuvem deve ser levado em consideração no momento de decidir qual a melhor ferramenta. Azure Functions podem acelerar a produtividade em suas soluções, já que a sua flexibilidade pode resolver uma grande variedade de problemas. Atualmente, muito se fala sobre microsserviços. Onde entram as funções? Quebrando aplicações complexas em unidades funcionais e reutilizáveis de código, que podem ser isoladas e evoluírem de maneira independente, com suas próprias restrições. É possível tratar essas unidades como serviços, conectá-las através de um orquestrador e fechar um cenário funcional completo. Ao decompor a aplicação em diferentes funções, pode-se agrupá-las em contextos
// 23
A MICROSOFT TAMBÉM TROUXE SERVERLESS PARA O MUNDO DOS CONTAINERS COM O AZURE CONTAINER INSTANCE, QUE PERMITE IMPLANTAR UM CONTAINER SEM TER QUE SE PREOCUPAR COM delimitados, afim de atender a casos de uso e requisitos de um determinado domínio. Adotar funções para integrar aplicações é conveniente em alguns casos. Ainda que existam outras ferramentas na plataforma da Microsoft (Azure Logic Apps), fazer uso de Azure Functions é uma alternativa válida: as funções podem fazer um meio de campo, aceitando requisições em formatos convencionais e traduzindo para protocolos que as aplicações legadas possam entendam. Funções também podem ser usadas no agendamento de tarefas recorrentes, como backups, restaurações, exportação e importação de dados, envio de e-mails, notificações etc. O processamento de informações em alta escala, ou mesmo em lotes, também é viável, já que converter e transformar dados de diferentes tipos (como arquivos XML, JSON e CSV) dentro de uma função pode ser algo simples e trivial. Por conta de sua alta capacidade computacional, Azure Functions são uma ótima escolha em cenários que envolvem manipulação de imagens ou reconhecimento ótico de caracteres (OCR). Inclusive, existem diversos casos de sucesso publicados pela Microsoft sobre o assunto. Com um modelo bem extensível, há muitas possibilidades tanto para o consumo como para a implementação de funções no Azure. Como as empresas estão cada vez mais centradas no valor de negócio oferecido e menos em manter
O NÓ ONDE ELE SERÁ EXECUTADO infraestrutura para tal, o futuro pode ser, sim, baseado em Serverless. Ferramentas como Azure Functions ajudam na construção de soluções práticas e robustas, nas quais a preocupação em gerenciar o ambiente não existe – o foco está no código. A plataforma da Microsoft é extremamente madura para hospedar funções, permitindo integrá-las perfeitamente a qualquer arquitetura. Como Serverless é tendência e o Azure oferece uma experiência de primeira classe, considero Azure Functions algo essencial para qualquer um que esteja utilizando a nuvem pública da Microsoft.
André Araújo é bacharel em Tecnologia da Informação pela PUC de São Paulo, especializado em tecnologias DevOps e ALM na Plataforma Microsoft, atuando na empresa Lambda3 como líder técnico da disciplina de Nuvem e Plataforma Azure. André é também Microsoft Partner Technology Solutions Professional, focado em Infraestrutura e Application Services. iMasters #27 Agosto 2018
24 //
DROPS DO MERCADO
PARA TODOS QUE SÃO WORDPRESS PRO E BLOGUEIROS
O WordPress Hosting com ResellerClub é construído em infraestrutura de nuvem state-of-the-art e é otimizado para profissionais da web. Nós incluímos 4 novos planos em nosso WordPress Hosting a um preço inacreditável! O WordPress é o Sistema de Gerenciamento de Conteúdo (CMS) mais usado. Estamos felizes em anunciar uma promoção exclusiva no WordPress Hosting, receba a sua hoje!
KINGHOST LANÇA HOSPEDAGEM PARA LOJA VIRTUAL
Com planos a partir de R$ 26 mensais, a KingHost lançou a Hospedagem para Loja Virtual. Além da plataforma e-commerce, a solução inova ao oferecer consultoria exclusiva e especializada. O benefício é um diferencial para ajudar quem está começando a investir no comércio eletrônico. Com foco na praticidade e segurança dos clientes, a novidade já vem com uma série de plugins instalados como o PayPal e Mercado Pago, para realização de transações financeiras. Já para quem quer integrar os canais de venda com redes sociais, o Shop To Facebook já vem instalado. Outros complementos como Google Analytics e o plugin dos Correios também já vêm prontos para uso. Para a Gerente de Marketing e Produtos da KingHost, Lívia Lampert, o diferencial deste lançamento está na gama de possibilidades que os clientes têm com esta nova solução. “Os planos não possuem limitação por quantidade de produtos e não há taxas para transações. São infinitas possibilidades para personalizar, criar e vender”, explica.
iMasters #27 Agosto 2018
FIAP: O NOVO É AQUI.
As mudanças nunca mais vão acontecer de forma tão lenta como hoje. Por isso, quem quer pensar o novo vem para a FIAP. As inscrições para o VESTIBULAR 2019 começam no 2º semestre de 2018. Os cursos de Graduação? Sistemas de Informação, Software Engineering & Artificial Intelligence, Defesa Cibernética, Marketing - Digital & Data Science, Banco de Dados - BI e Big Data, Redes de Computadores - IOT, Cloud e Infra, Engenharia da Produção, Engenharia de Computação, Engenharia Mecatrônica, entre outros (presenciais e on-line). Já o SHIFT, cursos de curta duração nas áreas de tecnologia, inovação e negócios, também tem novidades: PNL, PMO, Git & Github, Microservices, Design Sprints, Dashboards for BI, Chatbots, ICOs, Tecnologias Exponenciais e muito mais. FUTURE-SE.
// 25
Desde 2010, habilitamos a transformação de negócios e aceleramos resultados de ponta a ponta.
Produtos Digitais DevOps: Governança de TI e Processos Data Science Cloud Computing
Com um modelo de atuação customizado de acordo com o seu cenário de negócio, a Lambda3 está pronta para atuar com excelência técnica de ponta a ponta. Entender o seu desafio, entregar a melhor solução e acelerar os seus resultados é nossa maior expertise.
www.lambda3.com.br iMasters #27 Agosto 2018
26 // MOBILIDADE É TUDO
Google e IoT: do ADK ao Android Things Por Ricardo Ogliari, Engenheiro Android no BTCjam
E
Em 2011, no Google I/O, foi lançado o ADK (Accessory Developer Kit), um hardware baseado no Arduino que possui como chamariz um protocolo (Android Open Accessory Protocol) específico para troca de dados entre a plataforma de prototipagem e o smartphone com Android. A sua primeira versão é mostrada na figura abaixo. Essa versão foi criada com o molde do Arduino Mega. Na parte superior, encontra-se um shield com alguns sensores e atuadores em anexo. Alguns deles são: transistores e relês, sensor de temperatura, sensor de luz, leds coloridos e um sensor no estilo joystick. Na primeira versão do protocolo, o Android suportado era o 3.1 e superiores.
iMasters #27 Agosto 2018
// 27
No ano seguinte, o Google I/O apresentou a nova versão do ADK, mostrada na figura abaixo. Além das mudanças claras no hardware, que não seguia mais o padrão Arduino, houve alterações no protocolo AOA.
Seguindo seu hardware base, o ADK também é open hardware. Sendo assim, surgiram diversas versões do Arduino/ADK não oficiais do Google, mas que atendiam aos requisitos do protocolo AOA. Logo abaixo, temos dois exemplos de destaque. À esquerda, temos o ADK da Seeed Studio, uma importante fabricante de hardware, como arduinos, sensores e atuadores. À direita, temos o Iteaduino, uma versão com uma brincadeira bem clara em relação à rivalidade Android x iOS: A codificação para uso do ADK envolve duas partes. No sketch, que é codificado para o Arduino, é necessário identificar alguns dados do acessório construído; dessa
ADK Seeed Studio
ADK Iteaduino iMasters #27 Agosto 2018
28 // MOBILIDADE É TUDO
forma, ele se tornará único e poderá ser reconhecido de forma singular pelo smartphone Android. Abaixo, um exemplo desse trecho de código: #include <AndroidAccessory.h> AndroidAccessory acc(“Fabricande”, “Modelo”, “Descrição”, “Versão”, “URI”, “Serial”); void loop(){} void setup(){}
No lado do Android, é necessário definir essas mesmas informações em um arquivo XML (Extensible Markup Language). Além disso, no manifesto é criado um Intent Filter para interceptar o evento de conectividade de um ADK na porta serial do smartphone. Nesse mesmo filtro, também é definido o XML que detalha de forma única qual acessório exato é esperado. Veja um trecho de código que exemplifica isso. Essa codificação era apenas para as partes se conhecerem. Posteriormente, era feita a troca de dados entre ambos, através do protocolo AOA. <activity ... > <intent-filter ...> <meta-data android:name=”android.hardware.usb.action.USB_ACCESSORY_ ATTACHED” android:resource=”@xml/accessory_filter” /> </activity> //res->xml->accessory_filter <resources> <usb-accessory manufacturer=”Fabricante” model=”Modelo” version=”Versao” /> </resources>
Porém, o ADK não teve continuidade por parte do próprio Google. Versões do hardware continuaram a ser criadas por outras empresas, mas não tivemos um ADK 2013 ou 2014, por exemplo. Outra prova desse abandono é a falta de documentação sobre essa plataforma de hardware no developer.android.com, principal fonte de documentação para desenvolvedores Android. Isso tudo tem uma resposta fácil. O Google voltou-se para o Android Things. iMasters #27 Agosto 2018
// 29
O Android Things trouxe o sistema operacional Android para plataformas de desenvolvimento System-on-Modules (SoMs). A lista de produtos homologados e que suportam o Android Things é dinâmica. Quando ouvi falar sobre essa tecnologia, corri para o site de desenvolvedores do Google e vi que o Intel Edison era uma das plataformas suportadas. Felizmente, tinha um em casa e o testei com sucesso. Quando soube que o Raspberry Pi também estava na lista, comprei o novo Raspberry Pi Zero. Porém, depois do anúncio do novo Android Things 1.0, a lista de plataformas suportadas retirou o Edison, e percebi que somente o Raspberry Pi 3 Model B é suportado. Uma das novidades na nova versão é um console semelhante ao que temos no Firebase, por exemplo. Dentre outras facilidades, como controle em tempo real dos dispositivos com seus projetos IoT, o console nos fornece download de uma ferramenta chamada de Android Things Setup Utility. Esse zip, ao ser descompactado, oferece um utilitário para Mac, Windows e Linux, capaz de configurar a imagem corretamente em um mini SDCard. Este, por sua vez, irá no slot do Raspberry Pi e será justamente seu sistema operacional. Veja na imagem abaixo o screenshot desse utilitário no console do Android Things.
iMasters #27 Agosto 2018
30 // MOBILIDADE É TUDO
Esse utilitário o guiará no processo de gravação do SDCard. Depois de finalizado, é possível conectar o Raspberry Pi à sua rede Wi-Fi, caso o leitor possua o dongle Wifi para isso. Ou, ainda, é possível conectar diretamente um cabo RJ-45 na entrada correspondente, existente no Raspberry. No meu caso, parti para essa opção. Depois de conectado, precisamos saber o IP do Raspberry, para que possamos enviar o programa para ele e também visualizar seu sistema operacional em execução. Como não tenho aparelho de televisão há mais de 10 anos, não podia escolher a opção de simplesmente usar um cabo HDMI, como é de praxe. Sendo assim, entrei nas configurações do meu roteador e consegui encontrar qual o IP que o DHCP entregou para o Raspberry Pi. De posse do IP, basta digitar o comando: adb connect <ip>
Ricardos-MacBook-Pro:platform-tools ricardoogliari$ ./adb connect 192.168.0.105 already connected to 192.168.0.105:5555 Ricardos-MacBook-Pro:platform-tools ricardoogliari$
Ao conectar, algumas ferramentas de espelhamento de tela, como o Vysor, já o reconhecem. Sendo assim, podemos visualizar o Android Things rodando, em tempo real, na interface gráfica do hardware alvo. No meu caso, passo a ver o sistema operacional que está rodando no Raspberry Pi. Veja na imagem ao lado um screenshot: iMasters #27 Agosto 2018
// 31
Depois dessa conexão, também é possível usar a IDE Android Studio para programar o Raspberry Pi (ou qualquer uma das outras plataformas suportadas). Basta seguir o fluxo normal de criação de uma nova aplicação Android, mas é preciso atentar para escolha da plataforma Android Things na segunda tela do wizard, como mostra a figura abaixo:
iMasters #27 Agosto 2018
32 // MOBILIDADE É TUDO
Aqui vem o mais surpreendente: o desenvolvedor que já programa para Android vai reutilizar praticamente todo o seu conhecimento para programar para o Android Things. Existem apenas duas peculiaridades que vejo como relevantes em um primeiro momento. A primeira delas é no manifesto da aplicação (veja no trecho de código abaixo). Temos uma nova permissão de usuário para acessar os periféricos do Raspberry Pi através de suas portas GPIO. Temos uma nova biblioteca de usuário, definida na tag uses-library, além de um filtro novo para a activity, o IOT_LAUNCHER. <uses-permission android:name=”com.google.android.things.permission.USE_ PERIPHERAL_IO”/> <application> <uses-library android:name=”com.google.android.things” /> <activity android:name=”.MainActivity”> <intent-filter> <action android:name=”android.intent.action.MAIN” /> <category android:name=”android.intent.category.LAUNCHER” /> </intent-filter> <intent-filter> <action android:name=”android.intent.action.MAIN” /> <category android:name=”android.intent.category.IOT_ LAUNCHER” /> <category android:name=”android.intent.category.DEFAULT” /> </intent-filter> </activity> </application>
O segundo ponto é justamente a API para trabalhar com os periféricos e, mais importante, saber como trabalhar com eles. Por exemplo, no Raspberry Pi 3 Model B, temos uma representação gráfica dos nomes que cada GPIO recebe. Veja na figura da página ao lado: iMasters #27 Agosto 2018
// 33
Sendo assim, se desejarmos acender um LED, vamos utilizar um GPIO de terra e a outra entrada pode se um PWM. Logo, podemos ver a entrada da energia do LED no GPIO numerado com 33 e nomeado com BCM13. E, no código da aplicação Android, usaremos a classe PeripheralManager para controlar justamente essas portas. Veja como ficaria esse trecho de código no Android: PeripheralManager service = PeripheralManager.getInstance(); try { mLedGpio = service.openGpio(“BCM13”); mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW); mLedGpio.setValue(true); } catch (IOException e) { Log.e(TAG, “Error on PeripheralIO API”, e); }
Pronto. Com isso, o desenvolvedor Android passa a programar para Rasberry Pi, Pico i.MX7D I/O e outras plataformas System On Chip. A reutilização de conhecimento já adquirido é fantástica. O console que temos para o Android Things eleva o nível de controle de nossos produtos para um patamar bem alto. Sendo assim, agora é imaginar seus produtos para Internet of Things e pôr a mão na massa!
Ricardo Ogliari é coautor do livro “Android: do básico ao avançado” e de mais de 300 publicações. Especialista em Web, estratégia de inovação e tecnologia, tem MBA em Desenvolvimento de Aplicações e Jogos Móveis. É fundador do Things Hacker Team e foi eleito um dos 10 nomes de open hardware em 2013.
rogliariping@gmail.com iMasters #27 Agosto 2018
34 //
DROPS DO MERCADO PROGRESSIVE WEB APPS AO ALCANCE DE TODOS
Que desenvolvedor nunca sonhou em fazer um site com carregamento instantâneo? Melhor ainda, um site que funciona como um aplicativo e aparece na home screen do Smartphone? O Google vem trabalhando nesta tecnologia há alguns anos com a promessa de oferecer uma experiência cada vez melhor na web. Ainda são poucos os sites que têm esta tecnologia, afinal, leva-se tempo desenvolvendo um site destes. Contudo, o UOL HOST acaba de lançar esta funcionalidade de forma nativa em seu produto de criação de sites. Agora, qualquer cliente, leigo ou desenvolvedor pode criar um site, seja no modelo “arrasta e solta” ou usando linguagens de programação WEB e com um clique de botão transformar este site em um Progressive Web APP. Conheça já nossa ferramenta e veja como plataformas como WordPress estão ficando para trás com soluções SaaS de alto nível como o Criador de Sites do UOL HOST.
iMasters #27 Agosto 2018
IOT E MACHINE LEARNING APERFEIÇOAM PROCESSOS NO MERCADO DE CARTÕES
A utilização de inteligência artificial e machine learning é uma realidade cada vez mais presente no mercado de cartões, conhecido por ser um dos expoentes quando o assunto é inovação. Com a adoção de sistemas autônomos e inteligentes, as empresas conseguem aprimorar importantes atividades. Por meio dessas tecnologias, é possível aperfeiçoar processos de segurança, como a identificação de padrões de risco e de comportamentos fraudulentos. Cada transação pode ser analisada em milissegundos utilizando centenas de testes para detecção de possíveis fraudes, consequentemente, aumentando a taxa de conversão no processo transacional. O uso também melhora a análise de concessão de crédito, uma vez que permite a checagem de dados de milhões de contas para identificar automaticamente padrões que se correlacionam fortemente com risco de inadimplência, com eficácia superior aos processos tradicionais. (Com informações de Cielo)
DROPS DO MERCADO
// 35
TODOS OS RECURSOS DE UMA BIG TECH COMPANY DISPONÍVEIS PARA VOCÊ DESENVOLVER SEUS PROJETOS ONLINE LOC AWEB PRO
LOCAWEB CORP
T R AY
YA P AY
ALL IN
Desenvolvida especialmente para atender desenvolvedores e programadores. Aqui, a gente fala o seu código.
Soluções exclusivas, com tecnologia de alta performance e personalizadas de acordo com o tamanho da sua empresa.
Crie sua loja virtual com integração nativa com marketplaces e Mercado Livre.
Receba seus pagamentos de forma prática e segura. Antecipe seus recebimentos sem burocracia e com taxas flexíveis.
Comunique-se e converta clientes por meio de uma plataforma completa de marketing digital.
locaweb.com.br
iMasters #27 Agosto 2018 Paixão por desenvolver
36 // DOCKER
DOCKER SERVE APENAS PARA APLICAÇÕES WEB? Por Renato Groffe, Consultor em desenvolvimento de sistemas O advento do Docker como principal tecnologia para uso de containers vem revolucionando as áreas de desenvolvimento de software e DevOps nestes últimos anos. Inicialmente focando em Linux e, mais recentemente estendendo o suporte para ambientes Windows, o Docker está presente hoje em projetos construídos nas mais diferentes plataformas. ASP. NET Core, Node, Java, Python, Ruby e PHP constituem bons exemplos de tecnologias nas quais a utilização do Docker cresce a cada dia. E quais os motivos de tanta agitação em torno do Docker? Bom, além do fato de ser uma plataforma open source em contínua evolução e que conta com uma comunidade bastante engajada, o Docker traz ainda grandes vantagens em termos de deployment de aplicações. Um container Docker oferece um ambiente isolado, no qual estarão uma aplicação e todas as suas dependências. No caso de um típico projeto Web, isso pode envolver binários, bibliotecas das quais ele depende e arquivos estáticos (HTML, CSS, entre outros). O isolamento de aplicações em um mesmo host impede que a atualização de uma delas afete as demais, o que se traduz em deployments mais seguros. Outro ponto que pesa a favor da adoção do Docker está na menor dependência em relação às configurações dos ambientes nos quais acontecerá o deployment de uma aplicação. Se um projeto é capaz iMasters #27 Agosto 2018
de executar normalmente em um container gerado a partir de uma imagem criada numa máquina de desenvolvimento, o mesmo valerá para publicações em outros ambientes que suportem Docker. A questão do isolamento possibilita ainda um melhor aproveitamento de recursos, evitando assim a criação de múltiplas máquinas virtuais que na maioria das vezes seriam subutilizadas. Embora empreguem técnicas de virtualização, containers Docker localizados em um mesmo host compartilham recursos deste último e contribuem para uma utilização mais racional de recursos computacionais. Grandes players do mercado enxergaram todo o potencial oferecido pelo Docker e têm realizado vultosos investimentos na disponibilização de serviços baseados nessa tecnologia. Microsoft, IBM, Amazon, Google e Red Hat se destacam dentro dessa iniciativa, oferecendo alternativas na nuvem para os mais variados tipos de demanda envolvendo aplicações Web. Todo um ecossistema foi também desenvolvido em torno do Docker, com soluções estendendo as capacidades de recursos baseados nessa tecnologia. Exemplos disso são Kubernetes e Docker Swarm, alternativas open source voltadas para a orquestração e o gerenciamento de containers Docker. Orquestradores de containers são opções extremamente interessantes em projetos Web com alta demanda de utilização:
// 37
ALÉM DO FATO DE SER UMA Dispondo de mecanismos que permitem escalar rapidamente uma aplicação, tecnologias como Kubernetes e Docker Swarm conseguem criar dezenas, centenas ou até mesmo milhares de containers em poucos segundos. As rotinas de gerenciamento de produtos como esses são capazes de detectar instâncias/containers com problemas e rapidamente gerar novas estruturas desse tipo, em substituição aos elementos com defeito. Tudo isso contribui para garantir uma alta disponibilidade do projeto em questão. Soluções de integração contínua, como Jenkins e Visual Studio Team Services (VSTS), também suportam Docker. Tal compatibilidade acaba por viabilizar o build e o deployment automatizado de aplicações que dependam de containers. Características como isolamento, escalabilidade facilitada, alta disponibilidade e deployment automatizado correspondem a aspectos perseguidos dentro de uma arquitetura de microsserviços. Essas razões acabam por favorecer a adoção do Docker em projetos que se guiam por esse novo paradigma de desenvolvimento. Mas além de projetos Web, como sites e APIs REST, podemos utilizar Docker com outros tipos de soluções? A resposta para essa pergunta felizmente é SIM. Além da containerização de soluções Web, o Docker pode ser empregado em cenários como a montagem de instâncias de servidores de bancos de dados, instalação de serviços de mensageria e, até mesmo, como meio para o deployment de rotinas de processamento contínuo/periódico (neste último caso, em um formato similar ao de implementações como Windows Services). E quais seriam então as vantagens de se utilizar o Docker fora do desenvolvimento Web, levando em consideração esses outros cenários mencionados? A instalação de instâncias de servidores de bancos de dados como SQL Server e Oracle costuma ser um processo moroso, variando de minutos a até algumas horas. Ao se baixar uma imagem desses SGBDs, é possível subir uma nova instância via geração de um container em questão de segundos. Outro tipo de processo em que muitas vezes há demora e eventuais problemas é a desinstalação de um
PLATAFORMA OPEN SOURCE EM CONTÍNUA EVOLUÇÃO E QUE CONTA COM UMA COMUNIDADE BASTANTE ENGAJADA, O DOCKER TRAZ AINDA GRANDES VANTAGENS EM TERMOS DE DEPLOYMENT DE APLICAÇÕES
software. Com o Docker, temos a possibilidade de interromper a execução e proceder com a remoção de um container em poucos segundos. Eventuais resquícios deixados após uma desinstalação deixam de constituir um problema, já que um container Docker encapsula tudo do que uma aplicação depende para funcionar (e ao ser eliminado não produzirá vestígio algum). Diferentes versões de um mesmo software podem conviver sem dificuldades em uma mesma máquina, bastando para isso que se definam diferentes portas para a execução de cada release. Tomando como exemplo o SQL Server, isso abre a possibilidade de execução de instâncias das versões 2016 e 2017 a partir de um mesmo host. Todos esses benefícios contribuem para que o Docker represente uma excelente alternativa para a montagem de ambientes de desenvolvimento e testes, dada a velocidade de criação/remoção de containers baseados nessa tecnologia. Podemos exemplificar tudo o que foi discutido até aqui com a criação de um container baseado no RabbitMQ, message broker open source e multiplataforma que conta com grande adesão entre desenvolveres das mais variadas plataformas. O comando a seguir criará um novo container do RabbitMQ, baixando ainda a imagem necessária caso ela não exista no host (o que é indicado na imagem que aparece na sequência): iMasters #27 Agosto 2018
38 // DOCKER
docker run -d --hostname rabbit-local --name testes-rabbitmq -p 6672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_ USER=testes -e RABBITMQ_DEFAULT_ PASS=Testes2018! rabbitmq:3-management
Nessa instrução constam: O atributo -d, que fará com que o container em questão seja executado como um serviço em background. O atributo --hostname, com o nome de identificação do message broker.
No atributo –name, está o nome do container a ser gerado (testes-rabbitmq). O atributo -p permite configurar a porta (6672) em que acontecerá a comunicação com o RabbitMQ, a qual será mapeada para a porta default (5672) desse message broker dentro do container. O atributo -e duas vezes, utilizado em conjunto com os parâmetros RABBITMQ_DEFAULT_USER e RABBITMQ_DEFAULT_PASS na definição das credenciais de acesso ao message broker. Um segundo atributo -p indica a porta (15672) para acesso ao plugin de monitoramento do RabbitMQ. A imagem utilizada como base para a geração do container (rabbitmq:3-management).
O comando docker images rabbitmq:3-management mostrará que a imagem foi baixada corretamente:
iMasters #27 Agosto 2018
// 39
Já a instrução docker ps confirmará que o container criado se encontra em execução:
O plugin de gerenciamento do RabbitMQ pode ser acessado a partir do endereço http://localhost:15672:
Além do SQL Server, do Oracle e do RabbitMQ, é importante mencionar ainda a viabilidade de se instalar por meio de containers serviços populares como o PostgreSQL, o MySQL, o Redis e o MongoDB. Inúmeras são as possibilidades de uso do Docker, desde projetos de grande porte à montagem rápida e sem dificuldade de ambientes de desenvolvimento/testes.
Renato Groffe atua como consultor em atividades voltadas para o 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.
renato.groffe@yahoo.com.br iMasters #27 Agosto 2018
40 // SOFTWARE
ALM - APPLICATION LIFECYCLE MANAGEMENT: A IMPORTÂNCIA DO LIFECYCLE NO DESENVOLVIMENTO DE SOFTWARE Por Vandré Miguel Ramos, Gerente de desenvolvimento de software na Hostgator Nos últimos anos, o desenvolvimento de software vem se popularizando. Atualmente, qualquer pessoa que possua conhecimento básico sobre lógica e tenha contato com alguma linguagem de programação já é capaz de gerar um código de software de um sistema ou um aplicativo. Para alguns, o desenvolvimento de software se resume ao processo de escrever um código e disponibilizá-lo de alguma forma para o usuário final, o que de certa forma não está incorreto. Porém, dependendo do caso, ao seguir uma linha tão simples e míope com o desenvolvimento de software, corre-se o risco de tornar sua manutenção, evolução e operação mais trabalhosa, restritiva ou até mesmo impossível. Apesar de esse conceito simplista em relação ao desenvolvimento de software estar mais próximo de curiosos ou pessoas que estão iniciando seu contato com a área, muitas empresas ainda desconhecem iMasters #27 Agosto 2018
a importância do ALM ou da aplicação de qualquer uma de suas disciplinas no processo de desenvolvimento de software. Application Lifecycle Management Mas o que é o ALM? O Application Lifecycle Management engloba um conjunto de processos e ferramentas que, integrados, otimizam as atividades de documentação, desenvolvimento, automatização, controle, monitoramento e rastreabilidade em todo ciclo de vida da aplicação, abrangendo desde a concepção da ideia até a desativação. Segundo David Chappelle, o ALM pode ser dividido ainda em três áreas distintas: a governança de aplicação, o desenvolvimento de software e a operação, que respectivamente estão relacionadas às fases de definição, construção e operação de uma aplicação. Abaixo, abordamos cada uma delas separadamente:
// 41
∂ Áreas do ALM
Governança de aplicação A área de governança de aplicação tem como objetivo principal garantir que o software desenvolvido atenderá totalmente à necessidade do negócio ao qual se propõe e, por isso, está conectada diretamente com a área de desenvolvimento de software.
Os pilares do ALM O ALM está estruturado em três pilares: pessoas, processos e ferramentas. De forma integrada, eles possibilitam que as empresas sejam capazes de gerenciar todo o ciclo de vida de suas aplicações.
Desenvolvimento de software Também conhecida como SDLC (Software Development Life Cycle), tem como principais processos a análise dos requisitos, o desenvolvimento ou codificação, os testes e a documentação da aplicação. Operação Assim como a área de governança está diretamente relacionada ao desenvolvimento de software, o mesmo ocorre entre as áreas de operação e de desenvolvimento. A área de operação do ALM tem um papel fundamental para o sucesso da aplicação, e as principais atividades relacionam-se ao processo de disponibilizar a aplicação para o usuário final e realizar seu monitoramento ativo e constante. iMasters #27 Agosto 2018
42 // SOFTWARE
ALM PODE SER DIVIDIDO AINDA EM TRÊS ÁREAS DISTINTAS: A GOVERNANÇA DE APLICAÇÃO, O DESENVOLVIMENTO DE SOFTWARE E A OPERAÇÃO, QUE RESPECTIVAMENTE ESTÃO RELACIONADAS ÀS FASES DE DEFINIÇÃO, CONSTRUÇÃO E OPERAÇÃO DE UMA APLICAÇÃO
Pessoas Dentro do ALM, são todos aqueles que interagem e se envolvem com o desenvolvimento da aplicação durante todo o ciclo de vida, e são responsáveis por realizar a conexão entre o uso correto dos processos e ferramentas. Processos O pilar de processos descreve a metodologia de desenvolvimento a ser seguida. Ela inicia na coleta de requisitos e segue seu fluxo até as atividades de monitoramento, contendo guias e manuais técnicos ou de negócio, possibilitando a construção e a manutenção de uma aplicação de forma padronizada.
processos e ferramentas envolvidas no ciclo de desenvolvimento da aplicação. As disciplinas do ALM visam a aprimorar a organização, a conformidade e o registro das atividades, a otimizar procedimentos, a eliminar o desperdício e a obter informações de forma rápida para tomada de decisão e melhoria de comunicação. Devido à constante evolução da tecnologia, as disciplinas do ALM passaram por diversas evoluções e transformações. Dessa forma, a lista abaixo possui algumas das principais disciplinas do ALM, mas, em muitos casos, não devemos nos limitar a elas. Se necessário, novas disciplinas deverão ser utilizadas de acordo com o contexto da aplicação.
Ferramentas As ferramentas são as tecnologias existentes que proporcionam automação de procedimentos manuais e facilitam o trabalho das pessoas junto aos processos.
Gerenciamento de requisitos Consiste nas atividades de documentar e manter atualizada a descrição do comportamento do sistema e suas definições técnicas e de arquitetura. Com isso, garante-se a rastreabilidade dos requisitos ao longo de todo ciclo de vida da aplicação.
Disciplinas do ALM Dentro de cada uma das áreas do ALM, ocorrem atividades organizadas em diversas disciplinas e que são executadas a partir da integração das pessoas,
Gerenciamento de recursos/repositórios Responsável por manter e gerenciar os diversos artefatos que são produzidos durante todo o SDLC e possibilitar a rastreabilidade e versionamento deles.
iMasters #27 Agosto 2018
// 43
Gerenciamento de testes e qualidade Visa a garantir a qualidade do software e sua conformidade frente aos requisitos definidos. Ela se apoia diretamente em técnicas como BDD, TDD e testes de integração automatizados e funcionais, buscando garantir que defeitos não se perpetuem para o ambiente produtivo. Gerenciamento de mudanças e configuração Tem como objetivo controlar mudanças e gerenciar as configurações, sejam elas em nível de aplicação, sistema operacional, infraestrutura ou banco de dados. Ela está intimamente relacionada à disciplina de gerenciamento de recursos/repositórios. Gerenciamento de bugs Consiste em coletar e registrar, de forma clara, os incidentes ou bugs. Outra função é a de apoiar a identificação de suas causas raízes através de uma descrição correta do comportamento ocorrido, facilitando o direcionamento e a execução da correção a ser realizada. Gerenciamento de versões Responsável por garantir a consistência das diversas versões que a aplicação venha a possuir, assim como gerenciar os demais artefatos dos quais a aplicação depende. Ela está intimamente ligada à disciplina de gerenciamento de recursos/repositórios e de mudanças/configuração. Gerenciamento de build & release É a atividade de empacotar ou agrupar os componentes de uma aplicação em um único pacote, de forma que esse artefato possa ser distribuído por ambientes de testes, validação e ou posteriormente publicado no ambiente produtivo. Gerenciamento de métricas/relatórios Visa a coletar métricas de processo, software e operação, entre outras. Permite a geração de relatórios que possibilitem um acompanhamento de atividades e facilitem a tomada de decisão.
Gerenciamento da operação e monitoramento Permite acompanhar, de forma online e constante, a disponibilidade e a performance das aplicações, não se limitando apenas à camada de software, mas abordando também o nível de infraestrutura. O ALM, de maneira geral, abrange conceitos de SDLC e DevOps, e visa também a integrar pessoas, processos e ferramentas, permitindo a criação de softwares melhores. Cada disciplina do ALM pode ter sua eficiência aprimorada por ferramentas de controle e automação. Atualmente, existe uma gama de ferramentas disponíveis, tanto proprietárias como de código aberto, que podem ser utilizadas. Desenvolver uma aplicação sem uma definição do ALM que será utilizado é como navegar pelo oceano sem uma bússola. O ALM proporciona uma direção clara para todos os integrantes da equipe envolvida no desenvolvimento, acelera uma série de atividades e apoia diretamente o processo de tomada de decisões. Se você deseja iniciar sua adequação quanto ao ALM, comece identificando os maiores gargalos no processo utilizado pela sua empresa e verifique as ferramentas que podem apoiá-lo. Referências:
http://davidchappell.com/writing/white_papers/What_is_ALM_v2.0--Chappell.pdf https://msdn.microsoft.com/pt-br/library/ee156630.aspx#item5 https://dzone.com/articles/what-is-application-lifecycle-management-alm
Vandré Miguel Ramos é gerente de desenvolvimento de software na Hostgator. É bacharel em informática pela UEPG, pós-graduado em Web Sistema de Informação pela UFRGS, MBA em gerenciamento de projetos pela FGV e Mestre em Administração pela UFRGS. Trabalha com desenvolvimento de software há mais de 15 anos e com agilidade há mais de 10. É Certified Scrum Master, apaixonado por gestão de pessoas e ciclo de desenvolvimento de software, transformador de times e facilitador de soluções. iMasters #27 Agosto 2018
GRAPHQL REST IN PEACE?
Por Gabriel Rodrigues Couto, CTO da Memed iMasters #27 Agosto 2018
// 45
Nossa história começa em fevereiro de 2012, quando alguns engenheiros do Facebook passavam por um grande dilema de arquitetura. Naquele exato momento da história, e após alguns anos de o Facebook tentar o sonho de grande parte dos desenvolvedores, que era escrever um só código para múltiplas plataformas, a empresa enfim iniciava o desenvolvimento de seus aplicativos mobile em código nativo, depois de sofrer muito em busca de performance e estabilidade. Durante o desenvolvimento dos novos aplicativos, ocorreu o tal dilema de arquitetura: o Facebook não tinha uma API para o News Feed, que até o momento era entregue diretamente em HTML. E depois de avaliarem padrões como REST e FQL tables (Facebook SQL-like API), não encontraram uma forma inteligente de consumir (via API) dados estruturados da mesma forma que armazenavam, ou seja, grafos de objetos. Pode parecer meio estranho o problema encontrado por eles, mas quem nunca implicou com o fato de precisar reorganizar/reprocessar os dados enviados pela API ou, ao contrário, reorganizar/reprocessar os dados enviados pela aplicação, para ficarem no padrão que você precisa/espera? Após uma extensa pesquisa, uma equipe de três engenheiros estava determinada a produzir uma ferramenta própria, e foi então que surgiu o SuperGraph, o protótipo do que viria a ser o que conhecemos hoje como GraphQL. Saindo do REST Não existe forma melhor de elucidar como o GraphQL funciona sem sair de outra maneira de construção de APIs, então vamos utilizar uma das mais adotadas nos últimos anos, REST (Representational State Transfer), que, diferentemente do GraphQL, é um conceito arquitetural (sem especificações e ferramentas oficiais). Imagine que temos um site de receitas culinárias, o “Tudo Delicioso” (qualquer semelhança é mera coincidência), e resolvemos fazer um aplicativo para ele. Já temos uma API REST, com os seguintes endpoints: GET /recipes POST /recipes GET /recipes/{id} GET /authors GET /authors/{id}
Nosso aplicativo, assim que for aberto, mostrará uma lista das últimas receitas cadastradas, o que já é entregue pelo endpoint de receitas: GET /recipes { “data”: [ { “id”: 1, “name”: “Torta de Legumes”, “category”: “salgado”, “author”: { “id”: 9, “name”: “Paulo Panela” }, “ingredients”: [ “500mg de Farinha”, “Sal”, “Fermento”, ... ], “steps”: [ { “description”: “Junte a farinha com o sal, fermento...” }, { “description”: “Misture bem...” }, ... ] }, { ... }, { ... } ] }
E aqui temos o nosso primeiro problema: não precisamos dos «steps», nem dos «ingredients», para mostrar uma lista de últimas receitas. Como estamos no mundo mobile, dados custam tempo, dinheiro e bateria, por isso precisamos de uma certa iMasters #27 Agosto 2018
46 // CAPA
liberdade para requisitar à API somente alguns campos, e isso é uma das coisas que o GraphQL resolve.
Além de criar um endpoint, precisamos utilizar uma biblioteca que implemente a especificação do GraphQL, a qual nos ajudará a processar os requests. Existem várias bibliotecas para várias linguagens de programação. Para deixar este artigo o mais genérico possível, não vamos nos aprofundar em uma biblioteca de uma linguagem de programação, e sim nas especificações do GraphQL, por isso, caso queira ver uma lista de bibliotecas indicadas para a sua linguagem, acesse https://graphql.org/code/. Legal, temos o endpoint e a biblioteca configurados, agora precisamos especificar o que o endpoint “sabe responder”. Schema: “Ei, cliente, pode me pedir isso que eu sei responder”. Uma das coisas mais legais do GraphQL é o fato de o endpoint se autodescrever, ou seja, através de uma especificação, é possível ver o que a API sabe fazer. Para exemplificar, vamos escrever um schema que permitirá listarmos nossas receitas culinárias. O schema é escrito em “GraphQL Schema Language”, uma forma agnóstica de linguagem de programação: type Query { recipes: [Recipe] }
Vamos implementar o GraphQL em nossa API, criando um único endpoint: POST /graphql
Diferentemente do REST, não precisamos mais de um endpoint para representar cada recurso, nem utilizar vários verbos HTTP - toda “magia” acontece na especificação do endpoint e no conteúdo do request, ambos escritos utilizando uma linguagem, a GraphQL Query Language. iMasters #27 Agosto 2018
type Recipe { id: ID! name: String! category: Category! author: [Author]! ingredients: [String]! steps: [Step]! } type Author { id: ID! name: String! photo: String
// 47
friends: [Author]
salgado doce
} } type Step { description: String! } enum Category {
No schema, nós definimos tipos de objetos e seus campos. Cada campo possui um tipo, como o campo “author”, que é um array de objetos do tipo “Author”, ou o “photo”, que é uma String.
Int
Número inteiro de 32-bit (com sinal)
Float
Número de precisão dupla (com sinal)
String
Sequência de caracteres em UTF-8
Boolean
true ou false
ID
Representa um identificador único. Internamente, é como o tipo String, e recomenda-se que não seja “human readable”
Enum
Restringe os valores de um campo para os presentes numa lista
[] (array)
Um array de objetos ou tipos escalares
! (não nulo)
Define que o campo nunca será nulo
Existem dois tipos especiais de objetos, Query e Mutation, nos quais vamos nos aprofundar logo em seguida. Todo request para o GraphQL tem em seu conteúdo um JSON, que contém os seguintes campos: { “query”: “...”, “operationName”: “...”, “variables”: { “myVariable”: “someValue”, ... } }
Sempre que for citado “conteúdo da nossa query”, será o valor do campo “query” no JSON mostrado. No campo “query”, podem existir N definições de objetos do tipo Query e Mutation (chamadas de operation), mas apenas uma pode ser executada em um request, por isso a presença do campo “operationName”. É possível também usar variáveis, o que será explicado ainda neste artigo.
Query: “Ei, API, preciso disso” Ao definirmos no schema um objeto do tipo Query, estamos deixando explícitos quais os entry points que nossa API permite serem usados nas respostas, ou seja, os objetos iniciais, aqueles que ficam na raiz da resposta. Para o nosso aplicativo, precisamos listar apenas alguns campos das receitas, então o conteúdo da nossa query será: { recipes { id name category author { name photo } } }
iMasters #27 Agosto 2018
48 // CAPA
Note que “recipes” é nosso objeto raiz (entry point), e a partir dele podemos especificar os campos da receita que queremos na resposta, que seria algo como:
{ recipes(id: “MQ==”) { id name ingredients steps author { name } }
{ “data”: { “recipes”: [ { “id”: “MQ==”, “name”: “Torta de Legumes”, “category”: “salgado”, “author”: { “name”: “Paulo Panela”, “photo”: “https://photo.co” } }, ... ] } }
Conseguimos nossa lista de receitas de forma mais enxuta. Agora, como requisitamos uma receita em específico? Para isso, podemos usar um recurso chamado “Arguments”. Vejamos como ficaria o objeto Query do nosso schema: type Query { recipes(id: ID, byMe: Boolean, byFriends: Boolean): [Recipe] }
É importante lembrar que, ao definirmos os argumentos, cabe à nossa própria lógica da API fazer a filtragem dos dados. A maioria das bibliotecas de GraphQL apenas irá lhe passar quais argumentos foram utilizados na query. Para requisitar apenas uma receita, nossa query ficaria assim: iMasters #27 Agosto 2018
} Note que adicionamos alguns campos na resposta e deixamos de pedir outros. Este é um dos melhores recursos do GraphQL, como falamos anteriormente: podemos pedir somente aquilo de que precisamos. Agora, imagine que em nosso aplicativo teremos uma tela com “Minhas Receitas” e “Receitas de Amigos”. Se notar, no schema já temos dois argumentos que podemos utilizar para isso: “byMe” e “byFriends”. Vejamos como ficará nossa query: { recipesByMe: recipes(byMe: true) { ...commonFields } recipesByFriends: recipes(byFriends: true) { ...commonFields author { name } } } fragment commonFields on Recipe { id name }
// 49
COMO ESTAMOS NO MUNDO MOBILE, DADOS CUSTAM TEMPO, DINHEIRO E BATERIA, POR ISSO PRECISAMOS DE UMA CERTA LIBERDADE PARA REQUISITAR À API SOMENTE ALGUNS CAMPOS, E ISSO É UMA DAS COISAS QUE O GRAPHQL RESOLVE Aqui, podemos ver outros dois recursos das queries - os “Aliases”, que são “apelidos” para os objetos e campos (ex.: “recipesByMe”), e os “Fragments”, que são fragmentos de query que podem ser reutilizados, superúteis para evitar repetição. A resposta para a nossa query seria algo como: { “data”: { “recipesByMe”: [ { “id”: “MQ==”, “name”: “Torta de Legumes” }, ... ], “recipesByFriends”: [ { “id”: “MjA==”, “name”: “Pudim de Chocolate”, “author”: { “name”: “Roberta Sweet”, } }, ... ], } }
Estamos quase no fim de todas as telas do nosso aplicativo. Agora, vamos para a penúltima, na qual será possível ver os autores cadastrados no site. A tela terá dois campos: o nome, que poderá ser digitado pelo usuário (como um filtro de busca), e “ver os amigos”, que mostrará os amigos de cada autor. Para fazer essa tela, precisaremos mudar um pouco o nosso schema: type Query { recipes(id: ID, byMe: Boolean, byFriends: Boolean): [Recipe] authors(name: String, showFriends: Boolean): [Author] }
Não é uma boa prática colocar campos que são preenchidos pelo usuário diretamente na query, precisamos passá-los como variáveis. Para isso, na definição da query, colocamos o nome das variáveis (com “$” antes) e o tipo de cada uma. Além disso, precisamos que alguns campos sejam incluídos na resposta seguindo uma condição (somente se “ver os amigos” estiver marcado). Esse recurso se chama “Directives”, e possui duas opções: “@include(if: Boolean)”, para incluir um campo caso uma variável seja verdadeira, e seu oposto, o “@ skip(if: Boolean)”. iMasters #27 Agosto 2018
50 // CAPA
Nossa query ficaria assim:
{ “name”: “Rodrigo Cardoso”
query ListOfAuthors($name: String, $withFriends: Boolean!) { authors(name: $name) { id name photo friends @include(if: $withFriends) { name } } }
Note que agora demos um nome à query (ListOfAuthors), o que é uma boa prática para facilitar o debug da aplicação, mas também necessário caso tenhamos várias queries especificadas no mesmo request. Como estamos utilizando variáveis, precisamos defini-las (campo “variables” do nosso request): { “name”: “João”, “withFriends”: true }
} ] }, ... ] } }
Mutation: “Ei, API, muda isso”. Ao sairmos do REST para o GraphQL, uma das dúvidas inevitáveis é como enviar dados. Já que tudo é um POST e vimos diversas definições de query, onde se encaixa um cadastro, por exemplo? Para isso, o GraphQL tem um tipo especial de objeto chamado Mutation. Vamos alterar o nosso schema, declarando a mutation de cadastro de receitas: input CreateRecipeInput { name: String! ingredients: [String]! steps: [String]! } type CreateRecipePayload { recipe: Recipe }
A resposta seria algo como: { “data”: { “authors”: [ { “id”: 1, “name”: “João da Silva”, “photo”: “https://photo.co”, “friends”: [ { “name”: “Paulo Panela” },
iMasters #27 Agosto 2018
type Mutation { createRecipe(recipe: CreateRecipeInput!): CreateRecipePayload }
Uma boa prática é criar um objeto do tipo input, que agrupa todos os campos de entrada da nossa mutation, deixando mais simples o uso com variáveis. Outra boa prática é ter um objeto que representa a resposta da mutation (payload), o qual poderá ser reutilizado por outras mutations (imagine uma mutation de atualização, o payload seria o mesmo que a de criação).
// 51
Para utilizar a mutation que criamos, precisamos enviar no campo “query” o seguinte conteúdo no nosso request: mutation CreateRecipe($input: CreateRecipeInput!) { createRecipe(recipe: $input) { recipe { id } } }
E lembrando que, como estamos utilizando variáveis, precisamos defini-las:
autores e a documentação do GraphQL são bem enfáticos quanto a isso: a autorização fica na camada de regras de negócio. Quando uma query ou mutation é processada, a maioria das bibliotecas permite que seja “injetado” um objeto de contexto, no qual poderemos colocar uma instância do usuário logado, por exemplo, e nossa camada de regras de negócio pode utilizar essa instância para verificar a permissão do usuário. Imagine que um usuário do “Tudo Delicioso” requisitou os detalhes de algumas receitas (especificando os IDs). Em REST, estamos acostumados a rejeitar o request inteiro (HTTP 400-499), mas, no GraphQL, uma prática comum é simplesmente retornar null para aquele objeto. Vejamos a seguir um exemplo: {
{ “input”: { “name”: “Bolo de Fubá”, “ingredients”: [ “Farinha de Fubá”, ... ], “steps”: [ “Misture os ingredientes secos”, ... ] } }
semPermissao: recipes(id: “MQ==”) { name } comPermissao: recipes(id: “Mg==”) { name } }
A resposta será: { “data”: { “semPermissao”: null, “comPermissao”: { “name”: “Torta de Legumes”, } }
A resposta será algo como: { “data”: { “createRecipe”: { “recipe”: { “id”: “MTAw” } } } }
Authorization: “Ei, API, quero ver isso”. Uma das primeiras dúvidas ao implementarmos uma API inteira em GraphQL é sobre a autorização. Os
}
Dessa forma, o usuário terá uma experiência melhor do aplicativo, já que foi “vetado” somente o conteúdo ao qual ele não tem acesso, não “quebrando” a tela inteira que estava visualizando. Pagination: “Ei, API, página 2, por favor” Quando nossa API precisa retornar uma lista de itens, uma boa prática é retornar um número limitado, iMasters #27 Agosto 2018
52 // CAPA
assim utilizamos menos recursos (CPU, memória, rede etc.) do nosso back-end e front-end, dando respostas mais rápidas ao usuário. A implementação de paginação no GraphQL fica a cargo do desenvolvedor, mas existe um padrão recomendado. Vamos usar como base a nossa query de receitas culinárias. Sua versão com paginação ficaria: { recipes(first:2 after:”Mg==”) { totalCount edges { cursor node { name category author { name photo } } } pageInfo { endCursor hasNextPage } } }
Obs: Não veremos o schema, que precisaria ser alterado também com os campos definidos na query, mas não tem segredo, é parecido com o que já vimos anteriormente. Vamos à explicação de cada alteração: first e after: Especifica que queremos os N primeiros registros, após o registro com um determinado ID. totalCount: Quantidade total de registros encontrados (por exemplo, 199 receitas). iMasters #27 Agosto 2018
edges: Em um grafo, edges são as arestas que conectam um nó a outro. No nosso exemplo, não têm muita utilidade, mas em casos como relacionamentos (“lista de amigos”), podem ser úteis para trazer dados sobre o relacionamento (a data em que duas pessoas se tornaram amigas, por exemplo) cursor: É um identificador único da aresta. Normalmente, é a posição do item na lista (ex: 21) ou o ID (ex: “Mq==”). No nosso caso, uma possível implementação seria utilizar o ID da receita culinária. node: É o nó ou, no nosso caso, a receita culinária. pageInfo: Um objeto de auxílio à paginação. No exemplo, endCursor seria o último cursor da página (para facilitar pedir a próxima página), e hasNextPage um booleano que nos dirá se existe uma próxima página. Error Handling: “Ei, cliente, não entendi o que você disse” Em alguns momentos, nossa API não conseguirá responder o que o cliente pediu. Para isso, o GraphQL define um padrão de resposta de erro. Um retorno simples seria algo como: { “errors”: [ { “message”: “Não foi possível excluir o objeto” } ] }
Tools Existe uma enorme gama de ferramentas voltadas para GraphQL, mas uma merece um grande destaque, a GraphiQL. Ela é uma espécie de Postman com autocomplete, syntax highlighting e até mesmo navegação pelos objetos definidos no schema.
// 53
A GraphiQL está incluída em várias bibliotecas, mas você pode usá-la de forma separada. Para ver o projeto, acesse https://github.com/graphql/graphiql. Outros projetos que merecem destaque são: Apollo - https://www.apollographql.com/ Relay - https://facebook.github.io/relay/ GraphQL Playground (alternativa a GraphiQL) https://github.com/prismagraphql/graphql-playground GraphQL Docs - https://graphql-docs.com É o fim do REST? Depois de ver todas as vantagens do GraphQL, essa pergunta é inevitável. Sinceramente, existem muito mais pontos a favor do GraphQL do que do REST para a maioria dos casos de construção de uma API. Estamos vendo duas coisas que foram pensadas de forma diferente em seus nascimentos, mas, no fundo, as soluções são parecidas em diversos pontos. Experimente trocar algumas nomenclaturas (ex.: queries por endpoints) e verá que estamos falando basicamente das mesmas ações (ex.: como obter ou modificar um recurso). É importante deixar claro que nem tudo são flores para o GraphQL. Um dos principais problemas é em relação a Caching. Como o request pode ser ultrapersonalizado, todas as ferramentas de HTTP Caching com as quais estamos acostumados não funcionam para ele. Em contrapartida, várias soluções já foram criadas (ex.: Apollo Engine) e, com um pouquinho mais de trabalho, é possível contornar esse problema.
Após um tempo utilizando o GraphQL, pude sentir que resolveu a maioria dos problemas encontrados no REST, como não ter um padrão de formatos de requisição (pessoalmente, uso o padrão JSON API), passando por não ser autodocumentavel (Swagger, por exemplo, faz esse papel, mas adiciona trabalho), até não ser customizável (existem implementações como “?fields=name,steps,ingredients”, mas não tão profundas como as do GraphQL). Na minha visão, a transição já está acontecendo e é questão de tempo para o mercado adotar com mais força o GraphQL. O REST ainda estará presente em N casos, como no uso para aplicações com Hypermedia (HATEOAS, que permite um computador navegar pelos recursos assim como um humano navega pela Internet) ou simplesmente o upload de arquivos, já que o conteúdo de um request pode ser o próprio arquivo (diferentemente do GraphQL, que ainda não tem um padrão oficial para isso). Para finalizar, vale relembrar uma das maiores verdades do mercado: quando temos mais de uma opção, as coisas evoluem melhor. Gabriel Rodrigues Couto é Engenheiro da Computação, CTO da Memed e evangelista da comunidade PHPSP. É conhecido por ter feito um emulador de Game Boy em PHP, além de palestrar sobre assuntos como Inteligência Artificial e Blockchain. Defende diariamente o uso da tecnologia para melhorar a vida dos seres humanos.
gabriel@rodriguescouto.com.br iMasters #27 Agosto 2018
54 // CMS
COMPARAÇÃO DE CMS: WORDPRESS X JOOMLA X DRUPAL Por H. Fatima, Engenheira e escritora
Eu sou blogger há mais de 10 anos e, nesta última década, venho acompanhando como a Internet vem se desenvolvendo. Dos blogs pessoais aos sites de negócios, a Internet vem sofrendo tremendas mudanças. Devido ao rápido crescimento da tecnologia, os e-business e as startups online estão em alta. Um dos recursos para ajudar esses negócios a se estabelecerem é o Content Management System (CMS) ou Sistema de Gerenciamento de Conteúdo. Os CMSs ajudam os usuários a projetar, implantar e gerenciar um site de maneira descomplicada. Neste artigo, compararei as três versões mais populares dos CMSs de código aberto: WordPress, Joomla e Drupal. Wordpress: O WordPress é um dos mais populares e amplamente utilizados. É utilizado por mais de 30% dos sites e possui um Market Share de 59.9%. É uma plataforma simples, flexível e amigável para o usuário com um dashboard intuitivo. O WordPress é fácil de instalar e o CMS mais indicado caso você seja um iniciante, pois requer pouco conhecimento técnico. Além disso, a Hospedagem WordPress é fácil de entender. É um CMS customizável, possuindo mais de 4.000 temas e mais de 55.000 plugins. Algumas das empresas que usam WordPress são CNN, Forbes, Wall Street Journal etc. iMasters #27 Agosto 2018
Joomla: Com um Market Share de 6,1%, o Joomla é utilizado por 3% dos sites e é o segundo CMS mais popular. Ele fornece facilidade de uso, extensibilidade e estabilidade estrutural. Possui uma comunidade de desenvolvedores ativa e provê estabilidade, flexibilidade e um poderoso UI. É um pouco mais complicado de instalar que o WordPress, mas requer um conhecimento técnico mínimo. É adequado para a construção de sites de e-commerce, bem como redes sociais. Algumas das empresas que usam Joomla: Linux. com, Harvard University, Cloud.com etc. Drupal: Com um Market Share de 4,1%, o Drupal é utilizado por 2,3% sites do mundo e é o terceiro CMS mais utilizado. É um poderoso, flexível e eficiente CMS, e pode ser usado por sites corporativos de alto nível. Drupal provê um framework de back-end e é muito popular entre a comunidade de desenvolvedores. É um CMS de nível empresarial, que pode ser usado para sites orientados por conteúdo, com bases de dados e clientes enormes. Algumas empresas que usam o Drupal são Warner Bros, The White House etc. Veja ao lado um infográfico comparativo para melhor entendimento:
// 55
WORDPRESS VS
JOOMLA
VS
DRUPAL
LANÇAMENTO Lançado em 2003
Lançada em 2005
Lançado em 2000
Fundadores: Matt Mullenwegg
Fundado por um Fork do MAMBO
Fundador: Dries Buytaert
& Mike Little
APLICAÇÃO DO SERVIDOR PHP + Suporta Bancos de dados MySQL
PHP + Suporta Bancos de dados MySQL
PHP + Suporta Bancos de dados MySQL
MERCADO Utilizado por 30% dos sites com
Utilizado por 3% dos sites com 6,1%
Utilizado por 2,3% dos sites com 4,2%
59,9% de participação no mercado
de participação no mercado
de participação no mercado
REQUISITOS TÉCNICOS Não precisa de conhecimento técnico
Requer conhecimento técnico básico
Requer um bom conhecimento técnico
Pode instalar facilmente
Requer um pouco de atenção
Precisa de um desenvolvedor
na instalação
para instalar
∂ Feito pela: Resellerclub
Escolhendo o CMS certo Não há um CMS certo ou errado - isso irá depender do tipo de site que você está criando. Se você for iniciante e quiser criar um site simples, WordPress é a melhor opção. Se você está confiante de que seu site vai crescer significativamente ou irá criar um site cujos requerimentos não são preenchidos pelo WordPress, você deve escolher o Drupal. Por fim, se você está criando um site de rede social ou está confuso sobre a migração do WordPress para o Drupal, o Joomla é um bom meio termo. Você pode se perguntar se a migração de um CMS para outro é possível, ou se você pode construir seu
próprio CMS. A resposta é sim! Inclusive, o processo de migração é relativamente simples. Espero que este texto ajude você a fazer uma escolha informada, dependendo de qual CMS melhor atenda às suas necessidades!
H. Fatima costumava ser engenheira por profissão e escritora por paixão, até começar a escrever em tempo integral. Seu blog é uma coleção de vinhetas curtas, histórias e poemas. Ela escreve principalmente o que percebe e analisa profundamente. iMasters #27 Agosto 2018
56 // TÉCNICAS DE TESTES
TÉCNICAS DE TESTE PARA DESENVOLVEDORES Por Julio de Lima, Lead QA Engineer na Capco Por muitos anos, o processo de desenvolvimento de software segregou o papel do desenvolvedor e do testador como sendo dois profissionais com habilidades e objetivos diferentes. O cenário atual, entretanto, exige que testadores sejam capazes de desenvolver e que os desenvolvedores sejam capazes de testar. Dessa forma, podemos entregar software com mais velocidade e com mais qualidade. Agora contextualizados, podemos então conhecer, numa abordagem prática, quais são as técnicas que podemos utilizar para validar os softwares que desenvolvemos de forma sistemática e mais apurada. Além disso, utilizar scripts de teste automatizado para exercitar os testes provenientes do uso das técnicas sempre que o software sofrer modificações. Definição do problema Consideraremos o código a seguir como objeto dos nossos estudos. Ele atende a um requisito de negócio que determina que funcionários com salário a partir de R$ 3.000,00 e inferior a R$ 5.000,00, a partir de três anos desde a contratação, serão considerados incluídos na nova política de bonificação da companhia. const validacaoSalario = (salario, tempo) => { if (salario >= 3000 && salario < 5000) { return (tempo >= 3) ? true : false; } }; ∂ Código 1: Método para validação do salário versus tempo de contratação (em JavaScript)
iMasters #27 Agosto 2018
Cobertura de sentença A cobertura de sentença é uma técnica utilizada para garantir a execução de todas as linhas da aplicação ao menos uma vez. Logo, escrevemos testes que utilizarão dados de entrada de forma que passem por todas as sentenças do método que estamos construindo. describe(‘Testes para validação de salário’, () => { it(‘para cobertura de sentença’, () => { expect(validacaoSalario(4000, 4)). toBeTruthy(); }); }); ∂ Código 2: Aplicação da cobertura de sentença (em JavaScript, com Jasmine)
Perceba que esse único teste exercitou todos os comandos contidos dentro do método validacaoSalario, uma vez que o valor informado para o salário atendeu ao condicional, e a linha de dentro foi atingida. Dessa forma, com um único teste, temos 100% da cobertura de sentença. Essa técnica é utilizada como primeiro passo para times que desejam iniciar com a criação de testes para cobertura do código, pois requer menos esforço e traz ganhos rápidos. Cobertura de decisão A cobertura de decisão tem o objetivo de avaliar o verdadeiro e falso de cada condicional contido no código. Essa caraterística faz com que ela seja mais
// 57
abrangente do que a cobertura de sentença, dado que, para o mesmo trecho de código, teremos muito mais testes a serem criados. Em contrapartida, precisamos de mais tempo para a criação dos testes. describe(‘Testes para validação de salário’, () => { it(‘pra cobertura decisão do salário 3k e com 10 anos’, () => { expect(validacaoSalario(3000, 10)). toBeTruthy(); }); it(‘pra cobertura decisão: salário 4.5k e menos de 3 anos’, () => { expect(validacaoSalario(4500, 2)). toBeFalsy(); }); }); ∂ Código 3: Aplicação da cobertura de decisão (em JavaScript, com Jasmine)
O código 3 mostra o cenário no qual cobrimos a condição verdadeira da validação de salário e as condições verdadeira e falsa da condição relacionada ao tempo. Ainda falta a validação da condição falsa da condição que avalia o salário. Bem, no caso em que esse método deveria retornar apenas true ou false, nosso próximo teste revelará um defeito que não havia sido identificado pela cobertura de sentença, que é a falta de um retorno específico para a condição falsa do salário, uma vez que não definimos explicitamente o retorno para esse cenário. describe(‘Testes para validação de salário’, () => { it(‘pra cobertura decisão: salário fora do escopo e 7 anos’, () => { expect(validacaoSalario(4500, 7)). toBeFalsy(); }); }); ∂ Código 4: Aplicação da cobertura de decisão com teste que retorna falha (em JavaScript, com Jasmine)
Partição de equivalência A partição de equivalência é uma técnica usada como base para a maioria das técnicas utilizadas por
testadores para projetar seus testes. Basicamente, é a atividade formal de identificar quais as faixas de valores permitidos, sejam numéricos ou não. Geralmente, é utilizada para validações funcionais, mas cabe muito bem para validações em qualquer nível de teste, seja em código, em API, em UI etc. Para aplicá-la, vamos nos lembrar do requisito que dizia “funcionários com salário a partir de R$ 3.000,00 e inferior a R$ 5.000,00 a partir de três anos desde a contratação”. O primeiro passo é identificar as variáveis, que são salário e tempo. Depois, identificar todas as possibilidades relacionadas a elas, essas seriam as partições. Para salário, são < 3k, >= 3k e <5k além de >=5k. Para tempo, são apenas <3 e também >=3. Identificadas as partições, fazemos a permutação entre as partições de cada variável. Logo, teríamos 3 salários vezes 2 tempos, o que daria 6 combinações de entradas. Colocaríamos então o resultado esperado para cada uma delas: Salário <3k e tempo <3 deve retornar false Salário >= 3k e <5k e tempo <3 deve retornar false Salário >=5k e tempo <3 deve retornar false Salário <3k e tempo >=3 deve retornar false Salário >= 3k e <5k e tempo >=3 deve retornar true Salário >=5k e tempo >=3 deve retornar false Teríamos que escrever um teste para cada combinação identificada. Um único valor seria escolhido de forma arbitrária para cada faixa de valores contido em cada combinação. describe(‘Testes para validação de salário’, () => { it(‘Salário <3k e tempo <3 deve retornar false’, () => { expect(validacaoSalario(2499.99, 2)). toBeFalsy(); }); it(‘Salário >= 3k e <5k e tempo <3 deve retornar false’, () => { expect(validacaoS alario(3299.99, 2)).toBeFalsy(); }); it(‘Salário >=5k e tempo <3 deve retornar false’, () => { expect(validacaoSalario(6900, 1)). toBeFalsy(); }); it(‘Salário <3k e tempo >=3
iMasters #27 Agosto 2018
58 // TÉCNICAS DE TESTES
deve retornar false’, () => { expect(validacaoSalario(1200, 5)). toBeFalsy(); }); it(‘Salário >= 3k e <5k e tempo >=3 deve retornar true’, () => { expect(validacaoSa lario(4199.99, 6)).toBeTruthy(); }); it(‘Salário >=5k e tempo >=3 deve retornar false’, () => { expect(validacaoSalar io(5379.99, 12)).toBeFalsy(); }); }); ∂ Código 5: Aplicação da partição de equivalência com permutação (em JavaScript, com Jasmine)
Podemos avaliar a cobertura da partição de equivalência de duas formas: 1) a cobertura por partição ou 2) a cobertura das combinações geradas pela permutação. Na opção 1, escreveríamos testes que exercitassem cada uma das 5 partições identificadas, ou seja, 3 para o salário e 2 para o tempo. Na opção 2, criaríamos testes que exercitassem as 6 combinações que criamos através da permutação. Se estivéssemos executando testes em uma API, criaríamos os scripts de testes automatizados usando ferramentas capazes de enviar requisições HTTP com os valores de entrada que identificamos nas 6 combinações pelo uso da técnica de partição de equivalência. Então, validaríamos se as respostas obtidas fossem as esperadas. Já se o caso fosse em que estivéssemos testando uma aplicação com interface gráfica web, desktop ou mobile, usaríamos um framework de manipulação da interface para abrir a aplicação, digitaríamos os valores referentes às 6 combinações que identificamos, submeteríamos o formulário e então avaliaríamos se os valores de resposta são os esperados. Análise do valor limite A técnica de análise do valor limite olha para os limites entre as partições de equivalência com o intuito de validar que os operadores condicionais foram usados apropriadamente. Por exemplo, no requisito “funcionários com salário a partir de R$ 3.000,00”, entende-se que o operador a ser usado aqui é “>=”, ou seja, inclusive 3000. Mas o que aconteceria se eu, como desenvolvedor, colocasse “>”? Com certeza, ao usar 3000 com tempo iMasters #27 Agosto 2018
de 5 anos, teria um retorno false ao invés de true. Pensando nisso, criam-se testes capazes de cobrir os limites entre as partições: para salário, seriam 2999.99,3000.00,4999.99 e 5000.00, e para tempo, seriam 2 e 3. Logo, o menor e o maior valor dentro da partição, além de uma unidade de valor abaixo do menor valor da partição e uma unidade de valor acima do maior valor da partição. describe(‘Testes para validação de salário’, () => { it(‘pra cobertura decisão do salário 2999.99 e com 2 anos’, () => { expect(v alidacaoSalario(2999.99, 2)).toBeFalsy(); }); it(‘pra cobertura decisão do salário 5000.00 e com 2 anos’, () => { expect(validacaoSalario(5000, 2)). toBeFalsy(); }); it(‘pra cobertura decisão do salário 3000 e com 3 anos’, () => { expect(validacaoSalario(3000, 3)). toBeTruthy(); }); it(‘pra cobertura decisão do salário 3000 e com 2 anos’, () => { expect(validacaoSalario(3000, 2)). toBeFalsy(); }); it(‘pra cobertura decisão do salário 4999.99 e com 3 anos’, () => { exp ect(validacaoSalario(4999.99, 3)). toBeTruthy(); }); it(‘pra cobertura decisão do salário 4999.99 e com 2 anos’, () => { expect(v alidacaoSalario(4999.99, 2)).toBeFalsy(); }); }); ∂ Código 6: Aplicação da análise do valor limite (em JavaScript, com Jasmine)
É importante mencionar que testes que envolvem os limites são diferentes dos testes que envolvem partições, visto que os primeiros olham apenas para a intercessão das partições, e os outros olham para a faixa de valores contidos dentro da partição. Por isso, são complementares.
// 59
Testes de mutação Testes de mutação são utilizados para avaliar os testes escritos para uma determinada aplicação. Basicamente, eles alteram o código-fonte e executam os testes para verificar se eles foram capazes de validar que as alterações no código feriram o comportamento esperado. A versão alterada do código é chamada de “mutante”. Abaixo, o Código 1 que sofreu três mutações: const validacaoSalario = (salario, tempo) => { if (salario > 3000 || salario <= 5000) { return (tempo == 3) ? true : false; } }; ∂ Código 7: Mutação do método para validação do salário versus tempo de contratação (em JavaScript)
Vemos que no Código 7 a mutação modificou alguns dos operadores condicionais que existiam no Código 1: No salário, o operador >= foi substituído pelo > No salário, o operador && foi substituído por || No salário, o operador < foi substituído por <= No tempo, o operador >= foi substituído por == Então, os testes seriam executados novamente e aqueles que continuassem a passar seriam considerados “mutantes sobreviventes”, ou seja, código que possui validações falhas. Se houvesse validações suficientes, os scripts de teste deveriam ter falhado e informado que a mudança no código alterou o comportamento da aplicação. As técnicas mencionadas neste artigo são passíveis de validação através do uso de scripts de testes automatizados. A utilização desses scripts é muitas vezes mal compreendida, por exemplo, ao tratar essa atividade como um esforço elevado e de pouco valor quando, na verdade, pode ser simples e trazer grande valor ao processo de desenvolvimento. Numa abordagem manual, usamos depuração dinâmica ou da leitura de logs para entender se o resultado obtido é o esperado. Se esse processo leva três minutos, podemos considerar rápido, mas se temos que executar isso cinco vezes, talvez 15 minutos seja demais. Se escrevemos um script de teste automatizado em cinco minutos, podemos executá-lo a qualquer momento, em questão de segundos. Temos então um ganho significativo e a possibilidade
de validação do software com uso das técnicas sempre que ele for alterado. A escolha das técnicas depende de diversos fatores, mas, com certeza, os principais são: tempo disponível para testes e nível de risco relacionado ao que estamos desenvolvendo. Por isso, devemos levar em consideração o contexto para dizer como iremos abordar a atividade de testes dentro do time em que atuamos. Testadores nunca testam tudo, eles avaliam os riscos relacionados ao que se testa e, então, selecionam quais condições têm que ser executadas para evitar que os riscos se materializem em problemas que impactem o cliente ou o negócio. Logo, técnicas ajudam a entender o cenário completo, bem como a análise dos riscos ajuda a identificar quais condições devem ser testadas. O contexto atual do processo de desenvolvimento de software exige desenvolvedores capazes de criar e validar que o produto se comporta como esperado. Com o uso de técnicas de teste, é possível validar sistematicamente o software sob a perspectiva do código e também da funcionalidade. O uso de scripts de testes automatizados favorece a execução dos testes provenientes do uso das técnicas sempre que o software sofrer modificações e, assim, manter vivas as validações. ∂ Referências: https://en.wikipedia.org/wiki/Mutation_testing http://pitest.org/quickstart/mutators/ https://en.wikipedia.org/wiki/Code_coverage https://jasmine.github.io/2.0/introduction.html https://www.istqb.org/downloads/send/34-foundation-level-e-books/ 165-istqb%C2%AE-foundation-level-syllabus-2011-epub-format.html
Julio de Lima é Lead QA Engineer na Capco, possui experiência em testes envolvendo aplicações Web, desktop, mobile e serviços. É formado em Tecnologia em Informática e especialista em Docência no Ensino Superior e atua como professor em cursos de pósgraduação em universidades do Paraná e Manaus. Ajudou mais de 14 empresas a implementar testes e automação usando ferramentas privadas e open source com PHP, Java, Ruby e JavaScript. É palestrante assíduo em diversos eventos de tecnologia, disseminando a disciplina de testes de software, além de ser o cofundador do meetup garoaQA.
iam@juliodelima.com.br iMasters #27 Agosto 2018
60 // INTELIGÊNCIA NADA ARTIFICIAL
Implementação e análise de RNA com Python Por Alex Lattaro, Analista de sistemas
T
Tenho percebido duas pequenas dificuldades quando falamos de IA. A primeira advém da matemática e a dificuldade de entender um algoritmo de IA e sua manipulação dada a sua natureza. A segunda é a própria implementação da matemática em forma de código. Hoje, faremos uma simples implementação de RNA em Python e levantaremos alguns pontos de discussão. Matemática Nas outras edições da revista, vocês puderam observar que os algoritmos de IA são baseados, por exemplo, em equações integrais e diferenciais, álgebra linear, matrizes e funções trigonométricas. O ideal é entender o conceito de todos estes subterfúgios matemáticos, porém, graças a funções computacionais já prontas, você consegue implementar sem saber exatamente como essa base de cálculo funciona. Embora o conhecimento matemático não seja imprescindível, é altamente recomendável que você estude estes conceitos. Abordaremos esta necessidade no tópico discussão.
iMasters #27 Agosto 2018
Classes e bibliotecas Python Para facilitar a criação da nossa RNA em Python, utilizaremos as seguintes classes e bibliotecas. Como vimos no tópico anterior, para desenvolver um algoritmo de RNA precisamos utilizar álgebra linear, e no Python temos uma biblioteca chamada Numpy que é utilizada para este fim. Caso seu compilador não tenha, basta instalar o pacote. Outro ponto muito utilizado em RNA é a própria construção da rede, que como já vimos anteriormente, é baseada em neurônios artificiais, camadas e pesos. Temos vários exemplos de codificação de RNA pronta na internet, é importante sabermos como estes códigos funcionam para fazemos as modificações necessárias para nosso problema ou mesmo para iniciarmos do zero, caso tenhamos algum problema específico a ser resolvido. Abaixo vamos explicar um modelo comum. No Python, temos uma classe chamada Network.
// 61
No constructor temos o parâmetro syze que recebe o número de neurônios de cada camada. Sendo assim, para criarmos uma rede com cinco neurônios na primeira camada, dois na segunda e quatro na última, basta instanciarmos o seguinte objeto da classe Network Rede = Network([5,2,4])
Implementação Existem várias arquiteturas de RNA, Deep Feed Forward, Radial Basis Network, Perceptron, Feed Forward, Sparse AE e muitas outras. Neste algoritmo será utilizada a arquitetura Feed Forward. Para termos ideia da complexidade de cálculos realizados para cada tipo de arquitetura, seguem dois exemplos diferentes.
Também neste constructor podemos observar que o bias e os pesos são inicializados aleatoriamente por meio da função: np.random.randn. Esta função gerará distribuições gaussianas com 0 de média e desvio padrão de 1. Este não é o modo ideal de inicializarmos os pesos e o bias, mas é um ponto inicial. Na sequência é necessário utilizar uma função de ativação.
∂ Feed Forward
iMasters #27 Agosto 2018
62 // INTELIGÊNCIA NADA ARTIFICIAL
∂ Deep Feed Forward
Agora é necessário aplicar esta rede feed forward à classe Network. O método feed forward aplica a equação sigmoid em cada camada da nossa rede neural.
Até este ponto, a RNA já está basicamente implementada, entretanto, ela ainda não é capaz de aprender, pois falta o dataset e a descida estocástica do gradiente (SGD) que é o algoritmo padrão de aprendizagem para RNA. Existem outros algoritmos que podem ser utilizados. Segue abaixo a implementação do SGD e a implementação do data set por meio do training_data. iMasters #27 Agosto 2018
// 63
O training_data é uma série de tuplas com entradas e saídas esperadas (aprendizagem supervisionada). Epochs e mini_batch_size são as variáveis que representam os resultados esperados e eta é a taxa de aprendizagem. Nos argumentos você também pode ver o test_data, que é opcional. Caso o argumento seja fornecido, o algoritmo imprimirá o resultado parcial após cada período de treinamento. É extrema-
mente útil esse tipo de utilização, caso você queira inserir rastreabilidade no seu processo de aprendizagem, porém, a performance é severamente afetada. Neste código, os dados de treinamento são arrastados e particionados em mini batches. Para cada mini_batch, um passo de descida no gradiente SGD é aplicado. Então, os pesos e o bias são atualizados pelo update_mini_batch. iMasters #27 Agosto 2018
64 // INTELIGÊNCIA NADA ARTIFICIAL
Nesta atualização do mini_batch você consegue identificar o algoritmo backpropagation funcionando. Este algoritmo calcula o gradiente da função de custo. Mas não estudaremos isso neste momento. iMasters #27 Agosto 2018
Discussão Durante o artigo nós falamos sobre uma chamada função de ativação e propositadamente não a explicamos. Aqui, é importante nos atentarmos ao fato de porque precisamos entender a mate-
// 65
EMBORA O CONHECIMENTO MATEMÁTICO NÃO SEJA IMPRESCINDÍVEL, É ALTAMENTE RECOMENDÁVEL QUE VOCÊ ESTUDE ESTES CONCEITOS
mática, mesmo sabendo que muitas das funções já estão prontas e implementadas nas próprias bibliotecas. Funções de ativação são necessárias para ajustarmos a saída de nossos neurônios. Você pode pensar que alterar o valor do peso manualmente seja suficiente para corrigir uma saída
inesperada para uma que seja esperada. Entretanto, este tipo de alteração pode fazer com que a saída do neurônio correspondente aja de forma correta, entretanto, todo o resto da rede pode agir de maneira incorreta. Sendo assim, utilizamos a função de ativação da seguinte maneira:
iMasters #27 Agosto 2018
66 // INTELIGÊNCIA NADA ARTIFICIAL
Esta função de ativação basicamente define se um neurônio deve ou não ser ativado. Esta decisão é tomada baseada na relevância da informação que o neurônio produz. Dada função de ativação, nada mais é que outra camada matemática adicionada ao processo. Porém, esta camada matemática é imprescindível para que seu algoritmo tenha realmente uma inteligência e não esteja apenas aplicando uma regressão linear. Regressões lineares não são técnicas ruins, muito pelo contrário; sua importância é fundamental em várias aplicações de IA, porém, apenas a implementação da regressão linear não pode ser chamada de IA.
Agora, imagine: se você souber como manipular matematicamente esta função e não apenas utilizá-la matemagicamente, você será capas de alterá-la ou até mesmo criar outra função e, assim, desenvolver um algoritmo que trará maior assertividade para o seu programa. As bibliotecas e as classes nos auxiliam (e muito!) no desenvolvimento dos nossos modelos. Porém, quanto maior o seu conhecimento em matemática, maior será a sua facilidade de manipular estas bibliotecas e, assim, melhorar a performance da sua aplicação.
Alex Lattaro é formado em Análise e Desenvolvimento de Sistemas pelo IFSP. É desenvolvedor júnior de jogos, estuda e tem grande interesse nas áreas: Interação Humano Computador, Inteligência Artificial e Design. Também é músico, apaixonado por música, física, anime, séries e filmes.
alex.lattaro@gmail.com iMasters #27 Agosto 2018
// 67
Conheça o Movile Tech Conteúdo de Tech para Tech, criado por engenheiros de todas as empresas do Grupo. Artigos educativos sobre as tecnologias que as empresas utilizam. Cases com os principais desafios e soluções.
acesse: movile.blog
iMasters #27 Agosto 2018
68 // POR FALAR EM DEV...
Sou programador. Por que devo entender o negócio? Por Diego Pinho, Cofundador da Code Prestige
C
Com a quarta revolução industrial, a Internet se tornou o principal meio de comunicação entre as pessoas. Isso é muito fácil de notar, basta perceber o número de pessoas que andam com os seus celulares na mão respondendo a mensagens, lendo artigos e notícias, acessando as suas redes sociais etc. No entanto, não somente a comunicação quebrou barreiras, mas como o conhecimento também. O que antes era exclusivo de poucos que podiam pagar no mundo acadêmico se tornou público e acessível. Isso até hoje ajuda muita gente que deseja entrar na área, afinal, há inúmeras formas de aprender sobre programação na rede, o que é maravilhoso. Mas, apesar disso, conversando com meus amigos e amigas, colegas de trabalho, pessoas que atuam no mercado de tecnologia como empregadores e empregados e com programadores e programadoras em geral através das redes sociais e por meio de encontros em meetups e eventos, notei uma tendência preocupante nessa nova geração de profissionais: a de negligenciar o negócio. Para contextualizar o ponto em que quero chegar, vou utilizar a minha própria experiência. Há alguns anos, trabalhei em uma empresa de healthcare. Em resumo, essa empresa desenvolvia soluções web para laboratórios, clínicas e hospitais de todos os portes. Ha-
iMasters #27 Agosto 2018
via soluções para medicina diagnóstica, gestão laboratorial, diagnóstico por imagem, logística e afins. Quando eu comecei, mal sabia o que estava fazendo. Somente codificava funcionalidades e telas de acordo com as especificações que eram passadas nas histórias (Scrum). Mas, com o tempo, fui promovido como Scrum Master e comecei a lidar mais diretamente com os clientes, os produtos e suas integrações. E foi aí que o bicho começou a pegar… Para começar, eu tinha uma dificuldade tremenda para atender aos suportes (problemas em produção) e alterar as integrações. Isso porque eu não entendia nada sobre como o negócio e as coisas deveriam funcionar. “Será que faz sentido um exame do tipo X estar agrupado com um do tipo Y?”, “Um documento desse tipo pode ser exibido na Internet?”, “Os valores padrões de visualização estão corretos?”. E como você faz quando está com todas essas dúvidas enquanto o paciente está lá esperando ou quando você está muito próximo do deadline do projeto? Outra coisa que começou a acontecer muito foram reclamações sobre os layouts e os fluxos das telas. Era comum escutar coisas assim do cliente: “Mas os médicos não precisam aprovar procedimento X para fazer Y”, “Os médicos estão tendo que acessar muitas telas para liberar o exame”, “Os pacien-
// 69
tes não conseguem acessar os exames, está confuso”. Ou seja, como eu não entendia o negócio, não fazia ideia de como fazer as telas e os fluxos de maneira que fizessem mais sentido ao dia a dia dos profissionais que iriam usar. Em resumo: usabilidade e UX. Enfim, chegou um momento em que finalmente caiu a ficha: apesar de saber programar bem, eu não atendia de forma satisfatória às demandas dos clientes. Depois que essa ficha caiu, consegui tomar algumas atitudes para melhorar esse meu lado não técnico. Óbvio que não consegui fazer isso da noite para o dia, mas algumas simples atitudes ajudaram muito, como: Conversar mais com o meu gerente/ líder: mostrei interesse em me aproximar da área de negócios. Com isso, ele começou a abrir espaço para que eu participasse de mais reuniões com os clientes. Ler sobre o assunto: um aspecto importante é sempre a leitura. A área médica é bastante ampla e complexa, mas me dediquei a aprender o máximo que pude sobre os procedimentos em que eu atuava. Não fugir dos problemas em produção: muitos dos problemas em produção, como foi citado, aconteceram por que eu e minha equipe não compreendíamos como o usuário pensa. Quando essas situações aconteciam, comecei a usá-las como experiência para aprender mais sobre o meu cliente e o negócio como um todo.
Vejo toda essa situação pela qual passei se repetir cada vez mais no marcado brasileiro, principalmente... A empolgação de aprender algo novo nos desvia do verdadeiro objetivo de agregar valor ao cliente. Isso acaba se resultando em projetos subestimados, atrasados e caros. Acredite, em grande parte dos casos, não vai interessar para o cliente se você utilizou tecnologia X ou Y, mas sim se você conseguiu resolver o problema de forma eficaz. Ao alinhar o seu conhecimento técnico ao conhecimento de como o negócio em que você atua funciona, você conseguirá: Entregar demandas com mais qualidade Fazer melhores sugestões/críticas sobre os pedidos do cliente Ter menos retrabalho, pois você errará menos Atender de forma mais satisfatória o seu cliente, pois você irá otimizar o processo de trabalho dele A mensagem que quero passar se resume na seguinte frase: jamais deixe de aprender e se divertir no trabalho, mas, como profissional, se preocupe sempre em atender o cliente de forma precisa e no contexto em que ele vive, e não com o que você quer fazer/usar no projeto.
Diego Pinho é 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.
diegomartinsdepinho1992@ gmail.com iMasters #27 Agosto 2018
70 // DESENVOLVIMENTO
INSTRUMENTAÇÃO DE SERVIÇOS COM MICROMETER, SPRING BOOT E KOTLIN Por Rafael Grisotto, Desenvolvedor backend na Wavy e Lucy Narita, Desenvolvedora na Wavy Sexta-feira à tarde. Depois de um dia de trabalho normal, está chegando a hora de arrumar as coisas e ir embora para casa, quando, pelo canto dos olhos, Enzo avista aquela temida notificação no chat da empresa: “Estamos tendo algum problema na plataforma?”. A pressão chega quase a abaixar e o suor começa a ficar frio. Mais uma mensagem no inbox: “A fila não está conseguindo escoar. Estamos com 100k mensagens e só aumentando”. Sentindo o desespero bater, os dedos correm pelo teclado. Os logs indicam que a aplicação está de pé e consumindo mensagens da fila. “Deve ser algo pontual.”, o coração acalma, “A fila logo vai estar zerada”. Alguns minutos depois, e nada acontece. A fila continua a crescer. A aplicação continua a consumir... E os ícones vermelhos notificando novas mensagens ficam cada vez mais agressivos aos olhos. Tem algo (muito) errado, mas o que será? Vários tails, greps, tops e revisões do código depois, vem a luz no fim do túnel: “O tempo de resposta da minha API está na grandeza de segundos!”. Infelizmente, a real pergunta fica no ar: “Mas por quê?”. A história acima é fictícia, mas para alguns pode ter sido uma experiência real (e não queremos nem falar do estresse envolvido). Diferentemente do que você pode estar imaginando, o tema deste artigo não é como escrever sistemas real-time altamente performáticos e com tempos de resposta baixíssimos, mesmo com um número enorme de eventos e dados trafegados. Em tempos em que “Agile” é mais do que uma buzzword e que o tempo de (re)ação e a eficiência iMasters #27 Agosto 2018
custam dinheiro, saber identificar o problema de forma rápida e precisa é essencial. Por isso é importante oferecer formas de monitoramento e visualização para poder discernir qual parte da sua aplicação precisa de melhorias mais urgentes. Se Enzo tivesse seguido esse princípio, teria tido menos dificuldade em identificar o problema e poderia tê-lo solucionado muito mais rapidamente, diminuindo seu impacto drasticamente. Existem três principais formas de se visualizar uma plataforma: Logs: o que está acontecendo agora? Métricas: dado o que aconteceu, qual a tendência para esse momento? Tracing: em uma plataforma com diversos sistemas ou muita troca de contexto (microservices/async services), o que está acontecendo enquanto eles interagem entre si? Nenhuma delas é menos importante que a outra, mas este artigo procura focar na segunda forma. Coletar e expor métricas significativas de sua aplicação não precisa ser difícil. Há diversos jeitos de se fazer isso atualmente, e queremos apresentar um dos modos como fazemos isso aqui na Movile: utilizando Micrometer e Prometheus em aplicações Spring Boot. A ideia do Spring Boot é você criar aplicações completas com o mínimo ou zero de configuração
// 71 de dependências e de forma fácil - promover rápida evolução da sua aplicação para produção, incluir suporte para funcionalidades que são comuns sem geração de código e sem arquivos de XML. Prometheus é uma plataforma de monitoramento open source que foca em confiabilidade e simplicidade. Com sua própria linguagem de consulta altamente flexível e relativamente fácil de aprender, pode ser utilizado para montar gráficos referentes à sua aplicação e para criar alertas. Sendo baseado em um modelo “pull”, ele busca dados pelos targets configurados, em vez de receber a informação através de agentes instalados no sistema a ser monitorado. Micrometer é uma biblioteca de instrumentação de métricas. Ela disponibiliza uma coleção de facades com o intuito de observar medidas como tempo, contagem e calibração do seu código. Incluída por padrão no Spring Boot 2 e recentemente portada para o Spring Boot 1.5, 1.4, e 1.3, adiciona primitivas de métricas poderosas como: Timer, Counter, Gauge, Distribution Summary, Long Task Timer, Function Counter, Function Timer e Time Gauge. A partir das métricas fundamentais, podemos construir as demais, por isso é importante entender estas mais a fundo: Counter: Contador que faz apuração em regiões específicas do código. Usada como ponto de partida para métricas mais complexas; Gauge: Identificador para obter o valor atual. Por exemplo, usado para obter a quantidade de threads em execução. Assim como o counter, os gauges são métricas fundamentais e já existiam no Spring Boot; Timer: Instrumentação que faz medidas de latências de curta duração e da frequência de cada evento. Reporta o tempo total e também a quantidade de eventos como séries temporais. Para mostrar como isso tudo é integrado a uma aplicação Spring Boot (em Kotlin!), criamos o seguinte exemplo: https://github.com/Movile/imasters-sample-project. Para a coleta do conjunto de medidas sobre sua aplicação, utilizamos o MeterRegistry. Para configurá-lo, podemos criar uma classe de configuração do Spring definindo-se o bean MeterRegistryCustomizer, a fim de garantir o funcionamento apropriado junto ao AutoConfiguration do Spring Boot.
EM TEMPOS EM QUE “AGILE” É MAIS DO QUE UMA BUZZWORD E QUE O TEMPO DE (RE)AÇÃO E A EFICIÊNCIA CUSTAM DINHEIRO, SABER IDENTIFICAR O PROBLEMA DE FORMA RÁPIDA E PRECISA É ESSENCIAL
Segue abaixo a classe MetricsConfiguration que usamos no nosso exemplo: @Configuration class MetricsConfiguration { @Bean fun metricsCommonTags(): MeterRegistr yCustomizer<MeterRegistry> { return MeterRegistryCustomizer { registry -> registry.config() .meterFilter(MeterFilter.deny { id -> val uri = id.getTag(“uri”) uri != null && (listOf(“swagger”, “actuator”).map { uri. startsWith(“/${it}”) }.any { it }) }) .meterFilter(MeterFilter. denyNameStartsWith(“tomcat”)) } }}
Nessa classe, redefinimos o registry.config e utilizamos o meterFilter, que filtra caminhos de URI para remover locais em que métricas não são relevantes. O usamos para ignorar os caminhos /swagger e /actuator e também qualquer métrica gerada com o nome começando com tomcat. iMasters #27 Agosto 2018
72 // DESENVOLVIMENTO
Para extrair métricas sobre taxa e tempo de resposta de algum método, podemos utilizar o seguinte código: val meterRegistry: MeterRegistry = ... val sampleTimer = Timer. start(meterRegistry) someMethod() sampleTimer.stop(meterRegistry. timer(“timer”, “tag”, “your-tag”))
Ou simplesmente utilizar a anotação @Timed: @RestController @RequestMapping(“/sleep”) class SleepResource(@ Value(“\${resources.sleep.min}”) val min: Long, @Value(“\${resources. sleep.max}”) val max: Long) { companion object { val logger = LoggerFactory. getLogger(SleepResource::class.java) } @Timed() @GetMapping fun sleep() = future { val random = ThreadLocalRandom. current() val sleep = random.nextLong(min, max) logger.debug(“Sleeping for {}ms”, sleep) // (。-ω-)zzz sleeps, don’t do this in production delay(sleep, TimeUnit.MILLISECONDS) sleep } }
No Spring Boot, todos os métodos que servem requisições são medidos por padrão, mesmo sem iMasters #27 Agosto 2018
anotá-los com @Timed, e aparecem com o nome de http.server.requests. Para simular uma API sobrecarregada, ou que possui um tempo médio de resposta relativamente alto, criamos um endpoint que faz um processamento simples por um tempo aleatório, como é possível ver no código exemplificado anteriormente. Para observar as métricas já na formatação utilizada pelo Prometheus, acesse o link http://localhost:8080/actuator/prometheus Observe que, após acessar o caminho /v1/delay, foram geradas métricas referentes às requisições, sendo uma delas com os seguintes parâmetros e valores: Para o caso acima, temos o caminho /v1/delay com retorno 200 que foi acessado três vezes. Em uma aplicação, as métricas mais importantes para se monitorar são: latência, tráfego, taxa de erros e saturação (de recursos). Como foi possível ver, métricas são importantes, fáceis de integrar a uma aplicação nova ou já existente, apresentam novas formas de visualizar a performance e o estado do sistema. O conceito apresentado por este artigo passa longe de ser inovador e bleeding edge, mas é sempre importante ressaltar como uma aplicação bem monitorada pode melhorar o tempo de resposta do time em momentos críticos, agregando valor ao serviço e melhorando o relacionamento com o cliente. Então por que não tentar ainda hoje?
Rafael Grisotto é desenvolvedor backend na Wavy. Seus interesses são Algoritmos, Teoria da Computação e Sistemas Distribuídos. Rafael é bacharel em Ciência da Computação pela UFG e Mestrando em Teoria da Computação na Unicamp.
Lucy Narita é estudante de Ciência da Computação na UNICAMP e desenvolvedora na Wavy, uma empresa do Grupo Movile. Pode não ser capaz de salvar o mundo sozinha, mas gosta de pensar que está trabalhando duro para fazer a vida de 1 bilhão de pessoas melhor.
DROPS DO MERCADO
// 73
JUNTESE À PLATAFORMA COM MAIS DE
200.000 PROFISSIONAIS WEB EM MAIS DE 200 PAÍSES. Ferramentas de gerenciamento financeiro, de clientes e pedidos. Integração API fácil. Preços competitivos e promoções durante o ano todo. Venda mais de 800 produtos - Domínios, Hospedagens, E-mail, Segurança e mais! Loja pronta personalizável e gratuita. Suporte 24x7
COMPRE HOSPEDAGEM EM SUA CONTA DE REVENDEDOR
+55 11 3010 35555
|
br@resellerclub.com
|
br.resellerclub.com
iMasters #27 Agosto 2018
74 //
COMUNIDADES Por dentro do Campinas Front-End Por Rodrigo PokemaoBr, para Revista iMasters O Campinas Front-End (http://campinas frontend.com.br) nasceu em 2015, idealizado inicialmente pelo Victor Miguez, Gabriel Ribeiro e Rodolfo Pereira. Os três sentiam falta de uma comunidade ativa na cidade, para que pudessem compartilhar conhecimento e aprendizados. O primeiro encontro aconteceu na agência Princiweb, e logo foi perceptível parar os três que a comunidade se envolveu e abraçou a ideia dos encontros regulares. As atividades começaram com meetups no formato de palestras, com o momento para as perguntas ao final. Com o passar do tempo, a comunidade foi abrangendo atividades mais diferentes, que trouxessem um maior aprendizado como os dojos, rodas de discussões e até minicursos. Os eventos acontecem pelo menos uma vez por mês. A comunidade também está presente nas empresas, on-
iMasters #27 Agosto 2018
de realizam encontros mensais em empresas que abrem as portas. E agora, em 2018, eles fizeram o primeiro Front in Campinas. “E foi um sucesso!”, concluiu um dos fundadores, Gabriel Ribeiro. Outro ponto interessante do Campinas Front-End é que qualquer pessoa que sinta a necessidade de fazer um evento relacionado a front-end pode organizar através da comunidade. “Não existe uma hierarquia nem ‘donos da comunidade’, todos podem colaborar na organização e isso fortalece nossa comunidade” pontuou Gabriel. A comunidade também é parceira na organização do Minha Campinas, promovendo encontros para ajudá-los em alguns projetos de tecnologia cívica, como o Vota Campinas (http://votacampinas.org.br/) e o Vota SP (https://github.com/minhacps/votasp). Perguntado sobre a importância do Campinas Front-End para a região, Gabriel pontuou que ela é um ponto importante para concentrar o fomento e a troca de conhecimento no assunto aqui na região. “É um de nossos valores ajudar aqueles que estão começando suas carreiras, e ajudar aqueles que já estão inseridos no mercado, mas encontram barreiras para progredir”.
// 75
iMasters #27 Agosto 2018
76 // DA REDAÇÃO
O mundo open source nunca esteve tão forte Por Reinaldo Silotto, para Revista iMasters
N
No último mês de maio, desenvolvedores de cada canto do planeta foram pegos de assalto com a notícia da compra do GitHub pela Microsoft. Essa notícia foi apenas a confirmação de que o mundo do desenvolvimento de soluções de código aberto nunca esteve tão forte. Segundo projeções do site “statista. com”, a receita gerada por serviços de código aberto em 2020 será de mais de US$ 32 bilhões, algo no mínimo incrível. Voltando ao GitHub, entre os meses de setembro de 2016 e setembro de 2017, foram mais de 1 bilhão de commits públicos, sendo que nesse mesmo período estavam ativos mais de 25 milhões de repositórios (fonte: https:// octoverse.github.com). De acordo com essa mesma fonte, só no Brasil são mais de 1 milhão de contas/usuários que utilizam o GitHub para compartilhar ou participar de projetos open source. Até aqui, só falei do GitHub, mas existem muitos outros portais para compartilhar código aberto, como GitLab, BitBucket e SourceForge, este último inclusive muito utilizado por empresas baseadas no desenvolvimento de soluções open source.
iMasters #27 Agosto 2018
Os mais populares Segundo um levantamento do próprio GitHub, as linguagens com mais aplicações na plataforma são JavaScript, Python, Java, Ruby e PHP. Por outro lado, nem só de código vivem os repositórios. Muitos profissionais utilizam essas plataformas como um local para compartilhar links e divulgar seus trabalhos recentes, uma forma de mostrar seu conhecimento em determinada tecnologia. Links em destaque Todos os portais para hospedagem de aplicações de código aberto possuem uma lista de repositórios em destaque, mas existem alguns que realmente são úteis e importantes, por isso eles devem fazer parte deste artigo. Ao lado, listo alguns dos projetos que considero que valem a pena ser visitados, compartilhados e principalmente seguidos. Lembrando que desde o dia da escrita deste texto até agora, eles podem ter sofrido algum tipo de alteração.
// 77
Electron A ideia é muito simples: ajudar na criação de novos aplicativos para Windows, Mac OS e Linux através do uso de tecnologias abertas como HTML, CSS e JavaScript. Link: https://github.com/electron/ electron Wiki.js O Wiki.js é uma aplicação NodeJS para criação de Wikis com recursos completos para edição e compartilhamento, além de criação conjunta de autores. Link: https://github.com/Requarks/wiki BotPress Meu preferido, tanto que já fiz alguns workshops demonstrando o BotPress. A ideia aqui é disponibilizar uma plataforma completa para criação e desenvolvimento de chatbots, tudo através de uma interface gráfica amigável. Link: https://github.com/botpress/ botpress Menção honrosa - Build your own X Este é um projeto muito legal, mesmo não sendo um repositório para códigos. A ideia é listar links para diversos tutoriais, de várias tecnologias e linguagens. Por ser aberto, qualquer pessoa pode contribuir com novos links. Se você quer aprender algo novo, este é o local indicado! Link: https://github.com/ danistefanovic/build-your-own-x iMasters #27 Agosto 2018
78 // CÓDIGO ABERTO
Blockchain Applications Por Kemel Zaidan, Gerente de Desenvolvimento na Nuveo
B
Blockchain (ou cadeia de blocos) é a estrutura de dados distribuída que surgiu com a criação do Bitcoin. Ela é parte essencial do funcionamento dessa moeda digital que tem ganhado cada vez mais fama com o passar dos anos. Contudo, seus usos podem ir muito além de aplicações financeiras e moedas digitais. Algumas das vantagens de aplicações baseadas em blockchain é que elas são distribuídas (peer-to-peer), não necessitam de servidores (serverless), são facilmente escaláveis e altamente resilientes, e não podem ser facilmente tiradas do ar. Conheça algumas aplicações interessantes que estão sendo construídas com base nessa tecnologia.
Synereo (Apache2): o Synereo é uma plataforma de monetização online que permite remunerar os criadores de conteúdo digital em um esquema semelhante aos programas de filiados, em que é gerado um link personalizado para determinado conteúdo. A diferença é que os links não expiram nunca e tanto quem criou quanto quem divulgou o conteúdo passam a ser remunerados através de uma moeda digital chamada AMP. Link: https://www.synereo.com
OpenBazaar (MIT): se você acha que as taxas cobradas por marketplaces como Mercado Livre e eBay são muito altas, então dê uma chance para o OpenBazaar, uma plataforma de e-commerce distribuída e baseada em blockchain em que qualquer um pode comprar e vender produtos livremente, realizando pagamentos com Bitcoin, Bitcoin Cash ou ZCash.
Filecoin (MIT): que tal alugar o espaço vago no seu hard drive e ganhar algum dinheiro em troca? Ao fazer isso, você estará minerando Filecoins que podem, mais tarde, ser convertidas em outras moedas digitais como o Bitcoin ou mesmo dinheiro vivo. Em contrapartida, aqueles que precisam de mais espaço de armazenamento encontram uma opção segura e barata, já que os seus arquivos são replicados inúmeras vezes na rede do serviço e criptografados com uma chave privada que só o dono dos arquivos possui.
Link: https://www.openbazaar.org
Link: https://filecoin.io
iMasters #27 Agosto 2018
// 79
Namecoin (MIT): trata-se de uma alternativa descentralizada ao DNS, na qual os registros de nomes de domínio são armazenados no blockchain e as requisições de endereços resolvidas por mineradores que recebem algumas moedas digitais pelo serviço (Namecoins). Essas moedas podem, por sua vez, ser utilizadas para renovar e registrar novos domínios na rede. A vantagem desse sistema é que por ser distribuído e criptografado, ele evita a censura através de DNS (como foi o caso do Wikileaks) e ataques do tipo man-inthe-middle. Link: https://namecoin.org Bitmessage (MIT): o Bitmessage é um serviço de envio de mensagens P2P de forma privada e segura, no qual as mensagens enviadas são criptografadas por padrão com a chave criada a partir do endereço das contas na rede, como acontece com as carteiras do Bitcoin. É possível enviar mensagens offline, porém elas ficam armazenadas no blockchain por apenas dois dias. Depois disso, as mensagens são apagadas e não é mais possível ter acesso a elas. Link: https://bitmessage.org
Kemel Zaidan é um pseudoprogramador, metido a jornalista, com alma de artista e Gerente de Desenvolvimento na Nuveo.
kemelzaidan@gmail.com iMasters #27 Agosto 2018
O 7Masters é nosso encontro mensal de especialistas. Toda última quarta-feira do mês, reunimos 7 mestres de um determinado tema que, durante 7 minutos, expõem para os participantes sua experiência e vivência com o assunto da vez. Os temas são definidos pela equipe de conteúdo do iMasters. Se quiser fazer sugestão de tema ou palestrante, escreva para setemasters@imasters.com.br. Confira o que rolou nas edições passadas e quais ainda estão por vir em: setemasters. imasters.com.br.
A edição de março superou as expectativas de público, de debate e de nível dos nossos mestres. Não quer perder o próximo? Fique atento à nossa agenda e se inscreva no nosso site. Confira o que aconteceu:
Ravan Scafi falou sobre APIs com Laravel na edição do 7Masters que tratou sobre o tema. Ele é desenvolvedor back-end na Leroy Merlin Brasile e também é co-organizador do meetup do Laravel SP. https://bit.ly/2Mn2vKc
Desenvolvedor Full Stack no iMasters, Alef Souza teve como tema na sua palestra no 7Masters Laravel “Pug, uma alternativa ao Blade template”. Confira! https://bit.ly/2t1ExLK
“Testing” foi o tema da palestra de Matheus Marabesi no 7Masters Laravel. Ele é mestrando em Engenharia da Computação, autor do livro Zend Certified Engineer – Descomplicando a certificação PHP, e conseguiu sua primeira certificação ZCPE em 2015. https://bit.ly/2y1K22C
Fabio Vedovelli falou no 7Masters Laravel sobre a relação entre Laravel e front-end. Fabio é desenvolvedor front e back-end com PHP (Laravel) e JavaScript (Vue.js e React). https://bit.ly/2t3yh67
iMasters #27 Agosto 2018
Gabriel Machado é desenvolvedor web e instrutor. Trabalha com frameworks como Codeigniter e Laravel e é certificado em PHP (Zend Certified PHP Engineer), SQL Server (MCSA em SQL Server 2012/2014 e 2016) e ITIL v3. Em sua palestra no 7Masters, ele explanou sobre os Logs no Laravel 5.6. https://bit.ly/2JzeWow
Mariana Gomes é engenheira de software e evangelista PHPWomenBr. Em sua talk no 7Masters Laravel, ela falou sobre o Laradock: o que é, como e para que funciona e quais as vantagens do seu uso. https://bit.ly/2JN7WUo
Desenvolvedora backend, Marcela Godoy já passou por várias áreas da TI, iniciando como Game Tester, pegando atalho no Design/UX e finalmente caindo no mundo do desenvolvimento. No 7Masters Laravel, ela falou sobre o monitoramento de filas com Laravel Horizon. https://bit.ly/2sTl6VW
// 81
DROPS DO MERCADO
>> Programa_de_Parceiros_do_UOL_HOST
for ( +indicacoes ) { return $$$$; }
Para mais detalhes, vamos descodificar:
PROGRAMA DE PARCEIROS DO
host
Quanto mais você indicar, mais vai receber. Utilize o Criador de Sites do UOL HOST para desenvolver os projetos de seus clientes e tenha benefícios exclusivos.
Como funciona?
Seu cliente quer criar um site
Você desenvolve e hospeda o projeto no UOL HOST
COMISSÃO
ESPECIAL
40
%
POR VENDA
S 3 PRIMEIRO
MESES
Pronto, você receberá sua comissão e indicações
Algumas vantagens do Criador de Sites do UOL HOST: Hospedagem inclusa
Fale com um especialista:
Administração por celular
atendimento_parceiro@uolinc.com
Ou acesse:
Possibilidade de edição do código
iMasters #27 Agosto 2018
uol.com.br/parceirosimasters
82 // POR AÍ
POR AÍ BRASILEIRO USA BLOCKCHAIN E DESENVOLVE SISTEMA DE DEFESA COOPERATIVO NA UNIVERSIDADE DE ZURIQUE Bruno Rodrigues é assistente de pesquisa e aluno de doutorado da Universidade de Zurique. Por lá, ele se destacou recentemente por anunciar o desenvolvimento do Blockchain Signaling System em seu Ph.D. Trata-se de um sistema de defesa cooperativo que permite simplificar a sinalização de ataques, bem como a troca de incentivos para realizar a mitigação de ataques. A ideia de Rodrigues é que o sistema passe a atuar como um marketplace de defesa sob demanda, envolvendo organizações alinhadas com o mesmo objetivo de criar uma rede protetora. O sistema pode ajudar empresas e indústrias a se protegerem dos ataques DDoS. “Cabe observar que para muitas indústrias/empresas a imagem pública pode representar um ativo muito mais valioso do que um período de indisponibilidade e, portanto, existe a necessidade da criação de uma aliança com objetivos claros e bem definidos entre seus membros”. Devido ao seu projeto, Bruno foi um dos convidados para palestrar no Cyber Security Summit Brasil 2018, em São Paulo. Ele ainda prometeu levantar uma discussão para expandir a visão sobre blockchain em relação aos conceitos básicos, dissociando a percepção geral de blockchain da área financeira. “Em seguida, pretendo aprofundar a explicação em uma aplicação específica para a área de segurança - o sistema que é o meu tema de pesquisa - para que seja possível fomentar a ideia de novos casos e aplicações de blockchain na área de segurança”, afirmou.
iMasters #27 Agosto 2018
// 83
ZARPSYSTEM SOLUÇÕES PARA FACILITAR A VIDA DAS PESSOAS Com mais de 15 anos de experiência e domínio das principais linguagens de programação do mercado, a ZarpSystem atende clientes em diversas áreas, destaque para Trade Marketing com produtos inovadores que auxiliam as estratégias de marketing e vendas e a área da Saúde e Odontologia, onde atende os principais players do mercado com soluções e aplicações mobile, com produtos premiados. Recentemente a ZarpSystem recebeu o prêmio OdontoPrev Fornecedores 2017, vencendo em 1º lugar em duas categorias: Sustentação e Desenvolvimento de Sistemas.
Inove seu Negócio com a ZarpSystem. 16
3307•6809
contato@zarpsystem.com.br zarpsystem.com.br
Unidades: • Araraquara • Barueri Agosto 2018 • SãoiMasters Carlos#27 • São Paulo
84 // POR DENTRO DO W3C
OFERECIMENTO
MANTENEDORES
iMasters #27 Agosto 2018