domingo, 7 de março de 2010

Redes e seus Padrões: Sockets!

Sou professor da disciplina de "Sistemas Distribuídos" há um bom tempo, e todo semestre tento achar uns brinquedinhos novos para mostrar aos alunos. Nas primeiras aulas do semestre, gosto sempre de mostrar exemplos básicos de comunicação entre processos utilizando Sockets.

Socket é basicamente um canal de comunicação entre processos executados por um Sistema Operacional qualquer. Estejam estes processos na mesma máquina, em máquinas diferentes, ou mesmo utilizando tecnologias diferentes de implementação, o socket é uma forma simples e padronizada para "um lero" na rede. Na verdade, este troço está em todo canto... Seja quando você pede uma nova página a um servidor WWW, seja quando você envia um E-MAIL.

Em sala de aula, por conveniência (e esquecimento) sempre fiz meus exemplos em JAVA, tecnologia que domino. Mas estes últimos meses tenho intensificado meus estudos em Python e decidi mostrar para a galera como é que mágica acontece para fazer tecnologias diferentes conversarem. O código abaixo mostra um pequeno servidor escrito em Java, que só sabe receber conexões e imprimir mensagens na tela.

 

Por dentro de todo Socket em Java passa uma via de mão dupla, ou melhor, dois "fluxos de bytes" chamados Streams (um de input e outro de output). Como nem eu nem você deve querer trabalhar com Bytes em baixo nível, é normal se encapsular estes streams em um outro objeto que trabalha com coisa de mais alto nível, como por exemplo Strings e Objects.

No código da imagem acima, marquei a classe que usei para deixar meu servidor mais versátil... Antes, eu utilizava o ObjectInputStream o que fechava meu servidor para clientes Java, pois quando um objeto é retirado da memória (serializado) para que seja enviado para outra máquina, apenas outra JVM vai entender o stream de bytes gerado por um ObjectOutputStream. No caso do BufferedReader e InputStreamReader, trabalhamos com caracteres, bytes estes legíveis a qualquer tecnologia.

Se você executar o código acima (lembre-se de realizar os devidos imports), você terá uma JVM na porta 7777, esperando por clientes sedentos para deixar sua mensagem no nosso mural! O código JAVA para um cliente é quase que um espelho do servidor:

 
 
OK! A única coisa que este código de cliente faz demais é interagir com o usuário para pedir um IP e a mensagem a ser enviada. Teste-o! Mas agora a parte que mais me divertiu (sim... eu sou nerd) foi poder enviar uma mensagem de um script Python. Utilizei a biblioteca nativa da liguagem para isso:

 

Primeiro importa-se a biblioteca para utilização do socket, instancia-se um objeto cliente, realiza-se uma conexão e depois envia-se a mensagem textual (com quebra de linha - pois o servidor exige isso para apresentar a mensagem!).
No final das contas, apesar da simplicidade, grande parte das aplicações distribuídas baseiam-se nesta tecnologia. Obviamente que as complicações começam a aparecer com a complexidade da aplicação. Lembre-se:
  • Você ainda não está pronto para criar aplicações reais com isso que escrevi! =]
  • Socket é uma tecnologia padronizada a nível da camanda de aplicação mas que implementa protocolos da camada de rede como TCP e UDP. (o utilizado acima foi o TCP!).
  • Espero poder ter ajudado algum leitor a enteder melhor seu dia-a-dia de usuário de MSN!
  • "A resposta para a pergunta definitiva sobre a vida, o universo e tudo o mais é... 42"!
FUI!

sábado, 20 de fevereiro de 2010

Análise de Redes Sociais

OK! Esta é minha volta aos trabalhos de pesquisa que lentamento tenho tentado levar mesmo fora de um grande centro (como era meu caso - UFCG). No momento, tanto tenho alguns orientandos no FIP/SI, como tenho pesquisado por conta própria coisas relacionadas à Redes Sociais, análise dos grafos emergentes daí, e busca de informação latente nestas estruturas.

Depois de fazer um breve levantamento bibliográfico (vide: Link Prediction, Linked, Organization of Complex Systems, etc.), as idéias começaram a surgir... pena que o tempo é tão curto e eu ainda tão desorganizado. Além disso, neste momento, estou procurando ganhar experiência no uso de Python e algumas API's para implementarmos um portal acadêmico (e experimental) onde poderemos coletar dados mais "nossos", e podermos chegar a conclusões mais interessantes para a nossa comunidade.

Por que Pyhton? Bom... em primeira instância estou me sentindo um dinossauro por ser fluente em apenas uma tecnologia. Depois, gostei muito de Django e da facilidade que é colocar algo para rodar rapidamente. Como nosso intuído é mais experimental, nos preocuparemos com escala depois (além de já saber que o povo de Python já se preocupa com isso). Por fim, encontramos o Pinax, que é um conjunto de aplicações Django, reunidas de forma a facilitar a montagem de portais, tendo como exemplo base o Cloud27 que é exatamento uma rede social.

No mais, o meu objetivo atual é integrar alguma biblioteca de grafos na parte do Pinax que lida com usuários, profiles, tribos, mensagens, etc. para depois implementar alguns algoritmos para análise.

quarta-feira, 13 de janeiro de 2010

O paradigma da computação

Ainda estudante de graduação, me pegava pensando sobre a finalidade da minha formação como Bacharel em Ciência da Computação. Hoje, trabalhando com Sistemas de Informação a pergunta ecoa novamente, principalmente quando estou desempenhando atividades de ensino. Neste meu vai e vem entre áreas, e entre um livro e outro, acabei me deparando com este pequeno artigo da revista Communications (da ACM - pena que é material reservado a assinantes). Abaixo buscarei ressaltar alguns pontos que achei interessantes.

O texto começa lembrando dos debates que ainda existem sobre em qual paradigma a computação deve ser enquadrada: ciência, engenharia ou matemática. Obviamente que isto não impediu a necessária criação dos vários cursos de formação hoje existentes em sub-área particulares. Fiquei com a impressão de que esta definição de paradigmas envolve questões mais políticas e filosóficas, o que permite o andar da carruagem. O autor cita algumas tentativas de unificação das três áreas, buscando a definição de um paradigma próprio da computação sendo estes:
  1. "Processos da Informação" de meados da década de 1960;
  2. "Programação: a arte de criar processos da informação" do fim da mesma década (visão de personalidades como Knuth e Dijkstra;
  3. "Automação de processos da informação" de meados da década de 1970.
Esta discussão foi levada a comitês (incluindo na ACM) com expansão da área na década de 1980 e no final do século (até hoje eu diria) parecia que o termo TIC - Tecnologia da Informação e Comunicação - havia por fim fechado a definição da área. Porém a coisa se voltou muito ao mundo do hardware e a definição de um paradigma para a computação nos tempos atuais exigem "migrar a atenção de volta aos processos da informação". Além disso, o novo framework de princípios (que me parece ter sido definido pelo autor) considera ciência, matemática e engenharia como motores igualmente importantes para a computação; argumentando ainda que esta deve ser considerada o quarto grande domínio da ciência, ao lado da física, biologia e ciências sociais.

Por fim, a distinção mais interessante que o autor traça entre "os motores" da computação, e esta própria, é que os primeiros se posicionam do lado de fora dos universos estudados, ou seja, como observadores. Já a computação é mais insider no sentido de "representar os processos da informação como expressões que 'realizam trabalho'", ou seja, não apenas representam algo para o observador, mas também são geradoras de ações, que podem inclusive ser auto-referenciáveis. Estas duas características abrem um leque de possibilidades poderoso, como é o caso dos estudos sobre a computabilidade (e.g. problema da parada) baseados em muita matemática de personagens como Turing e Gödel.

Confesso que não procurei pensar além dos conceitos do autor, apenas adicionei pitadas de coisas que já tenho na cabeça. Talvez o leitor possa comentar e ajudar a expandir os meus horizontes.

Abraços.

PS.: O mais interessante foi que acabei de ler hoje mesmo o livro "Um louco sonha a Máquina Universal - Janne Levin - Companhia das Letras", sobre o qual prometo lincar depois meus comentários.