Cadastre seu e-mail para receber as novidades desse blog. Você pode cancelar a qualquer momento.

Delivered by FeedBurner

Assista ao vídeo descritivo acima; depois clique na imagem abaixo para adquirir o seu GUIA PRÁTICO PARA PASSAR EM CONCURSO PÚBLICO EM UM ANO.

Google Website Translator

Postagem em destaque

Automação Residencial com arduíno

Já pensou em criar sua própria casa inteligente, com automações em todos os cômodos? Sem gastar muito? Sem ser um engenheiro ou algo parecid...

Pesquise nesse Blog e na WEB com o Google

segunda-feira, 28 de fevereiro de 2011

Manipulação de arquivos em linguagem Java

Depois de vários testes cheguei à conclusão que a melhor forma de manipulação de arquivos no Java é utilizar arquivos randômicos ou serialização.

Arquivos randômicos:

Como a manipulação de arquivos randômicos no Java é difícil e trabalhosa, eu criei a classe Random para fazer o trabalho pesado. É só copiar o código e colar em uma classe com o mesmo nome. Os principais métodos da classe Random são:

Construtor – Configura a classe com o nome do arquivo que deve ser aberto ou criado, com o tamanho em caracteres dos campos e com a quantidade de campos por registro. Obviamente um arquivo só pode ser manipulado com a mesma configuração com a qual foi criado.

GravarStr – Grava uma string no final do arquivo ou em algum campo que foi excluído. Os campos excluídos são marcados logicamente com um “#”. Esse método só pode ser utilizado para a criação de novos registros, ou seja, não pode ser utilizado para atualizar registros, porque ele não oferece parâmetro para a gente dizer onde um campo novo deve ser gravado. Ele grava as informações no primeiro campo vazio que encontra. A string a ser gravada não pode começar por #. Se começar por # o programa apaga esse caractere antes de gravar a string no arquivo.






GravarStringIndex – Grava uma string no campo especificado do arquivo. A numeração começa por zero. Deve ser utilizado para atualização de registros.

ApagarString – Apaga um campo em um local especificado do arquivo e coloca um “#” como primeiro caractere do campo. Esse “#” indica que o campo foi excluído e é utilizado pelos métodos GravarStr e ContarRegistros.

ContarRegistros – retorna o número de registros do arquivo. Leva em consideração sempre o primeiro campo de cada registro.

ContarCampos – retorna o número de campos do arquivo, inclusive os vazios. Pode ser utilizado para listagens com ou sem filtro. A gente coloca um While que vai até a posição atual no arquivo ficar igual ao número de campos.

AbrirArquivo – Abre o arquivo.

FecharArquivo – Fecha o arquivo.

Os métodos para gravar e ler dados numéricos utilizam o método GravarStr e fazem as conversões automaticamente, uma vez que esse método só grava strings.

Uma string nunca é gravada antes de passar pelo método tratarString. Esse método retira um # inicial se houver um e altera o tamanho da string para o tamanho configurado dos campos do arquivo. Se a string for maior corta os caracteres em excesso, se for menor completa com espaços em branco. O método lerString ignora os espaços em branco no fim das strings gerados por esse método.
Serialização:


Através da serialização podemos gravar e ler milhares de dados de um arquivo com apenas uma instrução. A serialização consiste em gravar um objeto inteiro (classe) em um arquivo. Todos os tipos primitivos, inclusive vetores de tipos primitivos, são armazenados. Porém a serialização sempre grava por cima dos dados anteriores quando o arquivo é aberto, ou seja, pra não sobrescrever, todos os objetos têm que ser gravados em uma única sessão de abertura do arquivo. Uma boa estratégia para trabalhar com serialização é criar as seguintes classes:

  • Uma classe que representa os registros, por exemplo: Produtos.
  • Uma classe que cria um vetor de objetos Produtos e manipula seus campos (variáveis) através de métodos, por exemplo: Registros.
  • Uma classe com o método main que serializa a classe Dados que contem o vetor de objetos Produtos com todos os dados.

Não há limite de quantidade de vetores de objetos diferentes em uma classe.
As duas primeiras classes que estão envolvidas na serialização precisam implementar a interface Serializable, do pacote java.io. Essa interface não declara nenhum método, apenas marca a classe como serializável. A classe que contem o método main não precisa implementar Serializable.

Instruções:

Import java.io.*;

ObjectOutputStream arquivo=new ObjectOutputStream(new FileOutputStream(“Dados.dat”));

[1]arquivo.writeObject(registros);

arquivo.close();

ObjectInputStream arquivo=new ObjectInputStream(new FileInputStream(“Dados.dat”));

Registros registros=(Registros) arquivo.readObject;

arquivo.close();


[1] registros é um objeto da classe Registros.

Esta é a classe Random:

package random;
import java.io.*;
//Copyright (C) 2008 Robson Faria Machado

//http://robsonfm.blogspot.com/
public class Random {
 private String arquivo;
 private int campos;
 private RandomAccessFile arq;
 private int camposPorRegistro;
public Random(String arquivo, int campos, int cpr) {
 super();
 this.arquivo = arquivo;
 this.campos = campos;
 camposPorRegistro=cpr;
}
 public void abrirArquivo(){
  try{
  arq=new RandomAccessFile(this.arquivo, "rw");
  }catch(Exception e){
   System.out.println("Erro ao abrir arquivo. " + e.toString());
  }
 }
public void fecharArquivo(){
if (arq!=null){
 try{
 arq.close();
 }catch(Exception e){
  System.out.println("Erro ao fechar arquivo. " + e.toString());
 }
}
}
public void gravarStr(String str){
String teste="";
int cont=0;
str=tratarString(str);
try{
do{
 arq.seek(cont * ((campos*2)+1));
 teste=String.valueOf(arq.readChar());
 //System.out.println(teste);
 if (teste.equalsIgnoreCase("#")){
  arq.seek(cont * ((campos*2)+1));
  arq.writeChars(str);
  return;
 }
 cont++;
}while(true);
}catch(EOFException eof){
try{
 arq.writeChars(str);
 return;
}catch(IOException io){
 System.out.println("Erro ao gravar dados no arquivo. " + io.toString());
}
}catch(Exception e){
 System.out.println("Erro ao gravar dados no arquivo. " + e.toString());
}
}
public void gravarStringIndex(String texto, int pos){
 try{
  arq.seek(pos * ((campos*2)+1));
  arq.writeChars(texto);
 }catch(Exception e){
  System.out.println("Erro ao gravar dados no arquivo. " + e.toString());
 }
}
 public String tratarString(String texto){
  if (texto.substring(0, 1).equalsIgnoreCase("#")){
   texto=texto.substring(1, texto.length());
  }
  if (texto.length()>campos){
   texto=texto.substring(0, campos);
   return texto;
   }
  if (texto.length()<campos){
   int p=campos-texto.length();
   for (int i=0; i<p; i++){
    texto=texto + " ";
   }
    return texto;
  }
 
  return texto;
 }
public int procurarString(String str, int campoDoRegistro){
 if (str.length()>campos){
  System.out.println("Erro: A string a ser pesquisada é maior que os campos dos registros do arquivo.");
  System.out.println("Tamanho da string: " + str.length());
  System.out.println("Tamanho dos campos: " + (campos));
  return -1;
 }
 String teste="";
 String teste2="";
 int cont=campoDoRegistro-1;
 str=tratarString(str);
 try{
 do{
  arq.seek(cont * ((campos*2)+1));
  teste=String.valueOf(arq.readChar());
  //System.out.println(teste);
  if (teste!="#"){
   teste2="";
  for (int i=0; i<campos*2; i+=2){
   arq.seek((cont * ((campos*2)+1))+i);
   teste2=teste2+arq.readChar();

  }
  if (teste2.equalsIgnoreCase(str)){
   return cont;
  }
  }
  cont+=camposPorRegistro;
 }while(true);
 }catch(EOFException eof){
 return -1;
 }catch(Exception e){
  System.out.println("Erro ao gravar dados no arquivo. " + e.toString());
 }
 return -1;
 }
public long contarRegistros(){
 long contador=0;
 int cont=0;
 String teste;
 try{
 do{
  arq.seek(cont * ((campos*2)+1));
  teste=String.valueOf(arq.readChar());
  contador++;
  if (teste.equalsIgnoreCase("#")){
   contador--;
  }
  cont+=camposPorRegistro;
 }while(true);
 }catch(EOFException eof){
 return contador;
 }catch(Exception e){
  System.out.println("Erro ao contar registros. " + e.toString());
 }
 return contador;
}
//Método contar campos, incluive os vazios.
public long contarCampos(){
 long contador=0;
 int cont=0;
 String teste;
 try{
 do{
  arq.seek(cont * ((campos*2)+1));
  teste=String.valueOf(arq.readChar());
  contador++;
  cont++;
 }while(true);
 }catch(EOFException eof){
  return contador;
 }catch(Exception e){
  System.out.println("Erro ao contar registros. " + e.toString());
 }
 return contador;
}
public String lerString(int pos){
 String stringLida="";
 try{
  arq.seek(pos * ((campos*2)+1));
  for (int i=0; i<campos*2; i+=2){
   stringLida=stringLida + arq.readChar();
   }
  return stringLida.trim();
 }catch(Exception e){
  System.out.println("Erro ao lerString. " + e.toString());
 }
 return stringLida.trim();
 }
public void apagarString(int pos){
 String vazio="#";
 vazio=tratarString(vazio);
 try{
  arq.seek(pos * ((campos*2)+1));
  arq.writeChars(vazio);

 }catch(Exception e){
  System.out.println("Erro ao lerString. " + e.toString());
 }
 }
//int, double, float, long
public void gravarInt(int valor){
 gravarStr(String.valueOf(valor));
}
public void gravarDouble(double valor){
 gravarStr(String.valueOf(valor));
}
public void gravarFloat(float valor){
 gravarStr(String.valueOf(valor));
}
public void gravarLong(long valor){
 gravarStr(String.valueOf(valor));
}
public int lerInt(int pos){
 String val="";
 val=lerString(pos);
 return Integer.parseInt(val);
}
public double lerDouble(int pos){
 String val="";
 val=lerString(pos);
 return Double.parseDouble(val);
}
public float lerFloat(int pos){
 String val="";
 val=lerString(pos);
 return Float.parseFloat(val);
}
public long lerLong(int pos){
 String val="";
 val=lerString(pos);
 return Long.parseLong(val);
}
}


domingo, 27 de fevereiro de 2011

Transistores

Você sabe o que é um transistor? Os transistores são os componentes eletrônicos utilizados para fazer processamento de dados. A tecnologia utilizada atualmente nos processadores é a CMOS, que significa mais ou menos “semicondutor de metal e óxido complementar”. Os transistores CMOS são feitos com o elemento químico silício. Veja o esquema de um transistor na figura abaixo:


É incrível pensar que processadores tão complexos são feitos com apenas dois tipos de transistores CMOS: os pFet e os nFet. Um processador tem milhões de transistores iguais ao da figura. Portanto uma CPU moderna é um quebra-cabeça com milhões de peças. Por esse motivo foram criados os softwares que fazem compilação para hardware automaticamente. Nós fazemos a descrição do circuito e o programa gera o circuito desejado para a gente.

sábado, 26 de fevereiro de 2011

Curso de vôo visual (VFR)

CURSO DE VÔO VISUAL (VFR)




INTRODUÇÃO:



Os entusiastas da aviação gostam de saber tudo sobre aviação se possível e de fazer vôos virtuais nos simuladores totalmente reais. Então entusiastas, podem comemorar, esse é o curso de vôo visual ou VFR para simuladores.

O autor garante a veracidade de todas as informações aqui contidas.

O curso é para ser usado em simuladores; para pilotar um avião real você tem que fazer um curso em escola ou aeroclube homologado pelo DAC (Departamento de Aviação Civil).

O autor não se responsabiliza por danos que sejam causados pelo uso das informações aqui contidas para o vôo em aviões reais.

A posse deste tutorial significa que você está ciente e concorda com os termos aqui expostos.

O curso visa deixar os seus vôos virtuais totalmente dentro da realidade ensinando tudo sobre vôos VFR para quem é leigo e tirando várias dúvidas de quem já faz seus vôos virtuais.





O VÔO VFR.


O vôo visual (VFR) é executado com condições meteorológicas boas ao contrário do vôo por instrumentos (IFR) que é executado quando as condições são adversas. Essas condições são as condições de vôo, que podem ser:



VMC – Visual Meteorological Conditions – Condições Meteorológicas Visuais.

IMC – Instrument Meteorological Conditions – Condições Meteorológicas de Instrumentos. Sem ou com pouca referência visual.



Quando nós estamos fazendo o plano de vôo nós escolhemos o tipo de vôo dependendo das condições de vôo serem VMC ou IMC.

Quando as condições de vôo são VMC a gente pode voar VFR ou IFR e quando são IMC só podemos voar IFR. Vejamos o significado das siglas:



VFR – Visual Flight Rules – Regras de Vôo Visual.

IFR – Instrument Flight Rules – Regras de Vôo por Instrumentos.



Nos vôos visuais quem mantém a separação entre a aeronave, os obstáculos e outras aeronaves é o próprio piloto e quem matem a separação entre os vôos VFR e os IFR são os controladores. A responsabilidade pelo cumprimento das regras é unicamente do piloto em comando da aeronave.



Nesses vôos nós devemos seguir as regras de vôo visual (VFR) que se dividem em Regras Gerais e Regras de Vôo Visual:



Aplicabilidade das regras VFR:



Estas regras se aplicam a:



- Toda aeronave que esteja operando dentro do espaço aéreo brasileiro, não importando seu país de origem;

- Toda aeronave brasileira, não importando o país que esteja, contanto que não interfira com as regras do país nem com as da ICAO International Civil Aviation Organization.



Regras Gerais:



Você não pode lançar objetos de um avião em vôo, não pode fazer operações que tragam risco para a aeronave, seus ocupantes e pessoas no solo e tem também as regras de tráfego que são:



Direito de passagem:



• Quando duas aeronaves se aproximam frontalmente, as duas têm que virar para a direita.

• Quando uma aeronave está vindo da direita de outra com rumo 90º menor a que tem a outra a sua direita deverá reduzir a velocidade e ceder passagem.

• Em ultrapassagens a aeronave ultrapassadora é que se aproxima por trás em um ângulo igual ou menor a 70º com o lado da ultrapassada. A ultrapassada devido ao seu restrito campo de visão para traz tem sempre direito de passagem, devendo a ultrapassadora manter-se sempre fora da trajetória da primeira.



Veja nas figuras abaixo:



Aproximação frontal:







Aproximação lateral:







Ultrapassagem:







Pouso:



Todos os aviões que estão em vôo visual e chegam para pousar em um aeroporto devem seguir um padrão chamado Circuito de Tráfego Visual. Veja na figura abaixo. Esse padrão permite que você veja outras aeronaves voando e no solo preparando-se para decolar, organizando o tráfego em cima do aeroporto.

As aeronaves que estão vindo para pouso têm sempre preferência sobre as que estão esperando para decolar.

Os pousos são sempre feitos contra o vento, isso é o que define a pista ativa do aeroporto, aquela que estiver mais na direção oposta do vento. Planadores também sempre têm preferência para pouso, exceto em casos de emergência.

Circuito de Tráfego Visual:



Altitudes:

Aviões com motores a pistão: 1000 pés.

Jatos e turbo-hélices: 1500 pés.

Muda dependendo do aeroporto, mas essas são as mais comuns.



Se os ventos estiverem com menos de 6 KIAS são considerados calmos.

Vamos estudar cada segmento:

Perna de partida:

É a decolagem.



Perna do Vento Cruzado:

Virando 90º à esquerda você estará na perna do vento cruzado. Vire para esta perna quando estiver além da cabeceira da pista e dentro de 300 pés da altitude do circuito de tráfego (TPA – Traffic Pattern Altitude – Altitude do circuito de tráfego máxima).Durante toda a perna de partida e a perna do vento cruzado e também a perna do vento você pode continuar subindo. Isso depende do quanto você faz as curvas fechadas, do tamanho da pista e também da potência do avião. Durante um circuito de tráfego limite suas curvas a 30º de inclinação lateral.

Perna do vento:

É assim chamada porque agora você está voando na direção do vento e não contra ele, na direção oposta a que você vai pousar. Vire 90º à esquerda para a perna do vento entre meia milha e uma milha da pista, isso permite que você faça um pouso de emergência caso precise e também permite que você veja a pista de perto o suficiente para calcular o desvio do vento e fazer correções e também para ver aviões no solo indo para decolar. Você pode olhar pela janela ou calcular utilizando a velocidade no solo. Por exemplo, a 75 KIAS o avião voa 1.25 milha em um minuto. O rumo da perna é o oposto da pista de pouso, devendo a gente corrigir o desvio provocado pelo vento se houver.



Perna de base:

Voe na perna do vento até a cabeceira da pista está no seu través (no seu lado), então comece a configurar o avião para pouso caso tenha recebido autorização. Quando a cabeceira da pista estiver em um ângulo de 45º com a asa do avião ou no meio do caminho entre a asa e a cauda do avião vire 90º à esquerda novamente para a perna de base. A perna de base é a perna de transição onde ajustes importantes são feitos no avião. Não vire antes da hora ou não terá tempo suficiente para ajustar a velocidade, a planagem, a compensação e outros fatores a mais que haja. Se não estiver seguindo outro tráfego (avião) ou sendo seguido, é melhor alongar a perna do vento para ter mais tempo para se preparar para o pouso.



Aproximação final:

Você pode começar a descer na perna de base se quiser. Na aproximação final você já deve estar com o avião configurado para pouso, bastando apenas ajustar a velocidade e o planeio. Se você estiver muito baixo pode fazer uma curva direto do final da perna de base para a pista. Se estiver muito alto você pode aumentar a perna de base, dando mais tempo para descer. Outra opção é você voar em S na aproximação final. Vai dá impressão que você bebeu, mais é normal. Veja nas figuras:







Regras de vôo visual:



1 – Referências visuais:



Sempre manter referências visuais com o solo, relevo ou água.



2 – Altura mínima:



Em lugares habitados: 1000 FTS acima do mais alto obstáculo num raio de 600 metros.

Em lugares despovoados ou sobre a água: 500 FTS.



3 – Nível de vôo:



Os FLS (Flight Levels – Níveis de vôo) são as altitudes a partir de 3000 FTS. Nos vôos visuais nós só podemos usar níveis de vôo não cheios, pois os níveis de vôo cheios são para os vôos IFR, e de 500 em 500 pés. Por exemplo:



FL035=3500 FTS.

FL065=6500 FTS.

FL125=12500 FTS.



4 – Rumos magnéticos:



Para evitar possíveis colisões no ar entre dois aviões em vôo visual, nós utilizamos o rumo da rota da aeronave para escolher a altitude de cruzeiro.

As aeronaves com rumos entre 1º e 180º só podem escolher níveis de vôo ímpares. Por exemplo: FL075=7500 FTS.

As aeronaves com rumos entre 181º e 360º só podem escolher níveis de vôo pares. Por exemplo: FL085=8500 FTS.



5 – Nível máximo de vôos VFR:



O nível de vôo máximo para vôos VFR é FL150. Como não podemos usar níveis cheios em vôos visuais, na prática o nível de vôo máximo é FL145.



6 – Velocidade máxima:



Até o FL100: 250KTS.

Do FL100 ao FL145: 380KTS.



7 – Visibilidade horizontal mínima:



Até o FL100: 5000 metros.

Do FL100 ao FL145: 8000 metros.



8 – Quantidade de nuvens:



A quantidade máxima de nuvens permitida em vôos visuais é 50% do céu.



9 – Distância mínima das nuvens:



Vertical: 1000 FTS.

Horizontal: 1500 metros.



10 – Mínimos meteorológicos dos aeródromos envolvidos:



Teto: 1500 FTS.

Visibilidade horizontal: 5000 metros.



Códigos transponder especiais para vôos VFR e IFR:



2000 – Aguardando instruções do órgão ATC.

7500 – Interferência ilícita (Seqüestradores a bordo).

7600 – Falha de comunicações (Pane de rádio).

7700 – Emergência (Qualquer tipo de pane).



Observações:



Nos vôos visuais não há nenhum tipo de aproximação por instrumentos, nem mesmo aproximação ILS.



Os vôos visuais podem utilizar aerovias, mas somente as inferiores, as superiores são para os vôos IFR.



Se você estiver voando visualmente e as condições começarem a mudar, você deve pedir autorização IFR em vôo ao órgão ATC. Se você não for habilitado para vôo por instrumentos deve pousar imediatamente no aeroporto mais próximo, ou, se não der tempo, deve pousar numa fazenda, por exemplo.



Espaços aéreos no Flight Simulator:



Espaço aéreo classe A:



De FL180 até FL600. Os vôos nesse espaço aéreo dedem ser por instrumentos, a não ser que seja autorizado para o contrário.





Espaço aéreo classe B:



Da superfície para FL100 em um raio de normalmente 30MN do aeroporto principal de uma região. No Brasil essa classificação de espaço aéreo não existe.



Espaço aéreo classe C:



Da superfície para FL040 em um raio de 10MN de um aeroporto.



Espaço aéreo classe D:



Da superfície para 2500 FTS (762 m) MSL acima de um aeroporto com torre operacional. O espaço aéreo classe D é individualmente delineado em cada aeroporto.



Espaço aéreo classe E:



Todo os outros espaços aéreos controlados que não sejam da classe A, B, C, e D. Não temos que nos comunicar com ninguém no espaço aéreo da classe E, a não ser que o clima seja IFR.



Espaço aéreo classe G:



Espaço aéreo não controlado com três níveis de altitude diferentes: da superfície até e incluindo 1.200 pés (365,76 m) acima do nível do solo (AGL), mais de 1.200 pés AGL, porém menos de 10.000 pés (3.048 m) MSL e em ou acima de 10.000 pés MSL até, mas não incluindo, 14.500 pés (4.420 m) MSL. Você não precisa se comunicar com ninguém ao voar no espaço aéreo da Classe G.


Robson Faria Machado. Junho de 2004.

sábado, 19 de fevereiro de 2011

Como funciona a criptografia RSA

Introdução:

A transmissão de informações codificadas sempre foi uma necessidade da humanidade, desde os tempos da Grécia antiga. Imagine então nos tempos atuais, com a internet, onde informações confidenciais sempre viajam de todos os cantos para todos os cantos e sempre podem ser interceptadas por pessoas mal-intencionadas. Por isso crio-se a criptografia, um modo de transmitir informações de maneira que só o destinatário possa ter acesso a elas. Existem muitos tipos de criptografia, mas a mais utilizada é a criptografia RSA, por ser uma das mais seguras atualmente. RSA são as iniciais dos nomes dos matemáticos que a criaram em 1978, Ronald Rivest, Adi Shamir e Leonard Adleman, que na época  trabalhavam  no  Massachussets  Institute  of Technology  (M.I.T).
Essa criptografia baseia-se no uso de chaves públicas e privadas. Você pode criar uma chave pública e distribuí-la pra todo mundo, para que as pessoas possam criptografar informações e envia-las pra ti com segurança, sem o perigo de interceptação ilícita. Somente você, que possui a sua chave particular, consegui descriptografar as informações codificadas com a sua chave pública. As pessoas que codificaram as informações com a chave pública também não conseguem decodificá-las. Isso é útil por exemplo em sites de comércio eletrônico: o usuário do site utiliza a chave pública para codificar os dados, mas só a empresa que possui a chave particular consegui decodifica-los.






Funcionamento:
Conforme mencionado, o algoritmo RSA é baseado na construção de chaves públicas e privadas, utilizando números primos. Inicialmente devem ser escolhidos dois números primos quaisquer A e B. Quanto maior o número escolhido mais seguro será o algoritmo.
A título de exemplificação, serão escolhidos números primos pequenos, para permitir um acompanhamento de todo o processo de codificação e decodificação.
  • A = 17
  • B = 11
A seguir são calculados dois novos números N e Z de acordo com os números P e Q escolhidos:
  • N = A * B
  • O(N) = (A - 1) * (B - 1)
No caso obtêm-se como resultado:
  • N = 17 * 11 = 187
  • O(N) = 16 * 10 = 160
Agora se define um número P que tenha a propriedade de ser primo em relação a (O)N. No caso, opta-se pela escolha:
  • P = 7
De posse desses números começa o processo de criação das chaves públicas e privadas. É necessário encontrar um número S que satisfaça a seguinte propriedade:
  • (P *S) mod O(N) = 1
Se forem feitos os testes com 1, 2, 3... teremos:
  • S = 1 => (1 * 7) mod 160 = 7
  • S = 2 => (2 * 7) mod 160 = 14
  • S = 3 => (3 * 7) mod 160 = 21
  • ...
  • S = 23 => (23 * 7) mod 160 = 1
  • ...
  • S = 183 => (183 * 7) mod 160 = 1
  • ...
  • S = 343 => (343 * 7) mod 160 = 1
  • ...
  • S = 503 => (503 * 7) mod 160 = 1
  • ...
Logo até o momento os números 23, 183, 343, 503 satisfazem a propriedade indicada.
Para efeito de simplificação de cálculos, será tomado como referência:
  • S = 23.
Com esse processo definem-se as chaves de encriptação e desencriptação.
  • para codificar: utilizar P e N - esse par de números será utilizado como chave pública.
  • para decodificar: utilizar S e N - esse par de números será utilizado como chave privada.
As equações são:
  • TEXTO CRIPTOGRAFADO = (TEXTO ORIGINAL ^ P) mod N
  • TEXTO ORIGINAL = (TEXTO CRIPTOGRAFADO ^ S) mod N


Caso prático para o exemplo

Seja a necessidade de se encaminhar uma mensagem bem curta de forma criptografada, como o número 4 por exemplo, tendo por base as chaves aqui estabelecidas.
Para criptografar:
  • TEXTO ORIGINAL = 4
  • TEXTO CRIPTOGRAFADO = (4 ^ 7) mod 187
  • TEXTO CRIPTOGRAFADO =  16384 mod 187
  • TEXTO CRIPTOGRAFADO = 115
Para descriptografar:
  • TEXTO RECEBIDO = 115
  • TEXTO ORIGINAL = (115 ^ 23) mod 187
  • TEXTO ORIGINAL = 2,4891457557496919672912398470124e+47 mod 187
  • TEXTO ORIGINAL = 4
A questão das escolhas dos números primos envolvidos é fundamental para o algoritmo. Por essa razão escolhem-se números primos gigantescos para garantir que a chave seja inquebrável.
Antes da codificação os caracteres são transformados em cadeias de números que correspondem aos seus códigos ASCII.

Segurança no Windows 10

Os recursos de segurança do Windows 10 e antecessores são muito bons. Entre eles estão a criação de contas de usuários com senhas e diferentes níveis de permissão de acesso ao sistema, a criptografia de arquivos com certificados digitais e um agente padrão de recuperação de dados, a atribuição de direitos de usuários, a auditoria de sistema, as permissões de acesso NTFS e o compartilhamento NTFS. Alguns desses recursos só existem graças ao sistema de arquivos NTFS (New Technology File System) versão 5. Esse sistema além de apresentar ótimos recursos de segurança, apresenta clusters de 512 bytes, ou seja, os próprios setores do HD, o que praticamente elimina o desperdício de espaço em disco. O sistema FAT32 é especialista em jogar espaço fora. Tudo se baseia nas contas de usuário. Elas não permitem apenas que cada usuário do computador tenha as suas próprias configurações de área de trabalho. Através dessas contas o administrador do sistema pode atribuir direitos aos usuários, como por exemplo, fazer alterações de hardware e software, acessar determinados arquivos e programas etc. Quando o usuário clica em seu nome, ele está se identificando para o Windows, que por sua vez sabe quais são as permissões do mesmo. Cada conta de usuário tem o seu próprio certificado digital de criptografia de dados, ou seja, só o usuário que criptografou determinado arquivo tem acesso a esse arquivo. 





O agente padrão de recuperação, ou seja, o administrador, tem acesso a todos os certificados digitais dos usuários. O compartilhamento NTFS só funciona em rede. O administrador da mesma é quem diz o que cada estação de trabalho pode acessar, listar, executar etc, através do domínio. Por último temos a auditoria do sistema, que permite, por exemplo, saber quando um arquivo foi acessado e por qual usuário, quando um usuário fez logon, entre outras coisas. No nível das contas de usuário temos opções como bloqueá-las após um determinado número de senhas inválidas digitadas, exigir a troca das senhas após um certo tempo, só aceitar senhas com auto grau de complexidade etc.

Flight Simulator


Como pousar utilizando o piloto automático.

Se você ainda não tem um joystick, mas faz os seus vôos virtuais com o Flight Simulator, sabe como é difícil pousar os jatos usando o teclado. Normalmente você pousa uns quinze metros fora da pista, todo torto, não é? Pois bem, a partir de agora você vai saber como fazer pousos profissionais mesmo sem um joystick, utilizando o piloto automático. Lembre-se que para fazer pousos utilizando o piloto automático é necessário que a pista do aeroporto tenha o ILS (Sistema de Pouso por Instrumentos). Se o aeroporto não tiver este sistema, não dá para pousar. Para fazer viagens para aeroportos sem esse recurso, você tem que comprar um manche.








Vamos lá. Mãos a obra.

A primeira coisa a fazer é anotar a freqüência de ILS e o rumo da pista que você ira pousar. É possível fazer isso quando você está criando o plano de vôo. É só clicar no aeroporto no mapa que aparece, que todas as informações sobre o mesmo são mostradas. O plano de vôo para jatos (Boeing 737-747-777; Learjet) na realidade é obrigatoriamente IFR. Faça como na vida real, e escolha vôo IFR. Para os novatos, vôo IFR é um vôo totalmente controlado por radar. O piloto, no caso você, é orientado o tempo inteiro por vários controladores em vários centros de controle de vôo diferentes, desde quando você liga os motores e solicita reboque, até o momento que você chega no aeroporto de destino e estaciona no estacionamento ou portões. IFR (Instrument Flight Rules – Regras de Vôo por Instrumentos). O vôo sendo IFR, você pode passar por nuvens, pode voar com pouca visibilidade etc. O cruzeiro é feito todo em piloto automático, afinal você não vai ficar a viagem toda pilotando manualmente, mantendo altitude e velocidade constantes. O vôo sendo por instrumentos (IFR), ao chegar o final do cruzeiro, o controlador responsável por você mandará descer para uma determinada altitude. Nesse momento você deve manter o piloto automático ativo. Desça utilizando o estabilizador de altitude. Se receber ordens para virar para algum rumo, (na maioria das vezes isso acontece), vire utilizando o controle de direção (HDG). Observe que os controladores mandam sintonizar em novas freqüências. Isso ocorre porque cada centro de controle de vôo controla o tráfego aéreo em uma determinada área. Quando o seu avião sai da área do centro de controle atual, os controladores mandam você sintonizar a freqüência do próximo, e assim por diante. Você vai sendo passado de um centro para o outro e a responsabilidade por você também. Vá só seguindo as ordens. Os controladores vão colocar você na posição e rumo corretos para a interceptação do ILS, e vão dá autorização para isso. Quando estiver próximo de interceptar o localizador, com a freqüência já sintonizada no NAV 1, o rumo já ajustado no course e com a configuração de pouso, acione o estabilizador de aproximação. Em determinado momento, quando o avião estiver na altitude correta de aproximação, o estabilizador de altitude se desativa e o avião começa a descer com a razão correta. Se não receber permissão para pouso, desative a aproximação e siga as ordens dos controladores, eles colocarão você de novo na aproximação da pista. Se receber permissão, deixe a aproximação ligada até o último momento. Quando estiver quase tocando a pista desative o estabilizador de aproximação, com isso o nivelador das asas se ativa automaticamente para não deixar o avião se desviar do rumo correto. Daí é só utilizar os profundores e tocar suavemente a pista, primeiro com as rodas de traz e depois com as da frente. Para frear o avião rapidamente após o pouso, ative os freios automáticos antes disso, o do trem de pouso e o aerodinâmico. Tome cuidado para não frear rápido demais. Um bom pouso é aquele totalmente perfeito, da aproximação ao toque na pista, isto inclui, é claro, suavidade. Pronto. Você executou um pouso perfeito, profissional. Parabéns.

Clusters

Os clusters são as unidades básicas de alocação do disco rígido (memória secundária do computador). Mas você sabe por que os clusters são utilizados nos sistemas de arquivos da Microsoft? É simples, para aumentar a quantidade de dados que os sistemas de arquivos podem acessar no disco. Por exemplo: um sistema de arquivos de 32 bits pode acessar até 2³² posições de memória no HD. A placa dos discos rígidos, por sua vez, só acessa 512 bytes de dados por vez, ou seja, um setor por vez. Com isso ficariam 2³² x 512 bytes. Quando o Windows utiliza sistemas de arquivos com clusters de 4 kilobytes, por exemplo, o resultado é 2³² x 4 kilobytes. Portanto o Windows acessa mais dados do disco rígido.





Observe que o Windows só acessa quantidades inteiras de clusters, não acessa apenas uma parte dos clusters. Mesmo que um arquivo tenha apenas um byte de tamanho, ele ocupa um cluster inteiro. Com isso há esperdício de espaço em disco, o que não é importante devido ao tamanho dos HDs atuais.

Upgrade de BIOS (Com ou sem UEFI)

O BIOS (Basic Input-Output System – Sistema Básico de Entrada e Saída) é uma parte do computador de fundamental importância para o seu funcionamento. Fica armazenado na memória ROM da placa-mãe, que hoje em dia é sempre do tipo Flash ROM, ou seja, pode ser reprogramada, regravada via software. Nas placas-mãe antigas eram do tipo MASK ROM e não podiam ser regravadas. Na verdade há três programas nesse chip de memória ROM, que é chamado de EEPROM (ROM eletronicamente apagável e gravável), são eles: o POST, o SETUP e o BIOS. Chamamos todo o conteúdo da Flash ROM de BIOS para facilitar. O POST (Power-on Self Test) é um programa que testa o computador sempre que nós o ligamos, inclusive é esse programa que faz a contagem de memória. O SETUP configura a placa-mãe com opções escolhidas por a gente e opções fixas de fábrica. O BIOS auxilia o processador em operações básicas de I/O, como escrever na tela em modo texto, por exemplo, acessar alguns hardwares etc.
Quando esse sistema tem defeitos ou incompatibilidades com outras partes do computador nós podemos atualiza-lo, através de programas gravadores de BIOS. Essa é uma operação muito delicada! Se algo der errado a placa-mãe fica inutilizável! Portanto, se você não se sente seguro pra fazer isso, não faça!





O primeiro passo é verificar o fabricante e o modelo da placa-mãe. Essas informações podem ser obtidas na tela de contagem de memória, por exemplo. Com esses dados você deve acessar o site do fabricante e fazer download da imagem da versão mais recente e revisada do BIOS. Esses arquivos têm extensão BIN ou ROM e vêm compactados, portanto você deve usar o Winzip para descompactá-los antes de usar. O segundo passo é verificar se a placa-mãe tem um programa de atualização de BIOS embutido. Isso pode ser verificado na tela do POST (contagem de memória) ou nas opções do SETUP. Se não tiver você deve procurar o programa no CD da placa. Eles têm nomes como Flashupdate, por exemplo. Normalmente os CDs trazem um programa para Windows e outro para DOS. Se também não for possível instalar o programa a partir do CD, você deve procurar um programa genérico, como o Winflash, por exemplo. Observe que o programa genérico deve ser compatível com o fabricante do BIOS. Há três fabricantes: AMI, Award e Phoenix. Se o programa estiver embutido na placa ou tiver no CD da mesma, não precisamos nos preocupar com compatibilidade. O terceiro passo é a atualização propriamente dita. Se o programa for para Windows, é mais fácil, bastando você fazer um backup do BIOS atual e depois atualizá-lo utilizando o arquivo de imagem que baixou do site do fabricante da placa-mãe. Após isso reinicie o computador. Os programas oferecem todas as opções que precisamos, bastando para a gente escolher. Se os problemas aumentarem você pode retornar ao BIOS anterior utilizando o arquivo de backup. Quando o programa é para DOS ou está embutido na placa-mãe o processo é um pouco maior. Nesses casos devemos criar um disquete de boot com o arquivo de imagem do BIOS novo e com o programa de atualização para DOS, ou apenas copiar o arquivo de imagem para um disquete vazio. Podemos criar um disquete de boot com o Windows até a versão ME, ou copiar de bootdisk.com. Com o programa embutido na placa nós devemos fazer backup do BIOS atual no disquete e informar o arquivo de imagem que também está no disquete para a atualização. Já com o programa para DOS nós devemos iniciar o computador pelo disco de boot e em seguida usar o referido programa para as operações de backup e atualização. Após esses procedimentos reiniciamos o computador. Pronto, o BIOS novo está funcionando.
É aconselhável o uso de um no-break para o caso de falta de energia. Só devemos fazer atualização de BIOS em casos em que realmente haja necessidade, devido ao risco de inutilizar a placa-mãe. Caso isso aconteça há como reparar a placa através de uma técnica de hot-swap, mas essa técnica também é perigosa e pode queima-la, danificando-a de vez.

Cavalos de Tróia

Os cavalos de tróia (trojan horses) são uma das principais ameaças da Internet atualmente. Eles são programas que se instalam no computador da vítima e dão acesso total ao hacker; são os chamados Malwares. Funcionam da seguinte maneira: o hacker envia um e-mail para a vítima com o programa espião e uma mensagem falsa que induz o usuário a instalar o trojan sem perceber, principalmente usuários inexperientes, ou a pessoa copia o mesmo de sites. A partir daí o programa se infiltra no sistema operacional e passa a enviar um e-mail para o hacker toda vez que a vítima se conecta. Este e-mail tem informações como o número IP da vítima, a senha para se conectar ao servidor do trojan etc. Com essas informações o hacker tem acesso total a máquina infectada. Ele pode, por exemplo, ver todos os arquivos do computador, copiá-los, enviar arquivos para a vítima, manipular o registro do Windows, danificar o sistema, ver a tela do computador como se estivesse lá, ver a imagem da webcam, ver tudo que é digitado, entre outras coisas, como desativar recursos do Windows.





Alguns trojans fazem conexão reversa, ou seja, se conectam imediatamente ao computador do hacker sempre que a vítima está on-line. Se a conexão for permanente, o hacker entra no computador a hora que quer. Alguns ainda permitem que o hacker modifique o servidor que já tá instalado na vítima ou ainda que ele elimine o mesmo, não deixando pistas praticamente.
Muitos hackers conseguem manipular os trojans de tal modo que eles passam a ser indetectáveis pelos antivírus. Isso ocorre porque o programa antivírus só detecta os vírus que ele conhece, que estão em seu banco de dados. Se o trojan tá modificado e tem uma assinatura diferente, conseqüentemente passa desapercebido pelo AV.
Por aí dá para ver a importância de se ter um programa Firewall e um antivírus atualizado no computador. Não podemos correr o risco de termos dados roubados ou o sistema danificado, isso sem falar em vírus, em ataques manuais etc.

sexta-feira, 18 de fevereiro de 2011

Linguagem de Máquina

Todos nós precisamos conhecer e dominar uma linguagem para que possamos nos comunicar com as outras pessoas. Essas outras pessoas também têm que conhecer e dominar a mesma linguagem que nós, no nosso caso, o Português.
Os computadores também têm a sua linguagem. Essa linguagem é universal, qualquer computador em qualquer parte do mundo só entende essa linguagem, que é a linguagem de máquina. A linguagem de máquina é constituída de códigos em base binária.
O sistema numérico binário é bastante diferente do sistema decimal que utilizamos e estamos acostumados. Ele é constituído de apenas dois dígitos, que são o 0 (zero) e o 1 (um). A linguagem que os computadores entendem é formada por códigos numéricos que utilizam esse sistema.
Nos chips de memória RAM do computador, por exemplo, existem milhões de “células” capacitivas (capacitivas significa que elas armazenam energia). Quando essas “células” estão carregadas, elas valem 1, quando não estão carregadas, elas valem 0.
Um dígito binário, 0 ou 1, é a menor unidade de informação entendida pelos computadores (na verdade é tudo que eles entendem). Esses dígitos são chamados de Bit (Binary Digit). Um conjunto de 4 bits forma um código chamado Nibble. As 16 variações de Nibbles possíveis, correspondem respectivamente aos 16 dígitos hexadecimais (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F). Por exemplo: 5 em hexadecimal corresponde a 0101 em binário.
Um conjunto de 8 bits forma um código chamado Byte. Nós sabemos que um Byte é a quantidade de memória necessária para armazenar um símbolo ou letra. Isso significa dizer que  cada letra ou símbolo é armazenado na forma de um código binário correspondente de 8 bits. São utilizados os 8 bits para codificar cada símbolo ou letra porque um código de 8 bits tem 255 variações, a quantidade de letras, símbolos e instruções da tabela ASCII atualmente utilizada pelos computadores.





Cada letra ou símbolo tem seu respectivo código ASCII, por exemplo, o código da letra E (maiúscula) é 69. Quando nós convertemos um número binário de 8 dígitos (bits) para um número do sistema decimal, percebemos que o resultado é sempre igual ou menor que 255. Esse resultado que obtemos em decimal é o código ASCII de alguma letra ou símbolo. Por exemplo: 01101010 convertido para o sistema decimal resulta em  107, 107 é o código ASCII da letra k (minúscula). Isso significa que o código binário acima é o código correspondente à letra k, ou seja, é este código que o computador armazena como a letra k, e é este código que o computador entende como a letra k. Cada letra e cada símbolo têm um código binário de 8 bits (dígitos) como o do exemplo. O que trafega pelos barramentos do computador, pela memória, pelo processador etc são sinais digitais que correspondem a zeros e uns, os dígitos do sistema binário.
Existem alguns códigos ASCII que não representam letras nem símbolos. Então o que eles representam? Esses códigos ASCII especiais convertidos em códigos binários e chegando até o processador em forma de sinais elétricos, são entendidos pelo mesmo como determinadas instruções.
Um processador consegue interpretar certas instruções e devolver resultados perfeitos, sem erros. O conjunto das principais instruções que um processador reconhece é chamado de x86. Apesar desse conjunto de instruções ter sido desenvolvido em 1978 pela Intel, é utilizado até hoje em processadores modernos como os Athlon e Pentium. O x86 também é chamado de  assembler x86, que é uma linguagem de baixo nível.
As linguagens de baixo nível são o que mais se parece com o que corre nos barramentos do computador. Os processadores possuem registradores, que são pequenas regiões de memória dentro do Die, juntas com as unidades de execução. Esses registradores possuem nomes, são como se fossem variáveis predeterminadas dentro do processador. A maioria das instruções x86 meche com esses registradores, atribuindo valores, movendo valores etc. As linguagens de baixo nível trabalham diretamente com esse conjunto de instruções x86, por exemplo: mov ax, FA85. Isso instrui o processador a carregar o registrador ax com o valor FA85. O código B8 85 FA equivale à instrução acima, isso quer dizer que o código da instrução mov ax é B8; não B8 propriamente dito, mas o código binário desses dois caracteres, ou seja, o processador entende os sinais elétricos gerados pelos códigos binários desses dois caracteres como a instrução mov ax.
Quando as instruções chegam ao processador elas vão para os decodificadores de instrução. Os decodificadores convertem as instruções x86 em outras menores e mais eficientes. O principal motivo dessa conversão é o paralelismo (execução simultânea) do processamento para ganhar velocidade. Quando as instruções menores (uops) são geradas a partir das instruções x86, elas seguem para as unidades de execução. As principais unidades de execução são: ALU e FPU.
A ALU (Unidade Lógica e Aritmética) é responsável por processar dados do tipo inteiro e operações lógicas. A FPU (Unidade de Ponto Flutuante) é responsável por executar instruções que envolvam números com ponto flutuante.. Exemplo: 1.2327 x 0.0058.
A ALU é a unidade básica e está presente desde os primeiros processadores.
Antigamente havia a possibilidade de encaixar nas placas-mãe o que é chamado de coprocessador matemático. Esse coprocessador era uma FPU externa ao processador principal. Os primeiros processadores a incorporar uma FPU foram os 386 DX (1985) e os 486 DX (1989). Foi uma verdadeira revolução, os processadores ficaram muito mais velozes do que antes, sem a FPU incorporada. Daí pra frente, a FPU tornou-se uma unidade de execução obrigatória nos processadores. Não há instruções x86 que utilizem dados com ponto flutuante, para isso foram criadas as instruções x87.
Por muitas gerações os processadores possuíram apenas ALU e FPU, mas com o tempo começaram a surgir unidades de execução especializadas. A primeira foi a MMX (MultiMedia eXtensions). As unidades MMX nada mais são do que uma ALU (sem a parte lógica) anabolizada, que consegue processar vários dados de uma só vez. Uma instrução MMX pode oferecer até quatro resultados num único ciclo de clock, quatro vezes mais volume do que uma instrução x86 equivalente.
Depois da MMX veio a 3dNow!, que permite o processamento de dados tipo ponto flutuante com precisão simples. Em seguida veio a SSE, para ajudar a MMX que não opera com ponto flutuante. A seguir veio a Enhanced 3dNow! com 45 instruções, 21 herdadas da primeira versão e 24 novas, dessas, 19 são as mesmas que constituem as MMX+ presentes nas SSE. As 5 restantes são funções especiais para DSP (Digital Signal Processing) e úteis para soft-modems, codificação de MP3 e áudio em geral.
A última unidade lançada foi a SSE2. Com 144 novas instruções que se somam as 70 originais, o Pentium 4 foi a primeira CPU a reconhecê-las.
Existem outras unidades nos processadores, porém as mais importantes foram citadas acima.