Postagens

Mostrando postagens com o rótulo 4Developer

Leading The Transformation - Applying Agile and DevOps Principles at Scale

Imagem
Meu principal "take away" deste livro: A principal mensagem que eu tirei deste livro foi com relação à abordagem de como se implantar "Agile e princípios de DevOps" em uma empresa de grande porte (time de desenvolvimento > 100 pessoas).  Em uma abordagem mais tradicional de implantação, a implantação começaria no nível de "time" de desenvolvimento, iniciando em um pequeno time, usando um projeto como "piloto" e a partir das experiências e aprendizados deste time, ir expandindo para toda a corporação. O livro defende uma abordagem diferente, mais holística. Ele defende que a implantação deve iniciar em um nível mais alto dentro da organização, tendo os executivos/gerentes liderando a transformação. Estes caras deveriam estabelecer os " business objectives " e rodar um processo de melhoria contínua. O foco deveria ser no planejamento , criando um framework de priorização do trabalho entre os times de acordo com...

Distributed Tracing - Uber

Imagem
Participei de um meetup no Uber, sobre "Distributed Tracing" usando a ferramenta Jaeger, desenvolvida pelo próprio time  do Uber e que virou open source em 2017.  Para quem não conhece, distributed tracing é o antigo conceito de tracing, porém agora dentro da realidade de microservices, onde vc pode ter diferentes serviços implementados em diferentes linguagens e frameworks e você precisa fazer o tracking de um request por exemplo. No caso do Uber, eles tem mais de 3000 microservices (pelo menos eles dizem que tem :)).  Segue um dos links compartilhados, para aqueles que tiverem interesse: https://eng.uber.com/distributed-tracing/ https://www.jaegertracing.io/

Crônica: Javascript nos dias de hoje

Uma crônica muito engraçada, mostrando a realidade que estamos vivendo com as constantes mudanças no mundo de desenvolvimento web, falando especialmente em Javascript: Versão original: https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f#.nyjj086lv Versão em português: http://thiagolunardi.net/2016/10/como-e-aprender-javascript-em-2016/
Imagem
  Tenho participado de alguns meetups aqui na região de Long Island / NYC. O último encontro foi deste grupo de Javascript: Refactoring to ES2015 We will be refactoring code examples using some of the new ES2015 features, including the let & const declarations, template literals, default values, rest parameters, spread operator, arrow functions and the destructuring assignment. A experiência tem sido muito bacana. Interagir com desenvolvedores daqui dos USA é sempre interessante e o nível das discussões é muito bom.  

Android journey

Imagem
Chegou a criança, agora é comigo... De vez em quando é bom pegar um livro em português...

Yo! Geradores modernos de código com Yeoman!

Imagem
Apresentação muito bacana do meu colega Sidharta sobre a ferramenta de geração de código Yo!

Autenticação em redes sociais em Python e GAE

Imagem
Recentemente precisei fazer uma POC utilizando GAE e autenticando no Facebook. Utilizei a biblioteca SimpleAuth, portada para Python: https://github.com/crhym3/simpleauth Funcionou muito bem, recomendo! Um ponto interessante: ela utiliza o modelo User Models do webapp2 . Desta forma, os dados do usuário são automaticamente armazenados em uma tabela (kind) dentro do datastore:

Microservices: use com moderação!

Sempre que surge um novo "hype" no mercado eu fico com um "pé atrás". Não que eu seja reativo à mudanças (talvez um pouco), mas é que a velocidade com que as pessoas se atiram nas "novidades" me assusta e me faz ter uma reação contrária. Depois de tanto tempo ver as ondas chegando e passando, você começa a desenvolver este tipo de comportamento. Mas algumas ondas vem para ficar... É sempre bom quando um cara de respaldo consegue balancear as discussões. Neste artigo do Martin Fowler ele fala sobre o "custo" de se utilizar uma arquitetura neste padrão. "The microservices approach is all about handling a complex system, but in order to do so the approach introduces its own set of complexities" Ele termina desta forma: "So if you can keep your system simple enough to avoid the need for microservices: do." Minha conclusão (pode ser precipitada neste momento!): considere a utilização deste tipo de desenho de arquitetur...

Introdução à microservices

Artigo introdutório mas interessante sobre Microservices na vida real, usando a stack da Microsoft: http://theundocumentedapi.com/2015/01/05/modern-apps-and-microservices/ Em especial, as figuras "DEPENDS ON HOW YOU SLICE IT" e " MICROSERVICE LOGICAL ARCHITECTURE"

Datastore: [Parte 2] Queries and indexes

Queries  O conceito de queries no datastore não é diferente do que já estamos acostumados com bancos relacionais. O importante é entender as limitações.   Mas, conceitualmente, queries retornam "entidades" do datastore que atendam aos critérios especificados na consulta.   Uma query normalmente inclui:    Uma "kind" (equivalente a uma tabela de banco relacional) Um ou mais "filters": filtros baseados em valores das propriedades, chaves ou ancestrais. Uma ou mais opções de ordenação ("sort") Uma boa prática, com em qualquer banco de dados, é retornar o mínimo possível e necessário de informações, com o intuito de poupar recursos de memória e melhorar a performance. A função dos Índices Toda query do datastore utiliza um ou mais índices para ser processada. Atenção neste ponto. Esta é uma diferença fundamental, quando comparamos com bancos de dados relacionais, onde os índices tem a função primária de otimizar uma consulta ...

Criando um arquivo Readme.md no GitHub

Colocar um arquivo Readme.md no seu repositório do Github é sempre uma boa prática. O objetivo é você descrever o seu projeto e fornecer informações gerais para quem for utilizá-lo: Segue um exemplo: Synopsis At the top of the file there should be a short introduction and/ or overview that explains   what   the project is. This description should match descriptions added for package managers (Gemspec, package.json, etc.) Code Example Show what the library does as concisely as possible, developers should be able to figure out   how   your project solves their problem by looking at the code example. Make sure the API you are showing off is obvious, and that your code is short and concise. Motivation A short description of the motivation behind the creation and maintenance of the project. This should explain   why   the project exists. Installation Provide code examples and explanations of how to get the project. API Reference Depending ...

DataStore: [Parte 1] Introdução

Imagem
O que é o DataStore ? O datastore é a solução NoSql da plataforma de cloud do Google (Google Cloud Platform). De forma resumida, ele possui as seguintes características: Estrutura : banco de dados de objetos "schemaless" Consistência : oferece "Strong Consistency" (consistência forte), para consultas com as chaves completas (com ancestral). Consistência eventual para as demais consultas. Custo: oferece uma cota livre, com limites diários. Transações: são ACID. Como funciona internamente Internamente o DataStore foi construído sobre o BigTable e Megastore: MegaStore : traz a escalabilidade de um NoSql com as conveniências de um banco relacional. BigTable : oferece a infraestrutura escalável de armazenamento. Alguns termos básicos do DataStore Kinds: equivalem às tabelas do mundo relacional. Entities: equivale a uma linha no mundo relacional. No dataStore, uma "entity" é um objeto armazenado em uma kind. Keys: equivale à c...

GAE: Qual a causa mais comum de falhas de uma aplicação no GAE ?

Imagem
Por incrível que pareça, são problemas com cotas! Se uma aplicação excede a cota permitida, uma exceção será gerada. Por isso o assunto merece atenção: O que é cota ? Cota é um limite imposto pela plataforma para a utilização de determinado recurso. Existem cotas para tudo. Veja alguns exemplos: uso de "banda de rede" de entrada e saída armazenamento uso de API (prediction, etc) email logs uso de filas (queues) etc Tipos de cotas Existem 3 tipos: Free Quotas: como o nome diz, são cotas livres para a utilização de alguns recursos da plataforma. Billable Limits: limites pagos de utilização de recursos. Safety Limits: limites de segurança impostos dentro da plataforma, para que ninguém seja capaz de derrubá-la. Dentro dos "Safety Limits", temos 2 pontos: Cotas Diárias: limite diário, resetado todo dia à meia-noite (Pacific Time - PST) Cotas Por minuto: limita uma taxa máxima de uso por minuto. É resetado a cada minuto. Como ver...

GAE: Como fazer o troubleshooting?

Imagem
O que fazer se algo parar de funcionar ? Em um sistema tradicional "on premisse", normalmente faríamos o seguinte: "Logamos" no servidor Começamos a investigar o sistema operacional, a aplicação e os logs. E o que fazer no caso de um app rodando na nuvem, cuja instância pode estar sendo executada em qualquer servidor ? No caso do GAE, da plataforma do Google, a recomendação é a seguinte: Verifique o status do App Engine Antes de se "descabelar" e começar a procurar o problema na sua aplicação, verifique o status da plataforma App Engine, através da seguinte página: https://status.cloud.google.com/ Você pode assinar o RSS Feed no rodapé da página, para receber os status de forma automática. Verifique o Google Admin Console http://console.developers.google.com Na página inicial você também pode verificar o status geral de todos os serviços da plataforma. Além disso, verifique o status de suas instâncias do GAE, suas versões, tráf...

Big Data : Site interessante com uma lista de ferramentas e frameworks de visualização

Imagem
Aproveitando a onda de Big Data, onde existe a filosofia de... "static report is dead" achei este site com uma lista de ferramentas, como por exemplo Tableau , e também frameworks (a maior parte javascript) que podem ser usados para criar apresentações de dados de forma muito sofisticada. http://selection.datavisualization.ch

GAE: [Parte 4] Como funciona o scaling

Imagem
A configuração de scaling do GAE é feita através do arquivo de configuração da aplicação ".yaml " Normalmente uma aplicação irá ter um arquivo .yaml, porém esta configuração pode ser feita por "módulo" da aplicação, como na figura abaixo:   Cada arquivo .yaml define:   version: versão da aplicação tipo de scaling : manual, basic ou automatic (default) tipo de instância: URL mapping: mapeamento de URLs para pontos específicos da aplicação (ex: static files) Abaixo podemos ver um exemplo de configuração de cada tipo de scaling: Manual Scaling application: simple-sample application: simple-sample runtime: python27 api_version: 1 instance_class: B8 manual_scaling: instances: 5 instances: número de instância que serão criadas no start da aplicação. Basic Scaling  application: simple-sample version: uno runtime: python27 api_version: 1 instance_class: B8 basic_scaling:   max_instances: 11   idle_timeout: 10m ...