quarta-feira, 27 de janeiro de 2010

Emulando computadores antigos com o MESS

Quem é mais "antigo" na informática deve lembrar dos primeiros computadores pessoais comercializados no Brasil. Nos anos 80 já existia no mercado uma boa variedade de computadores domésticos, entre eles o Commodore 64, Amiga, CP-400 (Color Computer 2), TK-85 (ZX-81), MSX etc.

Naquela época era comum o computador usar como mídia de armazenamento uma simples fita cassete. Muitos também usavam cartuchos próprios e alguns já possuíam como opção os disquetes flexíveis. E o monitor era a televisão.

Hoje podemos reviver aquela época em nosso computador atual utilizando softwares chamados emuladores. Um emulador tem o propósito de recriar as funções originais do hardware. Um software executado em um emulador apresenta-se exatamente como se estivesse sendo executado no hardware original.

Um dos melhores e mais completos emuladores atualmente é o MESS. Seu nome é um acrônimo para "Multi Emulator Super System". O MESS é capaz de reproduzir sistemas de computadores e consoles em um PC. Atualmente possui capacidade para emular mais de 250 sistemas das últimas cinco décadas. O propósito primário do MESS é preservar a história dos computadores e consoles. O MESS é baseado no MAME, um emulador de jogos arcade.

O MESS emula o hardware destes sistemas e muitas vezes utiliza imagens da ROM para carregar programas e jogos. A ROM é equivalente a BIOS dos computadores atuais e graças aos hobistas o conteúdo de quase todas as ROMs de antigamente foram convertidas para arquivos imagem e podem ser encontradas pela Internet. Assim da mesma forma acontece com os softwares, onde antigamente eram armazenados em mídias que hoje em dia estão fora de linha, entretanto foram transferidos para os sistemas atuais e geralmente também na forma de arquivos imagem.

Podem ser encontradas versões do MESS para os sistemas Windows, Linux e Mac, inclusive os fontes para quem queira editar e compilar seu código. O MESS é um software gratuito porém vale salientar que as imagens das ROMs e dos softwares antigos na maioria das vezes não são.

O MESS possui uma interface bastante completa. É possível configurar os dispositivos de entrada para simularem os antigos dispositivos. As unidades de armazenamento funcionam como unidades virtuais, o sistema emulado vai interpretar o arquivo imagem como uma mídia real em um hardware. É possível montar imagens de disquetes, cartuchos, fitas cassetes etc.

Para quem usa Linux, provavelmente nos repositórios da distro tenha disponível o pacote contendo o MESS, na distro Fedora está no pacote sdlmess. Qualquer coisa no site oficial do MESS (http://www.mess.org/) é possível fazer o download para qualquer sistema.


Mostrando e alterando os MAC times dos arquivos no Linux

Os Mac times são partes dos metadados do sistema de arquivos onde são registrados certos eventos, ocorridos mais recentemente, relacionados a um arquivo. Os eventos são geralmente descritos como "modification" (a data em que o arquivo foi modificado), "access" (a data em que o arquivo foi lido) e "metadata change" (a data em que as permissões do arquivo foram alteradas). São estes termos "mtime", "atime" e "ctime" que derivam para o acrônimo MAC.

Estes são os eventos tradicionais no sistema de arquivos do Unix, onde o "ctime" é tido como a mudança nos metadados, para as permissões. Os sistemas Windows são os únicos sistemas que usam o "ctime" para significar data de criação do arquivo, diferentemente do adotado em sistemas Unix. Entretanto, o sistema de arquivos NTFS possui além dos eventos de modificação, acesso e criação, também possui o evento "Entry Modified", que registra a data de uma alteração na tabela MFT relacionada ao arquivo. A MFT é uma tabela localizada no início do sistema de arquivos na qual são armazenadas informações como datas, nomes, tamanho e localização dos arquivos. Estes quatro eventos são comumente abreviados como valores "MACE".

O comando stat, do pacote coreutils, é capaz de mostrar o status de um arquivo. Veja um exemplo de uma saída do comando stat. As três últimas linhas são as que trazem os MAC times:

$ stat .bash_history

File: `.bash_history'
Size: 50427 Blocks: 112 IO Block: 4096 arquivo comum
Device: 803h/2051d Inode: 2269552 Links: 1
Access: (0600/-rw-------) Uid: ( 500/ usuario) Gid: ( 500/ grupo)
Access: 2010-01-27 13:43:14.000000000 -0200
Modify: 2010-01-27 08:03:35.000000000 -0200
Change: 2010-01-27 08:03:35.000000000 -0200


O comando touch, também do pacote coreutils, é capaz de alterar a data dos eventos. Seguindo a sintaxe "touch [OPÇÃO] ARQUIVO" usa-se a opção "-a" para alterar a data de acesso e a opção "-m" para alterar a data de modificação. Para especificar a data pode-se usar em conjunto a opção "-t CCYYMMDDhhmm.ss". O comando touch não é capaz de alterar o evento "ctime".

Com as informações dos MAC times é possível, por exemplo, um aplicativo elaborar uma linha do tempo, com os acessos e modificações, dos arquivos contidos em uma unidade de armazenamento.

terça-feira, 26 de janeiro de 2010

Problema dos círculos tangentes

Originárias do Japão no período feudal, as gravuras com figuras geométricas conhecidas como sangaku, ou tabuletas matemáticas, ainda podem ser encontradas discretamente penduradas na entrada dos templos ou dos santuários.

O conteúdo e a forma dos sangaku tratam quase sempre de enunciados de problemas, propostos por um indivíduo, com ou sem a solução. Eles são relativamente sucintos e inspirados em composições geométricas complexas, nas quais quadrados, círculos e elipses se posicionam lado a lado ou se cruzam harmoniosamente proporcionando um belo efeito visual.

Um problema clássico da matemática japonesa que se encontra em muitos manuais e tabuletas matemáticas é apresentado neste artigo. O problema relaciona três círculos tangentes:


Três círculos C1, C2 e C3, com raios r1, r2 e r3, estão mutuamente tangentes um aos outros dois e numa linha paralela ao eixo x, como na figura acima. O centro do círculo C1 está na posição 0 do eixo. Como calcular a posição em x dos centros dos círculos C2 e C3 e o raio r3 sabendo apenas os raios r1 e r2?

A posição em x do centro do círculo C2 é dada pela distância horizontal entre os centros de C1 e C2 na resolução da equação


para x2, obtemos


A posição e o raio de C3 pode ser encontrado nas resoluções das equações



para x3 e r3, obtemos



A última equação pode ser escrita na forma


Este problema, encontrado em um templo japonês, é do ano de 1824. Os pares (x,r) de cada círculo nada mais são do que as coordenadas dos centros num plano cartesiano.

Liderança do Linux entre os 500 supercomputadores

Dentre os 500 sistemas de computadores mais poderosos conhecidos no mundo, classificados e detalhados pelo projeto TOP500, o sistema operacional Linux é utilizado em 89,2 %. Veja na tabela e no gráfico abaixo a tremenda superioridade que existe entre o Linux e os outros sistemas operacionais:

Sistema Operacional        Contagem      Percentual
Linux 446 89,2 %
Windows 5 1,0 %
Unix 25 5,0 %
BSD 1 0,2 %
Misto 23 4,6 %
Total 500 100,0 %


Talvez, como a maioria dos supercomputadores estão localizados em centros de pesquisa e em universidades, a escolha do sistema operacional deve seguir, além dos quesitos de desempenho e estabilidade, o baixo custo. O Linux tem estes três quesitos ao mesmo tempo.

segunda-feira, 25 de janeiro de 2010

Algoritmo para resolução do Sudoku

Os programas de computador podem empregar diferentes métodos de resolução para o quebra-cabeça Sudoku, o método mais comum é o de retorno à um estado anterior já analisado, uma forma sistematizada de tentativa e erro pela qual soluções parciais são propostas e à medida que se revelam erradas o algoritmo retorna e as corrige.

O algoritmo básico funciona com o programa inserindo o número 1 na primeira casa vazia. Se a escolha é compatível com os números já presentes no Sudoku, o programa segue para a próxima casa vazia e insere outro 1. Quando há um conflito, o algoritmo apaga o 1 que acabou de inserir e escreve 2 ou, se essa opção for inválida, 3 ou o próximo algarismo possível. Depois de chegar ao algarismo possível, passa para a próxima casa e recomeça com o número 1. Se o número que precisa ser alterado é o 9, que é o valor máximo no Sudoku padrão, o programa retorna e aumenta o número na casa anterior em uma unidade, que é onde está o penúltimo número inserido. A seguir, avança novamente até haver novo conflito. É comum o programa retroceder várias vezes antes de avançar.

Em um programa bem escrito, esse método explora amplamente todas as hipóteses e termina por encontrar uma solução, se ela existir. Caso haja múltiplas soluções, o que ocorreria para um Sudoku não-válido, o programa encontra todas.

Esta técnica de recuo pode ser codificada em algoritmos bastante pequenos. Abaixo é apresentado um algoritmo em linguagem C que utiliza essa técnica. A função "resolve" percorre todas as células da matriz tentando inserir os números de 1 a 9 em cada. Cada número é testado pela função "verifica" antes que seja inserido na célula atual. O teste é simples, verifica se já não existe o número na linha, coluna e região. A função "resolve" é chamada recursivamente para as células seguintes a fim de confirmar o número tentado na célula atual. Isso tudo é feito para cada célula da matriz. Quando terminado, o programa imprime a solução na tela.

#include <stdio.h>

int grade[9][9] = {{8,3,0,0,0,5,6,9,0},
                   {0,0,6,0,8,0,0,0,2},
                   {0,0,0,6,0,0,0,0,5},
                   {6,0,0,0,0,3,0,0,0},
                   {3,0,5,0,0,0,9,0,6},
                   {0,0,0,9,0,0,0,0,7},
                   {4,0,0,0,0,2,0,0,0},
                   {5,0,0,0,4,0,1,0,0},
                   {0,8,7,1,0,0,0,4,9}};

void imprime() {

  static int solucoes = 0;
  int l, c;

  printf("      Solucao: %d\n", ++solucoes);
  for (l = 0; l < 9; l++) {
    for (c = 0; c < 9; c++) {
      printf(" %d", grade[l][c]);
      if (c % 3 == 2) printf("  ");
    }
    printf("\n");
    if (l % 3 == 2) printf("\n");
  }

}

int verifica(int lin, int col, int n) {

  int l, c, lr, cr;

  if (grade[lin][col] == n) return 1;
  if (grade[lin][col] != 0) return 0;
  for (c = 0; c < 9; c++)
    if (grade[lin][c] == n) return 0;
  for (l = 0; l < 9; l++)
    if (grade[l][col] == n) return 0;
  lr = lin / 3;
  cr = col / 3;
  for (l = lr * 3; l < (lr + 1) * 3; l++)
    for (c = cr * 3; c < (cr + 1) * 3; c++)
      if (grade[l][c] == n) return 0;

  return 1;

}

void resolve(int lin, int col) {

  int n, t;

  if (lin == 9)
    imprime();
  else
    for (n = 1; n <= 9; n++)
      if (verifica(lin, col, n)) {
        t = grade[lin][col];
        grade[lin][col] = n;
        if (col == 8)
          resolve(lin + 1, 0);
        else
          resolve(lin, col + 1);
        grade[lin][col] = t;
      }

}

int main() {

  resolve(0,0);
  return 0;

}

sábado, 23 de janeiro de 2010

Problema de Lógica: Duas perguntas aos honestos e mentirosos

Atenção, resposta logo após o problema!

Um turista está em férias por um país onde cada pessoa é classificada como trabalhador, capitalista ou estudante. Os trabalhadores são honestos e só falam a verdade. Os capitalistas, ao contrário, são desonestos e mentem sempre. Os estudantes às vezes são honestos, mas podem agir de forma desonesta também. Chegou a hora do almoço e o turista se encontra em uma encruzilhada à procura de um restaurante. Nesta encruzilhada há duas estradas: uma para um restaurante e a outra para um abismo. Ali, há um trabalhador, um capitalista e um estudante. Apenas olhando para aqueles nativos não é possível ao turista identificá-los. Portanto ele não sabe quem é honesto ou mentiroso. Como o turista descobre o caminho para o restaurante fazendo apenas duas perguntas? Cada pergunta deve ser dirigida a uma única pessoa que se encontra na encruzilhada.






RESPOSTA






Primeiro pergunta-se a um dos três indivíduos "qual o caminho para o restaurante que cada um dos outros dois indicaria?". Se a pergunta for feita para o estudante ele saberá dizer claramente a resposta do trabalhador e a do capitalista. Se a pergunta for feita para o trabalhador ou para o capitalista, ele saberá dizer a resposta de um indivíduo mas não saberá dizer a resposta do outro, que é o estudante. Neste primeiro passo o turista descobre quem é o estudante. A segunda pergunta, que deve ser feita a um dos dois que não seja o estudante, será "qual o caminho para o restaurante que o outro indivíduo indicaria?". Neste caso o outro indivíduo citado na pergunta não pode ser o estudante, pois não se sabe a resposta. Seja qual for o indivíduo inquirido, a resposta indica sempre o caminho errado. Se perguntasse ao trabalhador, a resposta indicaria o caminho errado pois o capitalista não indica o caminho certo. Se perguntasse ao capitalista, a resposta indicaria o caminho errado pois o trabalhador indica o caminho correto.

sexta-feira, 22 de janeiro de 2010

Probabilidades

O simples experimento de lançar um dado possui um resultado que não pode ser previsto, não podemos saber com antecedência o número obtido, apenas sabemos que os possíveis resultados são 1, 2, 3, 4, 5 e 6. Este tipo de experimento é chamado aleatório. Na teoria das probabilidades, estudamos os experimentos aleatórios equiprováveis, onde qualquer resultado pode ocorrer com a mesma chance.

No estudo da teoria das probabilidades temos dois elementos, o espaço amostral e o evento. Espaço amostral é o conjunto universo de todos os resultados possíveis de um experimento aleatório equiprovável. O número de elementos desse conjunto é indicado por n(U). Evento é qualquer subconjunto do espaço amostral U. O número de elementos desse subconjunto é indicado por n(A).

Assim, no lançamento de um dado, por exemplo, o evento "obter um número maior ou igual a 4" é dado por A={4,5,6}, subconjunto de U={1,2,3,4,5,6}.

Quando A é igual à U, o evento é certo. Quando A é igual à conjunto vazio, o evento é impossível. Quando A união com 'A é igual à U, e, A intersecção com 'A é igual a conjunto vazio, os eventos A e 'A são complementares.

Se, num experimento aleatório equiprovável, o número de elementos do espaço amostral U é n(U) e o número de elementos do evento A é n(A), então a probabilidade de que ocorra o evento A é dada pelo número real P(A), tal que P(A) = n(A)/n(U). Portanto, a probabilidade de um evento é dada pelo quociente da divisão do número de casos favoráveis pelo número de casos possíveis.

A probabilidade de um evento é sempre um número entre 0 (probabilidade do evento impossível) e 1 (probabilidade do evento certo). Se A é igual a conjunto vazio então n(A) = 0 e portanto P(A) = 0. Se A é igual a U então n(A) = n(U) e P(A) = 1. Se A está contido em U então 0 <= n(A) <= n(U) e 0 <= P(A) <= 1. Se A e 'A são eventos complementares então n(A) + n('A) = n(U) e P(A) + P('A) = 1.

Se A e B são 2 eventos de um espaço amostral U, sabemos que n(A união com B) é igual a n(A) + n(B) - n(A intersecção com B) e portanto P(A união com B) = P(A) + P(B) - P(A intersecção com B). Se A intersecção com B é igual a conjunto vazio, os eventos são mutuamente exclusivos, isto é, P(A intersecção com B) = 0, daí P(A união com B) = P(A) + P(B).

A probabilidade do produto é dada por um princípio análogo ao princípio fundamental da contagem, quando os eventos A e B são independentes. Se um evento A tem probabilidade p e, em seguida, ocorre o evento B de probabilidade q, então a probabilidade de que ocorram os eventos A e B na ordem indicada é p x q, pois P(A intersecção com B) = P(A) x P(B). Esta regra pode ser generalizada para mais de dois eventos com suas respectivas probabilidades.

domingo, 17 de janeiro de 2010

Automatize sequências de comandos no prompt do shell com laços

Um comando de iteração, ou laço, permite que um conjunto de instruções seja executado repetidamente até que ocorra uma certa condição. No Linux o interpretador de comandos Bash, da mesma forma que às principais linguagens de programação, também possui os comandos básicos de iteração e são os comandos for, while e until.

O comando for é o mais simples dos três, utiliza um contador com um início e fim pré-definido e o incremento do passo. Durante cada passo a variável "argumento" recebe o valor de cada membro da "lista". O conjunto de instruções que será executado repetidamente deve ficar entre as palavras reservadas do e done. Sua sintaxe básica é apresentada abaixo:

for argumento in lista
do
comando(s)
done


Como vamos executar todo o comando em uma única linha no prompt do shell, então é necessário alguns ponto-e-vírgulas:

for argumento in lista; do comando(s); done


Veja alguns exemplos de lista para compor um contador para a repetição. Nos casos abaixo todos produzem o mesmo efeito, contando de 1 à 10. Em dois exemplos foi usado o utilitário seq, que imprime uma sequência de números:

for i in 1 2 3 4 5 6 7 8 9 10; do echo -n "$i "; done
for i in $(seq 10); do echo -n "$i "; done
for i in `seq 10`; do echo -n "$i "; done
for i in {1..10}; do echo -n "$i "; done
for ((i=1; i<=10; i++)); do echo -n "$i "; done


A lista de valores pode conter palavras ao invés de números, veja estes exemplos. O segundo exemplo utiliza um arquivo que contém as palavras:

for dia in Segunda Terça Quarta Quinta Sexta; do echo $dia; done
for dia in `cat semana.txt`; do echo $dia; done


O incremento do passo pode ser mais de 1 em 1. Os exemplos abaixo produzem o mesmo efeito, contando de 1 à 16 com passo 2:

for ((i=1;i<=16;i+=2)); do echo $i; done
for i in $(seq 1 2 16); do echo $i; done
for i in `seq 1 2 16`; do echo $i; done
for i in 1 3 5 7 9 11 13 15; do echo $i; done
foi i in {1..16..2}; do echo $i; done # A partir do bash versão 4.


É possível também utilizar duas variáveis no contador, na sintaxe semelhante à linguagem C:

for ((i=1, j=1; i<=10; i++, j++)); do echo -n "$i-$j "; done


Exemplos práticos com o uso do comando for:

for i in *.*; do novo="$(echo "$i" | sed 'y/ÀÁÂÃÄÅÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÇÑàáâãäåèéêëìíîïòóôõöùúûüçñ/
AAAAAAEEEEIIIIOOOOOUUUUCNaaaaaaeeeeiiiiooooouuuucn/')"; mv "$i" "$novo"; done

for i in `ls *-6_*.pdf`; do mv $i ${i/-6_/-06_}; done

n=1; for nome in $(awk 'BEGIN{FS=":"}{print $1}' < /etc/passwd ); do echo "USUARIO #$n = $nome";
let n+=1; done

for file in *.mp3; do mkdir -p "$(mp3info -p "%a/%l" "$file")" && mv "$file" "$(mp3info -p
"%a/%l/%t.mp3" "$file")"; done

for x in $(lynx -dump http://marx.vanderlinden.com.br/sem/2009.1/fi.php | awk '{print $2}' | grep
.pdf); do wget -c $x; done

for arquivo in $( find /usr/local/bin/ -type f -name '*' | sort ); do strings -f $arquivo | grep
"GPL" | sed -e "s%/usr/local/bin/%%"; done


O comando while testa por uma condição no início do laço e mantém a iteração enquanto esta condição é verdadeira (retorna 0 quando falso). Diferentemente do comando for, o comando while é usado quando o número de repetições não é conhecido de antemão. O conjunto de instruções que será executado repetidamente deve ficar entre as palavras reservadas do e done. Sua sintaxe básica é apresentada abaixo:

while condição
do
comando(s)
done


Mais uma vez, como vamos executar todo o comando em uma única linha, no prompt do shell, então é necessário alguns ponto-e-vírgulas:

while condição; do comando(s); done


Para o comando while executar o laço a condição já deve existir. Veja este exemplo onde é inicializada a variável de controle antes do comando while (Obs.: é necessário os espaços dentro dos colchetes pois é um teste de condição):

i=1; while [ $i -le 10 ]; do echo -n "$i "; let i+=1; done


Ou, produzindo o mesmo resultado:

i=1; while ((i<=10)); do echo $i; ((i+=1)); done


Uma outra forma, por exemplo, é suprir a entrada com o conteúdo de um arquivo:

cat semana.txt | while read linha; do echo -n "$linha "; done


Ou, produzindo o mesmo resultado:

while read linha; do echo -n "$linha "; done < <(cat semana.txt)


Exemplos práticos com o uso do comando while:

find /usr/share/ -regextype posix-egrep -iregex '.*\.(jpg|jpeg|gif|png|tif|tiff|bmp|svg)' -type f
-print | while read IMAGEM; do convert -thumbnail 120x120 -compress JPEG -quality 20 -delete 1--1
"$IMAGEM" thumbs/"$(echo "${IMAGEM}" | sed 's/.*\///g')".jpg; done

while read nome; do echo "USER #$n = $nome"; let n+=1; done < <(awk 'BEGIN{FS=":"}{print $1}'
< /etc/passwd )

seq 1 100 | while read i; do echo -n "texto${i}.txt "; touch texto${i}.txt 2>&1; done

while read i; do echo -n "texto${i}.txt "; touch texto${i}.txt 2>&1; done < <(seq 1 100)

while read arquivo; do strings -f $arquivo | grep "GPL" | sed -e "s%/usr/local/bin/%%";
done < <( find /usr/local/bin/ -type f -name '*' | sort )


O comando until testa por uma condição no início do laço e mantém esta iteração enquanto a condição for falsa (diferentemente do comando similar em outras linguagens), sendo o oposto do comando while. Também o comando until é usado quando o número de repetições não é conhecido de antemão. O conjunto de instruções que será executado repetidamente deve ficar entre as palavras reservadas do e done. Sua sintaxe básica é apresentada abaixo:

until condição
do
comando(s)
done


Como sempre, vamos executar todo o comando em uma única linha, no prompt do shell, então é necessário alguns ponto-e-vírgulas:

until condição; do comando(s); done


Também como o comando while, para o until executar o laço a condição já deve existir. Neste exemplo é inicializada a variável de controle antes do comando until:

i=1; until [ $i -gt 10 ]; do echo $i; let i+=1; done


Ou, produzindo o mesmo resultado:

i=1; until ((i>10)); do echo $i; ((i+=1)); done


Da mesma forma que demonstrado no comando while, também é possível suprir a entrada com o conteúdo de um arquivo.

Exemplos práticos com o uso do until:

until [ -e teste.txt ]; do echo -e "Crie o arquivo teste.txt\n"; sleep 5; done

until [ $(ls -l eventos.log | awk '{print $5}') -gt 5000 ]; do echo "Arquivo log ainda pequeno";
sleep 1; done


Nestes três comandos de iteração é possível interromper o comando ou somente pular o passo atual e continuar no próximo. Para isso usa-se respectivamente os comandos break e continue na posição desejada entre o do e o done. Obviamente para ter este controle certamente vai ser necessário o uso de um comando condicional, como o if.

Como escolher entre os laços for, while ou until? Pode ser possível conseguir o mesmo efeito com os três comandos de laço. Veja os comandos abaixo, todos produzem o mesmo resultado, então provavelmente o melhor será aquele que visualmente for mais fácil de entender o algoritmo. Mas observe que o comando for é mais utilizado quando o número de iterações é conhecido e os comandos while e until servem para um número impreciso de iterações:

for ((i=1; i<=10; i++)); do echo "$i "; done
i=1; while ((i<=10)); do echo $i; ((i+=1)); done
i=1; until ((i>10)); do echo $i; ((i+=1)); done

quarta-feira, 13 de janeiro de 2010

Ajustes pós-instalação no Windows XP

Em plena era do Windows 7 o Windows XP continua sendo bastante utilizado. Recomendado para máquinas antigas e principalmente para os Netbooks, por possuírem uma menor capacidade de processamento e memória.

Entretanto não gosto da configuração padrão da instalação do XP. Pois existem desde configurações que prejudicam o desempenho do computador à até configurações que podem ser um furo na segurança do sistema.

Por isso indico estas alterações que são bem fáceis de ser realizadas e que podem tornar o sistema mais rápido, bonito e seguro. Perceba que são alterações de gosto pessoal, em uma necessidade particular outras opções poderão ser escolhidas. Siga sua preferência.

Em "Meu Computador" clique com o botão direito para entrar em "Propriedades do sistema". Na guia "Restauração do sistema" marque a caixa "Desativar restauração do sistema". Na guia "Atualizações Automáticas" marque "Desativar Atualizações Automáticas". E na guia "Remoto" desmarque "Permitir o envio de convites de assistência remota deste computador". A caixa "Permitir que usuários de conectem remotamente a este computador" costuma já vir desmarcada, senão desmarque-a. Para complementar é necessário executar o utilitário "Diretivas de grupo" digitando "gpedit.msc" no menu "Iniciar/Executar". Na janela do "Diretivas de grupo" vá em "Configuração do computador/Modelos administrativos/Sistema/Assistência remota" e configure ambos os serviços para "Desativado".

Também em "Meu Computador" e "Propriedades do sistema", na guia "Avançado" clique no botão "Configurações" do quadro "Inicialização e recuperação" e na janela "Inicialização e recuperação" desmarque a caixa "Enviar um alerta administrativo". Ainda na guia "Avançado" clique no botão "Relatório de erros" e na janela "Relatório de erros" marque "Desativar relatório de erros".

Se desejar, em "Meu Computador" e "Propriedades do sistema", na guia "Avançado" e nas "Configurações" do "Desempenho", na janela "Opções de desempenho" marque e desmarque o que melhor convier na guia "Efeitos visuais".

Retornando na janela do "Diretivas de grupo", "gpedit.msc" em "Iniciar/Executar", vá em "Configuração do computador/Modelos administrativos/Sistema" e localize "Desativar AutoExecutar", desative este serviço.

Em "Desktop" clique com o botão direito para entrar em "Propriedades de Vídeo". Na guia "Área de trabalho" clique no botão "Personalizar área de trabalho..." e abrindo a janela "Itens da área de trabalho" na guia "Geral" desmarque "Executar o assistente para limpeza a cada 60 dias" e na guia "Web" selecione "Minha página inicial atual", mas não marque a caixa, e clique no botão "Propriedades". Na janela "Propriedades de About:Home" desmarque "Tornar esta página disponível offline".

Ainda em "Desktop" e "Propriedades de Vídeo, na guia "Aparência" clique no botão "Efeitos..." e abrindo a janela "Efeitos" selecione em "Usar este método para suavizar as bordas das fontes de tela" a opção "ClearType".

Mais uma vez em "Desktop" e "Propriedades de Vídeo, na guia "Configurações" clique no botão "Avançadas". Na janela "Propriedades de Monitor e ..." e na guia "Monitor" altere a "Frequência de atualização da tela" para o valor máximo possível que seu monitor suporte.

No "Windows Explorer" deixe selecionado "Disco local (C:)" ou "Meu computador" ou "Desktop" e no menu "Ferramentas" clique em "Opções de pasta...". Na guia "Modo de exibição" e em "Configurações avançadas" desmarque "Ocultar arquivos protegidos do sistema operacional", "Ocultar as extensões dos tipos de arquivo conhecidos" e "Procurar pastas e impressoras de rede automaticamente". E marque "Não armazenar miniaturas em cache" e "Mostrar pastas e arquivos ocultos". O restante deixe como está. Clique primeiro no botão "Aplicar" e depois no botão "Aplicar a todas as pastas", confirmando "Sim".

Ainda no "Windows Explorer" clique com o botão direito em "Disco local (C:)" e clique em "Propriedades". Na janela "Propriedades de Disco local (C:)" desmarque a caixa "Indexar disco para agilizar pesquisa de arquivo" e clique em "Aplicar". Escolha "Ignorar todos" se ocorrer algum erro na janela de progresso. A caixa "Compactar disco para economizar espaço" deve permanecer desmarcada. Repita isso se existirem outras unidades de disco rígido.

Caso seu hardware suporte o recurso de hibernação você pode desabilitá-lo. Entre em "Painel de controle/Desempenho e manutenção/Opções de energia". Na guia Hibernar desmarque a caixa "Ativar Hibernação".

Existe muito mais que pode ser alterado no Windows XP, inclusive brechas graves na segurança como alguns serviços com acesso remoto habilitados etc., mas isso vai ficar para uma próxima postagem neste blog. Se desejar averiguar execute a partir do "Painel de controle/Desempenho e manutenção/Ferramentas administrativas" os utilitários "Gerenciamento do computador" e "Serviços", ou de outra forma em menu "Iniciar/Executar" digite respectivamente "compmgmt.msc" e "services.msc". E também nas "Diretivas de grupo", "gpedit.msc", tem muita coisa nestes lugares.

As dicas apresentadas são baseadas no Windows XP Professional SP2 e SP3, a versão Home pode não conter tudo o que foi apresentado aqui.

quarta-feira, 6 de janeiro de 2010

Verifique a integridade dos seus downloads

Durante um processo de cópia de qualquer arquivo no computador é possível acontecer uma falha na comunicação da origem para o destino. Muitas vezes o software que está executando o processo de cópia não percebe e retorna para o sistema o sucesso da cópia. A cópia do arquivo aparenta estar normal porém ao realizar sua execução acontece um erro.

Este tipo de problema é bastante comum de acontecer em downloads de arquivos pela Internet. Não é sempre mas pode ocorrer de um único byte vir incorreto ou inexistente no arquivo. E pode ser um transtorno se este arquivo for por exemplo uma imagem de CD ou DVD, onde o erro só vai ser percebido depois de gravá-la em uma mídia e então executar o software contido.

Para possibilitar uma verificação da cópia do arquivo e assim evitar que um usuário fique com um arquivo corrompido, muitos administradores de repositórios de softwares disponibilizam um arquivo ou uma página no site contendo o valor hash do arquivo. Desta forma o usuário pode confirmar a integridade do arquivo.

Um hash é uma sequência de bits gerada por um algoritmo de dispersão formando uma sequência de caracteres alfanuméricos, geralmente na base hexadecimal de 0 a 9 e de A a F, representando 1/2 byte cada. Basicamente a sequência hash é a transformação de uma grande quantidade de dados em uma pequena quantidade de dados.

Esta seqüencia busca identificar um arquivo unicamente. É um método para transformar dados de tal forma que o resultado seja praticamente exclusivo. Mas como a seqüencia do hash é limitada, muitas vezes não passando de 512 bits, existem colisões ocasionando sequências iguais para dados diferentes.

Não é possível a partir de um valor de hash retornar à informação original, esta transformação então é somente unidirecional.

Os algoritmos de hash mais usados para este propósito são: MD5, com 128 bits; SHA1, com 160 bits e o SHA256, com 256 bits. Os hashes MD5 são representados por uma sequência de 32 caracteres hexadecimais, os hashes SHA1 e o SHA256 são representados por sequências de 40 e 64 caracteres, respectivamente.

Quando localizar um arquivo para download em um site, procure se informar se existe disponível o valor hash do arquivo. Este valor pode vir dentro de um outro arquivo em formato texto, comumente com nomes semelhantes à checksum, md5sum, sha1sum, ou pode apenas estar incluído no conteúdo da página de download do arquivo.

Para o sistema Windows é necessário instalar o utilitário que irá verificar a integridade, por exemplo para hash MD5 existe o software chamado MD5summer (http://www.md5summer.org/). Existem outros utilitários que funcionam com os algoritmos mais comuns de hash, uma pesquisada pelo Google vai ser suficiente para encontrá-los. Já o sistema Linux costuma trazer na instalação padrão estes utilitários. A execução do comando "md5sum " retorna a sequência com o valor hash MD5 do arquivo informado. Outros comando são o sha1sum e o sha256sum, para os hashes SHA.

Basta comparar o valor retornado com o fornecido no site. Se forem idênticos então o arquivo está OK. Uma forma automática é executar o utilitário informando o arquivo que contém a sequência hash, desta forma o retorno será a resposta OK ou não.

Outro proveito destes utilitários é para o controle da integridade de suas cópias particulares. Cópias de segurança, transferências de arquivos pela rede ou a utilização de uma unidade de armazenamento externa para transportar os arquivos etc. O procedimento é gerar os valores hashes antes de realizar a cópia e ao final verificar os arquivos copiados.

A grande maioria dos repositórios de softwares para o sistema Linux adotam este controle de integridade dos arquivos.

terça-feira, 5 de janeiro de 2010

Integração é a operação inversa da derivação

O Cálculo é usualmente dividido em duas partes principais, cálculo diferencial e cálculo integral, sendo que cada uma tem sua própria terminologia não-familiar, notação e métodos computacionais especializados.

Quase todas as idéias e aplicações do Cálculo giram em torno de dois problemas geométricos que são muito fáceis de ser entendidos. O problema básico do cálculo diferencial é o problema das tangentes, calcular o coeficiente angular da reta tangente ao gráfico num ponto dado P. O problema básico do cálculo integral é o problema das áreas, calcular a área debaixo do gráfico entre os pontos x = a e x = b. Ambos se referem ao gráfico de uma função y = f(x) qualquer, como na figura abaixo:


Com o cálculo diferencial é possível, dada uma curva, achar o coeficiente angular de sua tangente ou, de modo equivalente, dada uma função, achar sua derivada. Com o cálculo integral é possível encontrar a área sob uma curva ou, dada a função, achar sua integral.

Entretanto existem muitos problemas de geometria e física que dependem de "derivação para trás" ou "antiderivação", às vezes chamado de inverso das tangentes pois dada a derivada de uma função é possível achar a própria função. Isto é a definição da primitiva pelo Teorema Fundamental do Cálculo, visto que trabalhando com as mesmas regras de derivação, usando-as no sentido contrário levam em particular à integração. Assim pode-se dizer que a derivação e a integração possuem sentidos inversos. Abaixo alguns exemplos:


O processo de antiderivação, que retorna a primitiva, é uma integral indefinida e na solução adota-se o acréscimo de uma constante qualquer ao resultado. Isto se deve pelo motivo de que uma derivada pode ter várias primitivas. Por exemplo: