ZendCasts

30/06/2009

Esse post é quase um twitt, huahuahahu.
Para você que está estudando o Zend Framework, recomendo o site ZendCasts que possui excelentes screencasts sobre Zend Framework:
http://www.zendcasts.com/

A comparação de strings é tarefa rotineira na vida de qualquer programador. Acredito que a maioria dos programadores PHP desconheçam ou simplesmente ignorem as funções de comparação de strings e acabam realizando a comparação como se estivessem comparando números, como no exemplo abaixo:

$var1 = 'A';

if($var1 == 'A') {
    echo $var1.' igual A';
}

O que acontece nesse caso é que o PHP transforma os caracteres em números inteiros e realiza a comparação desses números.
Uma maneira melhor é utilizar as funções específicas de comparação como strcasecmp e strcmp. Essas funções são uma forma de fazer comparação de strings segura para binário, o PHP converte as strings em sua forma binária e compara os binários.
Ambas retornam um número inteiro, menor que 0 se string1 é menor do que string2, maior que 0 se string1 é maior do que string2 e 0 se as duas forem iguais.

A função strcasecmp compara duas strings sem diferenciar maiúsculas e minúsculas.

$var1 = 'A';
$var2 = 'a';

//comparacao case insensitive
if(strcasecmp($var1, $var2) == 0) {

    echo $var1.' (igual) '.$var2; //Imprime 'A igual a'
}

A função strcmp compara duas strings diferenciando maiúsculas e minúsculas.

//comparacao case sensitive
if(strcmp($var1, $var2) != 0) {

    echo $var1.' (diferente) '.$var2; //Imprime 'A diferente de a'
}

$var1 = 'A';
$var2 = 'B';

//comparacao case sensitive
if(strcmp($var1, $var2) != 0) {

    echo $var1.' (diferente) '.$var2; //Imprime 'A diferente de B
}

uhahuahuuhaahuhuahuhuahuhua

Eu aqui fazendo trabalho da facul, como todo bom nerd que se preze, programando em pleno domingão, quando uma amiga me manda um link, falando que viu algo engraçado no domingão do faustão… eu abro o vídeo, vejo um pouco e choro de dar risada hahahaahha

Enquanto o bonitão tá na balada te chifrando
O nerd com certeza está em casa estudando
O curso superior do gostosão tá no início
E o nerd ganha em dólar no Vale do Silício…

Vou mostrar a utilização de algo muito simples e de grande valia para aplicações web, o uso de um cabeçalho expires (expires header).
Toda vez que você acessa uma página na web, os dados trafegam pela rede, do servidor até o cliente. Muitas vezes as imagens, javascripts, css, html e etc trafegam desnecessariamente. Você pode diminuir o tráfego na rede, fazendo com que toda ou parte da sua aplicação se mantenha no cache do cliente, ou seja, fique armazenada no computador do usuário.
Cada servidor tem sua configuração específica, as vezes o próprio server é configurado para setar o tempo de expiração dos elementos.
Podemos setar a data de expiração de determinada página, manipulando seu cabeçalho.
Utilizando o código abaixo em uma página PHP, a data de expiração da página é da hora atual mais 5 minutos, obviamente que se sua página não tem atualizações frequentes você deve aumentar esse tempo, para dias ou meses, etc.

<?php
header("Expires: ".gmdate('D, d M Y H:i:s', strtotime('+5 minutes')));
?>

Você também pode especificar a data de controle do cache, alguns servers por padrão utilizam no-cache, isso faz com que o conteúdo seja baixado a toda requisição.
Esse exemplo especifica o controle do cache para 1 ano.

<?php
  header("Cache-Control: max-age=".strtotime('+365 days'));
?>

O que são prepared statements?

Prepared statment serve para setar uma consulta e executá-la várias vezes com parâmetros diferentes. São desenvolvidos para queries ad hoc, são mais seguros e mais eficientes. Segue um exemplo simples:

SELECT * FROM cidade WHERE idCidade = ?

O ? (ponto de interrogação) é chamado de placeholder. Quando a consulta acima for executada é necessário passar um valor, que será substituído pelo ? na consulta.

Por que usar prepared statements?

Existem numerosas vantagens em usar prepared statements em suas aplicações, por duas razões: segurança e performance.

Os prepared statements podem ajudar a aumentar a segurança, pois separam SQL lógico dos dados fornecidos pela aplicação. Essa separação ajuda a previnir uma série de vulnerabilidades conhecidas como Ataques de SQL Injection. Normalmente quando se recebe valores de uma aplicação em uma query ad hoc, você precisa ter muito cuidado com o dado recebido, para isso é necessário utilizar algumas funções de escape de caracteres, como escape de aspas simples, aspas duplas, barras, etc para garantir que nenhum usuário malicioso consiga injetar código na sua query. Quando se está utilizando prepared statments isso não é necessário, a separação dos dados permite que o MySQL automaticamente leve em conta esses caracteres e eles não precisam ser escapados por nenhuma função especial.

O crescimento de performance nos prepared statements podem vir de algumas características diferentes. Primeiro é a necessidade de parsear a consulta apenas uma vez. O MySQL vai parsear a consulta na primeira vez para checar a sintaxe e setar a consulta para ser executada. Então, se você executar a consulta várias vezes, ele não vai precisar ter esse trabalho novamente. Esse pre-parsing pode causar um aumento de velocidade se você precisar executar a consulta várias vezes, como por exemplo quando se precisa fazer vários INSERTs.
A segunda coisa que pode ser mais rápida é que os prepared statments podem utilizar um protocolo binário. O protocolo tradicional utilizado pelo MySQL sempre converte tudo em strings antes de mandar pela rede. O protocolo binário resolve esse problema, todos os tipos são enviados na sua forma binária nativa, o que economiza tempo de conversão da CPU e pode diminuir o tráfego na rede.

Quando você deve utilizar prepared statments?

Os prepared statements podem ser utilizados para uma infinidade de razões, mas não devem ser utilizados em toda sua aplicação. Algumas vezes podem ser mais lentos que uma consulta normal. A razão é que existem dois round-trips (”idas”) para o servidor, o que pode comprometer a performance para consultas que são executadas apenas uma vez. Cabe ao desenvolvedor decidir se compensará ter impacto na performance para ganhar mais segurança.

Considerações finais

Prepared statments são recursos muito bons de banco de dados quando utilizados adequadamente, podem aumentar performance e segurança.
Esse texto é uma tradução adaptada do texto de Harrison Fisk.
O artigo original pode ser encontrado em
http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

Xdebug é uma extensão para PHP que como o próprio nome sugere, serve para auxiliar no debug de scripts PHP.

Para instalar o Xdebug no Ubuntu siga os seguintes passos: (considerando que o apache e o php já estão instalados)

sudo apt-get install php5-dev php-pear
sudo pecl install xdebug

No meu caso o xdebug ficou em:
/usr/lib/php5/20060613+lfs/xdebug.so

Para que o php considere o uso da extensão, o arquivo de inicialização php.ini deve ser editado
sudo gedit /etc/php5/apache2/php.ini
acrescente:
zend_extension=”/usr/lib/php5/20060613+lfs/xdebug.so”

E agora basta reiniciar o apache:
sudo /etc/init.d/apache2 restart

Você pode acrescentar algumas linhas de configurações no php.ini, como por exemplo:
xdebug.default_enable = On
xdebug.dump.GET=*

Lembrando que você pode utilizar as funções do Xdebug dentro da sua aplicação, para depurá-la melhor e medir performance também. Para mais detalhes consulte a documentação do Xdebug em http://www.xdebug.org/docs/

Quando vamos criar uma base de dados, necessitamos de muito conhecimento e planejamento para garantirmos confiabilidade, performance e organização dos dados, já que a informação na maioria dos casos tem valor inestimável. Muitas pessoas, assim como eu, se deparam com situações inusitadas a cada dia, principalmente se tratando de banco de dados. As vezes possuímos dúvidas com assuntos teoricamente comuns e/ou rotineiros.

Acredito que muitas pessoas que utilizam um banco de dados, como por exemplo o MySQL, já se depararam com alguma dúvida referente a chaves estrangeiras, quanto a modelagem do banco: Qual tipo de relacionamento utilizar?

Quem usa a ferramenta MySQL Workbench, muito provavelmente já notou que existem dois tipos para os relacionamnetos 1:1 e 1:n, os identificados e os não identificados. Fazia algum tempo que tinha essa dúvida, hoje resolvi procurar a respeito e encontrei a resposta:

O relacionamento identificado é para quando a tabela que busca a referência, vai ter o campo da chave estrangeira também como chave primária.

identifying relationship

O relacionamneto não identificado é para quando a tabela que busca a referência, não vai ter o campo da chave estrangeira como chave primária. 

non-identifying relationship

Programador

2/05/2009

No post de hoje, vou tentar descrever o meu conceito sobre a profissão de Programador. Deixo claro que estou me referindo a programador de computador, desenvolvedor de software.

Programador é o profissional do ramo da computação que tem como tarefa principal a codificação de programas. O computador é uma máquina que processa dados, (recebe dados -> processa esses dados -> gera um resultado) dessa forma tem como principal finalidade auxiliar os seres humanos a resolver problemas do mundo real, através do mundo virtual. Para isso é necessário que o computador “saiba” como ele deve proceder para executar determinada tarefa pré-estabelecida. O trabalho do programador é exatamente esse. Simplificadamente falando, programar é setar uma série de instruções para que o computador possa “saber” como ele deve proceder com os dados e gerar um resultado que resolve e/ou auxilia em determinado problema, seguindo determinada lógica.
Basicamente o programador deve abstrair o problema do mundo real e transportá-lo para o mundo virtual, gerando uma solução para tal, através da codificação de um programa utilizando-se de uma linguagem de programação.
O programador deve possuir algumas habilidades bem desenvolvidas, como o raciocínio lógico e matemático.
Atualmente é exigido que esse tipo de profissional seja polivalente, dominando áreas de conhecimento que vão além das ciências exatas.
Muitas vezes o programador pode desempenhar outros papéis, como por exemplo o de Analista de Sistemas.

Chegando no trabalho hoje, fui surpreendido com a seguinte informação:

A Oracle comprou a Sun

Caramba! Até outro dia estava uma expectativa se a IBM compraria a Sun, mas quem comprou mesmo foi a Oracle.

What does Oracle plan to do with MySQL?
MySQL will be an addition to Oracle’s existing suite of database products, which already includes Oracle Database 11g, TimesTen, Berkeley DB open source database, and the open source transactional storage engine, InnoDB.

Fiz uma tradução, não está das melhores, mas “dá pra ler”

O que a Oracle planeja fazer com o MySQL?
O MySQL será um complemento a suíte de produtos de banco de dados existente da Oracle, que já inclui Oracle Database 11g, TimesTen, Berkeley DB banco de dados open source, e da open source storage engine, InnoDB.

Bom, nos resta agora esperar e ver qual será o futuro do nosso MySQL.

Esse não é um post de verdade, hahahah, talvez seria melhor publicalo no Twitter, mas aqui estou e vai aqui mesmo.

Provavelmente você já ouviu falar sobre versionamento, melhor dizendo, controle de versões. Existem alguns controladores de versão, como o SVN por exemplo, embora tenha realmente me surpreendido com o GIT. Prometo quando tiver com mais tempo fazer um post a respeito do GIT, agora só vou mostrar o comando para instalá-lo no Ubuntu:

sudo apt-get install git-core