Programação

Leia os últimos artigos sobre Programação em Infosimples.com



GraphQL: como dar ao cliente total controle sobre os dados de uma API
Gravatar publicou em

Programação Tutoriais

Você já deve ter passado por uma situação onde cada um dos seus clientes acessa sua API de maneira diferente, e provavelmente teve que desenvolver rotas e parâmetros específicos para cada um deles. Como se isso não fosse problemático o suficiente, ficou ainda mais complicado lançar uma nova feature ou remover algum resultado ou rota.

Parafraseando o título deste artigo, você se indaga o seguinte: “Como dar ao cliente total controle sobre os dados de uma API?”. A resposta (mais uma vez parafraseando o título) é: utilizando o GraphQL.

GraphQL Logo

GraphQL é uma linguagem de queries criada em 2012 pelo Facebook, num momento em que uma mudança nos apps mobile resultou num grande aumento da quantidade de queries nos servidores. Diante da necessidade de reestruturar toda a maneira pela qual as queries eram feitas, surgiu o GraphQL.

A solução vinda do Facebook é simples: ao invés de existirem diversos endpoints, existe apenas um, capaz de receber queries complexas e devolver uma resposta no formato que o cliente quiser.

Abaixo, temos um exemplo de request e a resposta de uma query GraphQL:

Você pode perceber que a resposta espelha a estrutura do request. Também é interessante destacar que é possível passar parâmetros adicionais, como tamanho da imagem e número máximo de resultados. E isso foi possível sem ter que criar rotas especiais, nem concatenar dezenas de parâmetros nas queries. Mas cima de tudo, vemos que a resposta contém apenas os dados requisitados pelo usuário. Isso resulta num menor consumo de rede e menores tempos de resposta, dependendo da situação.


Exemplo simples

Vamos fazer de conta que temos disponíveis os dados sobre algumas músicas no nosso servidor imaginário. Nele temos informações sobre os artistas, os álbuns e as músicas.

Agora imagine que implementamos uma API REST para esses dados. As rotas disponíveis são as seguintes:

Rota Descrição
/albuns Retorna uma lista de todos os álbuns disponíveis
/albuns/:id Retorna o álbum com o ID especificado
/albuns/:id/songs Retorna todas as músicas do álbum especificado
/artists Retorna uma lista de todos os artistas disponíveis
/artists/:id Retorna o artista especificado
/artists/:id/albuns Retorna os álbuns do artista especificado

Suponha que nós queremos fazer um app Android que mostra todas as músicas de um artista, utilizando a API especificada acima. Bem, nós podemos usar a rota das músicas de um artista… só que essa rota não existe.

Soluções disponíveis para esse nosso problema:

  1. Chamar a rota /artists/:id/albuns com o id do artista e salvar numa lista temporária. Após isso, chamar a rota /albuns/:id/songs para cada álbum armazenado naquela lista temporária, assim conseguindo todas as músicas daquele artista.
     
  2. Implorar para o desenvolvedor da API criar a rota /artist/:id/songs, afinal a solução acima é uma porcaria. Se um artista tem 55 álbuns no seu portfólio, vão ser necessárias 55 requests para obter todas as músicas dele. Se cada request leva 20ms para ser respondida, nesse caso levaríamos 1100ms para obter uma resposta (ignorando eventuais dados no cache). Isso sem falar na memória gasta no seu app por causa dos dados dos álbuns!

E isso não é ruim apenas pelos motivos óbvios. Cada uma dessas rotas deve ser documentada e receber manutenção.

Agora vamos trocar nossa API REST por uma API GraphQL. Abaixo está definido o Schema , ou seja, uma coleção de tipos e definições que espelha nosso modelo de dados:

O schema apenas define como é possível chamar pelos dados através de uma query do GraphQL. Ele não é responsável por fazer as queries no banco de dados, nem sequer determina como as relações dos dados são. Ele simplesmente declara a interface pela qual um usuário pode fazer as queries.

Agora podemos mandar um POST para a rota /graphql contendo o seguinte:

E de resposta, podemos obter algo do tipo:

Mas e a documentação? Ainda temos que detalhar cada uma das possibilidades de pedido de dados? NÃO! Existem ferramentas interativas que te ajudam a documentar a API sem você ter que digitar uma linha a mais de código. A mais utilizada é o GraphiQL, e você pode brincar com a demo dele aqui: http://graphql.org/swapi-graphql/


Considerações Finais

Se sua API é focada em fornecer dados, o GraphQL pode mudar drasticamente sua maneira de desenvolver (para melhor!). Obviamente, cada caso é um caso, mas vale a pena considerar utilizar o GraphQL no seu próximo projeto.

No caso da Infosimples, cada request em nossa API tem como consequência um acesso a um portal web (não acessando diretamente um banco de dados). Assim, o GraphQL não seria tão eficiente, apenas jogando fora informações já obtidas ao invés de mandá-las ao cliente.


Links úteis

Tutorial bem amigável de GraphQL, contendo a maioria das linguagens suportadas: https://www.howtographql.com

Página oficial do GraphQL: http://graphql.org



















Aprendizado não-supervisionado indica quais senadores votam afim
Gravatar publicou em

Ciência de Dados Programação

Neste artigo, detalho como escrever um programa capaz de agrupar os senadores de acordo com seus votos. Desde como encontrar as informações, passando por trechos de código, recorrendo à matemática e chegando enfim às "panelinhas" do Senado.

Introdução

O cenário legislativo brasileiro é complexo e, por vezes, mutante. Ter uma ideia de como nossos representantes se comportam costuma ser um desafio até mesmo aos mais informados no assunto. Ao cidadão comum, a informação nem sempre chega, chega de forma indigerível, ou já mastigada (demais).

Por sorte, a legislação prevê transparência nas esferas públicas e, através de portais para Dados Abertos como o do Senado Federal, podem ser obtidas informações valiosas sobre o exercício parlamentar. O acesso à informação, porém, é mais um direito que vem sendo penosamente estendido no Brasil – não fique muito animado.

Decidi realizar essa atividade paralelamente ao estágio na Infosimples para extrair conclusões imparciais e significativas das votações. Valeu o esforço, pois serviu para colocar sob teste alguns dos conceitos vistos no curso de Introdução à Inteligência Artificial do Udacity (e também serviu para atrair leitores curiosos como você! Deixe seu comentário depois).

Continue a ler...










Um pouco sobre correspondência de cadeias e árvores
Gravatar publicou em

Programação Ciência de Dados

Árvores estão entre as estruturas de dados mais estudadas dentro da Ciência da Computação. Diversas são as áreas em que comparações entre árvores são necessárias, como por exemplo em análise de imagens, comparação de textos estruturados, otimização de compiladores, inclusive algumas utilizações nem são exclusivas da computação, como é o caso da comparação de estruturas de RNA secundário em computação biológica.

Continue a ler...










Como publicar uma aplicação Web usando AWS
Gravatar publicou em

Programação Tutoriais

Este artigo foi escrito para o minicurso de Infraestrutura em nuvem com Amazon Web Services, realizado durante a SEnEC 2014, na Poli-USP.

Introdução

Este tutorial irá guiá-lo pelos passos envolvidos na publicação de uma aplicação Web utilizando componentes de infraestrutura da AWS (Amazon Web Services).

Serão utilizados componentes básicos para publicar uma aplicação Web simples mas escalável. Estes componentes, descritos brevemente no primeiro dia do minicurso, são:

  • EC2 (Elastic Compute Cloud): servidores virtuais
  • RDS (Relational Database Service): banco de dados
  • S3 (Simple Storage Service): armazenamento de arquivos
  • ELB (Elastic Load Balancing): balanceador de carga
  • Auto Scaling: escalabilidade automática

Antes de começarmos a falar dos detalhes, é importante que você tenha em mente qual é o objetivo desta atividade e quais são os passos, definidos em linhas gerais, que precisaremos executar para alcançá-lo.

Em primeiro lugar, é necessário conhecer a aplicação que será publicada. Ela pode ser acessada aqui: http://senec-demo.infosimples.com.br/.

É uma aplicação muito simples, cuja principal funcionalidade é permitir o upload (envio) de arquivos associados a um nome.

Dada a aplicação, o nosso objetivo é colocá-la no ar usando a seguinte arquitetura:

Continue a ler...










Inteligência Artificial para Jogo da Velha
Gravatar publicou em

Ciência de Dados Programação

O uso de aprendizado por reforço para programar a inteligência artificial de jogos tem como destaque a criação nos anos 90 de um programa de conseguia jogar gamão a um nível profissional, por Gary Tesauro da IBM. A primeira tentativa foi construir um modelo dos diversos estados do jogo a partir de alguns exemplos e generalizar com aprendizado supervisionado. Além de ter sido um trabalho tedioso enumerar centenas de estados para depois poder generalizar, a performance do programa não foi satisfatória.

A segunda abordagem foi utilizar aprendizado por reforço e fazer duas versões do programa jogarem entre si. Ao final de cada partida, atribuía-se uma pontuação positiva para o vencedor e uma negativa para o perdedor. Após 200.000 jogos, o programa conseguia jogar como os melhores jogadores do mundo, sem precisar da experiência de jogadores profissionais ou descrever todos os mais de 1 trilhão de estados possíveis em uma partida.      

Com o objetivo de recriar o experimento para um jogo mais simples, propôs-se o desenvolvimento de um agente inteligente para o Jogo da Velha (tic-tac-toe em inglês), sem precisar escrever um algoritmo com as melhores estratégias ou enumerar todos os possíveis estados.

Continue a ler...










Segmentação de Strings com Aprendizado de Máquina
Gravatar publicou em

Ciência de Dados Programação

O uso de inteligência artificial na linguagem vêm apresentando interessantes resultados, principalmente na área de tradução. Outros exemplos incluem sugestões de correção em erros ortográficos e até mesmo o reconhecimento de fala.

Para testar um algoritmo simples que trabalha com elementos de uma linguagem, foi desenvolvido um programa com o objetivo de conseguir separar as palavras de uma string que não contenha espaços. Por exemplo, ao receber "thisishowitshouldwork", o programa deveria retornar "this is how it should work". 

O problema consiste em determinar o que deve ser considerado uma palavra, visto que é impossível listar todas as palavras conhecidas em Inglês e não há como construir um modelo eficiente que consiga generalizar sua estrutura.

A abordagem foi utilizar aprendizado supervisionado e uma grande quantidade de texto como base de treinamento para que o programa conseguisse passar a identificar as diversas palavras que compõem a língua inglesa. A vantagem de utilizar textos ao invés de uma simples lista contendo todas as palavras conhecidas é a possibilidade de verificar a frequência com que cada uma aparece. Conhecendo a probabilidade de aparição de cada palavra, pode-se calcular a mais provável divisão da string recebida.

Portanto, é possível determinar que a probabilidade de uma certa divisão da string é função das probabilidades de cada palavra obtida na divisão. Para aumentar a qualidade dos resultados, poderia ser considerada a probabilidade de uma palavra ocorrer após outra certa palavra, mas devido à relativa pequena quantidade de texto utilizado na etapa de treinamento, foi considerada apenas a probabilidade individual de cada palavra.

Outra questão a ser considerada é como lidar com palavras que nunca apareceram na base de treinamento. É impossível garantir, por maior que seja seu texto, que ele contém todas as palavras existentes na língua. Foi utilizada Suavização de Laplace para o cálculo das probabilidades, de modo a evitar que palavras não encontradas tenham probabilidade zero. Por fim, foi realizada uma normalização para possibilitar a comparação entre divisões da string de diferentes números de palavras.

Continue a ler...











Leia mais sobre: