// NOVEMBRO 2018
R$24,00
1 // POR DENTRO DO W3C
// ANO 07
// EDIÇÃO 28 > FRAMEWORK-AGNOSTIC CODE
FRAMEWORK
AGNOSTIC
CODE
26
50
Ricardo Ogliari pensa sobre a relação entre o Google e os 5 sentidos
Entenda as dificuldades de implementação de um jogo multiplayer em rede
mobilidade é tudo
iMasters #28 Novembro 2018
GAME
68
DA REDAÇÃO
Nossa equipe te lembra a importância dos eventos de TI para a carreira dev
2 // POR DENTRO DO W3C
iMasters #28 Novembro 2018
// 3
EDITORIAL
U
ULTIMA EDIÇÃO DE 2017. QUANTA COISA ACONTECEU... E FINALIZAMOS MAIS UM ANO EDITORIAL DA REVISTA IMASTERS CHEIOS DE ORGULHO DO QUE ENTREGAMOS A VOCÊ, LEITOR. E muito gratos, claro, a cada um que colaborou nessas quatro edições. Não temos como expressar nosso muito obrigado! E para encerrar o ano com chave de ouro, Lucas Mendes ficou por conta da nossa capa para tratar de componentização. E nas palavras do próprio, “frameworks são ferramentas extremamente poderosas, desde que usadas com sabedoria e responsabilidade”. Você concorda? Diana Arnos trouxe um debate importante sobre mentoria e tutorização. Você conhece a diferença? Sabe de que lado você está nessa? Se o seu negócio é compartilhar informação e ajudar a comunidade, não deixe de ler! Com a compra do GitHub, nosso colunista, Kemel Zaidan, trouxe opções open source para você, dev. Confira! Rafael Dantas tratou dos CSS Shapes e João Bergamo, das dificuldades de implementação de um jogo multiplayer em rede. Na sessão Comunidades, conheça o Afrophyton, que trabalha pela inclusão de negros no mundo da tecnologia e do desenvolvimento. Afinal, representatividade importa! Esperamos que você goste e consiga absorver tudo que trouxemos. Nos vemos em 2019!
Abraços e até a próxima! Mariana Anselmo Editora da Revista iMasters www.imasters.com.br | redacao@imasters.com.br
iMasters #28 Novembro 2018
4 // EXPEDIENTE
// NOVEMBRO 2018
// ANO 07
// EDIÇÃO 28 > F R A M E W O R K - A GNOSTIC CODE
Tiago Baeta Publisher
CORPO EDITORIAL
Mariana Anselmo (MTB 0083858/SP) Jornalista Responsável Mariana Anselmo Editor
Mariana Anselmo Editor Nathália Torezani Revisão
Rodrigo PokemãoBr Conteúdo
Nathália Torezani Revisão Alessandro Huber dos Santos, Alex Lattaro, Bruna Freitas, Diana Arnos, Diego Pinho, João Bergamo, Guilherme Pereira, Kemel Zaidan, Lucas Mendes, Rafael Dantas, Reinaldo Ferraz, Renato Rodrigues Oliveira da Silva e Ricardo Ogliari Colaboradores Zupi Projeto Gráfico e Diagramação Eskenazi Indústria Gráfica Gráfica
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 #28 Novembro 2018
prévia autorização dos autores ou dos editores da publicação.
DROPS DO TECNOLOGIA M E R CNEGÓCIOS AINOVAÇÃO DO
// 5
C U R S O S D E C U R TA D U R A Ç Ã O
CHATBOTS: DO ZERO AO COGNITIVO
TOGAF FOUNDATION NÍVEL 1
MINDFUL LEADERSHIP
BITCOIN E BLOCKCHAIN
EVERYONE CAN CODE PROGRAMAÇÃO IOS PARA EDUCADORES
BIG DATA SCIENCE MACHINE LEARNING E DATA MINING
CREATING DASHBOARDS FOR B.I.
MICROSERVICES: KAFKA, API GATEWAY & SERVICE MESH
UX - CREATING KILLER EXPERIENCES
DESIGN SPRINTS
INTELIGÊNCIA COMPETITIVA E COGNITIVA - IBM CLOUD E WATSON
BIG DATA COM ECOSSISTEMA HADOOP E SPARK
E MAIS 50 CURSOS ACESSE O NOVO:
www.fiap.com.br/shift
iMasters #28 Novembro 2018
6 //
COLUNAS 26
Ricardo Ogliari MOBILIDADE É TUDO Google e os cinco sentidos
SUMÁRIO
28
18
Reinaldo Ferraz W3C Thing description: um manifesto para aplicações de Internet das Coisas
Guilherme Pereira DESIGN SPRINTS
A centricidade do consumidor no processo de desenvolvimento de negócios e as diferentes abordagens para a criação de valor
44
Alex Lattaro INTELIGÊNCIA NADA ARTIFICIAL Inteligência artificial, algoritmos e cidades inteligentes - uma aplicação na realidade nacional
58
Diego Pinho FALANDO EM DEV... Quer programar melhor? Então saia da frente do computador
14
Bruna Escudelario NODE.JS
Executando o PM2 e o Node.js em ambientes de produção
66
Kemel Zaidan CÓDIGO ABERTO Alternativas ao Github
68
Rodrigo Pokemão DA REDAÇÃO A importância dos eventos de TI para a carreira dev
iMasters #28 Novembro 2018
30
Alessandro Huber dos Santos VARNISH
Avaliando a fundo a performance do Varnish Cache através de seus logs
// 7
SEÇÕES
64
40
COMUNIDADES O Afropython mostra que até na tecnologia representatividade importa, sim!
Rafael Dantas CSS SHAPES
CSS Shapes – muito mais que retângulos ou quadrados
50
João Bergamo
72
7MASTERS Encontro iMasters de especialistas
54
Renato Rodrigues Oliveira da Silva
GAME
As dificuldades de implementação de um jogo multiplayer em rede
PROJEÇÕES
34 Lucas Mendes
CAPA Framework-agnostic Code
Exploração de conjuntos de dados por meio de projeções multidimensionais
ENTREVISTA com Danielle Monteiro
60
8
TUTORIZAÇÃO
A vida e os desafios de uma DBA
Diana Arnos
Mentoria e tutorização: precisamos conversar
iMasters #28 Novembro 2018
8 // ENTREVISTA
A vida e os desafios de uma DBA Rodrigo PokemaoBr, para revista iMasters
D
Danielle Monteiro é mestre em Engenharia da Computação, Microsoft MVP e MongoDB Female Innovator, além de colunista do iMasters. Mas, de acordo com a própria, o que melhor a representa é a definição do seu chefe “um espírito inquieto!”. Danielle começou a trabalhar com tecnologia no segundo semestre da faculdade. Era desenvolvedora e, apesar de adorar o que fazia, alega que a transição para a área de dados foi natural. Quando conheceu o SQL Server 2005, se apaixonou! Hoje, ela trabalha com arquitetura de dados e participa de diversas comunidades, ministra treinamentos, escreve artigos e mantém um blog, o DB4Beginners.com. Se mantém inquieta! Nesta entrevista, ela fala mais sobre a atuação dos arquitetos de bancos de dados, a (às vezes conturbada) relação desses profissionais com desenvolvedores e sobre o mercado em questão.
Revista iMasters: Como arquiteta de dados, qual é o seu maior desafio quando falamos da dificuldade de gerir essa enorme quantidade informações? Daniele Monteiro: São vários os desafios. O maior deles é ter governança de dados e agilidade (ao mesmo tempo e em igual proporção). Outro é conhecer a linhagem dos dados mesmo tendo uma quantidade enorme de sistemas e integrações; Tamém é importante (e difícil) garantir a segurança e integridade em bancos de dados NoSQL. E por fim, mas não menos importante, estar aderente às leis cada vez mais rígidas, como a GDPR e a Lei Geral de Proteção de Dados. iMasters #28 Novembro 2018
Revista iMasters: Muitas pessoas ainda não entendem a real diferença entre banco de dados relacionais (SQL) e não relacionais (noSQL), você conseguiria traçar um perfil para cada um e onde cada tipo é melhor utilizado? Daniele Monteiro: Adorei esta pergunta! Bom, em 1970, Edgar Frank Codd, um brilhante matemático da IBM, publicou um artigo onde definia formalmente o modelo relacional. Entre os anos de 1981 e 1983, a IBM vendeu os primeiros bancos de dados relacionais. Neste momento, o modelo relacional já era bem popular e eu me arrisco a dizer que trazia tanta euforia quanto os bancos de dados NoSQL trazem hoje.
// 9
O hardware era caro e os dados redundantes aumentariam muito o custo dos sistemas. Por isso, a opção mais prudente e sábia era normalizar os dados. E aqui, entenda normalização como “um conjunto de regras que visa, principalmente, a organização de um projeto de banco de dados para reduzir a redundância de dados, aumentar a integridade e o desempenho. Quando usamos um banco de dados relacional, a linguagem SQL é o padrão para consultas. Os dados são armazenados em tabelas (linhas e colunas bem definidas) e costumam ser normalizados, terem integridade referencial, e as consultas normalmente fazem a junção (JOIN) de dados armazenados em diversas tabelas. O termo NoSQL foi utilizado no início de 2009 para nomear um evento que discutiria bancos de dados open source e distribuídos. NoSQL é o agrupamento de um conjunto de bancos de dados não relacionais, sem esquema, executados em clusters, e que (em sua maioria) não utilizam a linguagem SQL para consultas. Além disso, os dados estão organizados de outras formas diferentes de linhas e colunas, e uma boa prática é ter em um único objeto (por exemplo um documento JSON) toda a informação necessária, ou seja, as junções de dados não são recomendadas, porque com o barateamento do hardware a redundância de dados (desde que controlada) deixou de ser um ofensor, e os Joins podem ser um problema quando o volume de dados é muito grande. De acordo com a organização dos dados, podemos categorizar os banco de dados NoSQL em 4 grandes grupos:
• Key-Value • Redis é o banco de dados key-value mais usado, as consultas são muito rápidas, utilizam a memória dos servidores e as pesquisas são feitas somente nas chaves. São fantásticos para cache, fila, mensageira, e normalmente usados como mecanismo de armazenamento secundário.
∂ Figura 1- Estrutura de dados em um banco de dados Key-value
iMasters #28 Novembro 2018
10 // ENTREVISTA
• Documentos
• Grafos
• O MongoDB é o banco de dados NoSQL mais usado no mundo. É fenomenal para armazenar dados semiestruturados, normalmente no formato JSON. Use-o quando a mesma entidade possui atributos diferentes. Por exemplo, um e-commerce que comercializa sofás, livros e geladeiras. Todos são produtos, mas cada um tem um conjunto diferente de atributos.
• Nesta categoria, o Neo4J é o banco de dados mais conhecido. O foco da modelagem de dados está na relação entre as informações. Este tipo de NoSQL é excelente para sistemas de indicação, detecção de fraudes e inteligência artificial.
∂ Figura 4- Exemplo de organização de um banco de dados orientado a grafos. (origem: http://micreiros.com/tipos-de∂ Figura 2- Exemplo de documento JSON
-bancos-de-dados-nosql/)
• Família de colunas
Revista iMasters: Uma questão que sempre é colocada, ainda mais quando falamos da relação entre desenvolvedores e arquitetos de dados/ DBAs é a questão de onde a regra de negócio deve ser colocada. Para você, as regras de negócio devem estar no banco de dados ou na aplicação; por quê? Daniele Monteiro: Momento rabugenta! Bancos de Dados armazenam e manipulam grandes volumes de dados. Regras de negócio devem ser tratadas na aplicação. Não é só a chatice que impera, mas devemos considerar alguns pontos, por exemplo, como as regras de negócio no banco de dados causam acoplamento; como elas dificultam a portabilidade; normalmente os desenvolvedores não conhecem profundamente a linguagem SQL e suas variações (me perdoem as exceções,
• Nesta categoria, o Cassandra é o banco de dados mais conhecido. Ele é fenomenal para a escrita de grandes volumes de dados. Nele, a redundância é aceita e permitida, e os Joins são proibidos (conselho de amiga!) Column1
Column2
Column3
Value1
Value2
Value3
Column1
Column4
Value1
Value4
Row Key1
Row Key2
∂ Figura 3- Exemplo da estrutura de dados de um banco de dados orientado a colunas
iMasters #28 Novembro 2018
// 11
mas infelizmente conheço poucos desenvolvedores com este skill); a manutenção e os testes são mais complexos e os bancos de dados não são adequados para o processamento linha a linha. Revista iMasters: Como a evolução da capacidade de armazenamento e performance dos hardwares modificaram o modo como nós armazenamos e consumimos dados atualmente? Daniele Monteiro: Eu sempre repenso a tecnologia quando converso com os meus avós. Diariamente, minha avó me manda vídeo, uma foto ou um áudio me desejando bom dia (às vezes manda tudo junto também). Recentemente, ela me mostrou o celular novo e eu perguntei se era melhor que o antigo. A resposta foi fofa: “este tem mais gigas para eu guardar as fotos de vocês”. Moral da história, a evolução do hardware aproximou a tecnologia da população não técnica. Em 1956, um HD de 4,4 MB pesava mais de meia tonelada e custava milhões de dólares. Era indispensável criar estruturas de dados que economizassem os recursos computacionais. Os primeiros bancos de dados relacionais foram comercializados nos anos 1980, um período onde o custo do HW ainda era muito alto. Por isso, normalizar os dados era tão importante; pois, na questão de custo, a redundância era cara! Hoje, temos muitos dados, e a mentalidade mudou. Existem novas linguagens, novos SGBDs, novas possibilidades que só são viáveis com novos HW. É mais caro perder um cliente do que armazenar muitos dados. A redundância que já foi a vilã, hoje pode ser aliada do desempenho almejado. Para resumir, os novos HW (mais baratos e mais potentes) nos dão novas possibilidades de armazenamento (bancos de dados relacionais, ban-
cos de dados NoSQL, data lakes etc.) e de uso (aplicativos mobile, inteligência artificial, aplicativos cliente/servidor), aumentando a nossa responsabilidade com a arquitetura das soluções, e por outro lado, possibilitando que todo tipo de pessoa tenha acesso a tecnologia. Revista iMasters: O que pode acontecer com os dados ou a performance de um servidor de banco de dados mal configurado? Já que muitos desenvolvedores apenas instalam o banco ou criam instâncias de banco sem se preocupar com as configurações do mesmo. Daniele Monteiro: Servidor de banco de dados configurado por desenvolvedor dá mini infartos nos DBAs... É preciso conhecer as características do SGBD que está sendo instalado, para que ele seja usado de forma eficiente e eficaz. Algumas tragédias que podem acontecer são: · Incidentes de segurança; · Má utilização do HW; · Desempenho inadequado; · Perda de dados; · Inconsistências. Revista iMasters: Qual a importância de sabermos o tipo de licença do banco de dados para a utilização do mesmo em uma aplicação? Daniele Monteiro: Aproveitando o gancho, preciso fazer uma observação importante - principalmente sobre os bancos de dados NoSQL. Eles não são gratuitos e são executados em servidores. Vale lembrar que, em muitos casos, a versão Community tem limitações de recursos e suporte. Voltando para a pergunta, uma licença é um documento que define os limites de uso que um usuário pode ter em relação a um software ou SGBD. iMasters #28 Novembro 2018
12 // ENTREVISTA
Não observar as licenças pode acarretar em multas, erros, limitações de recursos, problemas de desempenho e de segurança. Revista iMasters: Você é bastante ativa em várias comunidades de desenvolvimento. Entre as linguagens que você participa, qual a diferença da visão dos desenvolvedores quando falamos de banco de dados? É muito diferente a visão de acordo com a linguagem que é utilizada? Daniele Monteiro: A maioria dos desenvolvedores não gosta de banco de dados, e isso independe da comunidade. Mas posso dizer que cada comunidade tem o seu “malvado favorito”; por exemplo, PHP com MySQL, .Net com SQL Server, Java com Oracle... Revista iMasters: Recentemente, você falou sobre dados no TEDx São Paulo. Qual a dificuldade que você vê para as pessoas que não são da área de TI entenderem como funciona a relação de produção, armazenamento e consumo de dados? E qual artifício você utilizou para levar um tema tão complexo a um público não técnico. Daniele Monteiro: O TEDx São Paulo foi um enorme desafio! Nas primeiras versões da minha talk, eu estava muito insatisfeita, porque os exemplos que eu estava usando eram jargões de tecnologia, e nos ensaios as organizadoras do TEDx disseram que não eram conheciiMasters #28 Novembro 2018
dos pela maioria das pessoas. Insatisfeita ou não, segui este primeiro caminho. Ensaiei a talk, ajustei... Durante o TDC-SP, o Bruno Souza me alertou sobre a minha conexão com o público. Eu realmente não tinha pensado neste “detalhe”, e nem sabia o que fazer. Mas em uma conversa com o Edson Yanaga e com o Bruno, comentei que eu gostaria de poder tirar uma selfie com meu pai (já falecido), porque não lembro bem do rosto dele e não tenho uma foto nítida. Neste momento a minha talk mudou. Eu sabia que precisava mostrar que os dados fazem parte da nossa rotina, que são importantes e que podem acabar com as empresas. Para isso montei a seguinte sequência: · A minha angústia em esquecer o rosto do meu pai – momento de conexão com a plateia; · Quantidade de dados disponíveis e a explicação de que tudo são dados – Introdução da ideia; · O desafio das empresas em lidar com dados – Conclusão da minha ideia. Não usei nenhuma técnica infalível. Fui transparente em falar da minha dor, me expus, segui uma sequência definida e ensaiei. A loucura (ou a magia) foi ver gente chorando quando falei do meu pai. Saí do palco com a melhor sensação possível, e ainda tenho tremedeira de lembrar destes momentos.
Hospedagem de Sites
14 // NODE.JS
EXECUTANDO O PM2 E O NODE.JS EM AMBIENTES DE PRODUÇÃO Por Bruna Escudelario, Desenvolvedora Web
A famosa plataforma de aplicação conhecida como Node.js trouxe inúmeras possibilidades para a linguagem JavaScript. A vantagem mais evidente é que com ele conseguimos usar JavaScript de ponta a ponta nas nossas aplicações. Isso significa que não precisamos mais utilizar outras tecnologias como Java, PHP e C# para o nosso back-end, mas sim o próprio JavaScript. Isso facilita não somente o trabalho (já estaremos trabalhando com uma linguagem em comum), mas como todo o ecossistema. Contudo, quando o projeto/aplicação é publicado na web, o aspecto mais desafiador é mantê-lo ativo e em execução. É aí que entra o PM2. O que é PM2? O PM2 (Process Manager 2) é um gerenciador de processos automatizado e avançado para aplicações Node.js em ambientes de produção. O projeto é de código aberto (distribuído sob licença GNU-AGPL-3.0) e está com o seu repositório no GitHub, onde já possui mais de 25 mil estrelas. Ele vem também com um Load-Balancing integrado, permitindo que os aplicativos Node.js em rede sejam escalonados em todas as CPUs disponíveis, com nenhuma modificação no código. Veremos sobre essa funcionalidade no decorrer do artigo. E o melhor de tudo é que o projeto é multiplataforma, ou seja, funciona em ambientes Linux, Windows e Mac. Ele possui um arquivo de configuração (process.json) no qual é possível iMasters #28 Novembro 2018
especificar quais processos desejamos executar e quantos desejamos dimensionar. Ao iniciar o PM2, é possível especificar o arquivo process.json, e o PM2 irá cuidar do resto. Resumindo, o PM2 tem a função de manter os aplicativos Node.js ativos e recarregá-los com tempo de inatividade zero quando tiver atualizações no aplicativo ou servidor. Ele é bem fácil de usar e facilita o gerenciamento de um ambiente de produção. Instalação do PM2 Pressupondo que o Node.js já esteja instalado na máquina (assim como o npm, o gerenciador de pacotes dele), é possível fazer a instalação globalmente do PM2 com o seguinte comando: npm install pm2 -g. Dessa forma, conseguiremos usar a ferramenta independentemente do projeto em que estivermos trabalhando. Após a instalação, já é possível acessar o comando “pm2”, que veremos nas funcionalidades. Funcionalidades do PM2 O PM2 é uma ferramenta incrivelmente extensa e poderosa. Entre as funcionalidades mais interessantes dele estão: 1 - Reinício automático: Uma vez iniciado, o aplicativo estará sempre ativo e reiniciando automaticamente com o comando pm2 start. Então imagine uma situação em que sua aplicação sofre uma pane inesperada. Em situações comuns,
// 15 teríamos que verificar que o serviço não está funcionando para então reiniciá-lo. Com essa ferramenta, o processo é diferente, pois uma vez que acontece algum problema inesperado e a aplicação cai, o PM2 identifica isso e tenta restabelecer o seu projeto por conta própria (por uma quantidade x de vezes que podemos configurar).
2 - Gerenciamento de processos: O PM2 possui um conjunto de comandos que permite gerenciar os estados dos aplicativos sem se importar com a quantidade que está sendo executada, como é mostrado a seguir: · pm2 start process_prod.json: inicia um ou mais processos via arquivo JSON. · pm2 start NomeDoApp: inicia um aplicativo específico. · pm2 stop NomeDoApp: para uma aplicação específica. · pm2 ls: mostra uma lista de todas as aplicações sendo executadas. · pm2 NomeDoApp scale N: escala o aplicativo que foi especificado para n números de instâncias. · pm2 show NomeDoApp: mostra informações sobre a aplicação. · pm2 kill all: mata todos os aplicativos em execução. · pm2 restart all: reinicia todos os aplicativos em execução. · pm2 reload all: recarrega a configuração do aplicativo, como as variáveis de ambiente. · pm2 startup: configura o pm2 para inicializar com o sistema operacional.
iMasters #28 Novembro 2018
16 // NODE.JS Além disso, com o comando pm2 monit, é retornado um conjunto avançado de dados em torno da integridade do aplicativo - por exemplo, utilização da CPU, uso de memória, solicitações, entre outras coisas.
3 - Gerenciamento de logs: Possui um gerenciamento de log integrado. Ele junta os dados de logs de todos os aplicativos em execução e os grava em uma única fonte para exibição. Ele possui também uma rotação de logs, que é interessante especialmente se o aplicativo estiver gerando logs detalhados com frequência. Os três comandos mais utilizados são: · pm2 logs: saída de logs de todos os aplicativos em execução. · pm2 logs app: saída de logs somente de um aplicativo específico. · pm2 flush: libera todos os dados de log, disponibilizando espaço em disco.
iMasters #28 Novembro 2018
// 17
Lembre-se: é necessário ativar a rotação de logs para que o arquivo de logs seja dividido em arquivos menores que são mais gerenciáveis para o PM2, caso o arquivo de logs original seja muito grande. Para fazer isso, basta executar o comando pm2 install pm2-logrotate. Cluster Mode Um dos recursos mais poderosos do PM2 é a capacidade de execução no Cluster Mode. O Cluster Mode permite dimensionar o aplicativo Node.js em todas as CPUs disponíveis e utilizá-las sem qualquer tempo de inatividade, aumentando assim a capacidade do aplicativo de lidar com o tráfego, sem a necessidade de alterar nenhuma linha de código. É perfeitamente adequado para as aplicações em rede que lidam com conexões HTTP/UDP/TCP. Para iniciar um aplicativo em Cluster Mode, é usado o comando pm2 start app.js -i. No -i, é possível delimitar o número de CPUs usadas, como pm2 start app.js -i 5 (para 5 CPUs) ou usar pm2 start app,js -i max. O max é o parâmetro que detecta automaticamente o número de CPUs disponíveis. Boas práticas com o PM2 Há algumas práticas saudáveis para melhorar ainda mais a execução do PM2. São elas: · Variáveis de ambiente: as variáveis de ambiente são variáveis especiais definidas nos aplicativos Node.js. Elas são úteis para facilitar a configuração do aplicativo externamente. Um exemplo de variável de ambiente é a NODE_ENV, que especifica o ambiente no qual o aplicativo está sendo executado (em desenvolvimento ou produção). · Graceful Shutdown: como durante a vida útil do aplicativo ele será reiniciado
várias vezes, o usuário tem a possibilidade de enfrentar um problema de período de inatividade (servidor retornando respostas 503 – serviço indisponível) ou uma solicitação com falha (solicitação estava em andamento no momento da reinicialização). Para evitar esses problemas, é interessante sempre ter um Graceful Shutdown nas aplicações. · Aplicativo sem estado: um aplicativo sem estado não contém dados locais armazenados no processo, como memória e conexões de sessões, websocket, entre outros. Para contornar esse problema, é possível utilizar algum banco de dados para compartilhar todos os estados entre os processos. Desvantagem do PM2 A única desvantagem conhecida do PM2 é o consumo de processamento após algum tempo. Se não configurado corretamente, ele pode tornar não somente a aplicação, mas toda a máquina bem mais lenta. Porém, dadas as suas inúmeras vantagens e possibilidade de configurar de ponta a ponta a sua execução, esse problema é facilmente superado. Finalizando, além de o PM2 ser open source, ele nos permite criar aplicativos incríveis, sem se preocupar com a sobrecarga que é necessária para manter um aplicativo ativo e em execução, e permitindo que seja administrado todo o workflow de desenvolvimento facilmente. Bruna Escudelario é graduada em Ciência da Computação pela PUCSP, desenvolvedora web e coautora do livro Construct 2 – Crie seu primeiro jogo multiplataforma. Ama leitura, tecnologia e compartilhar os conhecimentos com os outros.
brunadefe@gmail.com iMasters #28 Novembro 2018
18 // DESIGN SPRINTS
A CENTRICIDADE DO CONSUMIDOR NO PROCESSO DE DESENVOLVIMENTO DE NEGÓCIOS E AS DIFERENTES ABORDAGENS PARA A CRIAÇÃO DE VALOR Por Guilherme Pereira, Diretor de inovação da FIAP
Abordagens centradas no usuário estão se espalhando em aplicabilidade e importância estratégica, mas quando e como utilizar os principais frameworks de trabalho nas equipes de desenvolvimento? Das diversas técnicas que temos hoje para nos auxiliar na criação de valor para nossos negócios, aquelas que buscam a conexão com os usuários para, de forma ágil e assertiva, criar uma experiência positiva e gerar consumidores mais engajados e valiosos estão sendo usadas nos mais diversos tipos de empresas e setores. Mas, apesar disso, algumas dessas técnicas continuam sendo usadas sem o entendimento de onde elas podem ser mais adequadas. A importância estratégica das empresas em se tornarem mais centradas em seus consumidores é uma unanimidade. Diversas das consultorias estratégicas mundiais estão trabalhando com a criação de estratégias de transformação de negócios para essa adequação, mas precisamos desmitificar a utilização das principais abordagens ferramentais quando iMasters #28 Novembro 2018
queremos criar novos serviços, produtos, experiências ou até mesmo novos negócios. Vamos explorar alguns desses métodos. Design Thinking O design centrado no usuário é o grande método por trás do Design Thinking. Usamos esta abordagem quando queremos entender mais profundamente o contexto do problema a ser solucionado e os padrões de comportamento de usuários – principalmente dos mais inovadores e primeiros adeptos (early-adopters). Conduzindo pesquisas etnográficas para buscar a razão do comportamento dos usuários, conseguimos entender quais são os princípios direcionadores para a criação de uma solução que vai gerar valor para nossos futuros clientes. As formas de aplicação hoje são amplamente conhecidas e existem diversos frameworks de aplicação da metodologia, como o duplo diamante (Double Diamond). A busca por insights e dados sobre
// 19
necessidades não estruturadas dos usuários são essenciais para o entendimento de quais são os fatores geradores de valor e de como uma potencial solução deveria se conformar. O exercício de divergência e criação de possibilidades através de uma ideação focada com base nesses princípios funciona para a criação de protótipos que, no Design Thinking, têm a função de testar os limites de percepção de valor do usuário. No Design Thinking, as técnicas de pesquisa e etnografia utilizadas nos ajudam a perceber sutilezas essenciais para a criação de um caminho de resposta, mas também – e principalmente – a aprofundar nosso conhecimento sobre o ambiente onde nosso problema está inserido.
Lean Startup Apesar de carregar no nome o termo Startup, esta abordagem já não é mais utilizada apenas por empresas nascentes. Muitas corporações têm utilizado as ferramentas descritas no método para criar valor de forma mais ágil. A diferença básica entre o uso do Lean Startup e do Design Thinking é o conhecimento que a equipe tem sobre o contexto do problema e das diretrizes de criação de valor para os usuários potenciais. E mesmo com o time de Lean considerando inicialmente todos os dados e caminhos como hipóteses a serem validadas, o processo se inicia com a especificação e a priorização de premissas do negócio (produto ou serviço) a ser criado. O time então começa o trabalho de validação dessas premissas a partir daquelas consideradas mais importantes para a criação de valor do produto. Criam-se experimentos (build), testam-se suas premissas (measure) e aprendem-se quais são os melhores caminhos para a solução de um problema (learn). No Lean Startup, usam-se métodos quantitativos para capturar dados e medir a efetividade das soluções propostas e que serão priorizadas para garantir a escalabilidade das soluções. iMasters #28 Novembro 2018
20 // DESIGN SPRINTS
Lean Inception Ao longo de um processo de desenvolvimento mais avançado do que será uma oferta – produto ou serviço –, faz sentido testar com os stakeholders o “o que” de fato precisa ser desenvolvido enquanto produto minimamente viável (Minimum Viable Product – MVP). Nesse sentido, a Lean Inception é uma forma de criar e demonstrar para um time misto entre desenvolvedores e representantes dos usuários finais “o que” deverá ser o produto. Na Lean Inception, são exploradas quais serão as principais funcionalidades e como elas deverão interagir com os usuários para garantir o engajamento e a criação de valor. Ela é utilizada, portanto, para planejar o escopo de um produto, levantar requisitos e definir uma estratégia de entrega.
iMasters #28 Novembro 2018
// 21
iMasters #28 Novembro 2018
22 // DESIGN SPRINTS
Design Sprint Uma abordagem criada inicialmente pela equipe do Google Ventures, os sprints de design se inspiram nos métodos de Lean UX descritos e utilizados na criação de startups enxutas (Lean Startups). A base da metodologia é conseguir compartilhar insights, ter ideias de solução, prototipar e testar conceitos em um período imersivo de cinco dias. Em geral, a equipe que vai passar por um Design Sprint escolhe uma parte de uma solução a ser implementada e utiliza o método para testar rapidamente se o caminho escolhido para a resposta está correto ou não. Nesse caso, o começo do processo pressupõe que os participantes já estão mais cientes do contexto do problema e já possuem um ponto de vista definido a ser explorado. E, principalmente nos Sprints, o time tenta se aprofundar no “como” uma oferta precisa ser desenvolvida. Apesar de o nome às vezes ser relacionado ao Design Thinking, os Design Sprints em geral são utilizados em uma fase mais madura do desenvolvimento de negócios que é coincidente com as abordagens do Lean Startup.
Agile Criado para lidar com as incertezas inerentes aos processos de desenvolvimento, no Agile encontramos um framework para trabalhar em equipe, como uma célula de projetos com um mesmo objetivo, e com tarefas e metas compartilhadas. Promovem-se ciclos de feedback rápido não apenas sobre o produto a ser desenvolvido, mas também sobre o próprio processo de trabalho. Em seus ciclos, deve-se definir e priorizar um backlog de trabalho a ser desenvolvido, e criam-se pequenos sprints buscando testar rapidamente as partes que formam o produto a ser desenvolvido. iMasters #28 Novembro 2018
// 23
Growth Hacking As ferramentas e técnicas de Growth Hacking são utilizadas para orientar a fase de ganho de escala, ou seja, é também uma forma de trabalhar na fase de crescimento inicial (adoção) de um produto ou serviço novo. É claro que, apesar de inicialmente ser associado com essas fases emergentes dos negócios, o Growth Hacking também é utilizado por empresas já estabelecidas e que buscam repensar seus esforços orientando-se por métricas e iteração com seus usuários. Baseado na criação de hipóteses e experimentos rápidos, os consumidores-alvo (targets) e os canais de aquisição e crescimento são testados com propostas que vão direcionar as melhores práticas para atingir seus consumidores e garantir que uma ideia se torne de fato inovação: gerando resultados.
iMasters #28 Novembro 2018
24 // DESIGN SPRINTS Todas essas abordagens, frameworks ou ferramentas possuem algumas características comuns e coincidentes. Por exemplo, todas elas se baseiam na interação com usuários e no teste e aprendizado rápido entre a proposta que está sendo desenvolvida e a percepção de valor. O trabalho em times interdisciplinares, com propósitos bem definidos e com alta capacidade de ajustes de escopo, também está presente em todas elas. Há pelo menos dois caminhos para direcionar a escolha de qual das abordagens descritas neste artigo pode ser utilizada. Em primeiro lugar, é preciso entender qual é o nível de entendimento que o time possui sobre o problema e o usuário – tenho chamado essa característica de “entendimento do fenômeno” – ou, simplesmente, entendimento sobre o contexto do problema/solução. Em segundo lugar, podemos usar a incerteza sobre o modelo de negócios, ou seja, quão validado está um modelo de negócios.
A ordem apresentada neste artigo é, em minha visão, uma forma concatenada para o uso híbrido das abordagens descritas. O Design Thinking é ideal para criarmos o nível de entendimento do problema e do usuário. A Lean Inception é uma forma de definir “o que” deveria ser um MVP, e os Design Sprints podem ser utilizados para testar e desenvolver o “como” entregar o MVP. Estas duas últimas são utilizadas em um contexto de desenvolvimento enxuto (Lean Startup), e que se conectam com os frameworks ágeis para o desenvolvimento de produtos que serão escalados através de Growth Hacking. Essa grande quantidade de formatos e a publicidade desses métodos têm criado uma confusão na cabeça dos gestores, que é justificada a partir dessa grande quantidade de termos novos. Uma “sopa de letrinhas” que tem se tornado cada vez mais importante para a criação de valor em um mundo volátil, incerto, complexo e ambíguo (VICA) e também em um ambiente altamente competitivo e globalizado – cenário especialmente preocupante para não só empresas de tecnologia, mas para aquelas que desejam ser e se manter como empresas inovadoras. Guilherme Pereira é diretor de inovação da FIAP. É formado em Ciências Econômicas e especialista em Inovação e Empreendedorismo pela Stanford University. Tem MBA em Gestão Estratégica de Negócios com extensão internacional na Babson College. Atua há mais de 15 anos desenvolvendo projetos de inovação em grandes empresas brasileiras e é conselheiro de diversas startups. iMasters #28 Novembro 2018
Desde 1988 transformando
profissionais
// 25
para o mercado digital!
Se o que você precisa é qualificação de verdade, não importa o formato, pois o Grupo Impacta tem todos: Mais de 300 Cursos presenciais e online em desenvolvimento, TI, gestão, design e Marketing Digital;
Graduações, Pós e MBA em TI, gestão e criatividade;
Soluções corporativas, Planos de assinatura EAD e muito mais!
Acesse e veja como podemos te ajudar:
WWW.IMPACTA.COM.BR Avenida Paulista, 1009 - 17º andar. São Paulo/SP. (11) 3254-2200
iMasters #28 Novembro 2018
26 // MOBILIDADE É TUDO
Google e os cinco sentidos Por Ricardo Ogliari, Desenvolvedor Android na InEvent
H
Historicamente, as plataformas Google utilizaram basicamente apenas dois sentidos do corpo humano: tato e visão. Ambos são as portas de entrada para a interação com a página de busca da gigante americana, para utilizar os jogos e aplicativos em seus smartphones com Android, além de outra série de funcionalidades entregues aos usuários. Porém, isso está mudando de uma forma radical. Nas últimas edições do Google I/O, alguns anúncios demonstram claramente uma mudança de rota na empresa, indo ao encontro da tendência mundial na Ciência da Computação, a Inteligência Artificial. Seja através de seu Machine Learning Kit, seja através de seu Google Vision Kit, a estratégia parece estar muito clara. E onde entram os desenvolvedores nesse cenário? As respostas são várias, dependendo do ponto de vista. O primeiro é no viés de um desenvolvedor. As iterações possíveis por parte do usuário crescem consideravelmente. Os dedos da mão em uma tela touchscreen, um teclado ou um mouse já não são a única forma de entrada de dados. O desenvolvedor pode usar a pilha de serviços do Firebase juntamente com o Firebase Machine Learning Kit para, por exemplo, estudar melhor a tecnologia que implementei - um sis-
iMasters #28 Novembro 2018
tema de alarme um pouco diferente. Ele roda em um Raspberry Pi 3 Model B, com o sistema operacional do Android Things. Com um sensor de proximidade, ele percebe que algo se aproximou e dispara um alarme. Depois disso, ele aguarda uma notificação oriunda do Firebase Cloud Messaging. Para parar o alarme, um aplicativo específico rodando no smartphone precisa ser aberto, e o usuário tem que sorrir para a tela do dispositivo. Através do Firebase Machine Learning Kit, o rosto e o sorriso são reconhecidos. Quando isso ocorre, uma notificação push é enviada para um serviço rodando na nuvem do Firebase Hosting, integrado ao Firebase Cloud Functions. Este último, por sua vez, dispara a notificação push que chega ao Raspberry Pi, interrompendo o som de alarme. Outra interação possível é o uso do processamento de linguagem natural. Google Assistant SDK e Voice Actions são ferramentas disponíveis para o desenvolvedor. Apesar de isso já ser possível anteriormente com Speech to Text através de uma simples Intent da biblioteca Android, agora a capacidade dos SDKs aumentou, e as possibilidades, em consequência, também. Outro ponto de vista é o dos profissionais de design. Com novas entradas
// 27
de dados e novas formas de inputar ações em uma tela, UI (User Interface) e UX (User Experience) também vão precisar se adaptar. Até mesmos novos conceitos e novas nomenclaturas estão sendo criadas, como Voice User Interface (VUI) e Projeto de Interação de Voz. Por exemplo, o fluxo de uma conversação envolvendo o usuário e a aplicação de um sistema de processamento de linguagem natural devem ser pensados e desenhados por quem? Para os projetistas, gerentes de projetos e outros profissionais responsáveis pela criação e desenvolvimento de soluções, novas ideias podem ser pensadas, quebrando o círculo vicioso dos mesmos tipos de aplicações. Por que não implementar um aplicativo em que um piscar de olhos dispara uma ação? Um fomentador de ideias pode ser o próprio Google. Recentemente, o AIY Vision Kit foi lançado. Ele possui um site oficial que tem 70 passos, com ima-
gens muito claras, sobre como montar esse kit. No final do trabalho, teremos uma espécie de caixinha tecnológica e inteligente que reconhece rostos mudando a cor de um botão que fica na parte superior. Além disso, reconhece quando o rosto sorri e muda a cor do mesmo botão, e ainda emite um som. Acredito que estamos em um tempo crucial para mudanças radicais no uso da tecnologia. Um clique, um toque na tela e uma movimentação de swipe são tecnicamente naturais, porém voz, gestos e expressões faciais são inerentes aos humanos. E isso sem falar em SDKs já à venda que permitem leitura de ondas cerebrais. O que podemos resumir disso tudo? Os próximos anos e as próximas soluções serão ainda mais espetaculares do que já são, e os desenvolvedores precisam começar a se iterar de novos assuntos, principalmente aqueles relacionados à Inteligência Artificial.
Ricardo da Silva Ogliari é coautor do livro “Android: do Básico ao Avançado” e de mais de 350 publicações. Possui bacharelado em Ciência da Computação, é especialista em Web: Estratégias de Inovação e e Tecnologia, tem MBA em Desenvolvimento de Jogos e Aplicativos Móveis. É cofundador do Things Hacker Team. Foi eleito um dos 10 nomes do Open Hardware em 2013.
rogliariping@gmail.com
iMasters #28 Novembro 2018
28 // POR DENTRO DO W3C
Thing description: um manifesto para aplicações de Internet das Coisas Por Reinaldo Ferraz, Especialista em desenvolvimento web do W3C Brasil
U
Um dos grandes dilemas da Internet das Coisas é a interoperabilidade. É comum uma “coisa” conectada utilizar tecnologia e protocolos diferentes de outros fabricantes, e muitas vezes essas “coisas” não se comunicam entre si. Em certos casos, essa ausência de interoperabilidade se dá pela falta de exposição das interfaces e das informações de dados. Esse fato atrapalha uma aplicação que acessará essa interface para consumir os dados, já que não há informação suficiente para facilitar esse processo. Essa é uma das premissas da recomendação em que o W3C está trabalhando para facilitar a interoperabilidade na Internet das Coisas utilizando tecnologia Web: o documento W3C Web of Things (WoT) Thing Description (https:// www.w3.org/TR/wot-thing-description/). Esse documento descreve um modelo formal e uma representação comum para uma Thing Description (TD) da Web das Coisas. Uma TD descreve os metadados e interfaces de “coisas”, onde “coisa” é uma abstração de uma entidade física que fornece interações da Web das Coisas. As descrições fornecem um conjunto de interações com base em um pequeno vocabulário que possibilita a integração de diversos dispositivos e a interoperabilidade de vários aplicativos.
iMasters #28 Novembro 2018
As TDs, por padrão, são codificadas em JSON-LD. O JSON-LD fornece uma base poderosa para representar o conhecimento sobre as coisas de forma simples, já que permite o processamento como um documento JSON. Além de entidades físicas, as coisas podem representar entidades virtuais. Uma instância TD pode ser hospedada na própria “coisa” ou hospedada externamente devido às restrições de recursos das “coisas” (por exemplo, espaço de memória limitado) ou quando um dispositivo legado compatível com Web das Coisas é adaptado com uma TD. O arquivo TD é um bloco de construção central em um sistema habilitado para Web das Coisas e pode ser considerado como o ponto de entrada dessa “coisa” conectada, como um “index.html”. A TD consiste em, além dos metadados semânticos para a “coisa” em si, um modelo de interação (com propriedades, ações e eventos), um esquema semântico para tornar modelos de dados compreensíveis por máquina e recursos de Web Linking para expressar relações entre as “coisas”. O exemplo a seguir mostra uma instância simples de TD que reflete o conceito de propriedade, ação e evento de WoT, descrevendo uma “coisa” (neste exemplo, uma lâmpada) com o nome MyLampThing.
// 29
{ “@context”: [“https://w3c. github.io/wot/w3c-wot-tdcontext.jsonld”], “@type”: [“Thing”], “name”: “MyLampThing”, “interaction”: [ { “@type”: [“Property”], “name”: “status”, “schema”: {“type”: “string”}, “writable”: false, “observable”: true, “form”: [{ “href”: “coaps:// mylamp.example.com:5683/ status”, “mediaType”: “application/json” }] }, { “@type”: [“Action”], “name”: “toggle”, “form”: [{ “href”: “coaps:// mylamp.example.com:5683/ toggle”, “mediaType”: “application/json” }] }, { “@type”: [“Event”], “name”: “overheating”, “schema”: {“type”: “string”}, “form”: [{ “href”: “coaps:// mylamp.example.com:5683/oh”, “mediaType”: “application/json” }] } ] }
Com essa informação disponível, é possível criar aplicações que se conectem à lâmpada (pelos dados do form->href) e identificar suas ações e eventos. O objetivo da Thing Description não é reinventar a roda, nem ditar protocolos e formas de interação entre as “coisas”. Sua função é bem simples: disponibilizar um manifesto de metadados para quem deseja se conectar às “coisas” que estão gerando dados na rede. Esse pode ser um caminho mais suave para a interoperabilidade da Internet das Coisas.
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 #28 Novembro 2018
30 // VARNISH
AVALIANDO A FUNDO A PERFORMANCE DO VARNISH CACHE ATRAVÉS DE SEUS LOGS Por Alessandro Huber dos Santos, Analista de Infraestrutura de Hosting Senior na KingHost
Como todo bom sysadmin sabe, logs e estatísticas são seus grandes amigos, principalmente quando temos que identificar problemas de performance. A grande maioria está familiarizada em como debugar logs de acesso e erros de web servers mais populares, como Apache e Nginx, porém, quando falamos do Varnish, essa situação se inverte. Muitas são as causas dessa falta de familiaridade: · seus logs são complexos, ainda mais em um cenário com múltiplos domínios; · a documentação oficial segue o estilo de man page, não provendo exemplos práticos de como tirar informações pertinentes; · a documentação de terceiros (mesmo em outros idiomas) é focada em versões mais antigas do Varnish, não se aplicando às versões mais atuais devido às mudanças aplicadas a partir da versão 4.0. Então, como fazer com que os logs do Varnish possam trabalhar a nosso favor? Em primeiro lugar, faz-se necessário conhecer um pouco mais as opções e tipos de informações (chamadas de tags) que o Varnish nos fornece, que são bastante pertinentes: · Qual IP e porta remota fez a requisição (ReqStart), qual o tipo da requisição (ReqMethod) e URL (ReqURL); iMasters #28 Novembro 2018
· Os cabeçalhos enviados pelo cliente e/ou configurados pelo Varnish no processamento inicial da requisição (ReqHeader); · Os passos que foram realizados pelo Varnish para processar a requisição (VCL_return e VCL_call); · Qual status HTTP e resposta do back-end (RespStatus e RespReason); · Os cabeçalhos retornados pelo back-end, juntamente com os definidos pelo Varnish no processo de resposta (RespHeader). Tendo conhecimento desses dados em mãos, podemos colocar em prática a análise desses logs. Para exemplificar, vamos utilizar um ambiente VPS que possuo, no qual se encontram hospedados dois domínios pessoais (vou chamá-los de dominio1.net e dominio2.net), ambos rodando WordPress e servidos pela mesma instância do Varnish, com seus back-ends utilizando Nginx, PHP-FPM e MariaDB. Para avaliar a eficiência do Varnish em sua principal funcionalidade, temos que descobrir qual o percentual das requisições servidas por ele. Para isso, julgo importante levantarmos estas duas estatísticas: · Quantas requisições foram servidas do cache (cache_hits); · Quantas requisições foram repassadas para o back-end (cache_miss).
// 31
E como levantamos isso? Através da primeira ferramenta que irei apresentar hoje, que é o varnishstat. Ela nos provê justamente as estatísticas da instância do Varnish em execução. A mera execução do comando, sem quaisquer parâmetros, nos traz uma chuva de estatísticas que normalmente não são úteis. Para torná-la uma ferramenta poderosa de análise, temos que fazer uso de seus parâmetros. Para este exemplo, irei utilizar dois deles: · -1: indica para o comando imprimir as estatísticas apenas uma vez, levando em consideração os dados desde o início da execução do Varnish; · -f: mostra apenas as estatísticas de interesse (neste exemplo, MAIN.cache_hit e MAIN.cache_miss). Executando em meu ambiente, tenho o seguinte retorno:
Fazendo uma conta rápida, temos que 883 requisições resultaram em entrega de conteúdo pelo Varnish, e apenas 18,59% do conteúdo servido foram providos pelo cache em memória por ele armazenado. Como esse percentual é abaixo de 90%, valor por mim considerado ideal, devem ser avaliadas as causas por tantas requisições repassadas para o back-end, se são intencionais ou não. Agora, temos que identificar qual domínio é responsável por não consolidar cache em nossa instância. Para isso, apresento outra ferramenta que o Varnish nos disponibiliza e que nos ajudará nessa análise: o varnishtop, que lê os logs em memória e apresenta uma lista atualizada das entradas de log mais comuns. Da mesma forma que o varnishstat, sua execução sem a utilização de parâmetros adicionais não traz informações relevantes. Por isso, vamos passar dois deles para sermos mais efetivos: · -1: imprime as estatísticas apenas uma vez, levando em consideração o início da execução do serviço; · -I: para mostrar apenas um campo específico que possua uma determinada tag; nesse caso, “ReqHeader:Host”, para mostrar apenas o header “Host” requisitado pelo cliente. Disparando o comando com os parâmetros em questão, temos:
iMasters #28 Novembro 2018
32 // VARNISH
Aqui, fica demonstrado que o dominio1.net é o host que recebe mais requisições, e que as requisições em MISS ultrapassam o total de requisições para o dominio2.net. Portanto, vamos aprofundar a análise, a partir daqui, para o primeiro. Agora, vamos validar que as requisições em MISS estão sendo retornadas por esse domínio. Para isso, vamos mudar a forma como iremos disparar o comando varnishtop, passando a utilizar um terceiro parâmetro, o “-q”: · -q: indica a passagem de uma consulta aos VSL (Varnish Shared Memory Logs). Nesse caso, perguntaremos por requisições que tenham o header Host igual ao domínio desejado. Abaixo, temos o resultado dessa consulta para solicitações realizadas ao host dominio1.net, que teve o valor do parâmetro “-I” alterado para essa execução:
Esse cenário demonstra que 461 das 733 requisições entregues pelo Varnish (ou seja, 62,9%) para esse domínio retornaram MISS. Outras 167 requisições (22,7%) foram redirecionadas para o back-end devido a regras de exceção de cache, e apenas 15% foram entregues pelo cache. O que nos dizem esses números? Que pode haver URLs com headers forçando a não execução de cache ou, ainda, um TTL (time-to-live) excessivamente baixo, sinais que devem ser investigados com maior profundidade. Você pode estar se perguntando: cadê as outras requisições? Simples: quase 90% foram geradas por redirecionamento para HTTPS, causadas por regra aplicada em sua configuração (arquivo VCL). Entrega iMasters #28 Novembro 2018
de conteúdo mesmo são os outros 10% representados e comentados acima. Ficou interessado? Leia a documentação oficial, pratique mais, e leia também sobre os comandos varnishlog e varnishncsa! Com certeza você irá tirar proveito das ferramentas poderosas que o Varnish possui! Alessandro Huber dos Santos é analista de Infraestrutura de Hosting Senior na KingHost. Tem MBA em Gestão Estratégica da TI pela FGV e é Engenheiro de Computação pela FURG. É apaixonado por tuning e performance de ambientes Linux. É pai do Enzo e torcedor fanático do Grêmio nas horas vagas.
alessandro.santos@kinghost.com.br
DROPS DO MERCADO NOVOS ENDPOINTS NA API GERENCIANET A Gerencianet disponibilizou novos endpoints na API. Agora, os usuários podem oferecer descontos radicionais e descontos condicionais nos boletos e emitir boletos do tipo balancete. Além disso, na plataforma, é possível configurar transferências programadas. O desconto condicional permite uma redução do valor caso o pagamento seja feito até uma data inferior ao vencimento. O boleto balancete proporciona a demonstração prévia das movimentações financeiras do mês, disponibilizando dados como receitas, despesas e contas a receber. Já a transferência programada possibilita transferir para uma conta bancária um valor estipulado ou todo o saldo disponível na conta. A Gerencianet possui SDKs em Go, PHP, .NET, NodeJS, Ruby, Python, Java e Delphi, além de módulos e plugins prontos para a emissão de boletos registrados sem a tarifa de registro e cobranças parceladas em até 12x no cartão de crédito. A documentação completa está disponível em gerencianet.com.br/api.
FACULDADE IMPACTA E INSTITUTO AVANÇADO DE ROBÓTICA LANÇAM PÓS-GRADUAÇÃO EM ENGENHARIA ROBÓTICA Com o objetivo de suprir a falta de mão de obra especializada no Brasil em uma das áreas mais em evidência na era da indústria 4.0, a Faculdade IMPACTA firmou parceria com o Instituto Avançado de Robótica – I.A.R. para desenvolverem o primeiro curso de pós-graduação lato senso em Engenharia Robótica do país. Com duração de 15 meses, o curso aborda com profundidade a robótica industrial, possibilitando toda experiência prática já que o aprendizado é realizado dentro da unidade móvel de alta tecnologia do I.A.R, utilizando softwares de última geração da SIEMENS PLM, que vem revolucionando o segmento. A especialização dará a competência técnica para o profissional realizar projetos e análises críticas nas áreas de automação, manufatura e robótica avançada. Confira datas de turmas para o próximo semestre no site da Faculdade Impacta.
// 33
CERTIFICADO SSL - SEU SITE DENTRO DAS NORMAS DO GOOGLE Qual seria sua reação se, ao acessar um site ou loja virtual, fosse exibido um aviso de que aquele endereço não é seguro para navegação? No mês de julho, o Google realizou uma atualização no Google Chrome visando identificar sites que não possuem o protocolo HTTPS. Isso quer dizer que sites sem o Certificado SSL já estão sendo classificados como “não seguros” pelo navegador. Como você pode ver, os certificados de segurança não são úteis apenas para manter sigilosas informações contidas em sites e lojas virtuais, como dados de pagamento. O Google leva a questão da segurança muito a sério e faz sua parte para tornar a web mais segura e confiável para o usuário. A boa notícia é que clientes da HostGator de Hospedagem de Sites, Hospedagem WordPress, Plus, Revenda de Hospedagem e Criador de Sites têm direito ao SSL gratuito para todos domínios de sua hospedagem! Chegou a hora de dar prioridade para a segurança do seu site e dos seus clientes. Para isso, conte com a HostGator!
LOCAWEB LANÇA CLOUD OPENSTACK COM TECNOLOGIA INTEL E RED HAT Com uma combinação única, o novo Cloud OpenStack propõe melhor desempenho e experiência para o usuário. Sua infraestrutura conta com a performance dos processadores de última geração Intel, além do storage de alta disponibilidade SSD. Além disso, a plataforma tem o selo de confiança e inovação da orquestração OpenStack Red Hat e o gerenciamento de múltiplas instâncias com o painel Horizon. O objetivo da empresa foi se reinventar para apoiar jornadas de transformação digital e impulsionar as mais recentes inovações do mercado. Tudo isso resultou num produto que oferece autonomia e flexibilidade de um datacenter virtual, uma vez que a contratação é realizada por recursos. Desta forma, é possível distribuir memória, vCPU e storage em diversas instâncias e volumes. Subir, descer e clonar servidores sem burocracia, trocar flavors a qualquer momento e ter a conveniência de fazer tudo via painel ou API. Então, que tal conferir e provar que existe vida além dos OpenStacks gringos?!
iMasters #28 Novembro 2018
34 // CAPA
FRAMEWORK
AGNOSTIC
CODE
Por Lucas Mendes, Product Owner na Nuvem Shop
iMasters #28 Novembro 2018
// 35
M
Muito tem se falado sobre frameworks e sobre a grande promessa de trazer ganhos de produtividade, qualidade e performance. Porém, quantos de nós já iniciamos projetos usufruindo de frameworks com o objetivo de alcançar melhores resultados de maneira rápida e eficiente, mas ao final caímos nos mesmos problemas que tínhamos antes do uso destes? Prazos estourando enquanto o mercado muda drasticamente suas regras, mudanças no escopo que precisam ser feitas para minimizar os impactos, enquanto isso, ferramentas escolhidas vão se tornando depreciadas e os testes não garantem o funcionamento ou até mesmo nem existem, chegando ao ponto de um sistema nunca ir para produção porque se tornou defasado antes mesmo de algum dia ter ficado estável. Um cenário muito comum na indústria de desenvolvimento de software. Qual o melhor framework? Quando estamos por iniciar um novo projeto, seja ele de uma aplicação web, mobile ou até mesmo em linha de comando, uma das primeiras perguntas que se passam na cabeça do desenvolvedor é: “qual framework vou usar?”. A escolha de um framework sempre vai variar de acordo com o escopo do projeto que vamos desenvolver, como por exemplo, a plataforma em que esse sistema irá rodar, o suporte desse framework, a mão de obra envolvida, o tempo e o dinheiro que temos para investir. Porém, o que percebemos é que esses são parâmetros que têm maior importância quando estamos discutindo a viabilidade do projeto com executivos e pessoas de negócio. Quando essa discussão chega a um time de desenvolvedores que irá trabalhar no projeto, parâmetros como a plataforma, o iMasters #28 Novembro 2018
36 // CAPA
FRAMEWORKS SÃO FERRAMENTAS EXTREMAMENTE PODEROSAS, DESDE QUE USADAS COM SABEDORIA E RESPONSABILIDADE
iMasters #28 Novembro 2018
// 37 suporte e o investimento perdem seu valor perante à um novo requisito: o fanatismo. Observando as discussões mais recentes dentro de comunidades, vamos encontrar uma trincheira de guerra com desenvolvedores vestindo fardas com as logo marcas de seus frameworks e ferramental favoritos. A maioria das discussões não segue um embasamento orientado ao escopo do projeto, senão, a religiosidade em cima de uma ferramenta que agrada aos seus olhos. Entretanto, escolher um framework que melhor atende aos requisitos do projeto nunca vai ser uma tarefa fácil e sempre terá um percentual de chance de falhas no futuro, pois, o escopo quase sempre muda e essas mudanças sempre vão exigir adaptações à medida que o produto evolui. E é trabalho do arquiteto e/ou líder de desenvolvimento garantir que esse sistema está preparado para receber tais mudanças com o menor esforço possível; principalmente, se estamos falando de produtos em startups, que precisam validar hipóteses em um curto período de tempo. Frameworks são ferramentas extremamente poderosas, desde que usadas com sabedoria e responsabilidade. E para aproveitar ao máximo os benefícios que um framework pode trazer para o seu projeto, precisamos, antes de mais nada, separar as responsabilidades e entender onde o código do seu produto termina e onde começa o trabalho que o framework deve fazer. Código Agnóstico à Framework Código agnóstico à framework é um mindset que vem sendo bastante discutido em comunidades de desenvolvimento e arquitetura de software. E para se atingir esse mindset, primeiro precisamos entender profundamente os conceitos por trás dele, para assim, começar a enxergar os benefícios por trás dessa abordagem ao desenhar novos sistemas. Software Design Principles Princípios de Design de Software não são uma novidade; eles estão em quase todos os livros de arquitetura e engenharia de software, e são também a base para diversos padrões utilizados na indústria. Porém mesmo não sendo uma coisa nova, muitos arquitetos e líderes de desenvolvimento ainda se esquecem, ou se recusam a se apoiar nestes princípios, de maneira e novos sistemas acabam perdendo em qualidade, manutenibilidade e escalabilidade. E essa negligência é o primeiro ponto de falha que nos leva à escrever código acoplado e específico para framework.
Separation of Concerns ou SoC (em português: separação de conceitos) é o primeiro e, sem dúvida, o princípio mais importante quando falamos de código agnóstico à frameworks, pois ele delimita as responsabilidades de cada parte do seu software - e isso inclui o código do seu produto (que contém suas regras de negócio) e o framework que você escolheu para se apoiar no desenvolvimento. Dentro deste conceito, temos duas premissas básicas: a máxima coesão e o menor acoplamento possível. O que significa que o seu código deve conter somente o que ele precisa para atender aos requisitos do negócio, mas ao mesmo tempo ter o mínimo (se possível nenhum) acoplamento com o meio externo a aquele requisito, que neste cenário, seria o framework que você adotou. Entendendo bem os limites de onde começa e termina o seu software, baseado nas funcionalidades oferecidas pelo framework que você escolheu para desenvolver seu projeto, começamos a aprofundar mais no desenho técnico, agora pensando de maneira mais granular, levando em consideração os requisitos do negócio. Então, utilizando-se do mesmo princípio de separação de conceitos, mas agora introduzindo uma nova abordagem, o Domain Driven Design, podemos começar a modularizar e definir os seus domínios. iMasters #28 Novembro 2018
38 // CAPA
Domain Driven Design Domain Driven Design ou DDD (em português: Desenho Orientado a Domínio ou Projeto Orientado a Domínio) é uma abordagem, considerada por alguns como uma metodologia, para modelagem de sistemas onde a maior preocupação deixa de ser o código que vai ser escrito, passando a focar no problema a ser resolvido, também conhecido como domínio. Ganhando entendimento sobre o negócio, junto ao que chamamos de Domain Experts, que são os principais stakeholders e possíveis usuários do software, vamos começar a encontrar os domínios deste negócio. Eles irão aparecer à medida que as discussões forem ganhando detalhamento e profundidade. Para exemplificar, trago aqui um problema comum: um e-commerce. Este é negócio bastante
iMasters #28 Novembro 2018
complexo que tem como problema base uma pessoa A vender algo para uma pessoa B. Apesar de, a princípio, parecer simples por ser um único problema, ao começarmos a análise das necessidades envolvidas de ambas as partes, podemos identificar alguns dos domínios, onde um vendedor A precisa montar um Catálogo, precisa receber os Pagamentos pelos produtos e ele precisa de uma solução de Logística para enviar os pedidos. Enquanto isso, um comprador B precisa conseguir realizar seus Pedidos e muitas vezes ele vai querer Cupons de Desconto para economizar. Portanto somente em uma breve sentença de detalhamento do fluxo padrão de um e-commerce, podemos identificar pelo menos cinco domínios de nosso negócio.
// 39
Component-based Architectures Identificados os domínios, agora podemos começar a pensar na melhor maneira de modularizar, ou quebrar nossos sistemas em componentes de única responsabilidade dentro do nosso sistema. Essa componentização poderá ser feita baseada não somente nos domínios, mas também em domínios de suporte, como por exemplo, serviços de comunicação, persistência, fila, mensageria etc. Após definidas as responsabilidades dos componentes que compõem esse sistema, precisamos definir os contratos de intercomunicação entre os domínios do sistema e isso poderá ser feito através de APIs, expondo para fora do componente as funcionalidades que forem necessárias e que outros componentes dependam através serviços delimitados e bem definidos. Por fim, após definidos e modelados os contratos de intercomunicação, podemos expor os serviços necessários para integrar o framework ao código de seu domínio. Dessa forma, caso você necessite de trocar de framework, você precisará reescrever apenas estes serviços.
Trade-offs Fazer código agnóstico à framework não é uma tarefa fácil. Você precisa conhecer muito bem o seu domínio e o framework que está escolhendo para desenvolver sua solução, para entender onde inicia e termina as responsabilidades da sua aplicação. Porém, se apoiando em alguns conceitos básicos de padrões de projeto e padrões arquiteturais esse processo pode ficar menos doloroso, além de trazer uma série de vantagens à longo prazo. Arquiteturas de software baseadas em componentização trazem muitos benefícios, dentre eles o reaproveitamento de código, a extensibilidade, escalabilidade à nível de requisitos de domínio, facilidade e garantia de funcionamento através de testes objetivos, e a redução de side-effects, pois o seus componentes dependem minimamente uns dos outros. Por fim, encapsular toda a complexidade de seu componente e expor suas APIs através de serviços garantem o mínimo acoplamento possível. Além de delimitar os contextos do seu domínio, tornando muito mais fácil o trabalho colaborativo. Outro ponto é que, ao colocar o código de integração de seu framework em serviços, isso permite que você se mova rapidamente quando perceber que aquela ferramenta já não te serve mais.
Lucas Mendes trabalha no time de Produto da Nuvem Shop tendo atuado em diversas frentes desde o negócio até a engenharia, é também evangelista PHP, palestrante e contribui em diversos projetos open source.
devsdmf@gmail.com iMasters #28 Novembro 2018
40 // CSS SHAPES
CSS SHAPES – MUITO MAIS QUE RETÂNGULOS OU QUADRADOS Por Rafael Dantas, Desenvolvedor Front-end
A web mudou de maneira drástica nos últimos cinco anos - JavaScript ganhou muita força e tornou-se uma linguagem ainda mais robusta, CSS mudou completamente com a chegada do Grid Layout, tornando-se uma opção perfeita para se trabalhar de maneira eficiente e, acompanhada do Flexbox, tornou-se uma propriedade muito poderosa. Hoje, nós, desenvolvedores front-end temos muitas opções, ferramentas e tecnologias disponíveis para nos ajudar no desenvolvimento de qualquer projeto, mas com isso a gente acaba tendo uma confusão enorme em relação ao que estudar e o no que se aprofundar. Eu mesmo, durante muito tempo, fiquei confuso, não sabia para onde seguir, mas de uns tempos para cá venho concentrando minha atenção em coisas nativas relacionadas às CSS e gostaria de compartilhar aqui um tema que venho estudando e vejo sendo pouco falado em terras tupiniquins, CSS Shapes. Vou dar uma abordagem prática sobre essa especificação que, apesar de não ser nova, ainda está sendo novidade para alguns navegadores (o Firefox, por exemplo, vai começar a dar suporte a partir da versão 62 que foi lançada em setembro para o público). O problema em se trabalhar com formas em CSS Trabalhar com formas em CSS sempre foi uma dor de cabeça - de modo geral, ou usávamos imagens ou um conjunto de hacks (gambiarras) pra desenhar coisas na nossa página. Ok, apesar de tudo, não é o pior dos mundos. Se você souber trabalhar com bordas, position, transform e display de maneira concisa, é possível criar
iMasters #28 Novembro 2018
// 41
praticamente qualquer formato para a sua página ou aplicação. Isso geralmente é muito utilizado em sites institucionais ou com conceitos de design bem avançados - podemos encontrar círculos, triângulos, polígonos, entre outras formas que não são triviais no dia a dia. Tudo isso é muito legal e desafiador, mas o problema real de lidar com essas formas é como os elementos ao redor vão se comportar ou como esses elementos podem fazer parte dessas formas de maneira fluida dentro do layout proposto, como se fossem uma única coisa. Vamos ver o exemplo da imagem abaixo.
Percebe como o texto flutua ao redor do prato no qual o bolo se encontra? Ele flui perfeitamente sem conflitar com o prato, e vice-versa. Antes, replicar isso em uma página web seria extremamente complicado e trabalhoso, especialmente se você tivesse que criar uma página adaptável aos mais diversos tipos de dispositivos existentes. Seria uma dor de cabeça tremenda, por isso, para a web nessa situação específica, os elementos geralmente ficam “sozinhos”, ou seja, nenhum elemento vai
flutuar ao redor de nenhuma forma, ou, se o fizer, será extremamente trabalhoso para o desenvolvedor, tendo que recorrer a diversos hacks e nem se fala em responsividade para isso, né?! Pensando nisso, a Adobe apresentou ao W3C em 2012 a especificação para CSS Shapes, que tem como objetivo principal facilitar a criação de layouts ainda mais complexos, nos quais elementos possam flutuar ao redor de qualquer forma, seja circular, polígono e até mesmo uma imagem ou foto, por exemplo. Essa é então mais uma arma muito poderosa para que nós, desenvolvedores
front-end, possamos usar para trabalhar com layouts mais evoluídos, sem dificuldade, sem dor de cabeça, com melhor performance e sem gambiarras. Uma solução limpa e eficaz para aplicar nesse contexto. Bom, agora vamos aprender a usar as propriedades dessa especificação? As propriedades do CSS Shapes Antes de mais nada, precisamos atender a duas condições para que seja possível trabalhar com CSS Shapes. iMasters #28 Novembro 2018
42 // CSS SHAPES
1) O elemento com forma deve usar float, apesar de ser uma técnica antiga e já substituída por Grid e/ou Flexbox. Nesse contexto, o elemento deve estar, sim, com float. 2) Os elementos com formas devem ter um bloco com altura ou largura definidas intrinsecamente ou não, pois é através dessas propriedades que os elementos ao redor vão flutuar. Bom, nós temos duas propriedades que podem ser utilizadas, são elas: - shape-outside: Faz com que o conteúdo flutue ao redor do elemento, mas externamente. - shape-inside: Faz com que o conteúdo flutue ao redor do elemento, mas internamente. E nós temos algumas opções para utilizarmos com essas propriedades. São elas: circle(); elipse(); inset(); url(); polygon(); Todas essas funções recebem um grupo de argumentos. Vou falar especificamente de cada uma delas aqui. É possível trabalhar com as propriedades shape-margin, que trabalham junto do shape-outside e shape-padding que trabalha junto com shape-inside. Dessa forma, é possível ter um espaço definido entre o elemento com forma e o conteúdo que fica flutuando ao seu redor sem muita dificuldade. Dito isso, vou explicar cada uma das funções que existem em CSS Shapes. A) circle() Circle recebe um conjunto de argumentos e, caso não os aplique, o conteúdo iMasters #28 Novembro 2018
externo ou interno vai flutuar do mesmo jeito em relação ao elemento com forma, porém sem nenhum tipo de controle, ou seja, o navegador vai usar valores padrão. Os elementos ao redor flutuam de forma circular, obviamente, e não precisam necessariamente de nenhum argumento pra funcionar, porém vocês podem inserir dois argumentos, conforme mostrado abaixo: shape-outside: circle( <shape-radius> at <posição>);
shape-radius: Nada mais é do que o raio da forma, ou seja, a partir do centro, você pode definir o tamanho que desejar do raio. Se preferir, existem duas opções, closest-side (a partir do centro até o lado mais próximo) e furtherst-side (a partir do centro até o lado mais distante). posição: Recebe dois valores, posicionamento horizontal e vertical, ou seja, define o posicionamento do raio da forma. Link de exemplo: http://bit.ly/circle-css B) ellipse() Essa função é muito próxima da função circle, recebe praticamente os mesmos argumentos, mas com uma pequena diferença: ela recebe dois argumentos relacionados ao raio e somente isso. Link de exemplo: http://bit.ly/ellipse-css C) inset() A função inset() trabalha de um até quatro valores que estão relacionados aos boxes de referência (largura e altura intrínsecas) e o box model dos elementos. Além disso, recebe outro parâmetro que nada mais é do que o raio de curvatura, igual a circle() e elipse().
// 43
shape-outside: inset( <shape-arguments (de 1 até 4)>, <round>);
shape-arguments: Refere-se aos quatro pontos que formam o box de referência, ou seja, topo do box, o lado esquerdo, o inferior do box e o lado direito. round: Trata-se do quanto o elemento terá seus cantos arredondados - esse argumento é opcional. Link de exemplo: http://bit.ly/inset-css D) polygon() Essa é a função mais complexa e com mais opções exatamente pelo fato de ser utilizada para que os elementos ao redor possam flutuar de maneira mais abrangente. Ela é muito utilizada para lidar com imagens, por exemplo. A função admite um conjunto maior de opções pelo fato de criar diversos pontos que vão construir a forma desejada. É uma função que pode ser usada a partir de três pontos na forma. shape-outside: polygon(<fill-rule>, <shapearg><shape-arg>);
fill-rule: Refere-se ao interior do polígono, ou seja, como ele será preenchido por dentro - é isso que dará forma para o elemento. shape-arg: São os pontos que formarão o elemento de fato, ou seja, esses argumentos aceitam alguns valores relacionados a tamanho, como PX ou %. Link de um exemplo para deixar mais claro o conceito: http://bit.ly/polygon-css
Concluindo... Existe um mundo à parte a ser explorado em CSS Shapes. Poderíamos falar muito mais e de maneira mais profunda sobre isso, mas acredito que o que mostrei aqui já é suficiente para testar e entender todos os conceitos propostos por essa especificação. Com CSS Shapes, o design das páginas em que trabalhamos tem ganhos tremendos e, claro, com muita facilidade para quem desenvolve, sem a necessidade de hacks malucos. É mais uma propriedade moderna que chega com força (apesar de não ser nada novo). Se quiser mais material, tem um em português bem completo do Maujor, traduzido de um artigo escrito no A list Apart. Recomendo fortemente a leitura pra quem quiser expandir o aprendizado em relação ao que está sendo criado e também vale a leitura diretamente da especificação da W3C. Os links seguem abaixo: - CSS Shapes: http://bit.ly/css-shapes-portugues - CSS Shapes - Módulo 1 pela W3C: http://bit.ly/css-shapes-module-1 E é isso, espero que tenham gostado e que tenha ajudado vocês. Qualquer dúvida, estarei nas redes sociais pelo @raffaeldantass.
Rafael Dantas é desenvolvedor front-end, co-organizador do Meetup do HTML SP, palestrante na medida do possível e contribui em alguns projetos open source. É fã de CSS e eterno aprendiz. Escreve alguns artigos no meu Medium e está sempre disponível pra ajudar quem está iniciando na área.
rafael.dantas.br@gmail.com iMasters #28 Novembro 2018
44 // INTELIGÊNCIA NADA ARTIFICIAL
Inteligência artificial, algoritmos e cidades inteligentes - uma aplicação na realidade nacional Por Alex Lattaro, Analista de sistemas
N
No último artigo, falamos sobre a importância do conhecimento matemático para aplicações de IA. Hoje, vamos falar sobre uma situação real e analisar como dois algoritmos baseados em modelos matemáticos diferentes podem nos apresentar resultados diferentes, ressaltando assim a importância da escolha do modelo. Para elucidar nosso cenário, vamos falar sobre cidades inteligentes. O termo cidade inteligente nos remete a um assunto muito amplo, e seria complicado tratá-lo em poucas páginas. Sendo assim, vamos falar apenas da infraestrutura necessária para se desenvolver uma cidade inteligente e nos ater a uma específica, o Smart Grid. O que é um Smart Grid? O Smart Grid é uma rede elétrica inteligente baseada em recursos avançados de TI, telecomunicações, sensoriamento, medição e automação. O objetivo de um Smart Grid é aumentar sua eficiência em lidar com cenários com fontes intermitentes e distribuídas de energia, altos requisitos de qualidade e confiabilidade. Além disso, o Smart Grid deve ter baixo impacto ambiental e estar apto a trabalhar com novos mercados de energia, ou seja, de
iMasters #28 Novembro 2018
ser capaz de se integrar com energia solar, eólica e aceitar o consumidor final como um produtor de energia. O problema no Brasil Dentro da realidade brasileira, esse cenário fica um pouco mais complexo. As cargas elétricas variam constantemente, e isso gera uma variação na tensão. Sendo assim, fica muito complicado para os gerenciadores de sistema, pois eles precisam injetar ou absorver potência reativa para controlar a tensão. Essas cargas variam por motivos como horários de pico, quedas de subestações, distância dos ramos de distribuição, intempéries, mau funcionamento de equipamentos, dentre outros. Outro problema encontrado é que a rede de distribuição elétrica brasileira não está totalmente apta a receber energia produzida por um consumidor final - uma casa que produza energia elétrica por meio de energia solar tem dificuldade em vender o excedente para o distribuidor, por exemplo. Além disso, existem problemas mais técnicos, como ilhamentos. Na imagem abaixo, conseguimos ter dimensão da dificuldade dada a ramificação dessa distribuição.
// 45
Outro ponto é a legislação brasileira, já que, segundo a ANEEL, as concessionárias de energia devem manter um limite de qualidade de energia que é baseado na variação de tensão. Essa variação deve ser mantida dentro do espectro 0,95TC ≤ TL ≤ 1,05 TC, onde TL = tensão de leitura e TC = tensão contratada. Caso esse valor não seja mantido, a concessionária paga multa relativa ao tempo em que passa fora desse limiar. Algoritmos vs algoritmos Vamos tentar resumir o problema para podermos entendê-lo melhor. Imagine um grafo com vários pontos. Todas as arestas devem ser percorridas e todos os pontos são capazes de gerar energia, mas esses pontos podem falhar a qualquer momento e toda a rede precisa ser
recalculada para que o limiar de tensão permaneça intacto. Existem vários algoritmos capazes de nos ajudar com esse problema. Se pensarmos nele como um típico problema do caixeiro viajante, podemos trabalhar com ACO (ant colony optimization), já visto em edições anteriores. Porém, precisamos levar em consideração o recálculo baseado no caos. Sendo assim, uma possível abordagem seria trabalharmos com lógica fuzzy ou SIA (Sistemas imunológicos artificiais), ambos também já vistos em edições anteriores. Mas, se pesquisarmos na literatura, vemos que outras soluções também são possíveis, como nuvem de partículas, algoritmos de seleção negativa, RNA e otimização multiobjetivo. Então, qual algoritmo melhor se adapta ao nosso problema? iMasters #28 Novembro 2018
46 // INTELIGÊNCIA NADA ARTIFICIAL Abaixo podemos ver a comparação de alguns algoritmos. Comparação entre técnicas de classificação
Comparação entre técnicas de regressão
Comparação entre técnicas de clustering
iMasters #28 Novembro 2018
// 47
Observando as comparações acima, podemos identificar que a escolha do algoritmo depende do tipo de problema e dos recursos disponíveis para a resolução dele. Em relação aos recursos disponíveis, é simples entendermos a necessidade de sua compreensão. Poucos recursos computacionais ou um data set restrito podem ser limitantes na resolução do nosso problema. Porém, o entendimento do nosso problema e dos algoritmos nos ajuda a fazer uma escolha mais assertiva. Primeiro, vamos levar em consideração o problema da extensão da rede e o princípio do caos. O tamanho da rede é um problema, porque precisamos identificá-lo de forma a otimizar onde podem ser instalados os reguladores de tensão. Outro ponto interessante é a ideia de caos que a rede pode apresentar devido ao grande número de variáveis. Sob esse espectro, seria interessante a utilização da lógica fuzzy, visto que ela funciona muito bem para redução do espaço da busca e por ela ser uma lógica que lida muito bem com imprecisões. Veja que a lógica fuzzy trabalha como um sistema especialista, ou seja, por meio de regras predefinidas, é possível estabelecer um critério que permite eliminar as barras cujas instalações de reguladores não seriam factíveis.
Com isso, nós limitamos a nossa busca. Agora, vamos falar sobre as imprecisões. Mais uma vez, partimos de um sistema especialista que identifica as principais variáveis que podem influenciar nas decisões a serem tomadas. Essas variáveis são expressas por meio de funções de pertinência capazes de expressar o grau de compatibilidade com o conhecimento especialista de forma quantitativa. Bom, conseguimos identificar que a lógica fuzzy é uma boa opção para resolução desse tipo de problema, mas ela é suficiente? Nada está escrito em pedra A beleza da IA é que não ficamos limitados a uma única solução. Dentro do estudo da IA, um paralelo interessante é trabalharmos com lógicas híbridas. Encontramos uma boa solução para a resolução do problema, mas será que ela pode ser melhorada? Com os algoritmos genéticos (AG), somos capazes de otimizar nossa solução. Se aplicarmos um AG após a aplicação da lógica fuzzy, podemos otimizar nosso sistema. Lembre-se de que um algoritmo genético é baseado na criação aleatória de uma população inicial. Ou seja, ao aplicar o AG após a aplicação da fuzzy, diminuímos o espaço amostral e encontramos
iMasters #28 Novembro 2018
48 // INTELIGÊNCIA NADA ARTIFICIAL
A BELEZA DA IA É QUE NÃO FICAMOS LIMITADOS A UMA ÚNICA SOLUÇÃO os melhores pontos de instalação, e ainda podemos fazer cruzamentos genéticos e diminuir mais a quantidade de recursos utilizados. Mas nosso sistema especialista pode não ter levado em consideração todas as possíveis anomalias. Sendo assim, podemos pensar em aplicar algoritmos imunológicos, que são especialistas em identificar anormalidades. Um sistema imunológico artificial é capaz de diagnosticar rápida e precisamente as possíveis anomalias do sistema.
Ag
Inicialização
Calcula Afinidades
Geração dos conjuntos Fuzzy
Clonagem
Avaliação Fuzzy
Maturação
Re-seleção
Diversidade
iMasters #28 Novembro 2018
Temos um campeão? Bom, depois de passarmos por todos esses algoritmos, acredito que esteja simples identificar o que devemos utilizar sempre, certo? Não. Um sistema de distribuição de energia elétrica dentro de um Smart Grid é extremamente complexo, e não podemos reduzi-lo de tal maneira. O que fizemos aqui foi tentar entender um problema e transformá-lo em algo mais simples e tátil, desmembrando suas principais características e, assim, sugerindo possíveis soluções. A ideia principal é entender como cada algoritmo funciona para podermos decidir os possíveis candidatos a solução. Outro ponto interessante foi observarmos que um algoritmo de IA pode ser híbrido, ou seja, constituído de mais de um tipo de algoritmo.
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
DROPS DO MERCADO HOSPEDAGEM PARA NODE.JS COM SUPORTE PARA MÚLTIPLAS VERSÕES E POR APP A hospedagem Node.js da KingHost recebeu otimizações a partir de feedbacks recebido dos clientes. A principal novidade é a possibilidade de utilizar versões diferentes do Node.js sem a necessidade de migração de ambiente - e por aplicação! Outro diferencial é que para aproveitar as mudanças, não é necessário ter conhecimentos básicos de Linux, uma vez que tudo é feito no Painel de Controle da KingHost. Por que é importante o suporte a múltiplas versões do Node.js no mesmo ambiente e a possibilidade de utilizar versões diferentes por aplicação? O analista de infraestrutura de hosting da KingHost, Alessandro Santos, indica pelo menos dois motivos: 1) Realizar testes A/B entre a versão atual da app (rodando em uma versão do Node.JS mais antiga) e uma nova release (rodando em uma versão mais atual); 2) Utilizar uma app legada sem perder compatibilidade com versões do Node.JS mais atuais para novas apps. Vale conferir!
A EMBRATEL ACABA DE LANÇAR SUA SOLUÇÃO DE MULTICLOUD O produto permite que as empresas contratem a Embratel para consultoria, implementação, migração e gestão eficiente e especializada dos seus ambientes de TI utilizando sua infraestrutura em Nuvem da empresa ou de parceiros. Com a novidade, as empresas têm a possibilidade de refazer a arquitetura e escalar seus ambientes, de acordo com a necessidade de seus negócios. Quanto à infraestrutura, oferecemos ao cliente o ambiente de cloud que melhor se aplica às suas necessidades. A qualidade das ofertas de Nuvem da Embratel e a colaboração com importantes parceiros do mercado também são diferenciais nesse lançamento. Além disso, o cliente conta com cobrança diretamente em reais, com a possibilidade de uso de ferramenta para gestão de custos e controle de orçamento, e atendimento técnico especializado, com suporte 24x7, para monitoração e solução de incidentes. Saiba mais em www.embratel.com.br/multicloud
// 49
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!
QUEM PENSA O NOVO, VEM PARA A FIAP Nossos lançamentos: MBAs em Artificial Intelligence & Machine Learning, Blockchain, Business Innovation – Change Makers, Digital Business, Digital Data Marketing, Health Tech e Metodologias Ágeis (presenciais), entre outros cursos. Gestão da Tecnologia da Informação e Gestão Estratégica de Negócios (online). Início das aulas em 2019. FUTURE-SE: fiap.com.br/mba
PAGAR.ME DÁ AUTONOMIA A SEUS CLIENTES PARA A PROTEÇÃO CONTRA FRAUDE O Pagar.me lançou recentemente duas novas ferramentas que atuam na proteção contra fraude, o Score Pagar.me e a Revisão Manual. O Score classifica todas as transações da loja — tendo elas sido aprovadas ou recusadas —, atribuindo a elas um grau de risco que varia entre muito baixo, baixo, moderado, alto e muito alto. A ferramenta funciona de maneira inteligente, ou seja, ela aprende e melhora conforme é utilizada, se adaptando ao perfil de cada lojista. A Revisão Manual, por sua vez, permite que algumas transações sejam aprovadas ou recusadas manualmente pela Dashboard, dando autonomia para que o lojista entenda e crie estratégias para melhorar a segurança da sua operação. Juntas, as duas ferramentas diminuem chances de fraude e levam mais segurança para a saúde financeira da loja.
iMasters #28 Novembro 2018
50 // GAME
AS DIFICULDADES DE IMPLEMENTAÇÃO DE UM JOGO MULTIPLAYER EM REDE Por João Bergamo, gamedev
Fui motivado a escrever sobre esse assunto quando, conversando com vários amigos da área, descobri que não é tão comum para os desenvolvedores saber o quanto o projeto muda se optarem por colocar multiplayer online no jogo. Se você já é veterano da área ou já fez alguns jogos em rede, provavelmente este texto não é para você. Mas se você nunca fez ou está começando agora, estas dicas podem ser valiosas para seu trabalho. Para começar, vamos falar sobre os conceitos “Client, Server e Proxy”. Se você não está familiarizado com os termos, vou explicar de forma bem resumida. Imagine três entidades: PlayerServer, PlayerClient e PlayerProxy. Todas elas representam você como jogador, mas por um aspecto diferente. PlayerServer é o objeto que representa o seu player no servidor. Já o PlayerClient é o objeto que é você dentro do jogo sendo executado no seu hardware. E PlayerProxy é o objeto que representa você no hardware dos adversários. Isso também significa que todos os inimigos que você vê em sua tela são versões proxies dos outros jogadores que estão jogando com você pela rede ou Internet. Outro exemplo para tentar deixar mais claro: imagine que iremos programar o
iMasters #28 Novembro 2018
item “poção de vida”. A versão de client desse item pode conter apenas o código com a sua mecânica de utilização. Já a versão de server, além do mesmo código com a regra de utilização da poção, pode conter uma parte adicional de segurança, para validar se o item pode mesmo ser utilizado por aquele jogador ou se é uma tentativa de hack. Já a versão Proxy talvez não precise manter nenhum dos dois códigos, afinal só precisa representar que aquele item foi utilizado por você para os demais jogadores. Logo, bastaria ter o código de um efeito que mostre a utilização daquele item para os jogadores adversários. Isso pode parecer confuso no início, mas com o tempo é um conceito bem fácil de aprender e utilizar, já que em jogos multiplayer é uma necessidade constante de arquitetura pensar por esses três prismas. Mas, João, eu preciso sempre dividir o objeto dessa forma? Sim, precisa ser uma preocupação constante que tipo de código fica em cada tipo de objeto, pois, como citei acima, uma das coisas mais importantes com que você também precisará se preocupar em multiplayer em rede é a segurança. Se seu jogo não for seguro, ele será facilmente hackeável. Existem inúmeros casos de jogos que, por melhor que fossem, não tiveram sucesso, pois os
// 51
hackers acabaram com toda a diversão. Uma grande dica é que toda ação importante do seu jogo seja validada no servidor, evitando que alguém que tente usar algum hack para conseguir algum tipo de vantagem consiga fazê-lo. Porém, para isso, você deve evitar que essa parte do código vá para a versão final executável dos jogadores, para que eles não tenham acesso a essa checagem de segurança caso façam engenharia reversa no executável. Com acesso ao seu código, hackear o jogo é muito mais fácil! E aí vem outra decisão que você deve tomar: qual técnica de servidor utilizar? Um servidor autoritário ou um servidor semiautoritário? Ou usar técnicas de self hosting com P2P? Servidor autoritário é aquele que executa e valida todas as ações do jogador. Em um servidor desse tipo, os jogadores apenas enviam pela rede seus inputs (suas intenções de ação), e o servidor valida todas, executa e replica para client e proxies tudo o que está acontecendo.
Já no servidor semiautoritário, algumas ações são executadas pelo servidor e outras podem ser executadas pelo client. É como se você confiasse que algumas ações podem ser decididas pelo jogador por não serem tão importantes ou de grande impacto no jogo. Assim, é dada a confiança de que algumas ações não precisam ser validadas pelo servidor. Ambas são técnicas válidas e podem ser utilizadas conforme a necessidade de cada projeto. A primeira garante mais segurança contra hackers, mas, dependendo da quantidade de validações que o servidor tiver que fazer, aumenta o custo de processamento com o qual talvez você ou sua empresa não queiram arcar - o que pode tornar a segunda opção mais vantajosa. Vale lembrar que, ao utilizar um servidor seja autoritário ou semiautoritário -, é essencial que você o hospede em algum lugar, e lembre-se de que isso tem um custo! Além de um serviço de hospedagem, você precisará se preocupar em dar manutenção nesses servidores, de modo que iMasters #28 Novembro 2018
52 // GAME eles se mantenham o máximo de tempo possível para não estragar a experiência dos seus jogadores. Existe também a opção de self hosting, que, em termos práticos, é o jogo em que o próprio jogador vira o host da partida. Os outros jogadores se conectam através de conexão Peer2Peer (P2P) a esse jogador host, e jogam sem precisar de um servidor dedicado. Isso faz com que você não precise de infra com um servidor rodando 24/7. No entanto, ao escolher essa opção, você estará dependendo do hardware do jogador para garantir que a experiência de todos na partida seja satisfatória. Também é importante apontar que, nessa hipótese, é necessário que todo seu código de server esteja no client que está em mãos do jogador. Como dito anteriormente, se o jogador possui seus códigos de validação em mãos, a chance de hacking é muito maior. tantes são arquitetura e escalabilidade. Há uma grande diferença entre jogos limitados por partidas (ex.: Overwatch, Fifa, Counter-Strike) e jogos massivos (MMOs), como World of Warcraft. O primeiro tipo é mais fácil de lidar, pois se utilizam instâncias de servidores diferentes para cada partida iniciada, e caso o servidor em que o jogo está hospedado comece a chegar ao seu limite, é fácil levantar uma segunda máquina com novas instâncias de partidas, e assim por diante. Dessa forma, na teoria, é possível manter um número virtualmente infinito de partidas rodando ao mesmo tempo, sem maiores problemas. O que leva a um cenário completamente diferente quando se trata de um MMO. Aqui, é necessário utilizar técnicas e várias tecnologias de ponta para conseguir manter vários jogadores em uma mesma região do seu MMO. Manter 100 jogadores conectados em uma ou mais máquinas com várias instâncias de servidores diferentes é um problema muito diferente de manter 1000 jogadores na mesma instância, que é o que geralmente faz um MMO. Nesse segundo caso, há uma grande necessidade de estudo, arquitetura e testes antes de começar a produção do jogo para ter certeza iMasters #28 Novembro 2018
de que ele aguentará o número desejado de jogadores. A utilização de banda da Internet também precisa ser analisada. A banda de Internet, infelizmente, ainda é um recurso físico e finito tanto para os datacenters, que podem hospedar seus jogos, quanto para seus jogadores, que podem até estar utilizando a conexão de um plano de dados móvel. Jogos como Hearthstone são exemplo de otimização nesse aspecto - mesmo após inúmeras partidas, utilizam apenas alguns kbytes da banda do seu pacote de dados. Por outro lado, MMOs no geral utilizam muita banda. Isso é normal, dada a natureza desse tipo de jogo, que exige a troca constante de informação por segundo para manter o seu mundo totalmente sincronizado com todos os jogadores. Sempre que você detectar que alguma ação do seu jogo precisará ser enviada ao servidor, pense em como enviar a menor quantidade de bytes possível para validar a informação. Assim, as chances de conseguir manter a utilização da rede do seu jogo em um nível saudável são muito maiores. Por último, mas não menos importante, vou falar de um dos problemas mais difíceis com que provavelmente você irá lidar fazendo um jogo multiplayer em rede: a tão temida latência, ou mais comumente conhecida como lag. A latência é o tempo no qual a informação demora para trafegar do hardware do jogador até o servidor, e lá ser processada e devolvida para o jogador. Mesmo que esse pacote de dados viaje na velocidade da luz, isso significa que a informação terá alguns milissegundos de atraso até ser recebida de volta. Esses milissegundos às vezes podem se tornar segundos, dependendo da distância física entre os jogadores e o servidor do jogo. Esse tempo de atraso entre servidor e client faz com que tudo o que o jogador vê esteja atrasado em relação ao servidor, e mais atrasado ainda se for pensado em relação aos proxies, conforme pode ser visto na imagem abaixo:
// 53
∂ Exemplo de problema de latência
É por isso que alguns jogos criam servidores regionais e restringem as partidas neles apenas para jogadores daquela região. Somente assim você conseguirá a menor latência possível e,com isso, garantir uma experiência melhor para seus jogadores. Existem inúmeras técnicas de NetCode, que são junções de técnicas de interpolation, prediction e reconciliation que podemos utilizar para mascarar esse problema. No MMORPG Profane, onde atualmente faço parte da equipe e ajudo a desenvolver, utilizamos a seguinte técnica de prediction nos projéteis que temos no jogo: ao disparar uma flecha, o jogador a vê saindo do seu arco instantaneamente ao executar a ação e a vê seguir sua trajetória normalmente. Porém, essa informação nem chegou ao servidor ainda. Quando o pacote com a ação chega ao server, é feito um cálculo utilizando a velocidade da flecha e quanto tempo a informação demorou para chegar ao servidor. Com isso, podemos calcular exatamente em qual posição a flecha deveria estar no servidor para que fique sincronizada com a posição que está aparecendo para o player. Em seguida, é feita uma checagem da posição do disparo até a posição em que a flecha deveria estar, se ela deveria ter acertado algo no caminho. Se sim, só confirmamos para o client que ele acertou algo. Se não, a instanciamos na mesma posição em que o jogador que a
disparou a está vendo, e a flecha prossegue seu trajeto normalmente, totalmente sincronizada com o client. Isso não é uma técnica perfeita, mas o custo-benefício era o melhor para nosso tipo de jogo no momento. Cada jogo utiliza uma técnica diferente, e vale a pena pesquisar como eles o fazem. Cada caso é um caso, e é preciso analisar para seu escopo o que faz mais sentido. A Blizzard divulgou um vídeo que pode ser visto em https://bit. ly/23cWKRq, e nele são explicadas as técnicas utilizadas em Overwatch. Vale a pena conferir e aprender mais sobre isso, pois eles são referências de jogos online no mercado. Espero com isso ajudá-lo a identificar as dificuldade de implementar um jogo multiplayer em rede. Na dúvida, recomendo começar com um escopo pequeno e gradualmente ir aumentando, até que atinja o resultado esperado. Pode parecer complexo, mas estudar cada um desses tópicos os torna muito mais fáceis no dia a dia, e o resultado será recompensador. João Bergamo é gamer de carteirinha, gamedev, cientista da computação e pós-graduado em produção de jogos. Trabalha com games há mais de 12 anos e torce para que venham muitos outros pela frente!
joaobergamo@gmail.com iMasters #28 Novembro 2018
54 // PROJEÇÕES
EXPLORAÇÃO DE CONJUNTOS DE DADOS POR MEIO DE PROJEÇÕES MULTIDIMENSIONAIS Por Renato Rodrigues Oliveira da Silva, Professor na Faculdade Impacta Tecnologia
Todos os dias nos deparamos com uma imensidão de dados, das mais variadas fontes: documentos, planilhas, conjuntos de imagens, músicas e vídeos são apenas alguns exemplos. Quando temos a tarefa de analisá-los e identificar informações úteis a partir deles, necessitamos de ferramentas adequadas. Não é à toa que os termos Ciência de Dados e Mineração de Dados andam tão em evidência, pois abordam o estudo de métodos para preparação dos dados e aplicação de técnicas para identificar padrões de forma automática. Então podemos usar essa informação para a tomada de decisões estratégicas. Nesse contexto, podemos destacar o papel de visualizações para auxiliar no entendimento dos dados. Existe uma grande variedade de representações visuais disponíveis, desde simples gráficos de linhas e barras até redes complexas que conectam milhões de elementos. Cada visualização é focada em um determinado contexto para ressaltar características particulares dos dados. No entanto, a grande maioria das visualizações não é adequada para trabalhar com dados iMasters #28 Novembro 2018
multidimensionais, como planilhas, tabelas ou documentos, nos quais o número de dimensões (colunas) pode facilmente chegar às centenas ou milhares. Isso limita muito a utilidade de visualizações quando trabalhamos com esse tipo de dados. Para exemplificar, vamos analisar a Figura 1. Na Figura 1a, podemos visualizar um gráfico de linha, em que uma dimensão da nossa tabela é utilizada no eixo y, e o eixo x representa os vários registros existentes. Dessa forma, é possível ver facilmente como essa dimensão varia ao longo do conjunto, e podemos identificar o valor máximo, o mínimo, se muitos elementos possuem valores similares, a amplitude etc. Mas e se quisermos analisar várias dimensões ao mesmo tempo? Como podemos verificar na Figura 1b, que ilustra o caso de seis dimensões, ficou muito mais difícil fazer comparações e responder às mesmas perguntas do exemplo anterior. Se quisermos ir além e verificar se existem grupos de elementos similares (e quão similares eles são), para entender a estrutura dos dados em um nível mais geral, o problema se torna ainda mais complexo.
// 55
30 20 10 50
100 (a)
150
(b) ∂ Comparativo entre gráfico de linhas de uma dimensão e várias dimensões.
Projeções multidimensionais Uma boa estratégia para contornar esse problema é empregar uma família de técnicas chamadas projeções multidimensionais [1]. Podemos descrever uma projeção multidimensional, de uma forma bastante simplista, como uma técnica capaz de criar uma versão bastante simplificada do conjunto de dados, em que é feita uma transformação que reduz as dimensões originais (normalmente para apenas duas), preservando a noção de similaridade entre os elementos. Dessa forma, podemos visualizar nossa tabela como um conjunto de pontos espalhados na tela 2D do computador. Cada ponto representa uma linha da tabela, e a posição dos pontos indica o quão similar eles são: pontos localizados em uma mesma vizinhança indicam alta similaridade, e vice-versa. Essa representação é capaz de indicar facilmente grupos de elementos similares, outliers (pontos muito distantes dos demais), fronteiras entre grupos etc. Como exemplos de técnicas de projeção temos MDS (Multidimensional Scaling) [2], t-SNE (t-Distributed Stochastic Neighbor Embedding) [3] e LAMP (Local Affine Multidimensional Projection) [4] - esta última desenvolvida no Instituto de Ciências Matemáticas e de Computação da USP de São Carlos. Cada técnica possui suas particularidades, como velocidade de execução, capacidade de lidar com grandes conjuntos de dados, precisão, flexibilidade para permitir interação do usuário para guiar o resultado final, capacidade de lidar com fluxos de dados etc. As pesquisas nessa área contam com uma comunidade
bastante ativa, e novas técnicas são desenvolvidas frequentemente. Exemplo de aplicação Para exemplificar uma aplicação de projeções, iremos estudar o conjunto de dados Relatório Anual de Felicidade 2017 (https://bit.ly/2MzlWDg). Trata-se de um relatório publicado pela ONU para medir o índice de felicidade de 155 países considerando uma série de medidas, como produção econômica, generosidade, índices de corrupção, liberdade etc. Queremos verificar como esses países estão relacionados de acordo com os valores das medidas, quais países são similares e possíveis outliers. Vamos trabalhar em um exemplo de aplicação utilizando a MDS, uma das técnicas mais tradicionais. Utilizaremos a linguagem Python com os pacotes scikit-learn (que já implementa a MDS), o pacote Pandas para manipular o conjunto de dados e o pacote Bokeh para visualizar e interagir. Todos eles já vêm previamente instalados na distribuição Python Anaconda (http://www.anaconda.com). Após fazer o download do arquivo de dados (world_happiness_2017.csv), incluí manualmente na tabela uma coluna para indicar a que continente pertence cada país, pois usaremos essa informação para colorir a projeção. Vamos iniciar utilizando o Pandas para carregar o arquivo na estrutura tabular DataFrame. Em seguida, removemos algumas colunas para deixar o DataFrame com apenas os atributos relevantes para comparar os países, ou seja, as métricas. iMasters #28 Novembro 2018
56 // PROJEÇÕES
import pandas as pd df = pd.read_csv(‘world_happiness_2017. csv’) # Carrega os dados no DataFrame df pais = df.pop(‘Country’) # remove de df os nomes dos países rank = df.pop(‘Happiness.Rank’) # remove as posições no ranking continente = df.pop(‘Continente’) # remove os nomes do continente
O passo seguinte é normalizar o conjunto, de modo a ajustar as dimensões para uma escala comum. Dessa forma, as dimensões podem ser comparadas, e a distância entre os elementos pode ser calculada posteriormente. from sklearn import preprocessing min_max_scaler = preprocessing. MinMaxScaler() matriz_normalizada = min_max_scaler. fit_transform(df) df_normalizado = pd.DataFrame(matriz_ normalizada, columns=df.columns)
Agora projetamos os dados para um espaço de apenas duas dimensões. from sklearn import manifold mds = manifold.MDS(random_state=0) df_2d = mds.fit_transform(df_normalizado) # Gera a projeção e armazena em df_2d
O último passo é visualizar a projeção como um conjunto de pontos. O resultado final é exibido na Figura 2. from bokeh.models import CategoricalColorMapper, ColumnDataSource, HoverTool iMasters #28 Novembro 2018
from bokeh.plotting import figure from bokeh.io import show, output_file from bokeh.transform import factor_cmap source = ColumnDataSource(data=dict(nom e=pais, x=df_2d[:,0], y=df_2d[:,1], label=continente)) # define a ferramenta HoverTool para permitir interação com o mouse hover = HoverTool(tooltips=[(‘index’, ‘$index’), (‘nome’, ‘@nome’), (‘continente’, ‘@label’)]) # define a paleta de cores a ser aplicada nos pontos, de acordo com o continente paleta = [‘#80b1d3’, ‘#bebada’, ‘#d8b365’, ‘#8ed28c’, ‘#fb8072’, ‘#9b856c’] mapper = factor_cmap(‘label’, palette=paleta, factors=continente. unique().tolist()) # gera e exibe a figura da visualização p = figure(plot_width=500, plot_height=500, tools=[hover], title=’Relatorio 2017’) p.circle(‘x’, ‘y’, size=10, source=source, color=mapper, legend=’label’, alpha=0.9) output_file(‘projecao.html’) show(p)
A projeção exibe vários agrupamentos de países, e podemos interagir utilizando o cursor do mouse para identificar o nome do país, posição no ranking e continente. Após investigar por alguns instantes, podemos notar um grupo de países localizado na região superior que possui alta pontuação no ranking. Esse grupo é formado majoritariamente por países europeus como Holanda, Alemanha, Noruega, Suécia, Islândia etc. Em contraste, na região inferior se concentram vários países com baixa pontuação, majoritariamente africanos. O único representante das Américas nesse grupo é o Haiti, país que enfrenta graves problemas econômicos e sociais. O Brasil ocupa uma posição próxima ao grupo superior (21ª posição), e possui como vizinhos Japão, França, Argentina e México. Vale lembrar que esses países são
// 57
considerados similares levando em consideração apenas os índices desenvolvidos pela ONU para esse conjunto de dados em particular.
Referências [1] L. G. Nonato, M. Aupetit, “Multidimensional Projection for Visual Analytics: Linking Techniques with Distortions, Tasks, and Layout Enrichment,” in IEEE Transactions on Visualization and Computer Graphics, 2018.
∂ Projeção do Relatório Anual de Felicidade 2017
[2] I. Borg, P. J. F. Groenen, “Modern Multidimensional Scaling: Theory and Applications”, Springer, 2018.
Considerações finais
[3] L. J. P. van der Maaten, G. Hinton, “Visualizing High-Dimensional Data Using t-SNE”, in Journal of Machine Learning Research, 2008. [4] P. Joia, D. Coimbra, J. A. Cuminato, F. V. Paulovich, L. G. Nonato, “Local Affine Multidimensional Projection,” in IEEE Transactions on Visualization and Computer Graphics, 2011.
Essa visualização permite que analisemos rapidamente o padrão de similaridade entre grupos de elementos, como o tamanho de cada grupo e a densidade. Também podemos verificar facilmente quais são os elementos de fronteira entre grupos, se existem outliers e quão distantes estão dos demais grupos. Uma aplicação interessante dessa técnica é permitir a visualização do resultado de técnicas de classificação e de agrupamento de dados em conjuntos de alta dimensão. Além disso, é possível interagir com o conjunto, de modo a selecionar elementos relevantes (de acordo com os critérios estabelecidos pelo analista) e criar um conjunto mais adequado para alimentar processos de mineração de dados. Isso pode tornar o modelo de mineração muito mais preciso para atender aos objetivos do projeto. Os desafios em Ciência de Dados são muitos, mas com as ferramentas adequadas é possível contorná-los e encontrar padrões muito interessantes. As possibilidades são várias. Bons estudos!
Renato Rodrigues Oliveira da Silva é professor na Faculdade Impacta Tecnologia (FIT) e analista de sistemas pelo Instituto Federal de São Paulo (IFSP). É doutor em Ciência da Computação com foco em Visualização de Informação.
r3nato@gmail.com iMasters #28 Novembro 2018
58 // POR FALAR EM DEV
Quer programar melhor? Então saia da frente do computador Por Diego Pinho, Cofundador da Code Prestige
E
Existem várias técnicas de aprendizado (ex: autoexplicação, interrogação elaborativa, visualização etc.), mas quando estamos falando de programação, é inegável que a mais eficaz é aquela em que a prática repetitiva leva à perfeição - seja uma biblioteca, um framework ou uma linguagem de programação. A maneira mais eficiente de fixar o conhecimento na cabeça sempre será através da repetição. Faça o código uma vez, então faça de novo e de novo. Resolva problemas pequenos e suba a complexidade gradualmente. Uma hora a informação ficará fixa na sua cabeça, e você não esquecerá mais. Precisamos fazer isso, porque todos os dias somos bombardeados com os mais diversos tipos de informações, de modo que, se não colocamos as tecnologias que vemos em prática, elas naturalmente somem da nossa cabeça porque o cérebro dá lugar a outras coisas (mesmo que elas não sejam importantes). Essa é a melhor técnica para se aprender uma tecnologia, mas não é a única que deve ser praticada para que você seja um profissional de tecnologia eficaz no mercado. Desde as origens da
iMasters #28 Novembro 2018
nossa área, a figura do programador é vista como aquela da pessoa solitária, que só sabe se comunicar com os computadores. Entretanto, essa é uma noção equivocada e totalmente distante do profissional de tecnologia da atualidade. É por esse motivo que não devemos nos prender somente ao computador e devemos sair para explorar o mundo além do digital. Uma das características que as empresas procuram e que falta em boa parte dos programadores é uma boa comunicação. Hoje, dificilmente as equipes de tecnologia são isoladas (o que já aconteceu em algum momento do passado), o que obriga os profissionais a se comunicarem não somente entre si, mas com outros de outras áreas (isso quando não com os próprios clientes). Diretoria, Recursos Humanos, Operações… hoje, todas essas áreas (e muitas outras) se sustentam na TI. Se você está acostumado a somente interagir por meio da Internet, poderá encontrar dificuldades em um futuro não muito distante. Mas não se alarme, porque existem muitas coisas que podem ser feitas para trabalhar isso.
// 59 Uma grande iniciativa é começar a participar de Meetups. Caso você ainda não conheça, os Meetups se tornaram muito comuns nos últimos anos e não são nada mais do que encontros de pessoas que possuem um interesse em comum. Eles são totalmente gratuitos e abertos ao público em geral. Gosta de back-end? Sem problemas. Front-end? Tranquilo. Devops? Também tem. Os Meetups são tão diversos que dificilmente você não encontrará um que esteja alinhado com os seus interesses. Se você for de São Paulo, sugiro alguns: Training Center Frontend SP HTML SP CSS - São Paulo Uma vez que você participe dos Meetups, o próximo passo natural são os eventos de tecnologia. O próprio iMasters realiza anualmente uma porção de eventos bacanas e acessíveis, como o JS Experience, .Net Community Summit e o InterCon. Mas claro que esses são só alguns exemplos. Há vários outros eventos fantásticos que acontecem nos quatro cantos do País - basta você encontrar o que mais te agrada e dar as caras. Quando começamos a participar desses eventos, muitas coisas boas começam a acontecer e que agregam ao seu perfil profissional em curto, médio e longo prazo. Logo de cara, o contato com novas pessoas é um grande motivador. Grande parte das comunidades de desenvolvimento são extremamente receptivas e te farão se sentir à vontade, mesmo que você seja iniciante ou uma pessoa muito tímida, o que dará brecha para que você troque experiências com outros. Quando isso acontece, não somente suas habilidades de comunicação terão melhorado, mas você terá aprendido com as experiências dos outros, e isso agregará muito a sua vida profissional, mais do que qualquer artigo na Internet. Além disso, há as palestras que sempre trazem uma nova visão sobre uma tecnologia e aplicações em cenários reais.
Outra atividade interessante para melhorar como profissional é a leitura de livros. Claro, a leitura de livros técnicos é importantíssima, mas aqui me refiro a livros de outros tipos. Poemas, ficção, romances, biografias… o que te interessar mais. Quando nos desprendemos do mundo técnico literário, abrimos possibilidade para o nosso cérebro exercer a criatividade e a própria interpretação do texto. Além disso, do mesmo modo que aprendemos a programar programando, também aprendemos a escrever e a nos comunicar lendo. Muitos profissionais são fluentes em linguagens de programação, mas não conseguem se expressar em sua língua nativa, e isso é um problema sério. Ao ler livros, as palavras e suas acentuações acabam entrando na sua cabeça por osmose. Mais uma técnica interessante é a prática de exercícios físicos. Eu sei que você já deve ter lido em muitos outros artigos diferentes, mas não posso deixar de reforçar como isso é benéfico para o corpo e para mente também. Quando o corpo está saudável, os nossos pensamentos fluem de forma mais eficaz, o que resulta em resolução de problemas mais rápidos e códigos mais bonitos. Além disso, não adianta saber escrever um sistema inteiro em um dia e não ter saúde. Essas são só algumas sugestões de coisas que você pode fazer além de programar o dia todo para ser um profissional melhor. Não há dúvidas de que sua atividade primária continuará sendo programar, mas essas e outras atividades fora do computador te ajudarão em capacidades complementares e te tornarão um profissional mais completo.
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 e cofundador da Code Prestige.
diegomartinsdepinho1992@gmail.com iMasters #28 Novembro 2018
60 // TUTORIZAÇÃO
MENTORIA E TUTORIZAÇÃO: PRECISAMOS CONVERSAR Por Diana Arnos, Tech Lead na MGov
iMasters #28 Novembro 2018
// 61
Todos nós, em algum momento de nossas carreiras, assumimos o papel de mentor e tutor. Seja como um representante de alguma comunidade de desenvolvimento ajudando a espalhar conhecimento, seja dentro de uma empresa em que coordenamos uma equipe ou precisamos preparar um sucessor, ou mesmo por um espaço delimitado de tempo numa hackathon ou em um workshop. Hoje, temos até comunidades inteiramente dedicadas a ligar mentores a quem deseja aprender, como é o caso da Training Center ou o programa de mentoria da WoMakers Code. Nos últimos dois anos da minha carreira, eu resolvi me dedicar mais a aprender melhor e a compartilhar conhecimento, depois de uma experiência frustrante tentando contratar desenvolvedores teoricamente seniors que sabiam muitas regras de cor, mas efetivamente não dominavam nenhum conceito.
O desenvolvedor responsável sabia C e C++ e estava muito confuso, porque, segundo ele, cada mentor que passou pela mesa do grupo sugeriu uma ferramenta diferente: Django (Python), Laravel (Php), Rails (Ruby). E cada um desses mentores tinha seus argumentos embasando a escolha. Nenhum deles perguntou coisas tipo “qual o problema que você precisa resolver?” ou “qual caminho você acha que pode seguir?”. Nenhum conceito foi discutido, a situação sempre se resumia a “você precisa desenvolver web, usa esse framework aqui que vai resolver seu problema”. É esse mesmo o papel de um mentor? Ou de um tutor? Você sabia que tutorar e mentorar são coisas diferentes? Acredito que em algum momento você já tenha visto alguma árvore ou outra planta apoiada em uma espécie de pedaço de madeira, como nesta imagem aqui:
10 anos decorando regras e sintaxes não te fazem um bom resolvedor de problemas Nessa jornada pessoal de tentar ajudar cada vez mais pessoas, percebi uma questão que parece simples, mas não é: todo mundo fala em ensinar, mas ninguém fala sobre “permitir aprender”. E são coisas diferentes. BEM diferentes. Algumas coisas só podem ser aprendidas, mas não ensinadas, porque dependem muito da experiência pessoal de cada um e da lição que pode ser tirada do ocorrido, dado o atual contexto da pessoa. Durante a última hackathon em que tive o enorme prazer de participar como mentora, havia centenas de participantes, e testemunhei um caso em particular que chamou minha atenção. Em um dos dias, tarde da noite, eu e alguns colegas passamos por alguns times para conversar e ver se podíamos ajudar em algo. Um dos times, por algum motivo, não tinha uma pessoa que entendesse de desenvolvimento web, apesar de o produto deles exigir esse tipo de conhecimento. iMasters #28 Novembro 2018
62 // TUTORIZAÇÃO
Isso é um tutor. A função dele é guiar o crescimento da planta em uma determinada direção (nesse caso, para cima). Ele dá a sustentação que, por enquanto, o próprio corpo da planta não tem. Deixa eu repetir: o tutor GUIA o crescimento em uma determinada DIREÇÃO. O tutor não faz a planta crescer. Aliás, ninguém tem o poder de fazer uma planta crescer. Puxá-la para cima vai, no máximo, arrancar a coitada do vaso com raiz e tudo. O tutor garante que, conforme a planta cresce, ela esteja na direção certa, sem interferir diretamente no seu desenvolvimento. Nesse caso, não importa qual seja a planta, a ação do tutor é sempre a mesma. Entretanto, para que efetivamente a planta cresça, outros cuidados são necessários. Não adianta apontar a direção correta se a planta não é regada, adubada, iluminada ou podada corretamente. Enquanto o tutor pode ser o mesmo para todas as plantas, os cuidados que são diretamente ligados à nutrição e ao desenvolvimento delas varia de acordo com cada uma. Algumas precisam de mais sol, enquanto outras, se tomarem sol demais, podem secar. Algumas precisam ser regadas todos os dias, outras só uma vez por semana. Isto é a mentoria: o cuidado personalizado que cada um exige para que possa crescer. E, mesmo com todo esse cuidado personalizado, a planta cresce no tempo dela. Jogar mais água ou colocar mais terra no vaso não vai transformar uma muda em uma árvore em um mês. Em compensação, se nenhum cuidado for tomado, a planta morre. Entendendo o significado de tutorização e mentoria, eu posso exemplificar uma situação prática: como eu ajudaria alguém a iniciar no desenvolvimento web com PHP. Como tutora, apresentaria o PHP do jeito certo, as PSRs, reforçaria a importância da padronização, apresentaria o php.net e incentivaria a busca pela documentação das funções que trouxessem alguma dúvida. Também apresentaria alguns conceitos básicos sobre a web em si: requests, a diferença entre cliente e servidor,
iMasters #28 Novembro 2018
o caminho da informação dentro de um sistema web desde o navegador até o processamento pelo servidor e a resposta de volta no navegador. Indicaria alguns materiais e talvez até cursos confiáveis. Dessa forma, eu consigo guiar a pessoa na direção correta no contexto atual do desenvolvimento web com PHP. Eu não estou exatamente ensinando, apenas indicando alguns caminhos a serem tomados. Como mentora, eu observaria as atitudes da pessoa em relação ao caminho dado e acompanharia seu desenvolvimento, entregando elementos conforme seja necessário. Exemplo: se a pessoa estiver se sentindo muito insegura, posso passar um exercício que eu, com meu entendimento sobre ela e seu real nível de conhecimento, conseguiria facilmente resolver. Talvez ela não ganhe muito conhecimento técnico, mas ganharia confiança para continuar os estudos. Ou, então, se a pessoa beirar a arrogância (quem nunca?), posso passar um exercício realmente desafiante, que a faça se questionar algumas vezes sobre a sua real capacidade (às vezes, é necessário).
O TUTOR GUIA O CRESCIMENTO EM UMA DETERMINADA DIREÇÃO. O TUTOR NÃO FAZ A PLANTA CRESCER. ALIÁS, NINGUÉM TEM O PODER DE FAZER UMA PLANTA CRESCER
// 63
Se a pessoa chegasse até mim dizendo “olha, fiz essa função e tive esse erro, pode me dizer o que significa?”, eu nunca daria a resposta. Provavelmente, eu responderia “o que aparece escrito na mensagem de erro?”. E então iria estimulando a pessoa a procurar a origem do erro sozinha. Com certeza, esse processo seria muito mais demorado, mas garantiria o real aprendizado, já que a pessoa acharia a solução por ela mesma. É entregar somente o necessário para que a pessoa ache o próprio caminho em seus estudos. Mesmo que duas pessoas cheguem ao mesmo resultado, cada uma teve seu caminho de execução. O que funciona para mim não vai funcionar para você. Quando tentamos ensinar alguém, corremos o risco de forçar um contexto de aprendizado baseado em nossas próprias experiências e esquecemos que cada pessoa tem seus próprios desafios e compreende o mundo de uma maneira diferente. Agora, se em vez de tentarmos ensinar, nós entregarmos à pessoa os elementos necessários apenas dando pequenas dicas para que ela não fique travada em seu próprio processo, ela nunca vai esquecer o que for aprendido, já terá descoberto as soluções por si só. Ou seja: a pessoa aprende sem ser ensinada. Isso significa que o trabalho de um mentor é muito mais dispendioso do que aparenta ser: ele precisa conhecer muito bem os conceitos em que está oferecendo ajuda, precisa conhecer muito bem a si próprio para identificar seus próprios limites e precisa ter empatia e saber conhecer o outro como o outro realmente é para que possa guiá-lo dentro do caminho que ele precisa, não aquele que o mentor tenha imaginado ser o melhor. Às vezes, precisamos deixar a pessoa cair e aprender a se levantar sozinha, e apenas estarmos lá para entregar a caixa de primeiros socorros e falar “abre aí e vê o que te serve melhor para parar a dor”. E isso não é fácil. É muito mais fácil saber o que fazer do que saber o que não fazer. Então, voltando à situação da hackathon: em vez de chegar para o participante e dizer algo como “use
Laravel”, por que não dizer “dá uma pesquisada nos frameworks PHP que estão em alta hoje e depois a gente conversa”? Isso faria a pessoa entender o que é um framework PHP, conheceria as tendências de mercado e pelo menos veria por cima o funcionamento básico desses frameworks. Isso levaria apenas algumas horas e, após escolher um dos frameworks para trabalhar, a pessoa teria seus próprios argumentos para justificar essa escolha. E, com certeza, ela nunca mais vai esquecer o que aprendeu, já que foi por escolha própria. Ao simplesmente tentar passar o seu conhecimento do seu jeito em vez de se adaptar à maneira do outro, supondo que a pessoa realmente consiga aprender como você, na MELHOR das hipóteses seu maior resultado como suposto mentor seria ter um aluno que sabe exatamente as mesmas coisas que você, da mesma maneira que você. Dessa forma, o conhecimento do aluno é limitado ao conhecimento do professor. Ao invés de expandir a capacidade de raciocínio e evolução, você apenas cria novas barreiras. Não existe maior alegria para um mestre do que perceber que seu discípulo se desenvolveu muito mais do que ele. Isso garante que os discípulos de seu discípulo também saberão mais do que ele. Assim, o conhecimento pode crescer de forma exponencial. Lutemos por mais conhecimento e menos ego.
Diana Arnos é Tech Lead na MGov, desenvolvedora, membro das comunidades PHPSP/PHPWomen, entusiasta de segurança da informação, bacharel em Ciência da Computação, apaixonada por open source e qualidade de código. É palestrante, amante de artes marciais e vocalista de Heavy Metal.
diana.arnos@gmail.com
iMasters #28 Novembro 2018
64 //
COMUNIDADES O Afropython mostra que até na tecnologia representatividade importa, sim! Por Mariana Anselmo, para revista iMasters Você conhece o Afropython? O projeto é uma iniciativa de profissionais de TI e Recursos Humanos de Porto Alegre, no Rio Grande do Sul. E o seu objetivo é incentivar o ingresso e empoderamento de pessoas negras na área da tecnologia. O Brasil é composto por 54% de negros e pardos, de acordo com pesquisa do IBGE. Mas na área de tecnologia da informação, a representatividade desta parcela da população é quase inexistente. E na tentativa de mudar esse cenário, sete jovens se juntaram (Felipe Machado, Andreza, Felipe de Morais, Amanda Vieira, Thomas Medeiros, Rosalba Monteiro e Jonas Davila) e criaram o Afropython. Nesta entrevista com Rosalba Monteiro, uma das idealizadoras do projeto, conhecemos um pouco mais da história do projeto, como eles estão atuando na região de Porto Alegre e os planos para o futuro. Como surgiu o Afropython e quais as principais atividades? Surgiu através da ideia do Felipe de Morais, em fazer algum tipo de ação com foco em pessoas negras no cenário de tecnologia. Junto com essa ideia, ele conectou algumas pessoas que foram as idealizadoras do projeto (que você pode conhecer mais em https://afropython.org/).
iMasters #28 Novembro 2018
Sobre nossas atividades, a principal ocorre sempre em novembro, onde realizamos o evento anual. Esta será a nossa segunda edição. Nossa principal frente é a gama de eventos que ocorrem periodicamente, como oficina de programação (e foi assim que o projeto surgiu), ou eventos em ciclos de palestras e workshops divididos em trilhas de assuntos de interesses. Além disso, estamos iniciando um ciclo de meetpus de porte menor, porém mais frequentes. Fora nossos eventos, mantemos o engajamento através de grupos no WhatsApp e no Facebook, na tentativa de criarmos um movimento para que pessoas negras possam ser protagonistas e que possam preencher outros espaços. Cada participante que atua em algum setor de tecnologia incentiva nosso protagonismo e com isso tentamos formar uma grande e linda corrente. O Afropython me parece bastante peculiar... O que os diferencia de outras iniciativas? Na verdade, este é o único projeto com este formato destinado a pessoa negras. Um projeto que reúne oficinas, ciclo de palestras e meetups; só isso já poderia ser considerado como algo único, mas o que
// 65
o torna, na minha opinião, um projeto especial é a entrega, carinho e amor que todos os envolvidos têm pelo projeto. E não só quem o organiza, mas também os participantes que, depois de vivenciar essa experiência, passam a realizar atividades dentro do projeto. Existe uma troca de experiências com outra comunidade? Sim, existe uma troca de experiências entre todos; quem organiza, quem participa... E essa troca é tão real que, aos poucos, os participantes vão se empoderando dos seus próprios conhecimentos e vão perpetuando-os para outras pessoas. Gostamos de falar que o Afropython se multiplica a cada evento, em cada participante. Isso é muito legal! É muito gratificante poder estar em um evento de pessoas negras e saber que estamos entre pessoas que muitas vezes têm a nossa mesma vivência quanto pessoa negra na sociedade. Quando exaltamos que somos todos capazes de qualquer coisa, essa semente germina e é perpetuada por todos ao nosso ecossistema. Qual a importância do Afropython para a região que vocês abrangem? É muito importante ter um movimento na área de tecnologia focado em pessoas negras; principalmente porque a tecnologia é um setor gerador de empregos em que não vemos uma quantidade aceitável de pessoas negras - e nisso estão vários fatores: sociais, econômicos e culturais. A pessoa negra, muitas vezes, nem se permite sonhar com algumas dessas profissões. Quando um projeto assim surge, ele dá a oportunidade para que elas não só
tenham técnica, como a oportunidade de ter poder de escolha. O mais importante é mostrar que somos capazes e que o mundo também é nosso. Quanto a localidade, não podemos desconsiderar o fato do Rio Grande do Sul ser ainda considerado um dos estados brasileiros mais racistas do Brasil. Nestas circunstâncias, ter um movimento de resistência e visibilidade para pessoas negras é algo tão importante que ultrapassa o projeto e se torna um movimento. Como enxerga o meio das comunidades no Brasil (o pessoal se ajuda, troca experiências, vão uns nos eventos dos outros)? Sim! E não só comunidades com foco no recorte racial. Hoje, vários grupos considerados minoria se uniram para forma uma grande corrente. Temos e damos apoio a esses eventos e isso é fundamental para que cresça a diversidade na tecnologia.
iMasters #28 Novembro 2018
66 // CÓDIGO ABERTO
Alternativas ao Github Por Kemel Zaidan, Gerente de Desenvolvimento na Nuveo
D
Desde a nossa última edição, o mundo do software livre e do open source foi abalado pela compra do Github, a maior plataforma de hospedagem de projetos de código aberto (e proprietário) do mundo. Passado o choque inicial e o receio de muitos sobre as reais intenções da gigante de Redmond, as coisas parecem bem mais calmas e muito semelhantes ao que costumavam ser. Independente disso, é sempre interessante conhecer alguns projetos abertos que pretendem ser alternativas ao Github, seja por segurança, independência tecnológica ou redução de custos. Gitlab (BSD): certamente, a alternativa mais conhecida. Escrito em Ruby on Rail, é de longe o mais completo (e complexo) de todos, abrangendo inclusive outras funcionalidades que não estão presentes por padrão no Github (como Continous Integration, por exemplo). Além de poder ser usado em uma infraestrutura própria, conta também com uma opção SaaS que ajuda a manter o desenvolvimento do projeto em um modelo já consagrado pelo Wordpress. Permite criar pequenas ou grandes instalações, com diversos níveis de redundância. https://gitlab.com
iMasters #28 Novembro 2018
Gogs (MIT): o segundo colocado é bem mais simples que o Gitlab, mas mesmo assim consegue oferecer uma boa gama de recursos, aproximando-se bastante das funções mais importantes do Github, inclusive na interface de usuário web. Escrito em Go, tem a instalação bastante simplificada como é comum a programas escritos nessa linguagem, capaz de gerar um binário único. Outra vantagem é que ele pode ser executado inclusive em hardwares muito simples e de baixo custo, como o RaspberryPi e alguns NAS. https://gogs.io
// 67
Phabricator (Apache2): esta talvez seja a opção que tenta se afastar mais do Github na tentativa de criar algo melhor e mais completo, que supra a maior parte das necessidades de um projeto de desenvolvimento de software. Algumas das features interessantes do Phabricator são revisão e auditoria de código, bug tracker, canais de chat, um painel de gerenciamento de sprints semelhante ao Trello, API, uma ferramenta de linha de comando e suporte a Mercurial e SVN além do Git. Escrito na maior parte em PHP, o Phabricator é mantido por uma empresa chamada Phacility, que oferece suporte e uma versão hospedada do software. https://phacility.com/phabricator/ Gitbucket: (Apache2): é uma plataforma web escrita em Scala e que conta com a instalação simplificada através de um arquivo .war em sistemas que podem rodar Java 8. Alguns recursos interessantes são a compatibilidade com a API do Github e um sistema de plugins capaz de extender a plataforma ao oferecer novos recursos. Outros destaques são suporte a GitLFS, editor de arquivos online, bug tracker e wiki, além de integração com LDAP. https:// github.com/gitbucket Kallithea (GPL3): o projeto é membro da Software Freedom Conservacy e suporta Mercurial, além de Git. Escrito em Python, traz alguns outros recursos interessantes, como integração com LDAP, suporte a pull requests, editor online, visualização gráfica de mudanças e estatísticas de commits. https://kallithea-scm.org/ Gitprep (GPL): agora, se você está interessado em algo mais simples, pode dar uma chance a este projeto. Com uma interface semelhante a do Github, o Gitprep só precisa de Perl 5.10.1+ para rodar e já traz um servidor web integrado. Além disso, ele possui issue tracker e suporte a CGI, SSL e autenticação por chave pública. http://gitprep.yukikimoto.com/
Kemel Zaidan é um pseudoprogramador, metido a jornalista, com alma de artista e Gerente de Desenvolvimento na Nuveo.
kemelzaidan@gmail.com
iMasters #28 Novembro 2018
68 // DA REDAÇÃO
A importância dos eventos de TI para a carreira dev Por Rodrigo PokemaoBr, para Revista iMasters
A
A cada dia que passa aumenta o número de eventos de TI acontecendo ao mesmo tempo. São meetups, conferências, webinars, hackathons, talks e muitas outras formas de disseminar conteúdo técnico para devs. E isso reflete diretamente na qualidade da comunidade de desenvolvedores que vem se construindo nos últimos anos. Vemos mais devs se preocupando com qualidade de código, com o aprendizado de novas tecnologias, estimulando o uso de diferentes linguagens de programação, além de estarem mais próximos de outras pessoas que desenvolvem, de empresas, de rodas de conversa e outros grupos. Mas nem sempre foi assim. Muitas das lembranças que temos do passado, quando falamos sobre desenvolvedores, eram de pessoas solitárias em uma sala escura, com um grande copo de café e olhando durante todo o tempo para uma tela escura com a IDE em preto e branco com um monte de HTML aleatório. Mas por que será que isso tem mudado nos últimos tempos? As pessoas estão começando a entender que, além da parte técnica, essa é uma parte muito importante para o bom convívio dentro de uma empresa de desenvolvimento. Outro ponto é que, no momento de contratação de um dev, cada vez mais são consideradas as habilidades pessoais, sociais e de comunicação; os chamados soft skills.
iMasters #28 Novembro 2018
A parte técnica de quem desenvolve é facilmente treinada: artigos, cursos, e-books, livros físicos, videos, plataformas de treinamento, github etc; estão sempre disponíveis para quem quiser aprender. As soft skills levam um pouco mais de tempo para serem aprimoradas e os eventos são uma ótima forma de estar mais próximo de pessoas e, com isso, melhorar as suas qualidades interpessoais. Palestras em eventos são uma parte muito importante. Quem está assistindo fica sabendo as tecnologias que estão sendo utilizadas no momento, o que as pessoas que estão utilizando estão falando delas, onde é possível aplicar, quais as dificuldades de implementação, quais são os cases de sucesso, quais problemas resolvem etc. Costumo pensar nelas como uma ferramenta dentro de uma caixa de ferramenta: você aprende como e quando utilizar e a deixa ali. Quando surge um problema que ela resolve, você a tira da caixa e começa a pegar experiência utilizando. Já quem está apresentando, além de melhorar as suas habilidades de comunicação (uma coisa muito importante para quem desenvolve), uma vez que muitos devs são tímidos; Participar de eventos tambpem proporciona o aumento do domínio sobre o assunto abordado, em geral se estuda ainda mais sobre o assunto ao realizar uma palestra, além de aprender muito
// 69 também durante a explanação e durante o período de perguntas; Melhora-se o poder de síntese, já que geralmente quem palestra retira uma parte importante de todo conteúdo que estudou, implementou ou desenvolveu sobre aquela tecnologia, mostrando apenas as partes indispensáveis para quem está assistindo. Outro soft skill desenvolvido por quem palestra é a questão de referência, visto que quanto mais palestras sobre um determinado tema aquela pessoa apresenta, mais conhecida no meio daquela tecnologia ela fica. O resultado é mais oportunidade de palestrar e até de empregos.
Mas além das palestras, tudo que rodeia o evento em si é importante para aprimorar as habilidades de quem desenvolve. O momento pré-palestra, onde você vai escolher um lugar para sentar é um momento em que poucas pessoas buscam conhecer as outras, mas é o momento mais propício para isso. Às vezes você vai passar 2, 3 horas do lado de uma pessoa que você nunca viu. Que tal aprimorar suas habilidades de relacionamento inter-pessoal e se apresentar para a pessoa? Perguntar quem é, onde trabalha, o que faz e aumentar a rede de contatos? Obviamente, respeitando todos os pontos do código de conduta do evento.
EXPERIMENTE O DIFERENTE! APROVEITE A OPORTUNIDADE DE ESTAR EM UM EVENTO PARA TIRAR O MELHOR DELE E MELHORAR SUAS HABILIDADES SOCIAIS
iMasters #28 Novembro 2018
70 // DA REDAÇÃO O momento de coffee break, é outro momento onde pode-se conhecer pessoas novas com o mesmo objetivo que você. É o momento em que você pode parar aquela pessoa que deu uma talk muito interessante sobre o tema que você gosta. O momento em que você pode rever quem você conhece e tirar fotos com a galera. É a hora em que você pode conhecer mais gente ou parar nos stands das empresas que patrocinam o evento e ver o que tem de novo por aí. É a hora em que deveríamos aproveitar para conhecer mais gente e aumentar nossa rede de contatos. A hora do almoço em geral é realizada em um intervalo de tempo maior, para que seja possível ainda uma maior interação entre os participantes do evento. Vá almoçar com a galera que você acabou de conhecer; com certeza sua experiência com o evento será ainda melhor. O happy hour é um momento único, onde todos estão abertos para conversar em um ambiente mais descontraído e informal que o local do evento. Não tenha medo de falar com todo mundo, se apresentar e interagir. Esse momento foi criado para isso: para que todo mundo saia conhecendo pelo menos mais alguém. Outra oportunidade que os eventos nos dão é o de conhecer novos lugares. Existem eventos de TI pelo mun-
iMasters #28 Novembro 2018
do todo. Por todos os estados do Brasil e em cidades que você talvez nem imagine que tenha. Busque esses lugares. Conheça outros ambientes. O trabalho em equipe é um requisito cada vez mais importante no mercado de trabalho de TI, e conhecer outras culturas é um atributo essencial quando falamos de trabalho em equipe. Saber respeitar os costumes de cada um, saber complementar o trabalho de quem trabalha contigo e ainda aumentar a bagagem cultural, são coisas que uma experiência de sair da zona de conforto e ir para “eventos fora de casa” te proporciona. Falo por experiência própria. Nesse mundo de eventos de TI, organizando, participando e palestrando conheci muita gente boa que com o passar do tempo viraram amigos e colegas de trabalho. Conheci lugares que nunca imaginei conhecer e pessoas que fazem coisas incríveis; que trabalham com tecnologias interessantíssimas. O meu trabalho atual, por exemplo, eu consegui por causa de um evento. Experimente o diferente! Aproveite a oportunidade de estar em um evento para tirar o melhor dele e melhorar suas habilidades sociais. Se você não viu ainda, com certeza você vai ver o quão isso é importante para a vida de quem trabalha com tecnologia.
// 71
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 #28 Novembro 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.
As edições de abril, maio e junho superaram 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:
Chatbots Caio Calado aproveitou sua talk para ensinar os quatro passos para melhorar a conversa do seu chatbot. Caio é Chatbot Advocate na Take e co-organiza ações para capacitar pessoas e empresas interessadas em chatbots, inteligência artificial e interfaces conversacionais no Brasil. https://bit.ly/2onYHgP
Community Manager do GDG-Bauru, Reinaldo Silotto aproveitou sua palestra no 7Masters para tratar sobre botpress. O que é, como funciona, em que situações se aplica... Confira! https://bit.ly/2Nz0Ilp
Nesta edição do 7Masters sobre chatbot, o Rodrigo de Almeida Siqueira falou sobre os 7 desafios da linguagem para chatbots. Rodrigo é fundador da InBot e desenvolve chatbots com processamento de linguagem natural desde 2001. Ele também foi um dos criadores do Robô Ed (Petrobras). https://bit.ly/2MDQLXj
“O que é chatbot”? Parece uma pergunta básica, mas a Cristina Luz aprofundou a questão e tirou muitas dúvidas em sua talk. Cristina trabalha como evangelista na PHPWomen, é co-organizadora do Women Dev Summit e fundadora do Desprograme, uma organização que busca democratizar a programação e inclusão da diversidade na tecnologia. https://bit. ly/2MDbgn7
Erik Andersen Neto desvendou os 7 segredos dos chatbots na sua fala no 7Masters. São dicas preciosas que você não pode perder! Erik é possui mais de 15 anos de experiência em TI. Atua na IBM desde 2008 passando por projetos internacionais e desde 2016 tem atuado como no time de consultoria da IBM. https:// bit.ly/2N1FNdL
Para falar sobre chatbot para plataformas e integrações, trouxemos a Thaissa Bueno Sanches. Ela é pós-graduanda em um MBA em machine learning, especialista em desenvolvimento de softwares com .NET e Java há mais de 10 anos. Também contribui com as comunidades técnicas de SP na área de inteligência artificial. https://bit.ly/2NvHgG7
Diana Arnos fez um paralelo interessante entre os chatbots e os SMS. Além de trazer a ideia de como um pode ajudar o outro. Diana é desenvolvedora, membro ativo das comunidades PHPSP/PHPWomen, entusiasta de segurança da informação, bacharel em Ciência da Computação. https://bit.ly/2MHmjfa
iMasters #28 Novembro 2018
// 73
Containers Alisson Machado de Menezes falou no 7Masters Containers sobre como usar o Openshift para orquestrar sua infraestrutura de containers. Alisson tem mais de 7 anos de experiencia em Linux, Python e projetos opensource. https://bit.ly/2Pqj2On
Outra palestra foi a do Daniel Requena, que tratou sobre provisionando um cluster KBS com Kops. Atualmente ele é DevOps Engineer e SRE na Mandic-Rivendel. https://bit. ly/2N3vUMM
Com o objetivo de facilitar a vida de quem está começando, Jeferson Fernando Noronha descomplicou o Docker para a plateia! Jeferson é entusiasta Linux, Docker e da cultura DevOps. Palestrante e fundador do canal do Youtube LINUXtips e co-fundador da empresa de consultorias e treinamentos CodeOps. https:// bit.ly/2NaMQB7
Openshift para orquestrar sua infraestrutura de containers foi o tema da talk da Gabriela de Lima Dias. Com mais de 18 anos de experiência em projetos FOSS (Free and Open Source Software), ela é entusiasta DevOps. Atualmente é gerente de Cloud na Mandic/Rivendel. https://bit.ly/2wv5j1r
Para mostrar que nem tudo são flores, Wellington Silva mostrou como se faz Linux containers na unha! Ele é autor do livro “Aprendendo Docker, do básico à orquestração de contêineres” e co-organizador do meetup de Docker e do DevOpsDays em São Paulo. https://bit. ly/2wqtttQ
“Indo além do desenvolvimento web com docker” foi o tema da talk de Renato Groffe, articulista do iMasters. Ele também é consultor em atividades voltadas ao desenvolvimento de sistemas há mais de 15 anos, Microsoft MVP e participante do programa MTAC. https://bit. ly/2PSZTWe
Talita Bernardes fez um overview sobre containers em sua talk no 7Masters que leva o tema. Falou desde o básico, como uso, funcionalidades, prós e contras. Talita trabalho com DevOps há cerca de um ano e meio e atualmente está na Getup. https://bit.ly/2PQ5I6P
iMasters #28 Novembro 2018
74 // 7MASTERS
Automação de testes Puppeteer foi o tema da talk de Fabio Damasceno no 7Masters Automação de testes. Ele conseguiu esmiuçar o tema, falando de vantagens, uso etc. Fabio é desenvolvedor full-stack e especialista em front-end. https://bit.ly/2MDF1Eh
Na edição do 7Masters sobre automação de testes, Emmanuel Brandão falou sobre três práticas, seis habilidades e três habilidades. Emmanuel trabalha como Consultor ALM / DevOps, ajudando times de desenvolvimento de software a serem mais produtivos. https://bit. ly/2LKyfHx
Em sua talk, Júlio de Lima tratou das escolhas durante a automação de testes de API. ele é Lead QA Engineer na Capco, possui experiência em testes envolvendo aplicações Web, Desktop, Mobile e serviços. https://bit.ly/2wv9SZP
Em sua talk, Marcos Vinícius Correia da Silva tratou dos Testes orientados pelo produto (PDT) e tirou todas as dúvidas acerca do tema. https:// bit.ly/2NAotJY
E quem precisa de dicas de melhorias para suite de testes, essa talk do Gabriel Caruso é para você! Na falta de uma dica, ele dá sete! Gabriel é Backend Developer na Leroy Merlin, além de PHP internals e externals evangelista. https:// bit.ly/2PR41pw
iMasters #28 Novembro 2018
// 75
iMasters #28 Novembro 2018
76 // POR DENTRO DO W3C
OFERECIMENTO
MANTENEDORES
iMasters #28 Novembro 2018