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.

terça-feira, 8 de dezembro de 2009

O oráculo e o sol!

Além de este post estar ressuscitando este blog criado há algumas eras, escrevo-o para comentar algumas impressões que tive depois de participar do primeiro dia do SunTechDays 2009-2010!

A primeira coisa é: tenho orgulho de ser quem eu sou e vir de onde vim! Putz... Ou não se fazem mais geeks como antigamente, ou essa galera daqui não sabe onde está! Um evento muito bem estruturado como este, com intervalos ao som de Rock, e a galerinha não se agita, não vibra com a entrada de James Gosling, nem entende as piadas nerds dos palestrantes do mais alto nível. Ou eu entendi errado, ou tá faltando o gingado do forró por aqui! Estou feliz por saber que estou acompanhando o nível do evento, e por ser um paraíba da UFCG e das FIP!

Um segundo ponto é: Estou triste pela SUN... Estou triste pela incerteza atual em relação a esta fantástica fábrica de idéias... Hoje me peguei comparando-a com um artista desses geniais, que "faziam o inferno" mas morreram de fome, ou não conseguiram se manter (como foi o caso). No mínimo não se sabe o futuro de ferramentas incríveis como o MySQL e Netbeans, tendo a Oracle investimentos em outros SGBDs e no Eclipse. Na média, o clima da empresa já é outro e cabeças pensantes, desenvolvedoras de ideias, estão confusas e improdutivas! As ferramentas que se vê em cada estande são de um nível altíssimo. Bastando citar os três tracks que estruturaram o evento:
  1. Java e Desktop
  2. JEE e Software Corporativo
  3. OpenSolaris e seu ZFS
Por fim, a impressão do momento é que o SunTechDay é um evento de 70% venda de idéias e de comunidade, e claro, 30% de venda de produtos diretamente. Acredito que estou numa posição confortável por aqui: de um lado, tudo que vejo me dispara inúmeras idéias para a sala de aula e para orientações de pesquisa; por outro, tenho contato com as tecnologias que farão de minha empresa algo mais e melhor.

No mais, até amanhã... E não esqueçam de sintonizar em @nigini!

domingo, 18 de novembro de 2007

Google, Sun e o mundo mobile!

Sem dúvida é por aqui que vamos...

Várias são as linhas de evolução tecnológica que mostram que em alguns anos todos andaremos comandando nossos negócios com aparelhos de bolso e com alta capacidade de interação. O mundo está evoluindo para um boom de computação mobile + web 2.0!!!

Quantos de vocês já perceberam que a maior parte do tempo que passamos nos desktops hoje está baseada num navegador Web? Claro, existem os que passam uma boa parte nos seus IDEs favoritos, mas esta população precisa enxergar outras mudanças no mundo da TI que não vêm ao caso. Já outros passam bem nos seus jogos favoritos, estes sim ainda precisarão de suas placas aceleradoras de 256Mb (apesar de já existirem empresas como a EA trabalhando numa linha de entretenimento para handsets).

As últimas novidades deste mundo estão ligadas ao lançamento da Google à frente de um consórcio desenvolvedor de tecnologia mobile. Chama-se Android (vide http://www.openhandsetalliance.com/) e consiste em uma pilha de aplicativos que busca facilitar homogeneizar os sistemas destes aparelhos (vide http://code.google.com/android/what-is-android.html).

Jonathan Schwartz (CEO e presidente da SUN) escreveu em seu blog, "o Android é um sistema Linux/Java", e essa declaração tem rendido muito bate-papo na rede. O que acontece é que o Android não utiliza a JVM da SUN em seu aparelho, mas sim uma outra implementação denominada Dalvik, dita mais eficiente para este tipo de plataforma. Ela é capaz de executar código Java através de uma conversão do .class para .dex (Dalvik Executable). Mas como grande parte das aplicações da pilha são JAVA, não vejo porque a negação da existência desta tecnologia no Android. Pelo que lembro, a JVM é uma especificação e sempre pôde ser reimplementada.

O que tem preocupado a comunidade é o particionamento da tecnologia, neste caso "Sun-JME x Android-Dalvik", principalmente porque ambas são open source e podem ser melhoradas por qualquer um. Tudo bem que uma fragmentação não é coisa simples, pois cria a necessidade de plataformas compatíveis, mas como estamos falando de um jogo de gigantes, empresas que possuem suas próprias plataformas e sistemas operacionais podem complicar a situação.

O importante é perceber a tendência de mercado direcionada ao mundo de tecnologias móveis e estar sintonizado nos próximos passos.

Abraços.