terça-feira, 8 de dezembro de 2009

Web Services, computação descentralizada para sistemas distribuídos, por Ramon Rosa da Silva

Resumo. O crescimento dos serviços disponibilizados na internet tornou necessário uma padronização de protocolos para troca de informações.

Para a interoperabilidade dos serviços desenvolvidos em diferentes arquiteturas, sistemas operacionais e linguagens, mais do que nunca é ressaltada a importância de padrões como XML (eXtensible Markup Language) e HTTP (Hypertext Transfer Protocol).

Com ajuda destes padrões Web Services podem resolver problemas de comunicação entre diferentes aplicações, e disponibilizar serviços que podem ser utilizados por vários clientes sem necessidade de reconfiguração do servidor, isto é reutilização de serviços.

1.Introdução

Na década de 60 a computação era baseada em grandes mainframes e terminais burros, isto é computação centralizada, existia pouca ou nenhuma preocupação com padronização de protocolos de comunicação, cada fabricante propunha sua própria especificação de seus produtos que não eram compatíveis com os produtos concorrentes. Muito rápido isso se tornou um problema para os clientes, que passava a ser também um problema aos fabricantes, foi neste contexto que sugiu a ISO, que propôs um modelo de arquitetura dividido em 7 camadas (famosa até hoje, arquitetura OSI).

Conforme foi sendo popularizado os computadores desktop e com a abertura da internet (por HTTP), a computação centralizada foi perdendo espaço, um novo modelo de computadores pessoais que operam sem necessidade de mainframes, que se comunicam pelo protocolo TCP/IP baseado no modelo OSI, assim iniciou a computação descentralizada.

A descentralização possibilitou o surgimento de serviços disponibilizados na web, os Web Services, e novos padrões foram criados para o desenvolvimento de aplicações distribuídas, como CORBA (Commom Object Request Broker Architeture), DCOM da Microsoft entre outros. Em meados da década de 90 existiam vários padrões que criavam um forte acoplamento entre os sistemas, e se tornava complicado diferentes sistemas interagirem entre si.

Mais uma vez foi necessário uma reformulação do modo de diferentes serviços se comunicarem, para este fim foi criada a XML, linguagem/padrão de troca de informações.

Atualmente as empresas se esforçam para aperfeiçoamento de padrões como XML e HTTP, com linguagens como Java e PHP, que permitem a criação de sistemas independentes de arquiteturas e plataformas. Essas tecnologias são utilizadas tanto com os novos padrões quanto antigos em sistemas legados.

2.Padrão Web Service

O padrão do Web Service é padronizado pela W3C, com: “um sistema de software projectado para suportar a interoperabilidade entre máquinas sobre rede”.

Essas interoperabilidade é garantida pelo seu padrão de comunicação baseado em XML encapsulado em SOAP.

3.XML

Atualmente de facto XML é a linguagem padrão para comunicação entre serviços com serviços, e serviços com clientes.


Fig. 1: Comunicação entre os serviços.

A linguagem XML é muito similar a HTML (Hyper Text Model Linguage), é escrita com tags com uma identificação e dados dentro das tags, podem existir tags dentro de tags. Por exemplo:

Fig. 2: Exemplo XML

O XML trafega pela rede dentro de um pacote HTTP ou HTTPS para conexões seguras, que é desempacotado pelo servidor.

4.SOAP

Simple Object Access Protocol, trás a mesma ideia do RPC (Remote Procedure Call) para XML, atualmente é um especificação da W3C.

É um protocolo baseado em XML para comunicação entre aplicações HTTP.

RCP não é recomendado para internet pois teria problemas com segurança e com firewalls ou proxyes.

Mensagens SOAP, são dividas em 3 partes:

SOAP envelope: Define o conteúdo da mensagem.

SOAP header: Contém a autenticação, transação e contabilização, é opcional.

SOAP body: informações dos métodos e parâmetros que serão utilizados.



Fig. 3: Exemplo mensagem SOAP

5.Web Services

Web Services são aplicações publicadas na web, desde simples processos como cálculos até complexas transações de empresariais, depois de publicados permitem obtenção e submissão de dados.

São acessados de forma independente de plataforma ou linguagem de programação, utilizando padrões como HTTP, XML e SOAP. Seus serviços são conhecidos através de uma mensagem padrão XML.

Um Web Service é feito para suportar 3 categorias: provedor do serviço, provedor de registro e o cliente do serviço. Com operações de procura (find), publicação (publish) e acoplamento (bind).

O cliente procura o serviço, e obtém a descrição do serviço e do provedor de registro, com essas informações ele pode acessar e interagir (bind) com o provedor do serviço.



Fig. 3: Ciclo de vida de um Web Service


5.1.WSDL

Web Services Description Language, linguagem XML, desenvolvida para descrever o Web Services, o que o serviços faz, como utiliza-lo e onde ele está localizado.


Contém o elemento "definition" dividido em:
"message" e "portType" : define quais operações o serviço fornece.
"type" : este elemento opcional serve para definir tipos de dados estruturados .
"binding" : designa como as operações são invocadas.
"service" : explicita onde o serviço está localizado.


5.2.UDDI

Universal Description Discovery and Integration, é um conjunto de registros baseados na web que provem informações a respeito de uma entidade ou organização, podem ser utilizadas por qualquer um que queira tornar disponível ou queira obter informações a respeito de negócios ou entidades.

São encontrados 4 tipos de UDDI:

BusinessService: pode conter informações sobre uma ou mais organizações.

BusinessEntity: informações técnicas e de descrições de serviços.

BindingTemplate : contem referencias a um ou mais tModels

tModel: definições de especificações técnicas de serviços.

Uma UDDI é similar a uma lista telefônica. Páginas brancas (white pages), contém informações como nome da organização, contato e identificadores. As páginas amarelas (yellow pages) um índice de serviços e produtos e as páginas verdes (green pages) contém informações a respeito de transações, descrições de serviço e invocação de aplicações.

6.Segurança

Atualmente a segurança é uma das questões mais criticas em um Web Service, não existe falta de tecnologia para segurança, mas um falta de consenso para escolha desta tecnologia.

Existe uma grande preocupação de separar bancos de dados importantes das empresas com os Web Services para maior segurança.

Principais mecanismos de segurança são: SSL, XML signature, XML encryption, WS-security e SAML.

6.1.SSL

Secure Socket Layer, desenvolvido para pequenos dispositivos, oferece autenticação, integridade e privacidade. Trabalha em cima de HTTP, com a desvantagem de ser mais lento que HTTP puro.

6.2.XML signature

Iniciado pela IETF (Internet Engineering Task Force) e W3C, como uma especificação de XML com assinatura digital. Com vantagem de ser independente de linguagem de desenvolvimento, ao contrario de outras assinaturas digitais.

6.3.XML encryption

Também iniciado pela IETF e W3C, define um processo de encriptação e decriptamento de dados no formato XML, onde o XML pode ser acessado por qualquer um, mas apenas o proprietário da chave pode entender os dados.

6.4.WS-security

Web Service seguro, iniciativa da Microsoft, IBM e Verisign, para XML signature e XML encryption, fornecer segurança para SOAP.

6.5.SAML

Security Assertion Markup Language, ainda pouco utilizada, é desenvolvida para prover autenticação e autorização em diferentes Web Services com níveis de direitos de acesso, permitindo que trabalhem como se fosse apenas um apicação.


7.Implementação

Um Web Service pode ser implementado de diferentes linguagens de programação. Linguagens como PHP, ASP, Java, possuem servidores que provem bibliotecas para facilitar a implementação.

No caso do PHP existe o Apache, um dos servidores mais populares para internet, para ASP a Microsoft desenvolve seu próprio servidor e para Java a Sun Microsystens definiu uma arquitetura que é implementada por diferentes empresas como IBM com WebSphere, Oracle, Apache.org com Tomcat entre outras.

8.Conclusões

Os Web Services tem se tornados cada vez mais importantes para as empresas, já substituíram o paradigma de computação centralizada, estão atualmente substituindo servidores que usam protocolos fortemente acoplados como CORBA.

A tendencia é que cada vez mais as empresas passem a disponibilizar seus serviços por Web Services.

Na medida que grandes empresas desenvolvedoras de software estão se dedicando no aperfeiçoamento de arquiteturas como J2EE, plataforma .Net, e também comunidade por trás do PHP, tem ficado cada vez mais simples para as empresas terem seus próprio Web Services.


9.Referencias

W3C

w3schools

www.ws-i.org

segunda-feira, 7 de dezembro de 2009

TI Verde Por Ramon Rosa da Silva

A pratica da TI verde se da escolhendo fornecedores que assumam sua responsabilidade ecológica, utilização materiais renováveis, descartamento de correto de materiais, virtualização, economia de energia entre outros atos que venham em favor sustentabilidade da computação. De forma geral essa pratica procura diminuir o desperdício e aumentar a eficiência.
Muitas pessoas não sabem mas uma forma simples de diminuir o gasto de energia é desligar o monitor quando não está sendo utilizado, principalmente quando é CRT, que pode consumir até 80% da energia do computador. Ainda bem estamos caminhando para monitores mais econômicos como LCDs e de LEDs, que consomem muito menos que os CRT.
Hoje em dia a TI verde está saindo da teoria e entrando em pratica nas grandes empresas, muitas por economia e consciência, outros por publicidades, como concursos como “Top Green 500”, com a escolha dos 500 computadores mais eficientes energeticamente, mas em fim o que importa é a adesão das empresas na TI verde.
Vale lembrar que além do hardware o software também tem grande importância na TI verde, imagine que quanto menor o processamento, menor aquecimento, que se relaciona com refrigeração interna do equipamento e do ambiente. No desenvolvimento o software também pode ser feito de forma sustentável, em forma colaborativa, criando módulos que possam ser melhorados, procurando a reutilização de formas comprovadas de eficiência.
Estive semana passada em uma empresa a ViaFlow de consultoria que em parceria com a IBM, trabalha com implantação de um sistema de GED (Gerenciamento Eletrônico de Documentos), o sistema se trata da digitalização de documentos, visando facilitar o gerenciamento deste documento, e o que eu achei mais interessante, permite anular todos documentos em papel, mantendo-os apenas no sistema, com a mesma validade jurídica, um sistema que elimina papéis é importante não somente para empresas de TI, e sim para todas empresas que trabalhem com um volume considerável de documentos em papel.
Eu trabalhei em um hospital de tamanho médio, e vi um grande volume de documentos gerados em papel apenas para fins jurídicos, pois o sistema podia abranger todas as atividades sem a necessidade de papel.
Sistemas como GED, ou simplesmente gerar em PDF e utilizar e-mail ao invés de imprimir relatórios, ou de desligar os monitores, ou virtualização, entre outros métodos, não são utilizados por estrar intrinsecamente no subconsciente¹ a desconfiança da segurança do software ou hardware.
Acredito que quando as empresas e pessoas tiverem maior consciência do desperdício que fazem, trocarão a cultura atual, por outra com maior confiança em tecnologias com um consciência ecológica.

¹ Nota: Lembra as aulas de psicologia, talvez um psicologo possa ajudar nesse processo de mudanças. Se não me der bem no área de tecnologia vou cursar psicologia...

Memória flash, por Ramon Rosa da Silva

A memória flash é a mais indicada para substituir a do disco rígida (HDs), por sua velocidade superior, com uma única operação é capas de escrever em vários blocos, com acesso aleatório, porém atualmente sua durabilidade é inferior a do disco rígido, são limitadas a uma quantidade finita de leitura e escrita. Seu custo atual é maior que a do disco rígido, quando seu custo baratear são vendida em massa nos desktops e em servidores, atualmente já são encontradas em alguns NetBooks.
São do tipo EEPROM (Electrically-Erasable Programmable Read-Only Memory) . Muito parecidas com a memória RAM (Random Access Memory) com a diferença que não são voláteis (não se apaga quando é desligada).
Encontradas em dispositivos como pen drives, mp3 players, câmeras digitais, celulares, principalmente por sua economia de energia e um tamanho pequeno.

Virtualização, por Ramon Rosa da Silva

Virtualização de sistemas operacionais é a possibilidade de em uma única máquina e sistema operacional, poder rodar por cima mais sistemas operacionais, que possam interagir entre si, e entre a rede de computadores, como se estivessem fisicamente instalados.
Cada vez mais comum nas grandes empresas a virtualização tem se tornado uma grande aliada a redução de custos.
Para que essa virtualização seja eficaz é necessário dispor de um equipamento potente, é pouco provável que um desktop comum tenha um bom desempenho para virtualizar outros sistemas operacionais.
Empresa que produzem servidores estão se dedicando a criação de hardwares específicos para vitalização de vários sistemas operacionais no mesmo servidor, até mesmo desenvolvendo sistemas operacionais específicos para esta atividade. Utilizam dedicação de processadores ou núcleos, memória para determinada máquina virtual.
Um desvantagem desta técnica é a centralização em uma única máquina de diversas atividades, caso ela necessite de reparos é recomendável ter uma outra máquina disponível (redundância), com um com backup dos sistemas virtualizados.

domingo, 6 de dezembro de 2009

Computação social, Por Ramon Rosa da Silva

Tem sido cada vez maior a necessidade das pessoas interagirem utilizando a internet, para solucionar o problema de “como se relacionar pele internet” tem surgido sistemas web e desktop, esses sistemas promovem o relacionamento das mais diversas pessoas, de diferentes classes sociais e lugares do mundo.
Mesmo já existindo muitas tecnologias voltadas para essa área, tais como, orkut, myspace, facebook, msn, gtalk, skype, ainda existe espaço para novas tecnologias que atenda públicos específicos, por exemplo, de empresas, de escolas, entre outros que a criatividade nos permita encontrar.
Para alguns autores como Höök (2001) o termo é aplicado no sentido de “pesquisar e construir software que permita as pessoas terem uma vida social on-line”, para Ashok Rao (2002) o foco seria poder incluir socialmente cidadãos na tecnologia digital.
Atualmente a computação social está motivando em grande quantidade o interesse das classes baixas por computadores e internet, devido a popularização do sistema de relacionamento Orkut, do mensageiro instantâneo Msn Messenger e sistema de gestão de conhecimento wikipedia (os 3 mais populares em suas áreas no Brasil), que muitas pessoas começaram a utilizar os computadores, algumas vezes para se relacionar de uma maneira mais barata que o telefone com amigos/parentes que viajaram para longe, ou até mesmo para conhecer pessoas novas, manter contato.
E também outro ponto importante que fez com que pais de baixa renda adquirissem um computador com internet é a questão de estudo, pois tem a consciência que o futuro é digital e com o computador seus filhos terão mais chances de se relacionar e aprender pela internet.

sábado, 5 de dezembro de 2009

Computação em nuvem, por Ramon Rosa da Silva

Em inglês chamada de “cloud computing”, é uma tendencia para o futuro da internet.
Computação em nuvem é poder utilizar os softwares sem precisar instalá-los, muitas vezes está ligado a computação móvel, no futuro poderemos utilizar softwares com nossos documentos pessoais em qualquer lugar, pois estarão armazenados em servidores na internet.
Mutias empresas atualmente já dedicam muito de seus esforços para aperfeiçoamento destes softwares, o Google por exemplo disponibiliza aos seus usuários, edição de textos, planilhas, email, mapas, e alguns outros software de escritório com gdocs, dmaps e gmail, para acesso em qualquer lugar pela internet. Além do google existem outras empresas como Zooho que estão seguindo o mesmo caminho.
Computação em nuvens é um serviço feito para funcionar em diferentes sistemas operacionais.
Alguns desvantagens deste serviço são:
Dependência de conexão de internet, o serviço só será utilizado com perfeição se o usuário e o servidor estiver uma boa conexão com a internet, ou se por ventura a conexão de uma das pontas cair, termos problemas críticos.
Exige segurança, autenticação segura, farejadores de rede, cópias sem autorização, alteração indevida, falhas com backup, entre outros, são problemas que podem acontecer quando se trabalha com dados armazenados em rede.
Custo alto, atualmente para manter um sistema de computação em nuvens é necessário sistemas de arquivos distribuído muito complexo e equipamento potente, isso eleva muito o custo.

segunda-feira, 30 de novembro de 2009

Uma reflexão sobre ética

Com o inevitável crescimento da tecnologia nas empresa, tem ficado cada vez maior o controle dos funcionários (tempo de trabalho, no que foi trabalhado), quanto maior a empresa e mais inovadora, maior a necessidade de controle e segurança industrial.
Mas toda essa busca por segurança e controle dos funcionários tem um carater invasivo, podendo passar por cima da privacidade ou até da legalidade.
É muito importante estabelecer políticas éticas corporativas que incluam questões relacionadas aos Sistemas de Informação.
Internet e e-mail fazem parte dos sistemas de informação, e tem preocupado muito as empresas com vazamento de informações confidenciais, que por isso invadem a privacidade de seus funcionários. Porém esse ideal de privacidade está em mutação, provavelmente esse avanço tecnológico crescente criará uma nova visão de privacidade.
Isso gera uma questão: O avanço tenológico vale a perda de privacidade? Essa resposta depende muito da empresa, pois em algumas empresas é inevitável a evolução tecnológica.
Mesmo os clientes das empresas sofrem com a perda de privacidade, com levantamento de perfil ou mesmo segurança dos próprios clientes é necessário invadir a privacidade, que talvez não fosse ético a não ser pelas circunstancias.
Por exemplo é necessário que algumas empresas tenham câmeras de vigilância para sua segurança, mas nem sempre o cliente ou funcionários estão cientes que estão sendo vigiados.
Mais do que outros setores, o setor de TI necessita de uma equipe ciente das obrigações éticas, por exemplo um banco de dados hospitalar, ou de uma prefeitura, os dados armazenados nele contém informações que podem ser utilizadas para criação de cartões de crédito, compras pela internet, financiamento. Recentemente ocorreram casos onde foram feitos empréstimos em nome de aposentados, os dados dos aposentados eram vendidos na internet, que saíram de um banco de dados, isso foi um caso de falta de ética ligado a um sistema de informação.
Normalmente a quebra de ética nas empresa é feita por necessidade e em um nível aceitável, é mais perigoso terem dados sigilosos em mãos de usuários comuns, hackers ou crackers do que de empresa.
Algumas pessoas procuram vulnerabilidades em sites, procurando dados sigilosos, isto também é eticamente errado, mesmo que seja apenas para olhar os dados, e pior ainda vender ou destruir, isso é um crime.
Existem também pessoas conhecidas como engenheiros sociais, se utilizam de conhecimentos tecnológicos ou específicos em um determinado seguimento para se passar por outras pessoas, afim de se infiltrar e conseguir informações ou até corromper-las, provavelmente essa é a mais perigosa forma de invasão ética, pois são indivíduos que podem entrar em diferentes ciclos sociais, algumas vezes são contratados por empresas para espionagem de outras empresas ou até de a vida pessoal das pessoas.
Cada vez mas a privacidade das pessoas está ficando exposta, e cabe criarmos leis para que exista para regulamentação de até onde empresas podem entrar na nossa privacidade, e ter uma conscientização da equipe de TI das empresas sobre éticas, fora disso cabe a cada um ou empresa cuidar da segurança de informações contra crackers, hacker ou engenheiros sociais.

domingo, 29 de novembro de 2009

TCP, UDP e RMI minhas observações sobre exercício e exemplos

Obs importante, esse post é continuação, deste: http://neoramon.blogspot.com/2009/11/essa-e-descricao-de-trabalho-de.html

Link para o fonte completo:Link
http://www.4shared.com/file/162287536/b6844a93/sd_online.html


Ambiente de teste:
Sistema operacional Ubuntu Linux 9.10,
Kernel 2.6.31,
arquitetura i386
java jdk 1.6
Processador Intel Core 2 Duo 1,83 Ghz

Instruções para compilação:
Passos:
entrar na pasta dos bytecodes
ex: $HOME/NetBeansProjects/sd/build/classes/
rodar o rmiregistory
ex: /opt/jdk1.6.0_14/bin/rmiregistry 1099&
rodar o menu da aplicação
ex: /opt/jdk1.6.0_14/bin/java sd.Main
Clicar nos botões dos servidores e depois nos botões de teste e esperar pelo resultado!
Descrição dos testes:
Os teste foram feitos sem utilização de threads nos clientes, para que sejam executadas sequencialmente,

Para testar os dos cálculos foram feitas 10000 multiplicações, de 2 * 50.
tempo em nanosegundos
O tempo de execução do RMI é muito mais lento do que os de UDP e TCP, pois fica mais complexo enviando dois parâmetros em uma única função.
TCP por sua vez é mais lento que UDP, pela complexidade maior do protocolo UDP.

Dificuldade
A facilidade de implementação de uma multiplicação em RMI é muito mais simples do que em qualquer outros dos dois métodos.
Em segundo lugar achei mais simples a implementação em UDP, pois na linguagem java, existe uma classe especifica para “empacotar” os dados (DatagramPacket), diferente do TCP, que utiliza classes não pensadas especificamente para rede, (OutputStream e InputStream).
A dificuldade de implementação do TCP é aumentada pelo necessidade de ter que gerenciar um servidor (ServerSocket). No UDP o servidor é desnecessário pois o protocolo não exige, apenas temos que “ficar esperando” um pacote chegar (socket.receive(packet);). Em RMI apenas é necessário registrar o serviço no Servidor RMI (Naming.rebind("rmi://localhost:1099/CalculadoraService" , m);).


Tempo médio em nanosegundos.



Para testar os Ping pong foram feitas 64 envios de um pacote para o servidor que responde com o mesmo tamanho do pacote.
tempo em nanosegundos


TCP é mais lento que o UDP pela complexidade maior do TCP.
RMI é o mais lento de todos.

Valores em Kb / nanosegundos
64 testes de 0 a 63.

Facilidades de implementação:
RMI, a implementação utilizando RMI, foi mais simples, pois apenas é necessário definir uma classe de interface, e uma implementação da interface, não é necessário se preocupar com o tamanho máximo de cada pacote, nem em converter do tipo byte para outro formato.
A implementação com TCP e UDP foram muito parecidas, mas muito mais complexas do que a de RMI, pois necessita um planejamento de tamanho de cada pacote, e dificuldade de saber se foi o tamanho exato do pacote enviado.


Tala da execução do software

Tela de configuração dos testes

Tela de configuração das portas do servidor.

Vou mostrar os Serivodores e Clientes do exemplo para calculadora:

Servidor RMI

package sd.rmi.calculadora;

import java.rmi.Naming;

import sd.Valor;

public class Servidor implements Runnable {

private Valor valor;
public Servidor() {
valor = new Valor();

}

public void run() {
try {
Calculadora m = new CalculadoraImpl();
Naming.rebind("rmi://"+valor.getIpServidor()+":"+valor.getPortRmi()+"/CalculadoraService" , m);
}
catch( Exception e ) {
System.out.println( "Trouble: " + e );
}
}

}


Cliente RMI


package sd.rmi.calculadora;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.NotBoundException;
import java.net.MalformedURLException;
import sd.Valor;
import sd.tabela.Linha;
import sd.tabela.TabelaInterface;

public class Cliente implements Runnable {
private Valor valor;
private TabelaInterface tabela;
public Cliente(TabelaInterface tablea) {
valor = new Valor();
this.tabela = tablea;
}


public void run(){
try {
Calculadora m = (Calculadora) Naming.lookup( "rmi://"+valor.getIpServidor()+":"+valor.getPortRmi()+"/CalculadoraService" );
long t1 = 0;
long t2 = 0;


int n = valor.getnCalculadora();
long tn = 0;

System.out.println();
for (int i = 0; i <>
System.out.print(".");
t1 = System.nanoTime();
Integer resultado = m.multiplica(2, 50);
t2 = System.nanoTime();
long ta = t2-t1;
tn += ta;
Linha linha = new Linha();
linha.setN(i);
linha.setT1(t1);
linha.setT2(t2);
linha.setValor(resultado.toString());
tabela.addLinha(linha);
tabela.atualiza(true);
}

}
catch( MalformedURLException e ) {
System.out.println();
System.out.println( "MalformedURLException: " + e.toString() );
}
catch( RemoteException e ) {
System.out.println();
System.out.println( "RemoteException: " + e.toString() );
}
catch( NotBoundException e ) {
System.out.println();
System.out.println( "NotBoundException: " + e.toString() );
}
catch( Exception e ) {
System.out.println();
System.out.println( "Exception: " + e.toString() );
}
}
}

Interface RMI
package sd.rmi.calculadora;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Calculadora extends Remote {

public Integer multiplica( Integer n1, Integer n2) throws RemoteException;

}
Implementação da Interface RMI
package sd.rmi.calculadora;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class CalculadoraImpl extends UnicastRemoteObject implements Calculadora {

public CalculadoraImpl() throws RemoteException {
super();
}

public Integer multiplica(Integer n1, Integer n2) throws RemoteException {
return n1 * n2;
}
}

Servidor TCP

package sd.tcp.calculadora;

/**
*
* @author ramon
*/

import java.net.*;
import java.io.*;
import sd.Valor;

public class Servidor implements Runnable {
private Socket clientSocket = null;
private ServerSocket serverSocket = null;

private Valor valor;
public Servidor() {
valor = new Valor();

}

public void run() {
try {
serverSocket = new ServerSocket(valor.getPortTcpCalc());
while (true){

clientSocket = serverSocket.accept();

InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream();

Integer v1 = Util.streamToInteger(in);
Integer v2 = Util.streamToInteger(in);


byte[] b = Util.integerToByte(v1*v2);

out.write(b);


out.close();
in.close();
clientSocket.close();
//serverSocket.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{

serverSocket.close();
}catch(Exception e){
e.printStackTrace();
}

}


}



}

Cliente TCP

package sd.tcp.calculadora;

/**
*
* @author ramon
*/

import java.io.*;
import java.net.*;
import sd.Valor;
import sd.tabela.Linha;
import sd.tabela.TabelaInterface;

public class Cliente implements Runnable{
private Socket echoSocket = null;
private OutputStream out = null;
private InputStream in = null;

private Valor valor;
private TabelaInterface tabela;
public Cliente(TabelaInterface tablea) {
valor = new Valor();
this.tabela = tablea;
}

public void run(){
try {
long t1, t2, tn;
float tm = 0;
Integer v1 = 2, v2 = 50;
int n = valor.getnCalculadora();
tn = 0;
System.out.println();
for (int i = 0; i <>
System.out.print(".");
echoSocket = new Socket(valor.getIpServidor(), valor.getPortTcpCalc());
out = (echoSocket.getOutputStream());
in = echoSocket.getInputStream();

t1 = System.nanoTime();
out.write(Util.integerToByte(v1));
out.write(Util.integerToByte(v2));
Integer resultado = Util.streamToInteger(in);
t2 = System.nanoTime();
tn += t2-t1;
in.close();
out.close();
echoSocket.close();
Linha linha = new Linha();
linha.setN(i);
linha.setT1(t1);
linha.setT2(t2);
linha.setValor(resultado.toString());
tabela.addLinha(linha);

}
tabela.atualiza(true);
out.close();
in.close();
echoSocket.close();

} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}


}
}

Classe de Conversão Byte para integer e Integer pra byte
Existe maneira mais fácil de fazer isso, por exemplo manda como string ou integer mesmo, porém tava dando alguns problemas na hora de execução do "for", então criei essa classe para evitar problemas

package sd.tcp.calculadora;

/**
*
* @author ramon
*/

import java.io.*;
import java.net.*;
import sd.Valor;
import sd.tabela.Linha;
import sd.tabela.TabelaInterface;

public class Cliente implements Runnable{
private Socket echoSocket = null;
private OutputStream out = null;
private InputStream in = null;

private Valor valor;
private TabelaInterface tabela;
public Cliente(TabelaInterface tablea) {
valor = new Valor();
this.tabela = tablea;
}

public void run(){
try {
long t1, t2, tn;
float tm = 0;
Integer v1 = 2, v2 = 50;
int n = valor.getnCalculadora();
tn = 0;
System.out.println();
for (int i = 0; i <>
System.out.print(".");
echoSocket = new Socket(valor.getIpServidor(), valor.getPortTcpCalc());
out = (echoSocket.getOutputStream());
in = echoSocket.getInputStream();

t1 = System.nanoTime();
out.write(Util.integerToByte(v1));
out.write(Util.integerToByte(v2));
Integer resultado = Util.streamToInteger(in);
t2 = System.nanoTime();
tn += t2-t1;
in.close();
out.close();
echoSocket.close();
Linha linha = new Linha();
linha.setN(i);
linha.setT1(t1);
linha.setT2(t2);
linha.setValor(resultado.toString());
tabela.addLinha(linha);

}
tabela.atualiza(true);
out.close();
in.close();
echoSocket.close();

} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}


}
}

Servidor UDP
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package sd.udp.calculadora;

/**
*
* @author ramon
*/

import java.io.*;
import java.net.*;
import sd.Valor;
public class Servidor implements Runnable{


private Valor valor;

public Servidor() {
valor = new Valor();
}


public void parar(){


}

public void run ()
{
DatagramSocket socket = null;
try {
socket = new DatagramSocket(valor.getPortUdpCalc());
while (true) {
byte[] buf = new byte[256];

DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String str1 = new String(packet.getData(), 0, packet.getLength());

socket.receive(packet);
String str2 = new String(packet.getData(), 0, packet.getLength());

String resultado = new Integer(new Integer(str1)*new Integer(str2)).toString();
buf = resultado.getBytes();

InetAddress address = packet.getAddress();
int port = packet.getPort();

packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);

}
} catch (IOException e) {
e.printStackTrace();
}finally{
try{
socket.close();
}catch(Exception e){}
}
}

}

Cliente UDP
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package sd.udp.calculadora;

/**
*
* @author ramon
*/
/**
*
* @author ramon
*/

import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import sd.Valor;
import sd.tabela.Linha;
import sd.tabela.TabelaInterface;

public class Cliente implements Runnable{

Valor valor;
TabelaInterface tabela;
public Cliente(TabelaInterface tablea) {
valor = new Valor();
this.tabela = tablea;
}


public void run(){
DatagramSocket socket = null;
try {

InetAddress address = InetAddress.getByName(valor.getIpServidor());
DatagramPacket packet1;
DatagramPacket packet2;
DatagramPacket packet3;
int n = valor.getnCalculadora();
byte[] buf1 = new String("2").getBytes();
packet1 = new DatagramPacket(buf1, buf1.length, address, valor.getPortUdpCalc());
byte[] buf2 = new String("50").getBytes();
packet2 = new DatagramPacket(buf2, buf2.length, address, valor.getPortUdpCalc());
byte[] buf3 = new byte[256];
packet3 = new DatagramPacket(buf3, buf3.length);
long t1 = 0;
long t2 = 0;
System.out.println();
socket = new DatagramSocket();
for (int i = 0; i < t1 =" System.nanoTime();" t2 =" System.nanoTime();" resultado =" new" linha =" new">

TCP, UDP e RMI descrição do exercício

Essa é a descrição de trabalho de sistemas distribuídos que deveria ser implementado utilizando TPC, UDP e RCP, podia ser implementado em C ou em Java, eu escolhi java é claro, só que no lugar de RCP no java utilizei RMI.

Vou disponibilizar no próximo post os fontes do projeto, fiz na IDE netbeans, mas pode fazer como preferir, a mão, no eclipse como bem quiser. OK?!

Também vou colocar as instruções para poder executar o RMI, e algumas observações que fiz sobre a implementação.


Descriçã do exercício

1. Objetivo:

Implementar os dois problemas especificados abaixo utilizando, em ambos, sockets (TCP e UDP) e RPC e analisar as facilidades de implementação e uso de cada método, bem como o desempenho de cada um.


2. Características básicas:

  • Desenvolver as aplicações em C, tomando como base os exemplos disponibilizados.


3. Problemas:


Problema 1: implementar um programa servidor que calcula a multiplicação de dois números enviados pelo cliente. O cliente envia esses números e imprime o resultado da multiplicação retornado pelo servidor. Cada versão do programa deverá ser executada um número de vezes estatisticamente válido e, ao final, deverá ser fornecido o tempo médio de execução de cada uma delas.


Problema 2: implementar um ping-pong, conforme modelo abaixo. A execução deverá ser feita para diferentes tamanhos de mensagens, desde zero bytes até 64Kbytes, com incrementos de 1024 bytes. Para cada um dos casos (para cada tamanho de mensagem) deverá ser calculada a banda passante da rede, que pode ser obtida dividindo-se a quantidade de informação transferida pelo tempo que levou para ser transferida.


PING (cliente):


//cria buffer para alocar mensagem

Buffer = malloc();


ti = GetTime();


//envia e recebe a mensagem n vezes para melhorar a precisão da tomada de tempo

for(i = 0; i <>

{

Send(Buffer);

Recv(Buffer);

}


tf = GetTime();


t = (tf – ti)/n;






PONG (servidor):


//cria buffer para alocar mensagem

Buffer = malloc();


ti = GetTime();


//envia e recebe a mensagem n vezes para melhorar a precisão da tomada de tempo

for(i = 0; i <>

{

Recv(Buffer);

Send(Buffer);

}


tf = GetTime();


t = (tf – ti)/n;


4. Relatório:

Além dos códigos-fonte dos programas, deverá ser entregue um relatório com os seguintes dados:

  • Descrição do ambiente de teste (sistema operacional, versão do sistema operacional, ...);

  • Instruções para compilação e execução dos programas;

  • Descrição de como os testes foram conduzidos, número de vezes que foram executados;

  • Tabela comparativa do tempo médio obtido pelas diferentes versões do servidor de multiplicação, com a resposta da seguinte questão: que conclusão se pode tirar desses testes?

  • Um gráfico comparando a banda passante da rede para cada caso de execução do ping-pong. Procure interpretar o comportamento do gráfico, tirando suas conclusões a respeito do que for observado;

  • Descrição/análise das facilidades de implementação e uso dos diferentes métodos de comunicação;

  • Descrição de características julgadas importantes em cada método de comunicação (lembre-se que, além das medições solicitadas, outras poderão ser efetuadas e apresentadas no relatório).

Empreendedorismo Transformando ideias em negócios

Vou disponibilizar os slides de uma apresentação que fiz sobre empreendedorismo, acho que programação, tecnologia e informação, te tudo a ver com empreendedorismo.

Esses são os capítulos da apresentação.

O Processo empreendedor
Identificando oportunidades
Plano de negócios
Plano de negócios em pratica
Buscando assessoria para o negócio
Questões legais de constituição da empresa
Recomendações finais ao empreendedor

Link para a apresentação:
http://www.4shared.com/file/162262016/a97a4a9/Transformando_ideias_em_negoci.html

DoCoMo, Celular carteira/cartão de credito

Qual o problema enfrentado pela DoCoMo?
O problema principal é a falta de confiança do usuários em usar esse tipo de serviço, e os comerciantes que ainda não aceitam pagar a comissão sobre o valor dos produtos.

Qual estrategia a empresa escolheu para solucioná-lo?
A DoCoMo adicionou sistemas de segurança como o bloqueio remoto, e tenta incentivar os comerciantes a usar o sistema pagando a instalação da maquina leitora.

É uma boa estrategia? Por quê?
A segurança ainda parece um pouco baixa, pois pode demorar muito para o desativamento. Em relação aos comerciantes, como a uma baixa aceitação no mercado, não adianta cobrar uma taxa maior ou superior ao cartão de crédito convencional.

Existem estrategias que a empresa deveria ter considerado?
Um boa estrategia para segurança seria a possibilidade do aparelho só funcionar estando perto do proprietário, utilizando por exemplo tecnologia de blue tooth, como um fone de ouvido sem fio e o telefone. Caso o telefone seja roubado ou perdido, outra pessoa não poderia usar se não tivesse com o fone de ouvido, no lugar do fone de ouvido porderia ser outro aparelho blue tooth que funcionasse como uma chave sem fio.
Com os comerciantes deveriam reduzir as taxas sobre os produtos, e ainda não cobrar pela instalação do equipamento leitor, depois de um período a empresa poderia subir novamente as taxas, e se os comerciantes não aceitasse devolveriam as maquias leitoras, mas por consequência iriam perder os cliente já habituados a comprar com esse serviço.

Quais forças externas contribuíram para os desafios que a DoCoMo enfrenta?
Para criar um carteira eletrônica mais cartão de credito em um celular, ela tem desafios como manter bons relacionamentos com bancos, adquirir experiencia com financeiro, capacitação de pessoal para trabalhar como cartão de credito, e principalmente conseguir equipar bancos e estabelecimentos com leitores do chip de cartão de crédito.

segunda-feira, 17 de agosto de 2009

Código Aberto

Essas foram algumas questões que a professora passo na aula de hj, cadeira de tecnologia da informação.

Se alguém discorda, favor posta um comentário.

Quais problemas o Linux e outros softwares de código aberto ajudaram as empresas a enfrentar?

Integração entre softwares diferentes, conhecimento de como o software é executado, liberdade de adequação de um software, mais opções escolha, custos com licenças.


Como as ajudaram?

Com a possibilidade de ver e alterar o código fonte de um software, as empresas ganharam mais autonomia para poder adequar o software a sua real necessidade, ou integra-los com outros softwares.

Conforme a popularização de um software livre, ele ganha mais desenvolvedores, e alguns criam novas versões ou ramificações. A empresa que deseja adotar o software tem pode escolher entre essas versões ou ramificações uma que melhor atenda suas necessidades.

Os softwares de código aberto tem como grande vantagem o custo zero para sua utilização, isso reduz muito nos custos de uma empresa.


Quais problemas e desafios fez aumentar a adoção de softwares de código aberto?

Problemas como falhas software, vulnerabilidades, muitas vezes encontrados em softwares proprietários. Fizeram as empresas adotarem softwares mais confiáveis e testados por vários desenvolvedores, como os softwares de código aberto.


Para você, qual seria a melhor estratégia para implantar o Linux e outros componentes de código aberto em seu atual estado de evolução?

Grandes empresas tomarem a dianteira no desenvolvimento e aprimoramento de ferramentas livres, criando um comitê entre essas empresas e a comunidade desenvolvedora, onde seriam propostas regras, objetivos, treinamentos, validades.


terça-feira, 11 de agosto de 2009

Java, “JSP puro” vs “JSP + JSF”

Estava olhando minhas coisas do semestre passado e achei uma apresentação simples, do que é o JSF e umas comparações dele com JSP puro.


Aqui o link da apresentação em pdf: http://www.4shared.com/file/124357482/878911a2/apresentao_jsp_jsf.html

Parte da apresentação a baixo:

JSF:

  • Prove componentes gráficos de controle para HTML.

  • Aplicação forçada de OO e MVC.

  • (wikipedia) O JSF é atualmente considerado por muitos como a última palavra em termos de desenvolvimento de aplicações Web, resultado da experiência e maturidade adquiridas com o JSP/Servlet (Model1), Model2 (MVC) e Struts.

    Porque continuar com JSP puro.

Porque continuar com JSP puro:

  • Curva de aprendizado muito alta;

  • Mais arquivo(s) XML para configurar (faces-conf.xml);

  • Dificulta para quem gosta de trabalhar com sql puro. (mas que gosta de criar querys sql?)

Porque utilizar JSF (1)

Porque utilizar JSF:

  • Facilita utilização de beans;

  • Exige organização (para alguns desvantagem).

  • Facilita JPA (Java Persistence Api);

  • Utiliza AJAX.

  • Gerencia de eventos. (servidor/cliente)

  • Integração com RichFaces (componentes ricos);

  • Performance do Servidor.

    orque utilizar JSF (2)

  • Várias IDEs:

  • Jbuilder, Borland;

  • Eclipse;

  • Jdeveloper, Oracle;

  • NetBeans, Sun.

Porque utilizar JSF (3)

  • Vários Servidores:

  • Tomcat;

  • Jboss;

  • WebLogic;

  • GlassFish.

Exemplo página