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.