Sopa de Blogs!

O blog da Sopa de Tags!

Quinta-feira, 12 de Fevereiro de 2009

Novo site para o portfolio: BIOINFO, v2

Acabei de botar no ar a nova versão do site do Grupo de Bioinformática Estrutural, Centro de Biotecnologia/UFRGS.

Dessa vez o desafio foi maior: usar código válido em PHP 4.3 e incluir uma modalidade bilíngue automática, além de acomodar vários elementos da versão anterior do site. Como dizem por aí: do not redesign, realign!

Vejam por vocês mesmos: http://www.cbiot.ufrgs.br/bioinfo/

Marcadores: , ,

Quinta-feira, 5 de Fevereiro de 2009

C#: validando CPF

Posto abaixo um código que eu adaptei de algum lugar da web. Só me lembro que estava em javascript. Acho que o original é do Thiago Prado. Eu portei e dei uma melhorada mais estética no código. E espero que ele se auto-explique, como sempre.

Eu gostei do código do Thiago porque ele usa Arrays em vez de milhares de substrings.


public static Boolean CPF(String cpfvalue)
{
// some variables
Int32 dv, calcdv, sum, position;

// declares the cpf array
int[] cpfarray = new int[11];

// conversion to int and retrieves the dv
dv = Int32.Parse(cpfvalue.Substring(9, 2));

// populates the array with the first 8 CPF values
for (int i = 0; i <= 8; i++)
{
cpfarray[i] = Int32.Parse(cpfvalue.Substring(i, 1));
}

// calculates the 1st digit
position = 10; sum = 0;
for (int i = 0; i <= 8; i++)
{
sum += cpfarray[i] * position;
Console.WriteLine(sum.ToString());
--position;
}
cpfarray[9] = sum % 11;
if(cpfarray[9] < 2) { cpfarray[9] = 0; }
else { cpfarray[9] = 11 - cpfarray[9]; }

// now calculates the 2nd digit
position = 11; sum = 0;
for (int i = 0; i <= 9; i++)
{
sum += cpfarray[i] * position;
--position;
}
cpfarray[10] = sum % 11;
if(cpfarray[10] < 2) { cpfarray[10] = 0; }
else { cpfarray[10] = 11 - cpfarray[10]; }

calcdv = cpfarray[9] * 10 + cpfarray[10];

if(calcdv == dv) { return true; }
else { return false; }
} // end CPF

Marcadores: , , , ,

Quinta-feira, 29 de Janeiro de 2009

Criando GUIDs com PHP?

Essa é uma pergunta meio velha já. Mas não há uma resposta satisatória para ela, pelo menos no meu ponto de vista. Uma solução que resolva todos os problemas em todas as plataformas. Aponto as soluções que pesquisei e achei abaixo:

1. Para quem roda PHP no Windows
Essa é fácil. Desfaça-se do trabalho duro e deixe o Component Object Model fazer o serviço pra você, em estrondosa (1) linha de código.


$guid = com_create_guid();


A vantagem desse método, para quem tem Windows como servidor, é que o GUID gerado é pseudo-sequencial (o que ajuda muito quando usa-se um GUID como chave primária de um banco de dados).

2. PHP em qualquer plataforma com MySQL
MySQL é uma coisa linda de Deus, assim como a Avaiana de Pau. E tem uma série de funções internas que podem facilitar o trabalho do programador preguiçoso (ou esperto, como diria Larry Wall). Por exemplo, o MySQL também tem uma função chamada GUID() que gera um identificador pseudo-sequencial, usando o endereço MAC da placa de rede em Linux e FreeBSD e a data/hora do computador em Windows, Mac e Solaris.

Basta fazer todo o código de uma consulta SQL normal, mas usando a seguinte sintaxe:


SELECT GUID();


Ou então ainda mais preguiçosamente, na hora e inserir o número no banco de dados, porque não criá-lo só quando for necessário?


INSERT INTO customers(guid, nome, endereco) VALUES (GUID(), 'nome', 'endereco');


Muita gente não gosta de usar o MySQL para nada que não seja inserir, procurar, retirar e mexer nos dados. É uma boa prática, sempre, separar banco de dados da programação normal (ou seja, não parece ser uma boa idéia pela maioria usar o MySQL para guardar valores LONGTEXT compactados - sim, o MySQL tem funções para ZIP e BZIP), deixando programação com a página ou script, e o banco apenas armazenando e manipulando informação.

3. Hardcore-PHP, para quem não tem preguiça
É possível também criar um script em PHP que faça todo o trabalho duro. Mas atenção: esse número deixa de ser pseudo-sequencial, como veremos logo adiante. Eu comentei o código direto abaixo, e espero que ele seja auto-explicativo.

A função tem apenas um parâmetro, $WinStyle (true/false), para saber se o GUID gerado virá com os {} ou não.

A mágica dela resume-se em usar a função uniqid() e fazer um hash MD5, de modo a obter uma sequência de 32 caracteres.



function createGUID($WinStyle) {
/*
description:
creates a GUID-like value, using md5 hash, the uniqid() function and the Mersenne Twister Random
number generator, in order to make it harder to predict the value (the uniqid() function is time-based).
returns the GUID as a string 36-character lengthy (32 numbers plus four em-dashes like '-');

the $WinStyle parameter is for Windows-style GUIDs, with {} after and before the GUID value
and all the characters to uppercase.

In order to avoid multiple substrings, I tried to use regular expressions, reducing the number of
code lines from 8 to 3 ONLY for partioning the $number. Adieu, substrings!
*/

//creates the random number with a 32-hex-character pattern
$number = md5(uniqid(mt_rand(), true));

/*
defines the pattern of the Perl-compatible reg. expression for a GUID
this patter means: any character from a to f or 0 to 9 in a group of 8, then 4, 4, 4 and 12.
So, ([a-fA-F0-9]{8}) neans 8 characters without spaces, being from a-f (or A-F) and/or 0-9
any of the between-parenthesis pattern is stored in a temporary variable $n, so, $1 would be the
first-matched pattern (8-char long), and so on.
the replacement is only the 5 patterns with dashes between them.
*/

$preg_pattern = '/([a-fA-F0-9]{8})([a-fA-F0-9]{4})([a-fA-F0-9]{4})([a-fA-F0-9]{4})([a-fA-F0-9]{12})/';
$preg_replacement = '$1-$2-$3-$4-$5';
$guid = preg_replace($preg_pattern, $preg_replacement, $number);

if($WinStyle === true) {
//exclusive format for windows-style GUID, otherwise it leaves the way it is.
$guid = '{' . strtoupper($guid) . '}';
}

return $guid;
} //end createGUID


Claro que esse código pode ser melhorado. Mas aí estão algumas alternativas.

Marcadores: , ,

Sopa de Blogs!, o blog da sopa de <tags>!

Saiu o blog da Sopa de <tags!>. Resolvi chamá-lo de Sopa de Blogs! Nada mais pseudo-criativo.

Esperem desse blog muitas e poucas coisas.

Até o próximo post,