ruby

APIs RESTful com Grape – Parte 1

Não é novidade para ninguém qual é a minha linguagem de programação favorita ultimamente. Ruby, oras! Provavelmente, também não é mais novidade para ninguém que venho focado em um único assunto: desenvolvimento de APIs RESTful. Inclusive, fazendo palestras aqui em Salvador. Então, como juntar esses dois mundos (Ruby + APIs)? A resposta é Grape! Um framework espetacular, que provê uma DSL muito simples e que facilita brutalmente a vida dos desenvolvedores de APIs.

Entretanto, percebi um probleminha! Não encontrei um tutorial sequer na Internet, sobre esse assunto, escrito em português ou espanhol. Péssimo! Portanto, meu objetivo aqui é escrever uma série de publicações sobre como instalar, configurar e usar o Grape para criar suas APIs. Primeiro, será um post em português, depois, me arriscarei a escrever em espanhol também. Será duplamente útil, porque terei a oportunidade de por em prática meus estudos de espanhol. 🙂

API do Bebum

Nosso projeto será uma API para um sistema que disponibilizará informações sobre cervejas. Começaremos com apenas dois modelos: Cerveja e Tipos de Cervejas. Futuramente, poderemos avançar, incluíndo mais modelos e incrementando nossa API! Todo o código que vocês verão aqui estará no Github, no endereço https://github.com/marloncarvalho/bebum-api.

Preste atenção que estamos seguindo rigorosamente (ou o máximo que pudermos) o modelo REST para a criação de APIs. Observe também que estou criando Tags no repositório com os nomes das partes de cada artigo. Por exemplo, teremos a Tag Parte 1, Parte 2 e assim por diante!

Montando seu Ambiente

Sou fã de Mac de longa data, portanto, vou focar basicamente nesta plataforma. Mas, como Mac é um *NIX, a maioria das coisas que farei aqui são replicáveis em um ambiente Linux. Quanto aos usuários Windows… bom, aí não tenho muito a ajudar, pois já tem 10 anos que não uso esse ambiente. Inicialmente, você precisa ter o interpretador Ruby instalado. No meu caso, eu uso o RVM – Ruby Version Manager para esta tarefa. O RVM instala e gerencia as versões do Ruby que você tem em sua máquina. Sugiro fortemente usá-lo!

Instalando o Ruby com o RVM

Para instalar o RVM, conforme descrito na página deles, basta digitar no console:

\curl -sSL https://get.rvm.io | bash -s stable

Depois disso, vamos instalar o Ruby na versão 2.1.2 usando o comando:

rvm install 2.1.2

Com o Ruby instalado, vamos agora instalar o Gem do Grape digitando no console:

sudo gem install grape

Pronto, seu ambiente está montado para nosso primeiro projeto com Grape. Fácil, não?

Bundler

Você já conhece o Bundler? Ainda não? Que feio! O Bundler é um gerenciador de dependências para Ruby. Com ele, fica mais fácil você definir quais gems seu projeto necessita e baixá-los. Caso ainda não o tenha instalado, faça gem install bundler no seu console para instalá-lo. O Bundler espera que você tenha um arquivo Gemfile na raiz do seu projeto. Neste arquivo, você deve listar cada Gem que seu projeto depende. Uma vez que você cria este arquivo, basta digitar bundle install no console, dentro do diretório onde está o arquivo Gemfile, para que ele baixe as dependências.

Estrutura do Projeto

Eu poderia começar com uma estrutura extremamente enxuta, mas seria simplista demais e já existem dezenas de artigos em inglês ensinando a usar o Grape que já fazem isso, então… Nosso próximo passo agora é montar a estrutura do nosso projeto. Crie um diretório qualquer em sua máquina e monte uma estrutura de diretórios semelhante à da imagem abaixo. Você também tem a possibilidade de baixar essa estrutura direto do nosso repositório.

Estrutura detalhada de diretórios do nosso projeto.

Esta é uma estrutura que eu sugiro, mas não significa que você deve utilizá-la sempre. Fique à vontade para modificá-la, conforme suas necessidades. Outro detalhe digno de nota é que ainda faltam alguns diretórios nessa estrutura. Por exemplo, ainda precisamos dos diretórios db e spec, mas faremos isso nos próximos artigos.

Nesta estrutura, o diretório app conterá todas as classes relacionadas ao negócio da nossa aplicação. Este diretório é subdividido em api models, onde api manterá somente as classes responsáveis em manter a lógica da nossa API RESTful e models conterá as classes de modelo, onde estarão, de fato, nossas regras de negócio.

Já o diretório api é subdividido em outros dois subdiretórios, chamados v1 v2. Esta divisão é interessante para facilitar a criação de novas versões da nossa API. Observe que tanto dentro de app, como dentro de v1v2, existe um arquivo chamado base.rb. Eles estão aí para unir em um único ponto todas as APIs que disponibilizaremos. Não se preocupe se ainda está confuso, pois detalharemos esses arquivos com cuidado a seguir. Dentro dos diretórios v1 v2 ainda temos uma pasta entities, que será responsável em manter as classes que irão expor os dados do nosso sistema em um formato de recursos.

Finalizando, o diretório model não tem nenhum subdiretório. Todos os demais arquivos são velhos conhecidos de todo programador Ruby e não vou detalhá-los aqui!

Modelos

Vamos nos focar agora na pasta models, onde temos, até este momento, apenas um arquivo chamado model.rb. Este arquivo contém as nossas classes de modelo. Obviamente, você pode, caso prefira, separar as classes em arquivos distintos. Talvez façamos isso no futuro, entretanto, para simplificar, vamos deixar em apenas um arquivo.

module Models

   # Cervejas.
   class Cerveja
      attr_accessor :id, :nome, :tipo
   end

   # Tipos de Cervejas
   class Tipo
      attr_accessor :id, :nome
   end

end

Observe que são duas classes extremamente simples, ainda sem nenhuma lógica de negócio associada e também sem as informações de persistência. Vamos incrementá-las no futuro, entretanto!

Estrutura Geral da API

Vamos agora fazer nossa primeira API funcional. Vamos iniciar analisando a pasta api. Observe o arquivo base.rb. Ele é extremamente simples, pois serve apenas para agrupar TODAS as versões que estamos disponibilizando da nossa API. É óbvio, entretanto, que normalmente liberamos apenas duas versões por vez. Mas, caso seja necessário, esta estrutura nos permite disponibilizar quantas versões acharmos necessárias.

require 'api/v1/base'
require 'api/v2/base'

module API

   class Base < Grape::API
      mount API::V1::Base
      mount API::V2::Base
   end

end

Este arquivo tem um módulo chamado API e dentro dele há uma classe chamada Base que estende de Grape::API. Logo em seguida, montamos as APIs que queremos exibir. No nosso caso serão API::V1::Base e API::V2::Base. Como você deve estar imaginando, essas classes estão definidas nos arquivos /app/api/v1/base.rb /app/api/v2/base.rb. São duas versões da mesma API!

Agora, vamos bisbilhotar o arquivo /app/api/v1/base.rb. Ele tem um pouco mais de informações. Inicialmente, continuamos criando o módulo API, mas agora temos outro módulo dentro dele, chamado V1. Depois, definimos a classe Base, que monta as APIs de Cervejas e Tipos. Essas duas APIs estão definidas nos arquivos api/v1/cervejas.rb api/v1/tipos.rb.

Também definimos algumas informações importantes sobre essa API. Definimos que a versão da API será obtida através do cabeçalho Accept do HTTP. Para que esta versão da API seja invocada, o cabeçalho Accept deverá estar escrito assim: application/vnd.alienlabz-v1+json. Isto é um padrão, não se preocupe em entender os motivos de ele estar definido assim. Obviamente, caso queira acessar outra versão da API, basta trocar o v1 por v2, por exemplo.

Não entraremos em detalhes da estrutura do diretório v2, pois ele está exatamente da mesma forma que o v1, já que ainda não temos nenhuma intenção de lançar uma versão 2.0 da API.

API de Tipos de Cervejas

Analisemos agora o arquivo /api/v1/tipos.rb. Ele inicia, como deveria ser, com a definição dos módulos APIV1. Logo em seguida, cria a classe Tipos herdando de Grape::API. Lembre-se, toda classe que representa uma API deve herdar desta classe do Grape. Agora a mágica começa a acontecer. Observe a definição do bloco resources. Ele serve para definir um namespace, dentro do qual estaremos servindo dados sobre um determinado recurso que estará disponível através de nossa API. No nosso caso, temos um recurso chamado Tipos, certo? Portanto, usamos o símbolo :tipos para criar o bloco de recursos referentes ao recurso tipos. Trocando em miúdos, isto significa que teremos uma URL do tipo http://localhost:port/tipos. Seguindo, definimos outro bloco, agora chamado de get.

module API
   module V1
      class Tipos < Grape::API
         resources :tipos do
            # Obter uma lista de Tipos de Cervejas
            get do
               tipo = Models::Tipo.new
               tipo.id = 1
               tipo.nome = 'Pilsen'
               [tipo]
            end
         end
      end
   end
end

Observe atentamente esse método e tenha em mente que o Grape é uma DSL (Domain Specific Language). O que estamos fazendo nesta linha é chamar o método get (definido em Grape::API) passando como parâmetro a String ‘:id’ e um bloco de código que será chamado futuramente. Parece confuso? Mas é mais simples do que você pensa e é por isso que eu amo Ruby! O que estamos fazendo é informando ao Grape que temos uma rota ‘http://dominio/tipos/id’, acessível através do método GET do HTTP. Dentro do bloco de código, você escreverá o código que tratará toda requisição que chegar a essa rota através de um GET. Simples, certo? Lógico que é!

Nossa primeira API RESTful com Grape está quase pronta!

Configurando o config.ru

Ainda precisamos configurar o arquivo config.ru para conseguirmos rodar nosso projeto. Este arquivo contém os requires mais genéricos, necessários para rodar nosso projeto, como o graperubygems e rack. Depois, usamos o CORS para liberar as requisições cross-origin para todos os métodos HTTP (GET, POST,…). No final, rodamos a API com run API::Base. Observe que só precisamos de um require de módulos de nosso projeto: require ‘api/base.rb’.

$:.unshift "./app"

require 'rack/cors'

require 'rubygems'
require 'grape'
require 'rack'
require 'grape-entity'

require 'api/base.rb'

use Rack::Cors do
   allow do
      origins '*'
      resource '*', headers: :any, methods: [:get, :post, :put, :delete, :options, :patch]
   end
end

run API::Base

Feito isto, agora vá no seu console e digite rackup. Sugiro instalar o Chrome junto com o plugin Postman. É um excelente plugin para executar chamadas a APIs RESTful. Veja abaixo como chamar nossa API na versão 1.

Usando o Postman para chamar nossa API.

 Pronto, meu caro, já temos nossa primeira versão da API executando! Não acredita? Testa aí! Nos próximos artigos, vamos fuçar mais o Grape, usando mais features dele. O objetivo deste primeiro artigo foi criar a estrutura e colocar uma primeira API simples executando!

ruby

Rundown on Grape Related Articles

My journey on API development started last year when I had to develop an API for a startup that I was involved with. Since then I’ve been intensively studying it through reading lots of articles and books. I built my first API using Java, even though it’s not my favorite language. To be honest, these days I’ve been shying away from projects where Java is the main language, however it was a great experience because I was able to learn lots of good practices for creating RESTful APIs.

And what’s my favorite language? If you’re following me on Twitter, you know that it’s Ruby. It was about three years ago when I was first introduced to Ruby, and since then I’ve been using it for most of my projects. Why Ruby? Because it’s the most elegant and beautiful language ever created. The worst thing about being a Ruby enthusiast is that everybody thinks you’re a Rails expert. I’m not. In fact, I have never used Rails.

Having said that, you might be wondering what I’ve been using to create my APIs. The answer is Grape: a simple and straightforward DSL that enormously simplifies the API developer’s life. This is not a step-by-step article on how to create APIs using Grape. Instead, I’m going to briefly lay out and comment on some articles and blog posts I’ve came across during these last months. I’m really surprised by the fact that there are only a few articles about Grape available on the Internet, and this is my motivation for writing this post.


Official Grape’s Site
https://github.com/intridea/grape

You haven’t ever heard of Grape? Then the first thing you should read is its official documentation. Every article I’m going to list from this point forward will be based on the assumption that you already know how to set up your Ruby and Grape environments. For this reason, it’s really important that you start reading it first if you’re new to this world. The documentation is simple and easy to understand.


Introduction to building APIs with Grape
http://codetunes.com/2014/introduction-to-building-apis-with-grape/

If you’ve already gotten the hang of programming in Ruby, and you know how to install Grape, then it’s time to read more specific and detailed articles. This one was published by Codetunes and describes how they built their API using Grape. It’s a good article despite the fact that they’re using some conventions that I personally don’t like, such as putting the API versioning information into the URI.

You must take into account, however, that they’re using Grape alongside Rails. Still, it’s not mandatory, and in my opinion you shouldn’t do this if the API which you’re planning to build doesn’t require all of the features and resources provided by Rails.


Build REST APIs with Grape
http://code.tutsplus.com/courses/build-rest-apis-with-grape

It’s a series of fourteen video lessons explaining how to build REST APIs with Grape. I haven’t watched every lesson, but it seems to be a very detailed step-by-step tutorial. Unfortunately, they provide only the first two videos for free.


Building RESTful API using Grape in Rails
http://funonrails.com/2014/03/building-restful-api-using-grape-in-rails/

A simple but useful article written by Sandip. Sandip doesn’t waste your time with misleading concepts and unnecessary explanations on how Grape works. He dives into the code in the first lines of his article. Again, take into account that he’s using Grape alongside Rails.


The 10 Minute API: Getting an API Up and Running in 10 Minutes with 3scale, Grape and Heroku
http://www.3scale.net/2012/06/the-10-minute-api-up-running-3scale-grape-heroku-api-10-minutes/

This is a 10 minutes hands-on video explaining how to build and deploy Grape based APIs on Heroku, one of the leading cloud host solutions on the market. I have some APIs running there and I strongly recommend their services. And no, they’re not paying me to write this, ok? 🙂

 The last thing worth mentioning about this article is the fact that they’re using their own API Management solution to authenticate each API call. Have you ever heard of the term API Management? I won’t explain it in this post because it deserves its own article. Instead, take a look at this article.


Building Modular APIs with Grape and Rails
http://priyaaank.tumblr.com/post/34018821171/building-modular-apis-with-grape-and-rails

This is the most detailed and interesting article out of all which I’ve listed so far. Priyank Gupta have written a detailed post explaining how he built his API using Grape, Rails and MongoDB.

facebook_banner-youtube

Estudo de Idiomas

Não é novidade para meus amigos e familiares que eu gosto de estudar idiomas. Entender o idioma de um povo é ser capaz de entender sua forma de pensar e, porque não, de agir também. Em minha humilde opinião, um idioma molda uma nação de diversas formas. A existência ou não de uma palavra para descrever um objeto, sentimento ou fenômeno pode acarretar em uma maneira totalmente distinta de ver o mundo e compreender as pessoas. Desde o ano passado passei a investir pesado em meu aprendizado de idiomas, com cursos e aulas online.

Comecei resolvendo um problema antigo: apesar de ler facilmente textos técnicos em inglês, a língua coloquial e os textos de jornais eram um horror para mim. Conversação, então, nem comento. Resolvi iniciar meus estudos focando neste aspecto e comecei estudando métodos para resolvê-lo. Invariavelmente, todos os métodos tinham um quesito que estava sempre no topo: não se aprende uma língua sem praticá-la com um nativo. Inicialmente, eu achei que era possível, sim, mas quebrei a cara.

Apesar de entender muito bem o que nativos falavam, eu não conseguia disparar uma conversa fluida, pois meu cérebro não estava preparado para isso. Ele estava preparado para ouvir e entender, mas o trabalho de formar frases inteiras e verbaliza-las é totalmente diferente e eu comprovei isso na prática. Foi aí que eu tomei vergonha na cara e comecei a ter aulas via Skype.

Minhas primeiras aulas foram com uma brasileira que vive em New York. Foram excelentes classes, mas fiz apenas 7. Depois disso, encontrei o site italki. Por lá, passei a marcar classes com professores nativos da Inglaterra, Estados Unidos e Espanha. Sim, também estou aprendendo espanhol! A diferença foi enorme. Conversar com um nativo é, de diversas formas, diferente de conversar com um brasileiro fluente em inglês. A conversa vem carregada de um histórico cultural que enriquece substancialmente sua vida.

Você aprende o idioma e junto leva de brinde um montão de informações culturais e forma de pensar de um nativo. Não é só que vale a pena, eu digo que é a forma mais eficiente e vibrante de se aprender um idioma. Já tenho planos para aprender francês, alemão e mandarim. Tudo em seu tempo!

Para finalizar esse texto, lhes convido a estudar idiomas também. É fascinante, juro! E fica a dica do italki, onde você encontra diversos professores mundo à fora. Ah! Se for usar o italki, na moral, clica nesse link aqui! A cada crédito que você coloca lá, eu ganho mais 50 aqui. Ajuda seu amigão aqui a aprender todos os idiomas do mundo! Por favor! 😛

t

Revista Tema

Uma postagem rápida e caceteira de autopromoção para me promover a mim próprio! A Revista Tema, uma publicação do Serpro, de agosto de 2014, conta com um artigo escrito por mim, Ronaldo Agra e Viviane Malheiros. O artigo é sobre a Análise de Redes Sociais no âmbito do Governo. O artigo começa na página 27 e você pode conferir na própria página da revista. Leiam, porque se tem meu nome no artigo, então é porque é bom! 😛

http://tema.serpro.gov.br/pub/serpro/?numero=224

aliendroid-serpro

AlienDroid no SERPRO

Já publiquei aqui sobre o AlienDroid, um framework de persistência de objetos que fiz para Android. Inclusive, publiquei sobre o prêmio no SBSI 2013 que ganhei com a publicação de um artigo sobre ele. Então, para que mais uma publicação sobre ele aqui, lindão? Bom, em primeiro lugar, para me gabar, é claro, e em segundo lugar, para dizer que ele ganhou holofotes aqui no Serpro recentemente.

Não lembro se já havia comentado, mas o AlienDroid foi utilizado em algumas soluções internas do Serpro, como o aplicativo Pessoa Física, e isso foi divulgando internamente, o que me levou a apresentá-lo internamente para a empresa. Bom, não tão internamente assim, pois a apresentação era pública através do Assiste Serpro. 🙂 Já saíram algumas matérias nos meios de comunicação do Serpro e agora saiu mais uma. Seguem os links:

AlienDroid é uma das Soluções Inovadoras do Serpro
https://www.serpro.gov.br/noticias/aliendroid-e-uma-solucoes-inovadoras-do-serpro-1

Mobilidade Garante Premiação no SBSI 2013
https://www.serpro.gov.br/noticias/mobilidade-garante-premiacao-no-sbsi-2013

Também encontrei o artigo publicado na internet, inteiro e de forma oficial. Segue o link:
http://www.lbd.dcc.ufmg.br/colecoes/sbsi/2013/0034.pdf

Linguagem Corporal

Body language affects how others see us, but it may also change how we see ourselves.

Este talk do TED está, sem dúvidas, na minha lista de melhores talks que já assisti. Trata de um assunto muito bacana e que aprendi a dar mais valor ainda após estudar sobre PNL. Sempre pensamos que a forma como andamos, nossa postura e trejeitos impactavam somente na forma como as pessoas nos veem. A verdade é que tanto nossa mente afeta nossa linguagem corporal como também a linguagem corporal afeta nossa mente. Assista a esse TED, que é excelente.

Caso não tenha fluência em inglês, assista esse vídeo com legendas no próprio site do TED, através do endereço link http://www.ted.com/talks/amy_cuddy_your_body_language_shapes_who_you_are.

Wallpaper_setembro

Pequenos Hábitos

Você já tentou estabelecer um novo hábito em sua vida? Já pensou em começar a andar/correr todos os dias? Ou talvez adquirir o hábito da leitura diária? Como todo mundo, eu sempre lutei para adquirir novos hábitos saudáveis. Quase sempre dava merda. Após uma semana de tentativas, a preguiça vinha e eu sucumbia. Mas, meus problemas se acabaram-se depois que comecei a estudar constantemente sobre esse tal de “hábito”. E um livro em especial me abriu a mente para o meu erro primordial: Mini Habits, do Stephen Guise.

20567918

Inicialmente, as ideias apresentadas podem parecer besteira, mas notei uma diferença imensa ao aplica-las. A questão é bem simples: sempre tentamos iniciar grande demais. Se queremos adquirir o hábito de correr, planejamos correr logo 40 minutos no primeiro dia que é para tirar o atraso. Se pretendemos nos tornar melhores em matemática, logo compramos um livro de 1000 páginas sobre Matemática Aplicada à Fusão Nuclear. Se queremos adquirir o hábito de ler, pensamos logo em começar lendo a Trilogia de Senhor dos Anéis em 1 semana.

Enfim, o resultado é previsível… você sente uma preguiça imensa em começar. Você aplica uma força de vontade descomunal para se manter sempre nesta rotina e rapidamente cansa e larga tudo de mão antes que o hábito se estabeleça em sua mente. E a solução para estabelecer um hábito duradouro parece até idiota demais para funcionar. Mas funcionou comigo.

Por exemplo, eu sempre precisei fazer caminhadas/esteira para manter a pressão arterial baixa e o colesterol sob controle. Minhas tentativas anteriores eram assim: na primeira semana, vou correr 5km todos os dias. Na segunda semana, aumento para 8km e vou até conseguir me estabelecer em 15km todo dia, sem parar. Nunca deu certo. Depois de ler este livro, mudei a estratégia. Vou correr 5 minutos todo dia. Ponto final.

Parece uma estratégia de perdedor, não é? Mas só parece. A questão é que nunca sinto preguiça de andar só 5 minutos. É fácil chegar, colocar o sapato e andar 5 minutos, não dá nem tempo de a preguiça gritar. A teoria por trás disso tudo é que o mais importante é colocar-se em ação. Uma vez que você está em ação, fica mais fácil persistir. Eu, normalmente, corro mais do que os 5 minutos. Tem dias que não dá, eu estou com uma preguiça cavalar mas SEMPRE ando os 5 minutos.

Isso é o importante: para estabelecer o hábito, faça em unidades de tempo/quantidade que não lhe causem mal-estar ou preguiça. Mas SEMPRE FAÇA! Com o tempo, o hábito se estabelece e você passa a aumentar a carga pouco a pouco. Hoje ando cerca de 45 minutos sem problemas. Sem dor. Sem preguiça. 🙂

img2

Marlonspectiva 2013

E 2013 está acabando. Eu poderia começar essa postagem com algo do tipo “apesar dos pesares”, “até que enfim”… Mas, ao contrário dos pessimistas, prefiro focar minhas energias em ver o lado positivo de tudo, mesmo quando tudo parece estar indo pra merda. Por isso, lhe digo este foi um excelente ano para mim. Sem sacanagem mesmo. Conquistei muitas coisas. Avancei em muitas outras. Deixa eu fazer uma retrospectiva para mostrar para você.

Neste ano, resolvi estudar Programação Neurolinguistica e foi a melhor decisão que tomei em quase toda a minha vida. Noventa e nove por cento do lado bom deste ano é proveniente desta única decisão. Por que? É difícil descrever. A PNL me ensinou muitas técnicas que me ajudaram a vencer problemas, medos e a me fortalecer em momentos complicados. Quer aprender também? Sugiro para você os seguintes livros para iniciar 2014:

O ano de 2013 também foi o que participei pela primeira vez de uma startup. Foi a startup Smartpanda. Apesar de o projeto não ter seguido em frente, posso dizer que me trouxe um monte de aprendizado e bons amigos para a minha convivência: Davi Ricardo, Márcio Vicente, Vicente Machado e Ivo Machado. Valeu brothers! Trabalhar com vocês foi over the top!

Neste ano também comecei um curso de Espanhol e que continuarei em 2014. Estou fazendo no Instituto Cervantes e indico para todo mundo. A metodologia deles é muito bacana, os professores são pessoas excelentes. Cada nível do curso é ministrado por um professor de um país diferente. O primeiro foi por uma brasileira que fala espanhol fluentemente. Faz sentido, já que entramos lá sem saber nada do idioma. Depois, a professora foi uma uruguaia. Depois tem espanhol, argentino, chileno, colombiano e por aí vai. É muito massa, porque você aprende muito sobre a cultura desses países e a forma de falar deles.

Iniciamos em Salvador o GDG Salvador, um grupo de desenvolvedores voltados para as tecnologias do Google. Fui inicialmente contatado pelo Neto Marin, que me chamou para fazer o grupo. Começamos o ano a todo vapor, mas agora no final deu uma parada. Não conseguimos fazer o DevFest e ficamos devendo alguns eventos. Mas estou me programando para em 2014 ficar a todo vapor durante todo o ano!

Também escrevi alguns artigos para a JavaMagazine. Não foi a primeira vez, em outros anos eu já tinha feito isso. Mas em 2013 eu emplaquei meu primeiro artigo de capa, quando escrevi sobre as novidades do Java 8. No total, escrevi 2 artigos, são eles:

Fiquei devendo um artigo sobre as novidades vindouras do Spring Framework, mas foi por um bom motivo, pois tive que me envolver profundamente em um novo projeto, chamado 8Car. Espero que 2014 seja o ano em que vamos decolar. 🙂 Não vou passar muitos detalhes sobre ele agora, quem sabe no futuro vocês ouçam falar sobre ele pela imprensa, hein hein hein!

Como torcedor fanático do Esporte Clube Bahia, não poderia deixar de mencionar a revolução que aconteceu no meu clube do coração. E que em 2014 venha nosso tricampeonato! Cheguei também à marca de 80 cervejas diferentes! Aliás, eu já bebi mais do que isso. hehehe. Mas das garrafas que eu coleciono, cheguei a esse número em 26 de dezembro. Olha só como está minha coleção nessa foto. Também comprei um carro novo! Depois de 10 anos com o mesmo carro, agora tenho um Peugeot 207. E estou gostando pacas dele.

Ah! Não poderia esquecer do artigo que enviei pro SBSI 2013 e que foi premiado como melhor artigo da categoria. Chique, né não? Eu nunca imaginaria isso. Até mesmo porque, eu não tinha nenhuma intenção de enviar um artigo para lá, foi o pessoal do trabalho, especialmente Viviane Malheiros, que deu a ideia e apoiou. Valeu! Assim que eu enviei o artigo, olha o que postei no Twitter.

E depois, quando eu fiquei sabendo da premiação, quando postei no Facebook direto de João Pessoa na Paraíba:

Esse ano também ganhei um cachorro de presente. Aliás, uma cadela. E muito doida. Muito doida mesmo. hehe. Já destruiu metade da casa, sem nenhum exagero. Sofá, cama, almofadas, sandálias, roupas, controle remoto, telefone… tudo isso já foi vítima da fúria de Mel, a Destruidora. Conheçam ela na foto abaixo. E não se enganem com a pose de criança inofensiva dela.

E a Copa das Confederações? Eu fui, oras pois. Claro. Como fã declarado de futebol, tinha que ir. Aliás, fui para todos os jogos na Arena Fonte Nova do Bahia. Aliás, que puta estádio hein? Está lindão. Já me disseram que os europeus são muito mais organizados, limpos, bem estruturados e bem acabados. Mas como frequentador de estádios nível Brasil, ainda fico surpreso com pouco.

2013 também foi o ano do Rock in Rio! E conheci duas bandas de minha adolescência: Iron Maiden e Slayer. Só achei o som meio esquisito, talvez o lugar que eu estava não tenha ajudado muito. Mas valeu a pena ver os caras ao vivo. Na mesma viagem, também conheci o Maracanã. Fomos eu e meu irmão lá ver o Bahia brocar o Foguinho por 2×1, de virada, e com gol de Obina Melhor que Etoo!

Este também foi um ano de muitas viagens. Conheci novos estados e cidades. Deixa eu relembrar aqui as viagens que fiz em 2013:

  • Fui para Porto Alegre, pelo Serpro, para uma reunião do Expresso.
  • Fui para São Paulo, para a Campus Party.
  • Voltei para São Paulo, para a reunião dos líderes de GDG da América Latina.
  • Fui de férias para Natal no Rio Grande do Norte.
  • Fui para João Pessoa, na Paraíba, para o SBSI 2013.
  • Fui para Brasília, para uma reunião de trabalho.
  • Fui para Florianópolis, para ministrar um curso de Android.
  • Fui para o Rio de Janeiro, para ver o Bahia no Maracanã e o Rock in Rio.

Olha só, vou terminar esse post agora, mas não significa que não atualizarei ele depois. É que simplesmente esqueci das outras coisas! Vou ali abrir uma cerveja pra refrescar a memória!

Bonne_Humeur

Sentiment Analysis – Parte 1

Você sabe o que é uma Análise de Sentimentos? Não, cara! Não estou falando sobre Freud ou Psicanálise. Imagine que você acabou de lançar seu produto, fez uma baita campanha de marketing e agora quer saber o que as pessoas acharam sobre ele. O que você faria? Pode contratar uma empresa para ir nas ruas coletar a opinião das pessoas. Pode também pedir para esta mesma empresa pedir a opinião dos consumidores através de pesquisas pela internet ou telefone. Mas e se você pudesse analisar as redes sociais e automaticamente detectar o que as pessoas estão achando? Isso, sem enquetes, sem pesquisas de opinião. Simplesmente analisando o que elas escrevem e descobrindo, a partir daí, o que elas acham sobre seus produtos e serviços. Genial, não?

E saiba que isso não é magia. Não é impossível. Aliás, é uma área que está fervendo ultimamente. Aliás, você encontrará diversas startups que estão trabalhando nisso. Até mesmo a IBM entrou na jogada e fez um aplicativo neste sentido para a Seleção Brasileira. Para você começar a entender sobre o que estou falando, sugiro inicialmente dar uma lida em um artigo da Communications of the ACM, que é gratuito. Basta se cadastrar e baixar a versão de Abril de 2013. É um artigo técnico, mas a parte inicial dá uma ideia bem legal sobre o assunto. A parte final também, onde eles exploram as áreas de aplicação.

Outro artigo bem legal sobre o assunto, embora também um pouco técnico, é esse aqui. Já este artigo aqui é mais light e mais fácil de ser entendido (e em português)Certo, mas por que estou escrevendo um post exclusivamente sobre esse assunto? Primeiro, é um assunto que me chama a atenção. Segundo, estou fazendo uma breve pesquisa sobre a aplicabilidade desse assunto dentro do Serpro, terceiro… terceiro… esqueci. Bom, mas a questão é que eu quero compartilhar com vocês o que venho aprendendo sobre o assunto, incluindo exemplos práticos. E além de ler muitos artigos sobre este assunto, eu também pesquisei ferramentas.

Caso você pesquise sobre ferramentas para Análise de Sentimentos no Google, não é de se espantar que uma das primeiras ferramentas que aparecem na pesquisa é a Google Prediction API. Mas ela não é a única na jogada. Temos também a Semantria, Datumbox, AlchemyAPI e muitas outras. Então, vamos fazer assim: você dá uma estudada sobre esse assunto, mesmo que superficialmente, e em uma sequência de posts, eu vou tratar sobre esse assunto. Vamos começar com um exemplo de aplicação rodando na Google Prediction API? Não? Então, deixe de pressa e aguarde os artigos falando sobre a Semantria, Datumbox e etc! Ah! Cadê o link para o próximo artigo? Calma, já está no forno!

outliers2

Outliers – Fora de Serie

Comecei a ler um livro bem interessante e já no primeiro capítulo, algumas coisas chamaram minha atenção. Estou falando do livro Outliers, Fora de Série. O autor, Malcolm Gladwell, apresenta sua visão sobre a questão do sucesso das pessoas. Por que algumas conseguem o sucesso e outras não? A resposta para mim sempre foi bastante simples: elas fizeram por merecer. Mas, será que a resposta é tão simples? Não há outras variáveis em jogo e que não temos conhecimento? Ele sustenta que sim. E que fazem muita diferença.

Um tipo de leitura que me agrada bastante são as biografias. Sempre considerei uma forma muito boa de ver como pessoas conseguiram ser o que são, seja nos esportes, finanças, vida pessoal… Eu sempre considerei que tudo que elas tem é fruto exclusivamente de seus próprios esforços. Claro, eu não descartava que sempre há pitadas de sorte, mas o esforço pessoal sempre esteve no topo. Sempre falei também que quem tem sorte atrai mais sorte. Quem tem azar, sempre atrai mais azar. Sem nenhuma base científica para essa afirmação, é claro. 🙂 Mas sempre tive esse feeling. Gladwell esclarece um pouco sobre este entendimento.

Malcolm trouxe, para mim, uma nova visão sobre essa questão. E que achei muito interessante. Nossos sistemas, da forma como são concebidos, já são preparados para determinar quem terá sucesso ou não, independente de suas habilidades pessoais. Parece sem sentido, mas o autor inicia com alguns exemplos interessantes que sustentam sua teoria. Ele destaca a lista de jogadores de diversos esportes. Vou citar somente a lista de jogadores de Hóquei do Canadá. Ele observou que a grande maioria, mas grande maioria mesmo, nasceu entre janeiro e março.

A explicação é bem simples para isso: a data limite para ingresso em uma liga é em janeiro. Assim, se o filho de uma pessoa completa 10 anos em janeiro, ela será logo selecionada, passará a treinar e competir com jogadores mais experientes, terá acesso a treinamentos mais fortes e especializados. E se você nasceu em agosto? Estará 7 meses defasado com relação a quem nasceu em janeiro. O resultado disso é que os grandes jogadores de hóquei, em sua maioria esmagadora, nasceram nos primeiros meses do ano.

É fácil entender isso. Observe que este mesmo que nasceu em janeiro já estará em vantagem para a seleção da liga imediatamente superior. Ele já larga com vantagem só por ser mais velho. A constatação ainda mais espantosa da questão é que se você nasceu em dezembro, mora no Canadá e quer ser um astro do hóquei, sinto muito, seu destino já está definido: você não será. Ou terá que “vender” as tripas para ser.

É uma constatação bem interessante e que me fez refletir sobre o assunto. De fato, ele observou que isso acontece em tudo na vida. Já existem regras, em nossos sistemas, que “determinam” quem terá mais chances de sucesso, comparada às demais. Seja no ensino escolar, nas Olimpíadas, Ligas… Aí vem aquela questão que é semelhante ao que eu pensava sobre a sorte: o rico tende a ficar mais rico, o pobre mais pobre, o sortudo a ter mais sorte e por aí vai. É a vantagem cumulativa. E isso traz problemas? O autor acredita que sim. Neste caso, específico do hóquei, se está deixando de lado uma enorme quantidade de talentosos jogadores de fora, só pelo de fato de eles terem nascido entre agosto e dezembro.

Temos uma cultura de supervalorizar os feitos pessoais, principalmente nas tais biografias. Mas acabamos esquecendo de verificar estas demais variáveis. Meu ponto de vista é que ainda assim vai depender de seu esforço pessoal para chegar lá. Claro, a tal pessoa que nasceu em dezembro terá que se esforçar muito mais do que aquela que nasceu em janeiro, mas também pode alcançar o estrelato. E é importante, para isso, ter o conhecimento destas informações. Ainda estou nos primeiros capítulos, mas já valeu os 19 reais investidos!