Cloud Computing - Tom Zé e o Amazon Mechanical Turk

/* Olá Senhores, Senhoras e Senhoritas DBAS!





Capa do album Com Defeito de Fabricação, Tom Zé.
      Em 1998, o músico experimental Tom Zé lançou o album Com Defeito de Fabricação. Seguindo um costume antigo (e que eu gosto muito), Tom Zé sempre cria um tema para seus trabalhos e todas as músicas envolvem esse tema. O tema de Com Defeito de Fabricação é uma linha de raciocínio simples mas ao mesmo tempo irônica e divertida.
     O albúm é sobre todos os trabalhadores do Terceiro Mundo, pouco especializados e abundantes e que na ótica de Tom Zé se tornam como robôs mais baratos do que os reais robôs alemães ou japoneses. Afinal, esses robôs reais ainda são muito caros e as grandes corporações do Primeiro Mundo ainda preferem optar pelas máquinas humanas e mais baratas, aceitando o risco de seus "defeitos" inatos (cada música é a respeito de um desses "defeitos").
    O que Tom Zé nunca imaginaria é que a gigante Amazon que vem se destacando no Cloud Computing com seus clusters elásticos de capacidade de processamento absurda a preços muito baixos iria pensar nessa mesma idéia e criar um "cluster de humanos"! 

    Lançado em 2005 e ainda no Beta, o serviço Amazon Mechanical Turk permite que através de uma API desenvolvedores e empresas (requesters) insiram tarefas (hits) que os softwares ainda não são capazes de fazer ou que são caras demais para serem desenvolvidas (como digitar o contéudo de cartões de visita ou selecionar os objetos em uma imagem).      Essas tarefas são disponibilizadas para qualquer usuário (workers)que queira se conectar e realiza-las, recebendo uma módica quantia para cada hit.
   Os pagamentos dos hits variam de US$ 0,01 (localizar o email de contato em um site) até US$ 50,00 (transcrever um arquivo de audio de uma hora e meia) mas só podem ser resgatados em dinheiro vivo por americanos ou indianos (porque será?), para outros paises os pagamentos podem ser convertidos em Gift Cards para serem usados no próprio site da Amazon.
   Em outras palavras, a inteligência humana que ainda não consegue ser emulada, ou os robôs defeituosos de Tom Zé foram clusterizados e colocados na nuvem. Uma companhia pode optar entre desenvolver um módulo que analisa contéudos de sites em busca de emails de contato, ou simplesmente deixar que trabalhadores humanos façam isso a US$ 0,02 por contato. Ela pode obter opiniões sobre milhares de artigos de jornal e usar o resultado para treinar uma Learning Machine que automatize essa verificação! 
    As possibilidades são infinitas, mas com certeza esbarram em uma série de novas  limitações (mau uso, fraude, etc...) que evitaram que esse serviço se popularize mais rapidamente.
    Afinal, Tom Zé já sabia, são pelo menos 14 defeitos.

*** Curiosidade ****
O Turco em ação!
  O nome Mechanical Turk foi tirado de uma máquina criada no final do século 18 que supostamente seria capaz de jogar xadrez contra um oponente humano. A engenhoca composta por um boneco vestido de turco e uma mesa com engrenagens  na verdade era um truque, pois um jogador humano ficava escondido dentro da mesa e operava a máquina
 fonte: Wikipedia
   
   

Espero que tenha gostado. Abraços!!
Felipe Antunes
twitter: @felipe_store




NoSQL- Graph databases (Neo4J), or the graph model - English Version

Para versão em português, clique aqui!

/* Ladies And Gentlemen DBAS!!!
  
     In my first post in english (sorry in advance), I would like to show you one of most interesting database models. The Graph Database (or Property Graph data model).

     A graph is model to store data which can be naturaly structured in an graphic way. A social network is an typical example, we have users that make connections between itself in many diferent ways (friend, follower, etc..) and they also can get connected with a lot of other objects like ideas, products or blog posts (like, follow, etc..)

      Another good examples are hierachy, corporate networks and semantic web applications

Fig.1 – Modeling my family

      Instead of use tables, columns and PK/FK relationships , an graph database uses vertices, properties and edges.

      A vertex is a object with properties. Example: In a book store, the vertices could be books, authors and publishers. Books could be described with properties like Title, Genre, Price, Total Pages, etc... authors receive properties like Name, Birthday, biography, etc..
             The edges connects the nodes with labels like Writed_by,
Published_by, etc... Edges can also have properties


Tools

      The tool that we are going to use in our "hands on" is Neo4J, that can be free download here. The Neo4J it is a BluePrints implementation and BluePrints  is a generic API for graph models. Another BluePrints implementations are TinkerGraph, OrientDB, DEX, InfiniteGraph, Rexster, e SailRDFStores
  
     
      We will also use Gremlin language to manipulate the data. Gremlin is based on Groovy and Pipes. There is a lot of languages that we could use (REST, Cypher). The main point is always choose the right tool for the job.
Note: Excuse me for the "new names avalanche", so many options make any begginner confuse, especially when we came from the relational world where the products are more integrated and ready to use, but is important to have a overview of all tools involved in a graphDB ecosystem if you want to implement it on the real world.



Creating an graph

      If your OS is Windows, all you need to do is download the Neo4J packagen on website , uncompressed it and execute Neo4J.bat file located in Bin folder
      The script will open a java windows (it is the service running)

      The Neo4J provides a web interface web hosted on your machine. by default, you can access the web admin on  http://localhost:7474/webadmin/




   To start, click on Console tab and select the Gremlin button on rigth-upper corner.

Inserting vertex, properties and listing
  
   Lets to create a basic social network, the vertex represents users and the unique edge type available will be KNOWS (CONHECE in portuguese).
   You can see below the code to add some users (a litle tribute to some friends of mine)



            Just after the ASCII Art, the webadmin instance the variable g that represents the graph.
After that, we use addVertex function to add our first vertex
            The vertex properties are passed as a parameter of the function, it is an JSON that basically have this structure:
         [PropertyName:PropertyValue, ...]

As you can notice, one differece between a relational database and a noSQL is that noSQL is schemaless,so properties can varies in the vertices.
To list vertex, use g.V, where V is a collection of vertices inside the graph G. To list a specific property type the property name after V. Example: g.V.Name or g.V.any_other_property.



We notice that the Bruno Salim position ("profissão" in portuguese) was writed wrong. Lets update this ( the vertex ID of Bruno is 28).



Very simple, as is simplier add new properties. For example, lets add a position to Gustavo vertex.


Or add a completely new property (this is schemaless!)



     The map show all vertex properties (a JSON structure).

Connecting vertices.
      Now, we are going to create connections between vertices through the edge type KNOWS




First of all, we assign the vertices to friendly named variables , then we add the edges between them.
      Finally, lets answer a few typical questions of social networks and figure the power of graph db.
      Gremlin queries are divided by steps separated by dots.
Object.step1.step2.stepN.property
A step use the result of the previous step and can  transform, filter or insert some side effects in results.
Who I know?
      The Felipe object is me, we use the out step to return all vertices wich receive edges of the object.



Who are the friends of my friends?
     Re-applying the out step, we list the vertices conected to the vertices returned by the first out.

     One way to avoid the use of the out step many times it is use the loop step, it repeat the previous step until the rule in brackets is not fulfilled (In our case, we limited the loop to twice times checking the it.loops property.)
Who can introduces Felipe to Gustavo?
     The power of graph can be showed solving this question. In a relational database, the correspondent query will be heavy and unsuitable for applications with many users, but in a graph db regardless the quantity of users and iterations the result will keep the same performance.

      
      
     The loop will iterate until it find the the gustavo vertex. The query list two possible paths.
     Replacing the "out" steps  for pairs of "outE" (outbound edges) and "inV" (to get the vertices) we will get how they relate.

     Lets delete the connection between Spigariol and Gustavo and try again.

    In the first line, we use 'g.E' to list all edges, then 'inV' to get the verices and 'has' to filter that vertices with property Name equals "Gustavo". Finally, we use back(2), to show the results of two steps behind.(returning to E).
    The next command we remove the Edge, now we have only one possible path to Gustavo.


Conclusion

   
    That was a little tour on GraphDB, what are the tools to access and a "hands on" to create, erase and query the stored vertices. This post is not a full tutorial, for a more complete information please see this great video of Andreas Kollegger <twitter> , he explain the graph database concept and present an full demo of Neo4jMy favorite part of the video is when he said that a relational database is great to calculate the salary average of the attendees of the webcast, but the graph would be better to identify who would buy him a beer.
      Thanks for your reading. If you have any questions, feel free to send me a email, or follow me on twitter, I´m always posting related content of the marvelous world of data!

Best Regards!

Felipe Antunes

email:fjantunes@gmail.com

twitter: @felipe_store

Comunidade ! - A visão de um DBA no DNAD 2012


/*Olá Senhores, Senhoras e Senhoritas DBAs, (e simpatizantes!)



      Nos dias 1 e 2 desse mês aconteceu o .Net Architects Day 2012 (ou simplesmente DNAD12), um evento voltado para arquitetos e desenvolvedores. É minha segunda vez no evento (a primeira está descrita aqui) e mais uma vez sai empolgado com o conteúdo das palestras. Por isso se você perdeu, não perca o próximo em 2013.

      Mas você pode se perguntar: O que fazia um DBA lá no meio de tantos desenvolvedores e arquitetos?

      E eu explico! Primeiro que antes de DBA eu sou desenvolvedor e antes de desenvolvedor eu sou vidrado em assuntos que envolvem TI. Apesar de hoje trabalhar pouco com programação, acho sempre válido se interar do que está sendo feito e para que lado a TI está correndo. Independente de ser um evento de dev, banco ou infra o importante é absorver e conhecer as novas tecnologias, siglas e soluções pois nunca se sabe quando você precisará desse conhecimento.
     
      Explicado o ponto, chegamos a razão desse post. Qual é a visão que um DBA pode tirar de um evento como esse?
      Infelizmente não pude participar do segundo dia, mas analisando o conteudo das palestras do primeiro dia foi possivel identificar uma tendência que está cada vez mais forte e na minha opinião ainda está engatinhando no Brasil. O Big Data!
            Praticamente das sete palestras do dia pelo menos quatro envolviam ou ao menos tangenciavam Big Data.



Mas o que é Big Data?!

Big Data é a um termo geral para cenários onde os dados a serem processados/armazenados são criticos  em seu volume (Teras ou Petabytes de informação), velocidade (esses mesmos Teras ou Petas em fluxo constante por hora ou por dia) e variedade (fontes diferentes de informação nos mais diversos formatos). É conhecido que empresas que analisam e usam as informações ocultas nos  bancos de dados corporativos possuem um fator diferencial de mercado (isso é BI), mas o fato é que expandir esse horizonte e incluir na analise dados não estruturados ou negligenciados (logs de servidores e aplicativos, redes sociais, etc..) pode aumentar o potencial e qualidade da informação obtida (isso é Big Data).

Isso não exatamente uma novidade, mas está se tornando muito mais acessível por conta da comoditização de storage/processamento e a elasticidade de custos dos servicos de Cloud Computing (a palestra do José Papo <twitter|blog>  foi sobre estratégias de redução no AWS da Amazon).
            A Microsoft também não ficou atrás e está integrando o Hadoop (uma plataforma para processamento distribuido) no Azure, inclusive dando suporte ao Java (nada boba ela).
          
           Outra palestra que demonstrou bem qual é o tipo de desafio que o Big Data proporciona foi a palestra do Juan Lopes <twitter|site> sobre um case que precisava armazenar, indexar e analisar logs de servidores em tempo real, uma média de 3Tb/dia! O case foi uma aula sobre como enfrentar esse tipo de cenário adverso.

            Ainda o evento fechou com duas palestras . Uma do Felipe Oliveira <twitter|site>  sobre CEP (Complex Events Processing). Uma ferramenta importante para analisar dados antes mesmo que elas sejam armazenadas (a frase chave foi “Big Data só é Big porque deixamos esse dado chegar a base sem ser analisado”) e uma divertida apresentação sobre 10 anos de evolução de um software do André Carlucci <twitter|site>.

Nessa ultima palestra, o volume de entrada de dados que o sistema em questão teria de absorver estava crescendo exponencialmente e eles não podiam trocar de um db relacional para um noSQL por razões politicas/comerciais.  Ou seja, eles tiveram que se esforçar na marra para modelar o banco de maneira mais adequada ao tipo de dado que eles tratavam, isso me chamou a atenção por mostrar aos entusiastas do noSQL que não basta simplemente trocar uma ferramenta por outra mais nova e seu problema estará resolvido. É preciso entender o problema e usar a ferramenta certa. E se a situação não permitir, tem que se virar com o que tem!
      Enfim, pessoal da organização, meus parabéns e muito obrigado! Mais uma vez vocês tocaram um grande evento e com certeza estarei lá ano que vem.

Abraços!

Felipe Antunes
Twitter: @felipe_store
Email: fjantunes@gmail.com