quinta-feira, 13 de junho de 2013

Enfileirar comandos para execução posterior

Com o comando "at", nos sistemas Linux, podemos agendar a execução de uma tarefa para determinado tempo posterior, seja após um tempo decorrido ou hora e dia específico. A execução ocorrerá apenas uma vez (diferente do cron que executa novamente a tarefa na próxima ocorrência da data) e então a tarefa é removida da fila de agendamentos. Na execução, a tarefa herda o ambiente do momento em que foi criada, isto é, o comando será executado no mesmo diretório e com algumas das variáveis de ambiente do momento do agendamento.

O administrador do sistema pode controlar quem poderá agendar tarefas com o comando "at", editando os arquivos "/etc/at.allow" e "/etc/at.deny". Se existir o arquivo "/etc/at.allow", somente os usuários incluídos neste arquivo poderão usar o comando "at". Se não existir e se existir o arquivo "/etc/at.deny", os usuários incluídos neste segundo arquivo não poderão usar o comando "at". Se nenhum dos arquivos existirem, somente o administrador poderá usar o comando "at".

Além do comando "at" existem o "atq", que lista todos os agendamentos, e o "atrm", para remover uma tarefa determinada. As tarefas serão executadas pelo serviço "atd".

Uma tarefa nada mais é que uma linha de comando qualquer, com seus parâmetros, opções etc. Há basicamente três formas de informar a linha de comando ao "at". Quando executa-se o "at" sem esta informação, a interface exibe um prompt "at>" para que se digite a linha de comando. Digitando Ctrl+D no início de uma nova linha vazia encerra a entrada. A segunda forma é canalizar "|" a linha de comando para o comando "at" e a terceira forma é informar com a opção "-f" o arquivo que contém uma ou mais linhas de comando.

O momento para a execução pode ser especificado com diversas sintaxes. Este é o ponto que torna o comando "at" um pouco confuso talvez. As sintaxes podem ser:

• A hora no formato HH:MM, para uma hora específica no dia ou, se esta hora já passou, é assumido o dia seguinte;

• A hora seguido do sufixo AM ou PM;

• Os termos MIDNIGHT, NOON ou TEATIME (4pm);

• A data no formato mês dia e ano opcional. Para os meses usa-se JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC;

• A hora seguido dos termos TODAY ou TOMORROW;

• O termo NOW, ou hora específica, + número seguido de um dos termos MINUTES, HOURS, DAYS ou WEEKS;

• O parâmetro "-t" e a data/hora no formato [[CC]YY]MMDDhhmm[.ss].


Exemplos:

$ at 22:30

$ at 10:30pm

$ at midnight

$ at jul 15 2014

$ at 10:30pm jul 15 2014

$ at 22:30 tomorrow

$ at now + 6 days

$ at 5pm + 7 days

$ at -t 201407152230

$ at -f tarefas.txt now + 1 hour



O comando "atq" ou "at -l" retorna todas as tarefas agendadas ou em execução no momento. Sua saída exibe o número da tarefa, a hora agendada e o nome do usuário. O comando "atrm", "at -r" ou "at -d" seguido do número da tarefa remove a tarefa especificada pelo número.

No mesmo pacote existe o comando "batch" (ou "at -b"), que possui o mesmo funcionamento e sintaxe do "at" porém executa a tarefa somente se o nível de carga do sistema estiver baixo, isto é, se a carga média do sistema (load average) estiver abaixo de 0,8 (ou outro valor especificado na invocação do atd). Assim, em um sistema sobrecarregado a tarefa não será executada.

O comando "at" pode também informar o usuário por e-mail quando a tarefa for concluída, quando usado o parâmetro -m. E ainda, assim como no cron, o usuário não precisa estar logado no sistema no momento da data e hora do agendamento, pois o serviço "atd" fará a execução.

A Evolução da Física, de Einstein e Infeld

Os artigos científicos da área de física são bastante complexos, na leitura e compreensão, para as pessoas que não estudam esta área. A física é uma ciência muito difícil assim como a matemática, que é uma ferramenta essencial da física. Principalmente a física teórica pois utiliza muito os modelos matemáticos.

Entretanto, e felizmente, muitas obras de divulgação científica são escritas ao público não especializado. Estas obras usam uma linguagem mais fácil e com conteúdos não tão aprofundados. Nomes como Stephen Hawking, Brian Greene e Michio Kaku são exemplos atuais de autores com obras mais populares, com diversos livros, mesmo eles sendo exímios físicos teóricos com diversos artigos científicos sérios.

Albert Einstein, que foi um dos principais precursores da física moderna, também publicou em sua época algumas obras voltadas ao público comum. A famosa obra "The Evolution of Physics: The Growth of Ideas from Early Concepts to Relativity and Quanta" foi seu último livro científico, publicado em 1938 junto com o físico polonês Leopold Infeld em uma linguagem bastante simples.

No Brasil este livro possui o título "A Evolução da Física" e foi lançado naquela época mesmo. A primeira edição em língua portuguesa foi publicada em 1939 e teve a tradução de Monteiro Lobato. A edição mais recente é a lançada em 2008 pela editora Zahar, com a tradução de Giasone Rebuá, talvez a mesma de 1962.

O livro "A Evolução da Física" divulga os aspectos mais importantes da teoria da relatividade, partindo da ascensão e o declínio do conceito mecânico na física, desde Galileu, até chegar na física moderna, com os princípios da física quântica.

Apesar de já ter se passado bastante tempo e a física ter evoluído muito, o conteúdo do livro ainda é em grande parte atual pois trata apenas das teorias elementares da física, dos princípios básicos. O livro está organizado em quatro partes, com os seguintes capítulos:

Parte I - A ascensão do conceito mecânico

1. A grande história de mistério
2. A primeira pista
3. Vetores
4. O enigma do movimento
5. Resta uma pista
6. Será o calor uma substância?
7. A montanha-russa
8. Razão de transformação
9. As bases filosóficas
10. Teoria cinética da matéria

Parte II - O declínio do conceito mecânico

1. Os dois fluidos elétricos
2. Os fluidos magnéticos
3. A primeira dificuldade séria
4. A velocidade da luz
5. A luz como substância
6. O enigma da cor
7. Que é uma onda?
8. A teoria ondulatória da luz
9. Ondas luminosas longitudinais ou transversais?
10. O éter e o conceito mecânico

Parte III - Campo, relatividade

1. O campo como representação
2. Os dois pilares da teoria de campo
3. A realidade do campo
4. Campo e éter
5. O andaime mecânico
6. Éter e movimento
7. Tempo, distância, relatividade
8. Relatividade e mecânica
9. O contínuo de espaço-tempo
10. Relatividade geral
11. Dentro e fora do elevador
12. Geometria e experiência
13. Relatividade geral e sua verificação
14. Campo e matéria

Parte IV - Quanta

1. Continuidade - descontinuidade
2. Quanta elementares de matéria e eletricidade
3. Os "quanta" da luz
4. Espectro luminoso
5. As ondas da matéria
6. Ondas de probabilidade
7. Física e realidade


É um conteúdo pra lá de interessante. A edição de 2008 possui as seguintes características de capa e ficha técnica:


Título: A Evolução da Física
Autores: Albert Einstein e Leopold Infeld
Tradução: Giasone Rebuá
Número de Páginas: 248
Edição: 1ª
Editora: Zahar
ISBN: 9788537800522
Lançamento: 21/1/2008

quarta-feira, 12 de junho de 2013

Ativar as opções do desenvolvedor no Android 4.2

No Android 4.2, as opções do desenvolvedor estão escondidas por padrão. Para mostrá-las é necessário ir até a tela "Configurações -> Sistema -> Sobre o telefone" e tocar sete vezes em "Número da versão". A ação é confirmada com a exibição da mensagem "Agora você é o desenvolvedor do telefone". Feito isso, a tela "Configurações -> Sistema -> Opções do desenvolvedor" estará disponível.

Mais informações em: http://developer.android.com/about/versions/jelly-bean.html

domingo, 26 de maio de 2013

Atualizando o caminho dos arquivos numa listagem de hash

Recentemente, eu estava com uma estrutura de arquivos em diversos diretórios e subdiretórios e todos eles já estavam com os respectivos hashes MD5 armazenados em um arquivo texto (hash.md5) no diretório raiz. Bastava executar o comando "md5sum -c hash.md5" na raiz para a ferramenta verificar a integridade de todos os arquivos.

Entretanto, resolvi reorganizar a localização dos arquivos, mudando os arquivos de subdiretórios, criando diretórios novos etc. Eram os mesmos arquivos só que agora estavam em caminhos de diretórios diferentes. Com isso, após estas mudanças, o arquivo texto com os hashes MD5 também precisava ser atualizado para os novos caminhos dos arquivos.

Algumas soluções poderiam ser aplicadas. Uma seria recalcular todas as somas MD5, gerando novamente os hash de todos os arquivos, mas esta solução iria expor novamente o disco rígido em um uso intenso. Eram muitos gigabytes de dados armazenados. Outra solução seria editar o arquivo texto com os hashes, alterando cada linha para o novo caminho do respectivo arquivo. Mas era um arquivo com 1650 linhas e fazer isso manualmente torna impraticável, levaria uma eternidade.

Contudo a segunda era a solução que deveria ser aplicada, afinal os hashes dos arquivos já estavam gerados e só precisava atualizar os caminhos. O que poderia executar esta tarefa rapidamente? Simples, um script no interpretador de comandos.

A seguir, está o código do script que realizou a atualização dos caminhos, de cada arquivo, nas linhas do arquivo texto com os hashes MD5. É um script para o interpretador de comandos Bash, do Linux.

O que ele faz é, primeiramente, uma cópia de segurança do arquivo texto com os hashes. Depois será lida cada linha deste arquivo, onde serão armazenados em variáveis o hash (incluindo os espaços) que está no início da linha e o nome do respectivo arquivo, ignorando o caminho antigo. Então será realizada uma busca pelo arquivo e seu caminho atual é armazenado em outra variável. Por fim, as strings com o hash e o caminho atual são concatenadas e direcionadas para um novo arquivo texto com os hashes MD5.


#!/bin/bash
#

cp -f hash.md5 hashantigo.md5

while read LINHA
do

  HASH=`echo "$LINHA" | cut -c 1-34`
  ARQUIVO=`echo "$LINHA" | sed 's/^.\{34\}//' - | sed 's/.*\///' -`
  NOVODIR=`find */ -iname "$ARQUIVO" -type f -print`
  if [[ $NOVODIR ]]
  then
    echo "$HASH""$NOVODIR" >> novohash.md5
  fi

done < hashantigo.md5

mv -f novohash.md5 hash.md5

echo "Feito!"



Este script torna o processo muito mais rápido e menos traumático no acesso ao disco. Nesta reorganização, eu também separei os arquivos em volumes de aproximadamente 4.4 GB (capacidade de DVDs) pois foram gravados em mídias óticas. Cada volume tinha o seu "diretório raiz" com uma cópia do arquivo texto original com os hashes e o script. O script foi executado para cada volume. Por isso a necessidade do if no script, alguns arquivos não estavam no respectivo volume.

São diversos comandos do Bash, internos e externos, utilizados neste script. As páginas manuais de cada um deles podem ajudar no entendimento de sua execução.

sábado, 18 de maio de 2013

Conversão entre coordenadas geográficas e UTM

O sistema de coordenadas geográficas expressa a posição de um ponto na superfície esférica do globo. Um exemplo desta coordenada são os valores -23,653492 graus de latitude e -47,235703 graus de longitude. O sistema de coordenadas UTM expressa a posição de um ponto em uma projeção plana do globo terrestre. Um exemplo desta coordenada são os valores X 271960,000 (Easting), Y 7382350,200 (Northing), Fuso 23 (Zone), Hemisfério Sul e Elipsoide WGS84 (datum).

As coordenadas podem ser convertidas de um sistema para o outro. Existem uma série de fórmulas, longas e volumosas mas não difíceis de compreender, que convertem uma coordenada do sistema de coordenadas geográficas para o sistema de coordenadas UTM e vice-versa. As fórmulas são baseadas nas propriedades do elipsoide, na geometria do elipsoide de revolução, que serve como referência no posicionamento geodésico.

Com o intuito de tornar este artigo o mais simples possível na execução da conversão, a teoria sobre a geometria do elipsoide de revolução não está demonstrada, muito menos a origem das fórmulas. Ainda, este artigo não trata da coordenada de altitude.

Uma informação importante nos valores de uma coordenada no sistema UTM é sobre o elipsoide de referência. O elipsoide de referência serve para representar matematicamente a superfície terrestre, na forma de um elipsoide de revolução, e assim executar os cálculos e definir as coordenadas. Um dos elipsoides de referência, ou datum, mais usados é o WGS84 e é o que está sendo usado neste artigo. Conhecer o datum é importante porque, nos cálculos, as fórmulas adotam alguns valores (parâmetros) constantes e estes valores estão definidos no datum.

Assim, por exemplo, pela coordenada UTM apresentada no primeiro parágrafo deste artigo, vemos que o datum é o WGS84. Desta forma, nos cálculos desta coordenada são necessários os parâmetros do elipsoide WGS84. O relatório técnico número 8350.2 (3ª edição) da Agência Nacional de Informação Geoespacial, do Departamento de Defesa dos Estados Unidos, define os valores (parâmetros) constantes do elipsoide WGS84, que são:

- Raio Equatorial (semi-eixo maior do elipsoide) em metros:



- Achatamento polar:




Destes parâmetros, derivam-se as seguintes constantes geométricas, que também são utilizadas nos cálculos:

- Raio Polar (semi-eixo menor do elipsoide) em metros:



- Primeira Excentricidade:



- Primeira Excentricidade ao Quadrado:



- Segunda Excentricidade:



- Segunda Excentricidade ao Quadrado:




Outro detalhe é que os graus de latitude e longitude, nestes cálculos, são usados em notação decimal. Se estiverem em notação sexagesimal, o artigo "Conversão de grau decimal e sexagesimal" (http://dan-scientia.blogspot.com.br/2012/12/conversao-de-grau-decimal-e-sexagesimal.html) pode ser útil.

Ainda em relação a latitude e longitude, além dos valores em graus decimais também são necessários os valores em radianos. A conversão de graus decimais para radianos é feita com o uso das fórmulas a seguir. Neste artigo, a latitude e a longitude em graus decimais estão representadas respectivamente por "lat" e "long", e em radianos estão representadas respectivamente pelas letras gregas phi "φ" e lambda "λ".






Mais alguns valores são utilizados nas fórmulas dos cálculos:

A latitude de origem, que no UTM padrão é zero.




O fator de escala no meridiano central do fuso, para garantir um modelo mais favorável de deformação em escala ao longo do fuso.




Os valores de falso norte, que será adotado um ou outro dependendo da posição, se está no hemisfério norte ou sul, e o valor para o falso leste, sendo o valor do meridiano central do fuso. Estes valores são adotados para evitar números negativos. Os graus em notação decimal são indicados com o sinal - (negativo) quando na latitude sul (hemisfério sul) ou na longitude oeste.






Conversão de coordenada geográfica para coordenada UTM

Nesta conversão, iremos obter os valores de Easting (x), Northing (y) e o fuso, a partir da coordenada geográfica, utilizando o datum WGS84.

O fuso UTM (zone) é dado pela fórmula:




E o meridiano central do fuso, que não é um item da coordenada mas será usado nos cálculos de ambas as conversões, é dado pela fórmula:




Na obtenção dos valores de Easting e Northing começam os cálculos pesados. As fórmulas para o cálculo das coordenadas Easting e Northing são compostas de diversos termos. Para que as fórmulas não fiquem extremamente extensas, podemos resolver estes termos realizando cálculos intermediários.

O cálculo de M, comprimento do arco de meridiano, que é a distância vertical ao longo da superfície terrestre partindo do Equador até o ponto, é feito com as fórmulas (séries) a seguir. A latitude está em radianos.




Outros cálculos intermediários devem ser feitos, também relacionados as propriedades do elipsoide, como o raio da curvatura na primeira vertical ou grande normal (N).




Por fim, as fórmulas para obtenção dos valores em metros de Easting (x) e Northing (y). Os valores obtidos nos cálculos intermediários devem ser substituídos nas fórmulas a seguir.






Na anotação desta coordenada deve-se, além dos valores de x, y e fuso, incluir o hemisfério e o datum.


Conversão de coordenada UTM para coordenada geográfica

Nesta conversão, iremos obter os valores de latitude e longitude, a partir da coordenada UTM (x, y e fuso), utilizando o datum WGS84. Alguns valores utilizados serão os mesmos da conversão inversa, incluindo as constantes geométricas, a latitude de origem e o fator de escala no meridiano central do fuso.

As fórmulas para o cálculo das coordenadas geográficas também são compostas de diversos termos. Assim, da mesma forma, para que as fórmulas não fiquem extremamente extensas, podemos resolver estes termos realizando cálculos intermediários.

O cálculo de M, comprimento do arco de meridiano, que é a distância vertical ao longo da superfície terrestre partindo do Equador até o ponto, é feito com a fórmula a seguir.




O cálculo da "footprint latitude", que é a latitude do ponto no meridiano central do fuso que possui a mesma latitude, ou comprimento do arco de meridiano, que o ponto que está sendo convertido.




E mais estes termos intermediários, calculados para "footprint latitude".




Finalmente, as fórmulas para obtenção dos valores da latitude (φ) e longitude (λ). Os valores obtidos nos cálculos intermediários devem ser substituídos nas fórmulas a seguir.






A notação decimal destas coordenadas são obtidas com as fórmulas a seguir.






A conversão entre coordenadas geográficas e UTM não é tão complicada mas requer muitos cálculos. Um software matemático ou uma planilha eletrônica ajuda na velocidade de todos os cálculos, além do mais, já existem muitos sites e aplicativos que fazem estas conversões. O propósito deste artigo é somente mostrar as fórmulas, de forma simplificada pois algumas são séries.

Para mais informações sobre o UTM, leia o artigo "O Sistema de Coordenadas UTM" (http://dan-scientia.blogspot.com.br/2013/04/o-sistema-de-coordenadas-utm.html).

Bibliografia recomendada:

National Imagery and Mapping Agency Technical Report 8350.2, Department of Defense World Geodetic System 1984, Its Definition and Relationships with Local Geodetic Systems, Third Edition, January 2000.

SNYDER, J.P., Map Projections A Working Manual, U.S. Geological Survey Professional Paper 1395, Supersedes USGS Bulletin 1532, United States Government Printing Office, Washington, 1987.

sexta-feira, 26 de abril de 2013

Codificando os parâmetros de uma URL no PHP

Quando se utiliza o método GET os parâmetros de solicitação, codificados como pares de nome e valor, ficam visíveis na URL do script que trata a solicitação HTTP. Isto torna o GET menos seguro, comparado ao POST, porque os dados são enviados como parte da URL e assim, além da URL estar visível à qualquer um, pode ser adicionada no favoritos, armazenada no cache e permanecer no histórico do navegador.

Exemplo de URL com parâmetros no script PHP:

http://www.site.com/index.php?op=L&md=D&id=8

É comum utilizar parâmetros no script como meio de especificar as funções que serão executadas ou também como passagem de valores para variáveis ou funções. Se a navegação no site pode ser manipulada apenas adulterando o valor de um parâmetro na URL, ou se há alguma informação relativamente importante que precisa ser passada por parâmetro na URL, é uma boa medida proteger o site dos bisbilhoteiros. Uma solução é esconder os parâmetros da URL, adicionalmente com outras medidas de segurança.

Não quero neste artigo ditar regras de segurança para sites. Quero apenas mostrar uma solução simples e alternativa para proteger a URL, sem uso das ferramentas convencionais e sérias de criptografia. Nesta solução caseira, é usado uma combinação de comandos nativos do PHP para dar um certo efeito de criptografia.

Uma forma de esconder os parâmetros é codificá-los em caracteres ilegíveis. Somente o script que manipula a solicitação saberá decodificá-los, como se fosse uma criptografia.

Exemplo de URL com parâmetros codificados:

http://www.site.com/index.php?p=dpECApXucSffrhH0VfFOTWgfFyIErbMOTv4ZT5EEvEEWrE

Um método simples de codificação e decodificação é o Base64. O Base64 é um método para codificação de dados para transferência na Internet. Útil na transmissão de dados binários por meios que lidam apenas com texto, por exemplo, enviar arquivos por email. O Base64 codifica qualquer dado em uma sequência de caracteres dentre 64 caracteres distintos (A-Z, a-z, 0-9, + e /). Por exemplo, o texto "ola mundo", convertido para Base64 se torna "b2xhIG11bmRv". Existem diversas variações do Base64 mas não importa aqui.

Entretanto, o Base64 não é uma criptografia, é apenas uma codificação. Na codificação os dados são facilmente convertidos de uma representação para outra, sem a necessidade de uma chave, apenas do algoritmo. O algoritmo Base64 é bastante comum e seu uso é fácil de ser percebido. Usar somente ele não adiantaria muito no propósito de esconder os parâmetros.

Para camuflar o Base64 pode-se usar uma sequência de eventos em uma função que irá codificar ou decodificar a URL. Esta sequência, inventada pelo programador, fica desconhecida para quem tem acesso a página HTML apresentada no navegador pois está no código fonte do script. Praticamente uma criptografia onde a chave é o algoritmo em si.

A seguir tem um exemplo de implementação desta solução em PHP. A classe "cripto" contém as funções que irão codificar e decodificar a URL. Nelas, algumas funções nativas do PHP foram usadas para camuflar o Base64:

A função "strtr", retorna uma cópia da string, traduzindo todas as ocorrências de cada caractere do primeiro conjunto para o caractere correspondente no segundo conjunto; A função "substr" retorna a parte da string a partir do parâmetro especificado; A função "strrev" retorna a string invertida; Por fim, a função "base64_encode" codifica a string e a função "base64_decode" decodifica a string.

A ideia deste exemplo é codificar a string original, invertê-la e adicionar um prefixo aleatório, repetindo tudo isso por três vezes. Este prefixo é para confundir o resultado final, impossibilitando a decodificação direta. Como se não fosse o bastante, os caracteres da string resultante são trocados, gerando outra confusão no resultado final. Segue a classe de exemplo:

class cripto {
 
  function codificar($str) {
    $prfx = array('AFVxaIF', 'Vzc2ddS', 'ZEca3d1', 'aOdhlVq', 'QhdFmVJ', 'VTUaU5U',
                  'QRVMuiZ', 'lRZnhnU', 'Hi10dX1', 'GbT9nUV', 'TPnZGZz', 'ZGiZnZG',
                  'dodHJe5', 'dGcl0NT', 'Y0NeTZy', 'dGhnlNj', 'azc5lOD', 'BqbWedo',
                  'bFmR0Mz', 'Q1MFjNy', 'ZmFMkdm', 'dkaDIF1', 'hrMaTk3', 'aGVFsbG');
    for($i=0; $i<3; $i++) {
      $str = $prfx[array_rand($prfx)].strrev(base64_encode($str));
    }
    $str = strtr($str,
                 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
                 "a8rqxPtfiNOlYFGdonMweLCAm0TXERcugBbj79yDVIWsh3Z5vHS46pQzKJ1Uk2");
    return $str;
  }
 
  function decodificar($str) {
    $str = strtr($str,
                 "a8rqxPtfiNOlYFGdonMweLCAm0TXERcugBbj79yDVIWsh3Z5vHS46pQzKJ1Uk2",
                 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
    for($i=0; $i<3; $i++) {
      $str = base64_decode(strrev(substr($str,7)));
    }
    return $str;
  }
 
  function separar_parametros($param) {
    return explode('&',$param);
  }
 
  function separar_valor($opcao) {
    return explode('=',$opcao);
  }
 
}

No script que irá montar a página HTML, no momento da edição da etiqueta "a" ou de outra etiqueta que use uma URL, chama-se a função "codificar", da classe "cripto", para gerar a URL do atributo "href". Os parâmetros originais são transformados em um único valor para o parâmetro "p", que será coletado na solicitação. O parâmetro "p" ficará visível na URL mas seu valor estará codificado. Segue alguns exemplos de aplicação da função "codificar":

'<a href="index.php?p='.$this->cripto->codificar("op=F&md=E").'">'

'<a href="cliente.php?p='.$this->cripto->codificar("op=A&md=F&id=".$idcliente).'">'

'<button type="button" value="Cancelar" onclick="location.href=\'index.php?p='.$this->cripto->codificar("op=A&md=I").'\'">Cancelar</button>'

header("Location: index.php?p=".$this->cripto->codificar('op=L&md=C'));

Por sua vez, o script invocado pela URL deve ler o valor do parâmetro "p" que está na variável $_GET, variável predefinida que coleta valores no método GET, e executar a função de decodificar. Após a decodificação, a string com os pares originais (nome e valor) deve ser separada nos parâmetros originais e seus respectivos valores e armazenados em variáveis que serão utilizadas no decorrer do script PHP. Segue exemplo:

$cripto = new cripto;

$param = isset($_GET["p"]) ? $_GET["p"] : '';
$op = $md = $id = '';
$parametros = $cripto->separar_parametros($cripto->decodificar($param));
foreach($parametros as $opcao) {
  $valor = $cripto->separar_valor($opcao);
  if ($valor[0]=='op') $op = $valor[1];
  elseif ($valor[0]=='md') $md = $valor[1];
  elseif ($valor[0]=='id') $id = $valor[1];
}

As funções auxiliares "separar_parametros" e "separar_valor" tratam a string decodificada. A função "explode", nativa do PHP, retorna uma matriz de strings, cada uma com uma substring formada pela divisão a partir do delimitador especificado.

Esta solução funciona muito bem para o propósito. O algoritmo criado para confundir a codificação Base64 é o segredo. O sucesso vai da imaginação do programador.

Uma limitação técnica desta solução é quanto ao limite do tamanho da URL. A URL é limitada a um tamanho máximo de 2048 caracteres. Os dados codificados em Base64 ficam aproximadamente 33% maiores que os dados originais. Realizando a codificação mais de uma vez e adicionando o prefixo, o resultado é bem maior. Mas é raro precisar de uma URL tão grande.

sexta-feira, 19 de abril de 2013

A matemática e o progresso humano

O avanço tecnológico e o progresso humano estão fortemente conectados ao conhecimento matemático. A percepção desta conexão é vital para o entendimento da história do homem em sua evolução. Uma das ferramentas mais importantes da matemática são as equações. As equações são modeladas nos padrões que encontramos no mundo a nossa volta e são estas equações que nos fazem entender o sentido do nosso mundo.

O recente livro do matemático inglês Ian Stewart, intitulado "17 Equações que Mudaram o Mundo", descreve a origem de algumas equações que tiveram influência na história humana. As equações vão desde o teorema de Pitágoras, passando pelas leis de Newton, as equações de Maxwell e a teoria da relatividade de Einstein. É um livro bem interessante com uma linguagem fácil.

A edição original foi lançada em 2012, a 1ª edição brasileira é de Abril de 2013 e lançada pela editora Zahar. Esta é a capa do livro:


sábado, 13 de abril de 2013

O Sistema de Coordenadas UTM

O UTM (Universal Transversa de Mercator) é um tipo de projeção e de sistema de coordenadas no plano. É utilizado na cartografia, um importante campo de aplicação da geodésia, para dar a localização de um ponto na superfície terrestre. O UTM é baseado no modelo elipsoidal da Terra e é um dos mais utilizados no mundo.

A geodésia é a ciência que estuda a forma, a dimensão da Terra, o campo gravitacional, o espaço-tempo tridimensional e os fenômenos geodinâmicos como rotação da Terra, marés e movimentos da crosta terrestre.

A forma da Terra foi representada inicialmente por uma esfera, Pitágoras e Aristóteles foram os primeiros que expressaram esta ideia. No século 17, Newton demonstrou que o conceito de uma Terra esférica era inadequado e representou a Terra como um elipsoide de revolução, onde o eixo equatorial era maior do que o eixo polar e assim a Terra era achatada nos polos. No século 19, Laplace, Gauss e outros afirmaram que o modelo elipsoidal não era convincente e então surgiu a forma de geoide para a superfície terrestre. O geoide é uma superfície equipotencial do campo de gravidade da Terra que coincide com o nível médio dos mares. O geoide se estende através dos continentes em uma forma ondulada, se aproximando da topografia terrestre.


Os modelos de representação da Terra, com a topografia, elipsoide e geoide.

Apesar do geoide ser o modelo mais próximo do verdadeiro formado da Terra, em geodésia utiliza-se um elipsoide de referência para representar matematicamente a superfície terrestre. O modelo matemático da Terra é denominado "datum". O elipsoide de referência torna bem mais simples a execução dos cálculos e definição das coordenadas e elevação. Atualmente, um dos elipsoides de referência, ou datum, mais usados é o WGS84, servindo como base ao Sistema de Posicionamento Global (GPS).

A Cartografia é o conjunto de estudos e operações científicas, técnicas e artísticas utilizados na elaboração de mapas, cartas e outras formas de representação de objetos. O mapa é a representação no plano, em pequena escala, dos aspectos geográficos de uma área na superfície de um objeto planetário. Diferentemente, a carta é a representação em média ou grande escala, para possibilitar a avaliação dos detalhes.

Para elaborar um mapa é necessário determinar um método no qual cada ponto na superfície terrestre corresponda a um ponto no plano e vice-versa. Existem diversos métodos e estes métodos são chamados sistemas de projeções. Um sistema de projeção adota um modelo matemático do planeta e relaciona os pontos estabelecendo uma escala e um sistema de coordenadas.


Projeção cilíndrica transversa, o eixo do cilindro está perpendicular ao eixo da Terra.

As projeções cartográficas são classificadas de diversas formas. Quanto a superfície de projeção temos a cilíndrica, que é utilizada no sistema UTM na posição transversal, em relação à superfície de referência. Na posição transversal, o eixo do cilindro está perpendicular ao eixo da Terra.

Quanto ao tipo de contato entre as superfícies de projeção e referência, o sistema UTM adota a secante, onde a superfície de projeção secciona a superfície de referência. Isto vem da atribuição do fator de escala k = 0,9996 ao meridiano central do sistema UTM, que garante um modelo mais favorável de deformação em escala ao longo do fuso. Limitando o erro de escala em 1/2500 no meridiano central e 1/1030 nos extremos do fuso.


Fuso ou Zona UTM, com 6° de extensão longitudinal e seu meridiano central.

No sistema UTM a Terra é dividida em 60 fusos, ou zonas, com 6° de extensão de longitude e os fusos são numerados de 1 a 60, crescente no sentido leste a partir do fuso 180°, a 174° oeste de Greenwich. Isto é, o fuso 1 vai de 180°O até 174°O, o fuso 2 vai de 174°O até 168°O e assim sucessivamente. Cada fuso é prolongado em 30' sobre os fusos adjacentes, criando uma área de sobreposição de 1°.

O sistema UTM é utilizado somente entre as latitudes 84° ao norte e 80° ao sul. Cada fuso é segmentado em 20 faixas com 8° de extensão de latitude. São dez faixas no hemisfério norte e dez faixas no hemisfério sul. Embora não ser essencialmente adotado no UTM e sim no MGRS, uma derivação militar do UTM, as faixas são designadas por letras de C, a partir de 80°S, até X, que termina em 84°N. As letras I e O não são usadas por causa da similaridade com os números 1 e 0. A letra N é a primeira faixa do hemisfério norte, adotada por causa do "n" de norte.


O mapa UTM, com a identificação dos fusos, faixas e graus.

Os quadriculados das zonas são uniformes em todo o globo, com exceção em duas áreas. O quadriculado 32V está estendido para alcançar toda a Noruega e assim o quadriculado 31V está recuado. Os quadriculados 31X, 33X, 35X e 37X estão estendidos para cobrir a região da Esvalbarda, também pertencente à Noruega, assim os quadriculados 32X, 34X e 36X não são usados.

O ponto de origem de cada fuso é a intersecção do Equador com o meridiano central do fuso. Para evitar números negativos, é adotado o valor de 500.000 metros para o meridiano central do fuso, na linha ao longo do Equador. Os fusos possuem um alcance longitudinal de 167.000 a 833.000 metros, na altura do Equador, reduzindo em direção aos polos. Justificando os números, a Terra possui aproximadamente 40.000.000 metros de circunferência, então os fusos tem 666.666 metros de extensão longitudinal.

No hemisfério norte as posições são medidas para o norte partindo do zero ao Equador até 9.300.000 metros na latitude 84°N, na linha ao longo do meridiano central. No hemisfério sul as posições são medidas para o sul partindo do 10.000.000 metros ao Equador até 1.100.000 metros na latitude 80°S, na linha ao longo do meridiano central. Assim, nenhum ponto recebe um valor negativo.

A posição na Terra é dada pelo número do fuso (zona), as coordenadas Este (Easting) e Norte (Northing) explicitamente nesta ordem, e o hemisfério. A coordenada Este também pode ser descrita por X e a coordenada Norte por Y. Abaixo um exemplo de coordenada UTM:

X 271960,000 (Easting)
Y 7382350,200 (Northing)
Fuso 23 (Zone)
Hemisfério Sul
Elipsoide WGS84 (datum)

A coordenada acima, dada como exemplo, indica que o ponto está no fuso 23, no Hemisfério Sul, a 228.040 metros a oeste do meridiano central do fuso (500.000 - 271.960) e a 2.617.649,8 metros ao sul do Equador (10.000.000 - 7.382.350,2). O datum será útil no cálculo de conversão entre sistemas de coordenadas.

O sistema de coordenadas UTM é o sistema mais usado em projeções planas do globo terrestre. As coordenadas geográficas, em graus de latitude e longitude, são usadas na superfície esférica do globo. É possível realizar a conversão entre os sistemas, será visto em um próximo artigo.

sexta-feira, 12 de abril de 2013

Detalhamento do uso no Android

Sem necessitar de aplicativos de terceiros, apenas com as ferramentas nativas, o sistema Android possui algumas telas que mostram detalhes do uso do sistema. São detalhes do uso de dados de rede, do espaço ocupado no armazenamento dos aplicativos e demais arquivos, do uso da bateria pelos aplicativos e do uso da (memória) RAM pelos aplicativos. O acesso à estas telas é pelo ícone Configurações.

Rede:

A tela "Uso de dados" detalha a quantidade de dados transferidos por upload ou download durante um determinado período. Chega-se nesta tela pelo ícone "Configurações" e depois em "Uso de dados". Existem duas guias, uma com as estatísticas dos dados trafegados pelo serviço da operadora de telefonia móvel e outra guia com as estatísticas dos dados trafegados por Wi-Fi. Além do gráfico do volume total de dados, é exibido o consumo por aplicativo, e clicando em um aplicativo, é exibido o consumo do respectivo aplicativo durante as execuções de primeiro plano e segundo plano.



Armazenamento:

A tela "Armazenamento" detalha, além do espaço total e do espaço disponível, o espaço ocupado pelos aplicativos, pelas imagens e vídeos, pelas músicas, pelos arquivos provenientes de download, pelos dados em cache e pelos arquivos diversos. Chega-se nesta tela pelo ícone "Configurações" e depois em "Armazenamento". Tocando em cada uma das categorias, é exibido o conteúdo da respectiva categoria. Para imagens é exibida a galeria, para downloads são exibidos os arquivos etc.



Bateria:

A tela "Bateria" detalha o uso da energia pelo sistema e aplicativos. Chega-se nesta tela pelo ícone "Configurações" e depois em "Bateria". A primeira informação é a quantidade de carga ainda disponível na bateria, em porcentagem. Em seguida, tem um gráfico evolutivo do nível da bateria, com início na última vez que o aparelho foi carregado com energia externa, e o tempo que o aparelho vem funcionando sob a energia da bateria. Abaixo, uma listagem dos aplicativos que consumiram a energia da bateria neste tempo, desde a última recarga. Tocando no gráfico abre-se uma tela com maiores detalhes do histórico e a influência do hardware no consumo, como GPS, Wi-Fi etc. Tocando em um aplicativo abre-se uma tela com maiores detalhes do respectivo aplicativo e, se aplicável, botões para ajuste do uso da energia.



Aplicativos:

A tela "Aplicativos", na guia rodando, detalha todos os aplicativos, processos e serviços que estão sendo executados no momento, com sua respectiva quantidade de memória que estão usando e a quanto tempo. Chega-se nesta tela pelo ícone "Configurações" e depois em "Aplicativos". Na parte superior desta guia há um botão para alternar entre mostrar os processos em cache ou mostrar os serviços em execução. Na parte inferior há um gráfico que mostra o total de RAM usada e a quantidade livre.



Neste artigo foi usado o Android na versão 4.2.1 para descrever estas telas de detalhamento do uso. Em outras versões as telas poderão ser diferentes ou até inexistentes (em versões muito antigas). Nestes casos poderão ser úteis os aplicativos de terceiros para este fim.

domingo, 31 de março de 2013

Problema de Lógica: A balança com defeito

Francisco e sua irmã Ana estão com seu cachorro Simba na farmácia de seu tio. Na farmácia há uma balança com defeito que só mostra corretamente os pesos superiores a 50 kg. Para evitar o defeito, pesaram-se juntos dois a dois e obtiveram os seguintes pesos:

Francisco e Simba pesam juntos 88 kg;
Francisco e Ana pesam juntos 114 kg;
Ana e Simba pesam juntos 60 kg.

Qual é o peso de Francisco, de Ana e do cachorro Simba?





RESPOSTA





De acordo com o enunciado, os valores obtidos nas pesagens de Francisco (x), Ana (y) e Simba (z), dois a dois, foram:

A) x + z = 88
B) x + y = 114
C) y + z = 60

Fazendo A - B, teremos:

D) (x + y) - (x + z) = 114 - 88
D) x + y - x - z = 26
D) y - z = 26

Fazendo C - D, teremos:

E) (y + z) - (y - z) = 60 - 26
E) y + z - y + z = 34
E) z = 17

Fazendo A - E, teremos:

(x + z) - z = 88 - 17
x = 71

Fazendo C - E, teremos:

(y + z) - z = 60 - 17
y = 43

Portanto, Francisco pesa 71 kg, Ana pesa 43 kg e Simba pesa 17 kg.

domingo, 3 de março de 2013

Ajustar níveis de cor no tratamento de texto digitalizado

Um texto impresso em papel e digitalizado para um arquivo de imagem pode conter diversas interferências, que comprometam a qualidade da cópia digital. Desconsiderando o desempenho do dispositivo de digitalização (scanner), o próprio impresso pode dificultar uma boa digitalização. A cor do papel, o tipo do papel, a qualidade da impressão e até a gramatura que, quando pequena deixa o papel um pouco transparente e assim a impressão do verso torna-se levemente visível na frente. Tudo isso influencia no resultado final.

Quase sempre é preciso fazer alguma correção na imagem do texto digitalizado. Felizmente temos os softwares de tratamento de imagens, que não são somente para fotografias pois são capazes também de tratar desenhos e textos digitalizados.

Este artigo mostra uma ferramenta de cor, a ferramenta de níveis de cor, que realiza um tratamento muito bom para este tipo de imagem digitalizada. O software utilizado na demonstração desta ferramenta é o GIMP (www.gimp.org), um software gratuito com muitos recursos e disponível para Linux e Windows.

O texto é basicamente uma imagem de duas cores, a cor do fundo, que é a cor do papel, e a cor do texto, que é a cor da tinta da impressão. Apenas ajustando os níveis podemos modificar os pixels para que eles se concentrem no preto e no branco. Poderíamos converter a imagem para a paleta preto e branco de 1 bit mas nisso perderia-se a suavidade dos caracteres, ou usar a ferramenta de contraste mas esta não permite um controle preciso no nível da cor preta e da cor branca.

A ferramenta de níveis de cor proporciona uma funcionalidade semelhante a ferramenta de histograma, entretanto, pode alterar o alcance da intensidade, tornar a imagem mais clara ou mais escura, alterar o contraste e corrigir a cor predominante. No GIMP, a ferramenta de ajuste de níveis de cor está acessível pelo menu "Cores/Níveis..." (Colors/Levels).

Vamos iniciar o nosso exemplo com esta imagem de um texto digitalizado. Veja que a cor dos caracteres está fraca, o papel está acinzentado e é possível perceber a impressão do verso:


Imagem digitalizada original

Abrindo a janela da ferramenta de ajuste de níveis de cor vemos o histograma linear na imagem, nos níveis de entrada. O histograma mostra a quantidade de pixels em cada nível de cor. O eixo horizontal vai do nível 0 (preto) ao nível 255 (branco) e a quantidade de pixels por nível está no eixo vertical. A área da curva representa todos os pixels da imagem.

No histograma desta imagem original vemos dois picos, o da esquerda é referente aos pixels próximos do preto e o da direita é referente aos pixels próximos do branco. Perceba que a quantidade de pixels próximos do branco é bem maior pois a área livre (sem impressão) do papel é predominante. Os pixels próximos do preto são os caracteres. Abaixo este histograma original:


Histograma da imagem original

Não mostrarei todas as funcionalidades desta ferramenta de níveis, apenas os ajustes dos níveis de entrada, que são suficientes para o propósito deste artigo. No combo do canal deixe em "Valor", significa todos os canais.

Os níveis de entrada são ajustados pelos três triângulos deslizantes, ou pelos conta-gotas (desnecessário neste artigo), ou pelas três caixas de valor numérico. São três pontos porque o da esquerda seleciona o ponto negro, o da direita seleciona o ponto branco e o do centro ajusta o gama, o ponto médio.

Reposicionando o ponto negro faz com que todos os pixels, que possuírem este valor ou menos, tornem-se pretos. Assim, vamos posicioná-lo para alcançar todos os pixels referentes aos caracteres. Abaixo o histograma ajustado no ponto negro e a imagem digitalizada após este ajuste:


Histograma com ajuste do ponto negro


Imagem resultante

Podemos ver que os caracteres estão quase que totalmente pretos.

Reposicionando o ponto branco faz com que todos os pixels, que possuírem este valor ou mais, tornem-se brancos. Assim, vamos posicioná-los para alcançar todos os pixels referentes ao papel. Abaixo o histograma ajustado no ponto branco e a imagem digitalizada após este ajuste:


Histograma com ajuste do ponto branco


Imagem resultante

Podemos ver que o papel está completamente branco.

O que foi feito até agora foi o ajuste isolado de cada ponto, para mostrar o seu respectivo efeito. O tratamento final da imagem digitalizada está no reposicionando dos dois pontos, o negro e o branco, fazendo o ajuste em conjunto. Abaixo o histograma ajustado no ponto negro e no ponto branco e a imagem após este ajuste. Temos agora a imagem final:


Histograma com ajustes de ambos os pontos


Imagem resultante final

O texto está bem mais nítido, com o contraste adequado e o papel (fundo) sem qualquer sujeira. Volte lá na imagem original e compare com esta. Agora perfeito, não? A ferramenta de ajustes dos níveis de cor é mais eficiente em eliminar as sujeiras no papel. As vezes, existem pontos que são escuros o suficiente para confundir com os caracteres e esta ferramenta possibilita distanciá-los do preto e aproximá-los do branco.

O reposicionamento do ponto médio pode ser feito se desejar alterar o gama. Indo para a esquerda, para o preto, a imagem fica mais clara, indo para a direita, para o branco, a imagem fica mais escura. Nestes exemplos estou mantendo no 1 para evidenciar o efeito dos outros níveis.

Apenas com este ajuste dos níveis de cor podemos obter uma imagem, de um texto digitalizado, muito mais agradável para leitura. Inclusive, facilita o reconhecimento ótico dos caracteres (OCR), caso o propósito da imagem seja para este procedimento, o software não sofrerá com as interferências. Boas digitalizações!

sábado, 2 de março de 2013

Pausa em shell script

A execução de um script no interpretador de comandos do Linux (este artigo adotando o Bash) pode ser pausada por meio de dois artifícios. Um é o comando interno "read" e o outro é o comando "sleep". O "read" pode ser utilizado para esperar o pressionamento de uma tecla e o "sleep" para que espere por determinado tempo.

A seguinte linha, em determinado ponto do script, faz uma pausa na execução, neste ponto, e deixa o script esperando o pressionamento da tecla Enter:

read -p "Pressione [Enter] para continuar ou CTRL+C para sair..."

Como CTRL+C interrompe a execução do script, pode-se aproveitar para informar esta possibilidade.

Se desejar uma pausa controlada por tempo, a seguinte linha em determinado ponto do script faz uma pausa na execução por, no caso, 5 segundos:

sleep 5

O padrão para o "sleep" é em segundos mas pode-se adicionar o sufixo m para minutos, h para horas ou d para dias.

Os dígitos verificadores do CPF/CNPJ

O CPF (Cadastro de Pessoa Física) e o CNPJ (Cadastro Nacional da Pessoa Jurídica) são cadastros para identificar uma pessoa perante a Receita Federal do Brasil. O CPF possui um número com 9 dígitos, denominado raiz, e o CNPJ possui um número com 12 dígitos, raiz mais sufixo. Estes números, são complementados por dígitos verificadores (DV), totalizando 11 dígitos no CPF e 14 dígitos no CNPJ. Estes dígitos verificadores servem para conferir a integridade e autenticidade do número, evitando erros de digitação, números falsos etc. O número do CPF tem o formato xxx.xxx.xxx-vv e o número do CNPJ tem o formato xx.xxx.xxx/xxxx-vv, os dígitos verificadores são os dois últimos, nos dois cadastros.

Cada dígito verificador é calculado separadamente e o primeiro entra no cálculo do segundo. O algoritmo do cálculo é denominado Módulo 11, cada dígito verificador é gerado pelo resto da divisão por 11, e o que é dividido é o somatório dos dígitos do número e seus respectivos pesos.

Os dígitos dos números do CPF e CNPJ recebem pesos antes de serem somados. Para o CPF o peso é crescente em uma unidade de 2 em diante, até a quantidade de dígitos. Para o CNPJ o peso também é crescente em uma unidade de 2 em diante mas até 9, retornando a 2 e repetindo a sequência até a quantidade de dígitos. Esta quantidade de dígitos é ampliada no cálculo do segundo DV pois o primeiro DV entra como parte do número raiz do CPF e CNPJ.

CPF:
Pesos do 1º DV: 2, 3, 4, 5, 6, 7, 8, 9, 10      (para os 9 dígitos do número)
Pesos do 2º DV: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11  (para os 9 dígitos do número mais o 1º DV)

CNPJ:
Pesos do 1º DV: 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5     (para os 12 dígitos do número)
Pesos do 2º DV: 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5, 6  (para os 12 dígitos do número mais o 1º DV)

Os dígitos dos números recebem os pesos na ordem do menos significativo ao mais significativo, isto é, da direita para a esquerda. Então a sequência dos pesos fica invertida. Cada dígito é multiplicado ao seu respectivo peso. Os produtos são somados e então divididos por 11.

Cada dígito verificador é gerado a partir do resto desta divisão por 11. Se o resto for 0 ou 1 o dígito verificador será 0, se o resto for maior que 1 o dígito verificador será a subtração de 11 pelo resto. Esta regra é a mesma tanto no CPF como no CNPJ, o que mudam são somente os pesos.

Os exemplos a seguir mostram os cálculos dos dígitos verificadores de um número CPF e de um número CNPJ. Perceba que o primeiro peso da sequência vai para o dígito mais à direita. No cálculo do 1º DV este dígito mais à direita (menos significativo) é a unidade do número raiz no caso do CPF e a unidade do sufixo no caso do CNPJ. Já no cálculo do 2º DV o primeiro peso vai para o 1º DV, que entrou no número à direita:


CPF nº 147.258.369

(1x10)+(4x9)+(7x8)+(2x7)+(5x6)+(8x5)+(3x4)+(6x3)+(9x2)
   10 +  36 +  56 +  14 +  30 +  40 +  12 +  18 +  18  =  234

O resto da divisão de 234 por 11 é 3, portanto o 1º DV é 11-3, que é igual a 8. O CPF fica, por enquanto:

CPF nº 147.258.369-8

(1x11)+(4x10)+(7x9)+(2x8)+(5x7)+(8x6)+(3x5)+(6x4)+(9x3)+(8x2)
  11  +  40  +  63 +  16 +  35 +  48 +  15 +  24 +  27 +  16  =  295

O resto da divisão de 295 por 11 é 9, portanto o 2º DV é 11-9, que é igual a 2. O CPF completo é 147.258.369-82.


CNPJ nº 14.725.836/0001

(1x5)+(4x4)+(7x3)+(2x2)+(5x9)+(8x8)+(3x7)+(6x6)+(0x5)+(0x4)+(0x3)+(1x2)
  5  +  16 +  21 +  4  +  45 +  64 +  21 +  36 +  0  +  0  +  0  +  2  =  214

O resto da divisão de 214 por 11 é 5, portanto o 1º DV é 11-5, que é igual a 6. O CNPJ fica, por enquanto:

CNPJ nº 14.725.836/0001-6

(1x6)+(4x5)+(7x4)+(2x3)+(5x2)+(8x9)+(3x8)+(6x7)+(0x6)+(0x5)+(0x4)+(1x3)+(6x2)
  6  +  20 +  28 +  6  +  10 +  72 +  24 +  42 +  0  +  0  +  0  +  3  +  12 =  223

O resto da divisão de 223 por 11 é 3, portanto o 2º DV é 11-3, que é igual a 8. O CNPJ completo é 14.725.836/0001-68.


Estes cálculos são frequentemente utilizados em sistemas computacionais para testar a veracidade dos números. Impede erros de digitação e detecta números falsos caso alguém queira inventar um número mentalmente. Obviamente, é possível inventar fazendo todos os cálculos para os dígitos verificadores, no entanto, as pessoas normais precisam de pelo menos um lápis e um papel para isso.

Observações: Nos números de CNPJ emitidos antes de 1993 (nesta época ainda era chamado CGC), o 8º dígito (o menos significativo) é um DV módulo 10 dos sete dígitos anteriores. A partir de 1993 o CNPJ não foi mais gerado assim. Os números de CPF e CNPJ usados nos exemplos deste artigo foram inventados por mim, pela posição das teclas em meu teclado. Se estes números estão sendo utilizados por alguém, esta pessoa é sortuda, possui uma sequência de teclas.

domingo, 24 de fevereiro de 2013

Servidor de desktop remoto no Linux

O Remote Desktop Protocol (RDP) é um protocolo de rede desenvolvido pela Microsoft para acessar o ambiente de desktop de um outro computador. No sistema Windows é feito pelo Serviço de Área de Trabalho Remota (Remote Desktop Services, RDS). Um computador executando o cliente RDS acessa pela rede o desktop do computador com o servidor RDS, os controles do teclado e mouse são transmitidos ao computador cliente e a imagem do desktop é exibida em uma janela no computador cliente. Nos computadores pessoais modernos, o ambiente de desktop é a interface gráfica do sistema operacional.

No Linux, a implementação de código aberto do servidor para o RDP é o xrdp (www.xrdp.org). As principais distros fornecem o pacote de instalação em seus repositórios. Um comando como "yum install xrdp" ou "apt-get install xrdp" resolve a instalação. O xrdp é baseado no FreeRDP (www.freerdp.com), uma implementação gratuita do RDP.

O arquivo de configuração do xrdp é o "/etc/xrdp/xrdp.ini". Seu conteúdo geralmente não precisa ser alterado, mas se for preciso é bem simples, como apresentado abaixo:

[globals]
bitmap_cache=yes
bitmap_compression=yes
port=3389
crypt_level=high
channel_code=1

[xrdp1]
name=sesman-Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1


A alteração que pode ser necessária é quanto a preferência do gerenciador de janelas. Para isso, edite o arquivo "/etc/xrdp/startwm.sh" e altere a linha SESSIONS, colocando em ordem de preferência o seu gerenciador de janelas:

SESSIONS="startkde gnome-session blackbox fluxbox startxfce4 xterm"

Outra necessidade é a definição do mapa de teclado. Ela é feita pelo arquivo "/etc/xrdp/km-xxxx.ini. O LCID para o português brasileiro é o número hexadecimal 0416. Então, verifique se existe o arquivo "/etc/xrdp/km-0416.ini". Se não existir, é preciso gerá-lo com a ferramenta xrdp-genkeymap, na linha de comando:

# xrdp-genkeymap /etc/xrdp/km-0416.ini

Observações: O xrdp-genkeymap se baseia no mapa configurado no servidor do X. Não importa o número que é dado para o arquivo km-xxxx.ini, o conteúdo gerado é proveniente das configurações do X. O meu xrdp curiosamente carrega e usa o mapa do arquivo km-0409.ini (en-us), mesmo com o X configurado para ABNT2 pt-br e inclusive existindo o arquivo km-0416.ini, então eu gerei o mapa sobrescrevendo este arquivo da língua inglesa (0409). A documentação do xrdp é muito pouca para esclarecer este quesito de mapa de teclado.

Provavelmente tudo está pronto para funcionar. Existem outros arquivos para configuração, scripts etc. mas só edita-se caso queira uma personalização maior, desta forma, é só iniciar o serviço do servidor xrdp para tornar ativo:

# service xrdp start

A máquina com o servidor do RDP está pronta para receber conexões de clientes de RDP. No Linux existe o cliente "rdesktop", na linha de comando. O artigo "Serviço de Área de Trabalho Remota do Windows" (http://dan-scientia.blogspot.com.br/2010/04/servico-de-area-de-trabalho-remota-do.html) mostra o serviço no sistema Windows e a linha de comando do rdesktop para tal conexão. Este serviço de RDP é bastante útil para manutenção de sistema pela rede.

quinta-feira, 7 de fevereiro de 2013

Problema de Lógica: Metade e Dobro

Qual é a metade do dobro do dobro da metade de um número?





RESPOSTA





Vamos adotar um número para facilitar o esclarecimento, no exemplo abaixo o número 6. Assim, do fim da frase para o início:

A metade de 6 é 3.
O dobro da metade de 6 é 6.
O dobro do dobro da metade de 6 é 12.
A metade do dobro do dobro da metade de 6 é 6.

Portanto, a metade do dobro do dobro da metade de um número é o próprio número.

quarta-feira, 30 de janeiro de 2013

Localizar um Android com o AndroidLost

Este artigo complementa o meu outro artigo "Como localizar um Android perdido" (http://dan-scientia.blogspot.com.br/2013/01/como-localizar-um-android-perdido.html) onde apresentei três aplicativos que localizam um smartphone perdido.

Encontrei um aplicativo que me impressionou pela simplicidade e por ter muitas funcionalidades. O AndroidLost (http://www.androidlost.com/), disponível gratuitamente na Google Play (https://play.google.com/store/apps/details?id=com.androidlost), é uma ferramenta provavelmente melhor do que as três apresentadas no artigo anterior, pois possui mais funcionalidades gratuitas. Mas muito mais funcionalidades.

Começando pelos comandos por SMS, o AndroidLost possui muitos comandos para serem executados caso o aparelho esteja sem conexão com a Internet, ele recebe o comando por SMS e também devolve a informação por SMS. Em seguida, possui uma interface web com também muitos comandos e recebimento das informações do aparelho. Se não for o bastante, algumas respostas podem vir por e-mail, para seu e-mail pessoal.

Os comandos, além dos de praxe que são receber a coordenada geográfica, mapa com a localização, bloqueio do aparelho, limpeza dos dados, disparo de alarme etc., é possível recuperar as mensagens SMS para o e-mail, enviar SMS do seu aparelho digitando-a na interface web, exibir mensagem popup na tela do aparelho, tirar foto com a câmera e enviar o arquivo para o seu e-mail, e até pronunciar uma frase pelo sintetizador de voz do aparelho (text-to-speech), redigida na interface web.

Após a instalação do aplicativo pela Google Play, a configuração do AndroidLost é extremamente simples. De início, basta executar o aplicativo que a configuração e a conexão com os servidores da Google se completam e pronto, já está configurado e ativo. Depois, faça o login na interface web do AndroidLost, usando a sua conta do Google, e autorize o aplicativo a usar a sua conta Google. O AndroidLost usa a sua conta do Google para autenticação e controle do aparelho. A única ação manual no processo de configuração, importante, é o ajuste no sistema Android para dar permissão de administrador ao aplicativo AndroidLost. Na execução do aplicativo, em sua tela inicial, é exibido um botão com a legenda "Request Administrator rights". Clique nele e a interface do sistema, para configuração da permissão, é aberta, basta aceitar. A permissão de administrador é requerida para o AndroidLost conseguir executar ações mais intrusivas no aparelho, como bloqueio, limpeza etc.

Vale a pena ter o AndroidLost no aparelho, é simples, é bastante funcional e é bem leve no consumo dos recursos do aparelho. Outro ponto positivo é o tempo no retorno dos comandos, pela interface web é quase instantâneo. Estou usando, em conjunto com os outros aplicativos de recuperação.

terça-feira, 29 de janeiro de 2013

Wolfram Alpha

Em filmes de ficção científica já vimos muitas cenas onde um personagem faz uma pergunta a um computador super poderoso, que detém todo o conhecimento. Nos filmes mais antigos isto era nada mais que ficção, mas hoje em dia, este tipo de consulta está se tornando realidade.

Desde 2009, existe uma ferramenta computacional desenvolvida pela Wolfram Research, a mesma que desenvolve o Mathematica, chamada Wolfram Alpha. O Wolfram Alpha é um motor de busca, um serviço online, que responde a consultas e é capaz de retornar resultados de cálculos matemáticos e informações a respeito do item pesquisado. O Wolfram Alpha é baseado na plataforma computacional Mathematica, pela sua linguagem simbólica generalizada e seus algoritmos que proporcionam as bases computacionais de qualquer área, e baseado nos algoritmos de "A New Kind of Science" (NKS), um novo ramo que estuda o universo computacional. A base de dados oferecida pelo Wolfram Alpha cobre uma imensa gama de áreas do conhecimento, pra não dizer todas, ou quase.

O Wolfram Alpha funciona em diversas plataformas, mas o acesso mais fácil para o usuário comum é pelo website (http://www.wolframalpha.com/) ou pelo aplicativo para dispositivos móveis, incluindo smartphones com Android (https://play.google.com/store/apps/details?id=com.wolfram.android.alpha). Em sua interface web somos recebidos com a frase "Entre com o que você deseja calcular ou saber a respeito:" e um campo para digitar o que quiser, assim, bem simples.


A página de exemplos (http://www.wolframalpha.com/examples/) ilustra bem todo o potencial da ferramenta, é impressionante, vale a pena ver cada exemplo para conhecer a imensa capacidade. Não é uma simples pesquisa na web, são computações dinâmicas baseadas em uma vasta coleção de dados, algoritmos e métodos. Entre com um cálculo matemático, a ferramenta retorna com a resposta, o gráfico, o passo a passo da solução etc. Entre com o nome de um objeto, a ferramenta retorna suas características, suas especificações etc. É uma enciclopédia que não para de crescer. Experimente as seguintes expressões na pesquisa: "where am i?" e "what is the weather here?", preferencialmente a partir de um smartphone, os resultados são bem legais. E seu uso vai além, por exemplo, a Siri, assistente da Apple, utiliza o motor de busca do Wolfram Alpha para responder determinadas requisições dos usuários.


O Wolfram Alpha quer tornar todo o conhecimento sistemático, computável de forma imediata e acessível para todos. Hoje em dia isto é possível, pois os computadores já são poderosos o suficiente e temos a Internet para propagar a informação quase que instantaneamente. O único obstáculo é uma estrutura de algoritmos capazes de computar tudo, mas parece que este entrave já está sendo superado. Haverá um tempo onde reassistiremos Star Trek e vamos achar normal, nada futurista.