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: