Notícias e links – 28/02

28 02 2007

Pear releases
Net_CDDB 0.3.0

Pecl releases
hidef 0.1.0

PHP at Java One
Andi Gutmans estará no Java One – maior evento sobre Java do mundo, palestrando sobre o tema “PHP and Java Technology Integration”. Que coisa…

XML for PHP developers, Part 1: The 15 minute PHP with XML starter
Artigo com uma introdução ao uso de XML para desenvolvedores PHP. Inicia com o básico de XML, escrevendo e explicando a estrutura de um documento, mostrando pontos fortes e fracos, comenta sobre DOM e SimpleXML – duas extensões que PHP possui para manipulação de XML, mostrando alguns exemplos de uso de ambas extensões.
Artigo bastante interessante. Por ser apenas uma introdução, não chegou a falar de XPath, o que poderia deixar mais claro como pode ser interessante utilizar XML em projetos dos mais variados tipos.

Introducing the Strategy Pattern
Artigo falando sobre o design pattern “strategy”, dividido em quatro partes, passa por uma introdução ao design pattern, demonstra alguns exemplos básicos dele e finaliza com um exemplo de funcionamento.

Introducing the Flyweight Pattern with PHP 5
Artigo do mesmo autor do artigo, anterior, falando sobre mais um design pattern. Segue a mesma estrutura do artigo anterior…

JSON Basics
Artigo falando sobre JSON. Pode ser bastante útil para quem pretende utilizar ou já utiliza Ajax.





“pog space”: Cotação do dólar em PHP

27 02 2007

Não estava precisando, mas resolvi escrever um script para obter a cotação do dólar junto ao banco central. E se tem algo que realmente eu consigo gostar menos do que debian isso é expressão regular. Nestes momentos de ira, utilizo a boa e velha POG para relaxar:


<?php
$url
= ‘http://www.bcb.gov.br/htms/infecon/taxas/taxas.htm’;

preg_match(
‘/<td ALIGN=CENTER class=”fundoPadraoBClaro2″>.*<\/td>/’
, file_get_contents($url),
$info);

list ( $d, $c, $v ) = explode (‘</td>’, $info[0]);


$data = strip_tags($d);
$compra = strip_tags($c);
$venda = strip_tags($v);


echo
sprintf(
‘Em %s: Compra: %s, Venda: %s %s’,
$data,
$compra,
$venda, “\n”);

$ php dolar.php
Em 26/02/2007: Compra: 2,0855, Venda: 2,0863

Ai está, agora quando precisar já tenho…





PHP keywords – Parte 1

26 02 2007

PHP, assim como outras linguagens, possui diversas palavras-chave e construtores de linguage, muitos deles bastante utilizados e outros talvez até desconhecidos.

Vejamos então uma lista com estas palavras-chave e construtores e para que servem ou como utiliza-los

  • echo

Diferentemente do que muitos pensam, “echo” não é uma função, mas sim um construtor da linguagem. É utilizado para exibir uma ou mais strings:

<?php
echo ‘Ola ‘, ‘mundo ‘;

echo (“cruel\n”);
?>

  • print

Da mesma forma que “echo” não é uma função, “print” também não é. As principais diferenças entre “echo” e “print” são:
- “print” retorna um valor (sempre 1) e “echo” não retorna
- “echo” pode exibir mais do que uma string, e “print” não (echo ‘Ola ‘, ‘mundo ‘;)

<?php

    print ‘Ola ‘;
    print ‘mundo ‘;
    print (“cruel\n”);

    // note que
    // print ‘Ola ‘, ‘mundo ‘;
    // nao funciona
?>

  • die e exit

“die” é um alias (apelido) para exit. “exit” serve para finalizar um script:

<?php
    if(!file_exists(‘/etc/blablabla’))
        exit(2); // finaliza o script, com status = 2 (file not found)

    echo “Eu nao serei exibido”;
?>

$ php exit.php
$ echo $?
2
$

<?php

    if(!file_exists(‘/etc/blablabla’))

        exit(“Arquivo nao encontrado\n”); // finaliza o script exibindo uma mensagem

    echo “Eu nao serei exibido”;

?>

$ php exit.php
Arquivo nao encontrado

$ echo $?
2
$

“exit” também não é uma função.

  • if, else, elseif e endif

“if”, “else” e “elseif” não precisam de uma explicação, pois são realmente simples e bastante utilizados. “endif”, ao contrário, não é muito. É utilizado na sintaxe altenativa de “if”:

<?php
    if ( 1 == 2 ):
        echo “Fim do mundo\n”;

        exit(42);
    else :
        echo “Tudo certo\n”;
    endif;

?>

  • for e endfor

Assim como o “if”, “for” é bastante utilizado e não necessita uma explicação e também possui uma sintaxe alternativa:

<?php
    for ( $cont = 0; $cont != 10; $cont++ ):

        echo $cont;
        echo “\n”;
    endfor;

?>

  • while e endwhile

Assim como o “if” e o “for”, o “while” também é bastante comum e possui uma sintaxe alternativa:

<?php
    $cont = 0;

    while($cont++ < 10):
        echo $cont;
        echo “\n”;

    endwhile;
?>

$ php while.php
1
2
3
4

5
6
7
8
9
10

  • foreach, as e endforeach

“foreach” é utilizado para fazer passar por todos os ítens de um array. E, como os citados anteriormente, também possui a sintaxe alternativa:

<?php
    $sos = array(‘windows’, ‘fbsd’, ‘plan9′, ‘linux’);

    foreach ( $sos as $so ):
        echo $so;
        echo “\n”;

    endforeach;
?>

$ php foreach.php
windows
fbsd
plan9
linux

É possível obter também o índice do ítem corrente do array sendo iterado:

<?php
    $paises = array(‘Brasil’, ‘Argentina’, ‘Paraguai’);

    // utilizando a forma mais comum de foreach

    foreach ( $paises as $indice => $pais ) {
        echo $indice;

        echo ‘ – ‘;
        echo $pais;
        echo “\n”;

    }
?>

$ php foreachi.php
0 – Brasil
1 – Argentina
2 – Paraguai

  • switch, case, default e endswitch

“switch”, “case” e “default” tem o uso bastente difundido também. Já endswitch não costuma ser muito utilizado:

<?php
    $cidade = ‘Curitiba’;

    switch ( $cidade ):

        case ‘Sao Paulo’:
            echo “Nao foi uma boa escolha\n”;

        break;

        case ‘Rio de Janeiro’:
            echo “Nao possui amor a vida ?\n”;

        break;

        case ‘Curitiba’:
            echo “Boa escolha\n”;

        break;

        // opcao padrao, caso nao se encaixe em nenhuma das anteriores
        default:
            echo “Nenhuma da opcoes\n”;

        break;

    endswitch;
?>

$ php switch.php
Boa escolha

  • do-while

“do-while” é bem menos utilizado do que o “while”. A diferença entre ambos é que no “do-while” a expressão condional é executada após cada iteração, e não antes:

<?php

    $cont = 1;
    do {
        echo $cont;

        echo “\n”;

    } while($cont++ < 10);
?>

$ php dowhile.php
1
2

3
4
5
6
7
8

9
10

  • break

“break” é utilizado para finalizar a execução de um bloco “switch”, “for”, “while”, “do-while” ou “foreach”:

<?php
    $cidade = ‘Curitiba’;

    switch ( $cidade ) {

        case ‘Curitiba’:
            echo “Boa escolha\n”;

        case ‘Curitiba’:

            echo “Curitiba novamente\n”;
        break;

        case ‘Sao paulo’:

            echo “Nao tao boa escolha\n”;
        break;

        case ‘Curitiba’:

            echo “Terceira vez Curitiba\n”;
        break;

    }
?>

$ php break.php
Boa escolha
Curitiba novamente

“break” pode ser utilizado também com um argumento númerico, que indica o nível do bloco que deve ser interrompido:

<?php

    for ( $x = 0; $x < 10; $x++ ) {

        for ( $y = 0; $y < 10; $y++ ) {

            echo “$x * $y = “;

            echo $x * $y;

            echo “\n”;

            if ( $x == 2 ) break 2;

        }
    }

?>

$ php breakn.php
0 * 0 = 0
0 * 1 = 0

0 * 2 = 0
0 * 3 = 0
0 * 4 = 0
0 * 5 = 0

0 * 6 = 0
0 * 7 = 0
0 * 8 = 0
0 * 9 = 0
1 * 0 = 0

1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4

1 * 5 = 5
1 * 6 = 6
1 * 7 = 7
1 * 8 = 8
1 * 9 = 9

2 * 0 = 0

  • continue

“continue” é utilizado no interior de loops, para parar a execução, retornar para o começo do bloco da estrutura de comandos e começar uma nova iteração.

<?php
    // exibindo numeros impares
    for ( $cont = 1; $cont < 10; $cont++ ) {

        // resto da divisao de $cont por 2. Se for = 0, o numero e’ par,
        // deve retornar para o inicio do loop
        if ( $cont % 2 == 0 ) continue;

        echo $cont.“\n”;
    }
?>

$ php continue.php

1
3
5
7
9

Continue pode ser utilizado também em “foreach”, “while”, “do” e “switch”. Vale observar que “switch” é considerado uma strutura de looping para o “continue”.
E assim como o break pode ser utilizado com um argumento número para indicar o nível que do bloco que deve ser interrompido, o continue também pode utilizar este argumento, tendo o funcionamento análogo:

<?php

    for ( $cont = 1; $cont < 5; $cont++ ) {

        for ( $cont2 = 1; $cont2 < 10; $cont2++ ) {

            if ( $cont2 == 3 ) continue 2;

            echo “$cont * $cont2 = “;

            echo $cont * $cont2;
            echo “\n”;

        }

    }
?>

$ php continuei.php
1 * 1 = 1
1 * 2 = 2

2 * 1 = 2
2 * 2 = 4

3 * 1 = 3
3 * 2 = 6
4 * 1 = 4
4 * 2 = 8

Nesta primeira parte ficamos nisso.





Cadastro com confirmação por email

26 02 2007

O leitor Erick de Oliveira nos pediu um tutorial sobre cadastro com
confirmação por email. Irei demonstrar de maneira bem simples e rápida uma
maneira de como criar um cadastro desse tipo e tentar sugerir algumas idéias.
Os exemplos irão usar o MySQL como database.
Aproveitando o embalo de já estar falando de MySQL, vamos construir então a
tabela que nos auxiliará nessa tarefa:


create table cadastro (
id_cadastro int not null primary key auto_increment,
nome varchar(50),
email varchar(50),
login varchar(30),
senha varchar(32),
data_ts varchar(14),
uid varchar(50),
ativo bool default 0
);

Nessa tabela, serão salvas as informações básicas de login do usuário. Quero
chamar atenção especial para os campos ‘data_ts’, ‘uid’ e ‘ativo’. Esses serão
os campos que usaremos como controle, para validar o usuário, após ele receber
o email de confirmação de seu cadastro.
O campo uid, irá armazenar um id unico, gerado pela função uniqid do
PHP, e esse id será usado em conjunto com o campo de data_ts, para validarmos
o cadastro do usuário, e ativarmos a sua conta. É mais simples de explicar
como funcionará, mostrnado um pouco de código.
(Obs: Não irei me preocupar aqui, em verificar se o login já não está em uso
no sistema por alguém, ou se as informações foram corretamente preenchidas, já
que a ideia aqui é demonstrar como validar o cadastro através de um email de
confirmação).

Cadastro.php


<?php

// Vou assumir que o arquivo conectar.php existe, e que ele e o responsavel
// por se conectar a seu database
include_once('conectar.php'); 

// Vou assumir que os campos foram preenchidos todos corretamente
// e que ninguem vai tentar se aproveitar do formulario para SQL Injection
// ou coisas do genero

if( isset( $_POST['enviar'] ) ) {

    $nome $_POST['nome'];
    
$email $_POST['email'];
    
$login $_POST['login'];
    
$senha md5$_POST['senha'] );
    
$uid uniqidrand( ), true );
    
$data_ts time( );
    
$ativo 0;

    $sql "insert into cadastro ( id_cadastro, nome, email, login, senha,
data_ts, uid,
ativo ) "
;
    
$sql .= "values
('', '$nome','$email','$login','$senha','$data_ts','$uid','$ativo')"
;

    if( ! mysql_query$sql ) ) {
        echo 
"Houve um erro inserindo o registro ".mysql_error( );
    } else { 
// Registro inserido com sucesso, mandar email

        $id mysql_insert_id$con );

        // Criar as variaveis para validar o email
        
$url =
sprintf'id=%s&email=%s&uid=%s&key=%s',$idmd5($email), md5($uid),
md5($data_ts)
);

        $mensagem 'Para confirmar seu cadastro acesse o link:'."\n";
        
$mensagem .= sprintf('http://www.dominio.com.br/ativar.php?%s',$url);

        // enviar o email
        
mail$email'Confirmacao de cadastro'$mensagem );

        echo "Registro inserido com sucesso";
    }
}

?>

<form method="POST">

    Nome:<input type="text" name="nome"><br>
    Email:<input type="text" name="email"><br>
    Login:<input type="text" name="login"><br>
    Senha:<input type="password" name="senha"><br>
    <br>
    <input type="submit" name="enviar" value="Cadastrar">

</form>

O formulário é bastante simples, e eu gostaria de dar destaque a linha:
$url = sprintf( ‘id=%s&email=%s&uid=%s&key=%s’,$id, md5($email), md5($uid),
md5($data_ts) );

Veja que essas são as variáveis que identificam o usuário que acaba de se
cadastrar. Quando a url para validação for acessada, iremos conferir se o os
dados de unique id e a data conferem com o email especificado, para poder
então ativar o cadastro. O email e data, são passados como hash md5, para
proteger essas informações de quem as possa estar vendo. A variável id
é quem identificará com qual registro na tabela essas informações devem ser
comparadas. O registro será ativado, apenas caso todas as informações
cadastradas sejam iguais as informações vindas pela URL, dessa forma, se
alguém tentar ativar um cadastro sem ser o verdadeiro dono da informação, não
poderá faze-lo, a menos que conheça o segundo exato em que o cadastro foi
feito, o email no qual o cadastro foi feito e a unique id do usuario.
Vamos ver então, como fica o código para ativar o cadastro.

Ativar.php


<?php

// Novamente, nao irei fazer nenhum tipo de checagem para validar os dados
// em busca de SQL Injection ou coisas do genero. Nao se esqueca voce de fazer
// isso.

// Conectar no banco de dados
include_once('conectar.php');

// Dados vindos pela url
$id $_GET['id'];
$emailMd5 $_GET['email'];
$uidMd5 $_GET['uid'];
$dataMd5 $_GET['key'];

//Buscar os dados no banco
$sql "select * from cadastro where id_cadastro = '$id'";
$sql mysql_query$sql );
$rs mysql_fetch_array$sql );

// Comparar os dados que pegamos no banco, com os dados vindos pela url
$valido true;

if( $emailMd5 !== md5$rs['email'] ) )
    
$valido false;

if( $uidMd5 !== md5$rs['uid'] ) )
    
$valido false;

if( $dataMd5 !== md5$rs['data_ts'] ) )
    
$valido false;

// Os dados estão corretos, hora de ativar o cadastro
if( $valido === true ) {
    
$sql "update cadastro set ativo='1' where id_cadastro='$id'";
    
mysql_query$sql );
    echo 
"Cadastro ativado com sucesso!";
} else {
    echo 
"Informacoes invalidas";
}

?>

A partir daí o cadastro já pode ser ativado. Agora quando o usuário for se
logar no sistema, basta verificar se o valor do campo ativo na tabela
para aquele usuário, vale 1. Caso sim, significa que o usuário já teve sua
ativação realizada.

Espero que o texto possa ter ajudado, e qualquer dúvida, basta deixar um
comentário ai : )
Abaixo estão os links para os arquivos com os códigos dos exemplos, pois o
WordPress faz o favor de estragar as aspas, e consequentemente o código : |

[]s

Cadastro.txt
Ativar.txt





Notícias e links – 25/02

25 02 2007

Pear releases
Net_MPD 1.0.1
Net_LDAP 0.7.1
Services_Technorati 2.0.0alpha1
Math_Derivative 1.0.0RC1
pearweb 1.8.0
File_MARC 0.1.2
Structures_LinkedList 0.1.3
Net_MAC 0.1.2

Pecl releases
zip 1.8.6
APC 3.0.13
pecl_http 1.5.2

PHPExcel
Release da versão 1.0 do PHPExcel. Atualmente cria planilhas apenas no formato do excel 2007 (e também as lê). Possui diversos outros features e promete ser uma boa alternativa à outros projetos existentes.

Going deep inside PHP sessions
Artigo bastante completo falando sobre sessões em PHP. Mostra, entre outras coisas, um passo a passo para a criação de um manipulador de sessões customizado e mais seguro que o padrão.

Coding PHP Mailboxes (Part 1)
Primeira parte de um artigo cobrindo o desenvolvimento de uma aplicação para acesso à caixas de email utilizando IMAP. É visto desde como instalar e conectar à um servidor IMAP, passando por como obter informações das mensagens contidas na caixa de email e finalizando com a sua exibição.

Syntax checking for PHP in Emacs
Para quem utiliza emacs para desenvolver em PHP, uma dica de como habilitar checagem de sintaxe on-the-fly.
Quem sabe futuramente surja também uma apresentação ao mesmo nível da VIM for (PHP) Programmers

SOAP vs REST
Compilação com diversos links comparativos de SOAP e REST.
Utilizo frequentemente SOAP ( Pear para criar webservices e a extensão do PHP para consumir ) e não me aventurei ainda com REST. Quem sabe brevemente…





Vídeos: Vancouver conference 2007

23 02 2007

Dois vídeos da conferência ocorrida nos dias 12 e 13 de fevereiro:PHP Tips and tricks
(seria mais simples se fosse um slideshow…)

Future of Open Source Software Panel






Notícias e links – 22/02

23 02 2007

Pear releases
MDB2_Schema 0.7.1
pearweb 1.7.0 (pulou do 1.6.3 para o 1.7)
Structures_DataGrid_Renderer_Flexy 0.1.1

Pecl releases
swish 0.2.0
pecl_http 1.5.1

PHP 6 and Request Decoding
“Hope this has been a useful preview of this very important part of PHP 6. Once this functionality is complete, we can finally make the Unicode preview release. Stay tuned.”

Zend Framework 0.8.0 Released
Entre outras coisas, correção de bugs, adição de novos componentes e aumento de performance de componentes antigos, além de ter movido diversos componentes da incubadora para o core do framework.

Distributed Testing with PHPUnit 3.1
Exemplo de uso de testes distribuídos usando PHPUnit 3.1 (que será lançado brevemente, atualmente se encontra na versão 3.0.4)

Taking a look at ten different PHP frameworks
Artigo de março de 2006, fazendo uma pequena análise de 10 diferentes frameworks para PHP ( Zend, CakePHP, Symphony, Seagull, WACT, PRADO, PHP on TRAX, ZooP, eZ Components e CodeIgniter ). Apesar de já ter quase um ano, vale a pena uma lida.

User Authentication and PHP Security
Artigo dividido em 4 partes falando sobre autenticação e segurança em PHP.
Na primeira parte o autor descreve o que é autenticação e comenta sobre dois métodos de efetiva-la, fala sobre ataques mais comuns na segunda e na terceira parte, e finaliza falando sobre a importância de se utilizar SSL em durante o processo de autenticação. Para quem está iniciando o desenvolvimento de aplicações, vale uma lida como uma breve introdução.





Upload de multiplos arquivos com PHP

22 02 2007

Fala pessoal!
A pedido do leitor Rodrigo Almeida, vou escrever aqui um mini tutorial de como criar um formulário para upload de multiplos arquivos.
Para começar então, vou demonstrar como se cria um formulário para upload de um único arquivo, e depois passaremos para upload de multiplos arquivos.


<?php

if( isset( $_POST['enviar'] ) ) {

    $erro '';
    
$pathToSave '/tmp/';

    // A variavel $_FILES é uma variável do PHP, e é ela a responsável
    // por tratar arquivos que sejam enviados em um formulário

    if( $_FILES['arquivo']['name'] != '' ) {
        
$arquivoTmp $_FILES['arquivo']['tmp_name'];
        
$arquivo $pathToSave.$_FILES['arquivo']['name'];

        // Copia o arquivo para o sistema
        
if( !move_uploaded_file$arquivoTmp$arquivo ) ) {
            
$erro 'Erro no upload. Verifique as permissoes do diretorio';
        }
    } else {
        
$erro 'É necessario escolher um arquivo para enviar';
    } 

}

?>

<form method='POST' enctype='multipart/form-data'>
    Arquivo: <input type='file' name='arquivo'>
    <br>
    <input type='submit' value='Enviar' name='enviar'>
</form>

O exemplo por si só é bastante explanatório. Certifique-se de que você substituiu o caminho no qual deseja salvar o arquivo, e que o usuário que está executando o php tem permissão para escrever nesse diretório.O comando move_uploaded_file é reponsável por pegar o arquivo que foi enviado, e então salva-lo no local que você especificou. Seguindo em frente então, vamos ver como fazer o envio de multiplos arquivos no mesmo formulário.
Vejamos um segundo exemplo:


<?php

if( isset( $_POST['enviar'] ) ) {

    $pathToSave '/tmp/';

    // A variavel $_FILES é uma variável do PHP, e é ela a responsável
    // por tratar arquivos que sejam enviados em um formulário
    // Nesse caso agora, a nossa variável $_FILES é um array com 3 dimensoes
    // e teremos de trata-lo, para realizar o upload dos arquivos
    // Quando é definido o nome de um campo no form html, terminado por []
    // ele é tratado como se fosse um array, e por isso podemos ter varios
    // campos com o mesmo nome
    
$i 0;
    
$msg = array( );
    
$arquivos = array( array( ) );
    foreach(  
$_FILES as $key=>$info ) {
        foreach( 
$info as $key=>$dados ) {
            for( 
$i 0$i sizeof$dados ); $i++ ) {
                
// Aqui, transformamos o array $_FILES de:
                // $_FILES["arquivo"]["name"][0]
                // $_FILES["arquivo"]["name"][1]
                // $_FILES["arquivo"]["name"][2]
                // $_FILES["arquivo"]["name"][3]
                // para
                // $arquivo[0]["name"]
                // $arquivo[1]["name"]
                // $arquivo[2]["name"]
                // $arquivo[3]["name"]
                // Dessa forma, fica mais facil trabalharmos o array depois, para salvar
                // o arquivo
                
$arquivos[$i][$key] = $info[$key][$i];
            }
        }
    }

    $i 1;

    // Fazemos o upload normalmente, igual no exemplo anterior
    
foreach( $arquivos as $file ) {

        // Verificar se o campo do arquivo foi preenchido
        
if( $file['name'] != '' ) {
            
$arquivoTmp $file['tmp_name'];
            
$arquivo $pathToSave.$file['name'];

            if( !move_uploaded_file$arquivoTmp$arquivo ) ) {
                
$msg[$i] = 'Erro no upload do arquivo '.$i;
            } else {
                
$msg[$i] = sprintf('Upload do arquivo %s foi um sucesso!',$i);
            }
        } else {
            
$msg[$i] = sprintf('O arquivo %d nao foi preenchido',$i);
        }

        $i++;
    }

    // Imprimimos as mensagens geradas pelo sistema
    
foreach( $msg as $e ) {
        
printf('%s<br>'$e);
    }

}

?>

<form method='POST' enctype='multipart/form-data'>
    Arquivo1: <input type='file' name='arquivo[]'><br>
    Arquivo2: <input type='file' name='arquivo[]'><br>
    Arquivo3: <input type='file' name='arquivo[]'><br>
    Arquivo4: <input type='file' name='arquivo[]'><br>
    <br>
    <input type='submit' value='Enviar' name='enviar'>
</form>

Veja então, que no exemplo acima, criamos um formulário, onde os campos todos tem o mesmo nome, porém são tratados como um array, por terminarem com ‘[]‘. A parte mais trabalhosa é entendero array que recebemos então, e trata-lo. Depois de tratado o array, prosseguimos normalmente com o upload do arquivo.
Espero que tenha ficado claro como fazer esse upload de multiplos arquivos. Se quiser entender como a variável $_FILES é, tente utilizar a funcao var_dump nela, para ver seu conteúdo, e enteder melhor o primeiro conjunto de laços foreach que foi demonstrado no exemplo.
Caso tenha permanecido alguma duvida, afinal trabalhar com arrays de 3 ou mais dimensões é um pouco mais complicado, deixe ai um comentário, que tentarei esclarecer da melhor forma possível.

Novamente, agradeço ao leitor Rodrigo Almeida pela sugestão, e peço para que todos participem, e mandem ai suas dúvidas, críticas e sugestões.

[]s

Edit: Bom, pelo visto pode estar havendo dificuldade em copiar e colar o código dos exemplos diretamente em algum editor de texto, pois o WordPress troca as aspas simples por um tipo de aspa esquisito. Por esse motivo, enviei os códigos em formato txt.
Os links:
upload.txt – Primeiro exemplo
upload2.txt – Segundo exemplo





Documentação de código: Doxygen + PHP

22 02 2007

Sempre que precisei gerar documentação técnica de alguma aplicação utilizei phpDocumentor. Afinal, é o mais conhecido, muitos projetos utilizam e não conhecia nenhuma outra opção viável. Além disso, estava acostumado com javadoc (pois é, durante tempos trabalhei com java).

phpDocumentor é um auto-proclamado padrão para a documentação de softwares desenvolvidos em PHP. É bastante semelhante (por ser um “clone”) ao javadoc e pode ser utilizado tanto em linha de comando quanto em uma interface web:

phpdoc web interface

A instalação também é bastante simples:

$pear download phpdocumentor

Após baixar, basta descompactar o arquivo e acessar, via localhost mesmo, que a interface acima será exibida.

Algumas das principais features encontradas nele, segundo os desenvolvedores, são:

  • Geração de documentação em HTML, PDF, CHM (windows help) e XML DocBook
  • Muito rápido (particularmente, não concordo com isso)
  • Interface via web e linha de comando
  • Documentação totalmente customizável utilizando templates “smarty-based”
  • Linkagem automática de heranças entre classes
  • Geração de TODO list utilizando tags @todo no código

Realmente, phpDocumentor é muito bom. Mas não é a única forma de se criar documentação.

DOXYGEN

DoxygeN, assim como phpDocumentor, é utilizado para geração de documentação com base em código fonte. Além de PHP (que tem suporte desde a versão 1.2.17), Doxygem pode ser utilizado para criar documentação de aplicações escritas em C, C++, C#, Objective C, Java, Python, IDL e D.
Os formatos de documentação gerados são HTML, LATEX, RTF, PS (postscript), PDF, XML, CHM e man pages unix.

As tags escritas para serem utilizadas pelo phpDocumentor (boa parte) também são utilizadas pelo doxygen, o que ajuda a deixar a documentação mais completa.

A instalação, dependendo o sistema que se está utilizando, pode não ser tão simples, mas também não possui nenhum segredo: basta baixar um pacote pronto para o sistema e instalar ou, em último caso, baixar os fontes e compilar.

Entre os diversos features encontrados no doxygen, alguns podem ser destacados:

  • Geração de documentação em diversos formatos, como citado acima
  • Não é indispensável documentar o código explicitamente
  • Suporta documentação de arquivos, namespaces (mesmo PHP sem ter – ainda – namespaces, a documentação gerada contém também documentação de namespaces), pacotes, classes, estruturas, templates, funções, typedefs, enums, defines e variáveis (algumas coisas não disponíveis em PHP)
  • Compatível com documentação no padrão JavaDoc, Qt-Doc e ECMA-334 (não imagino como é, mas é a especificação do C#)
  • Geração de diagramas de classe e de colaboração em HTML, com mapas de imagens (imagens em postscripts também)

diagrama de classe

  • Flexivel com o posicionamento de comentários
  • Sistema de busca interna, baseado em rank, para procurar por strings na documentação de classe ou de membros (uau! o seu próprio google na documentação)
  • Tags HTML colocadas na documentação são transformadas automáticamente em suas equivalentes na geração da documentação em outros formatos

Para geração de documentação pode se utilizar um arquivo de configuração, onde todos os parâmetros utilizados pelo doxygen serão lidos e processados. O arquivo de configuração pode ser escrito tanto manualmente, com ajuda do manual, quanto por ferramentas externas, como por exemplo, este excelente plugin para o eclipse.

Um exemplo de arquivo de configuração que utilizo pode ser encontrado aqui. Está totalmente comentado.

Futuramente um pequeno passo a passo para a instalação do eclipse+doxygen+plugins do eclipse será coberto aqui.

Fica ai então, a dica para documentação de um próximo projeto.





Delphi for PHP: Vídeo e Screenshots

21 02 2007

Como anunciado anteriormente, foi lançado recentemente um novo RAD para PHP. Veja um passo a passo para a instalação . Um vídeo demonstrando como criar uma aplicação também foi disponibilizado.

À primeira vista, o código gerado não é de qualidade tão ruim e parece ser bastante simples criar uma aplicação de pequeno porte.

Quem sabe com isso não consiga idéias para um RAD que tenho em desenvolvimento há muito tempo.

Athena

Ficaria faltando apenas tempo para desenvolver…





Notícias e links – 21/02

21 02 2007

Pear releases
pearweb 1.5.1
Net_UserAgent_Mobile 0.30.0

Pecl releases
pecl_http 1.5.0

PHP Cryptography
Artigo da php magazine edição 3/2004.
Ótimo artigo falando sobre criptografia em PHP utilizando a extensão mcrypt.
Entre outras coisas, no artigo são feitas comparações entre criptografia e hashing, explicações de métodos como o rot13, quando é apropriado utilizar um ou outro método, além de explicar como instalar e utilizar a extensão. Recomendado.

Make PHP apps fast, faster, fastest, Part 1: Boost performance, throughput with opcode cache software
Artigo falando sobre aumento de performance de aplicações em PHP. Nesta primeira parte, é falado sobre a utilização de um opcode cache (XCache). Inicia comentando a forma que uma aplicação em PHP funciona, descreve um passo a passo para a instalação e configuração do XCache, mostra um benchmark do phpMyAdmin com e sem o XCache e finaliza com mais algumas dicas.

CodeGear™ Launches Delphi® for PHP for RAD Web Development
Sem muitos comentários, quem sabe um review futuramente.

symfony 1.0 released
Framework com algum tempo de estrada, pode ser uma boa escolha para quem anda em busca de um framework





Será Março o mês das bruxas para o PHP?

21 02 2007

Bom, Março está batendo a porta, e junto com ele vem o chamado “Month of PHP bugs initiative”, ou em português bem claro, “Iniciativa do mês dos bugs no PHP”. Essa é uma iniciativa que visa demonstrar as falhas da linguagem PHP, trazendo a publico bugs encontrados na linguagem de programação, e maneiras de se aproveitar desses bugs, uns podendo ser ativados remotamente, outros apenas localmente, mas não deixando de ser bugs. Para que seja vista a seriedade do assunto, o responsável pelas publicações das falhas é Stefen Esser, fundador do projeto Hardened PHP, e também fundador do Time de Respostas sobre Segurança no PHP.
A entrevista completa, onde o Stefen Esser comenta sobre esse e outros assuntos referentes a segurança e PHP, podem ser lidos no site da SecurityFocus.

Vou ficar de olho o.O

[]s





PHP + GD = Desenhando com PHP

19 02 2007
Bom pessoal, faz algum tempinho que estou sem escrever nada, por falta de
tempo/idéias, mas nesse momento estou sem sono, e tive uma ideia para escrever
algo, então aqui estou.
Vou falar um pouco sobre PHP e GD, e demonstrar como fazer desenhos simples
usando essa extensão do PHP.
Inicialmente você precisa ter o GD compilado e instalado em sua máquina, e
precisa compilar o php com suporte a ele, usando o parametro '--with-gd' na
linha do seu './configure'.
Para averiguar se tudo funcionou corretamente, rode o seguinte comando:

$ php -m |grep gd
gd

    
Se aparecer a palavra gd para você, está tudo correto, e podemos seguir em
frente.
Quando o ambiente está pronto para se trabalhar com GD, o primeiro passo a se
tomar, é criar uma imagem, que servirá de base para trabalharmos. De maneira a
facilitar e agilizar as coisas, irei dar um exemplo, com algumas linhas de
código e explicar o que acontece:

<?php

    // É necessário especificar o header, para informar que se trata de uma
    // imagem
    header('Content-type: image/png');

    $imagem = imagecreatetruecolor( 640, 480 );
    $vermelho = imagecolorallocate( $imagem, 255, 0, 0 );
    imagefilledrectangle( $imagem, 0, 0, 640, 480, $vermelho );

    imagepng( $imagem );
?>

Esse código, irá criar um grande retangulo vermelho.
A nossa imagem é criada na chamada da função imagecreatetruecolor, que
cria uma imagem, e retorna um resource para a mesma. Praticamente todas as
funções (se não todas) que utilizamos com GD a partir disso, farão uso desse
resource. A partir daqui, o que nos resta a fazer é desenhar a nossa imagem.
Praticamente tudo o que desenhamos na imagem utiliza cor, então para isso,
precisamos criar um resource de cor, que será utilizado pelas funções que
desenham coisas propriamente ditas. A função imagecolorallocate toma 4
parametros que lhe permitem criar uma cor. O primeiro define a imagem para qual
essa cor deve ser alocada, os seguintes definem a intensidade de vermelho, verde
e azul (RGB). Logo na sequência desenhamos um retangulo vemelho do tamanho da
imagem, utilizando a função imagefilledrectangle, que toma 6 parametros,
que definem qual a imagem em que o retangulo deve ser desenhado, qual o ponto X
inicial, o ponto Y inicial, o ponto X final, o ponto Y final e a cor do
retangulo. A função imagepng renderiza nossa imagem, e a exibe na tela.
É importante saber que o eixo de cordenadas, começa no canto superior esquerdo
da tela, ou seja, a posicão X=0, Y=0 se encontra no canto superior esquerdo de
nossa imagem. Isso pode confundir um pouco no início, mas com o passar do tempo,
a gente vai pegando o jeito.
Os desenhos, vão sendo feitos na imagem, de acordo com a sequencia em que as
chamadas para as funções são feitas, logo se eu adicionasse uma nova função no
nosso código acima para desenhar um retangulo azul, por cima do vermelho, nós
veriamos apenas o retangulo azul, e não o vermelho.
Vejamos então, algumas funções que podemos utilizar com GD, para desenharmos
coisas na nossa imagem:
    imagerectangle( resource $imagem, int $x0, int $y0, int $x1, int $y1, int
$cor )
        Desenha um retangulo na tela, sem preenchimento. Lembrando que um
quadrado nada mais é que um retangulo de lados iguais.
    imageellipse( resource $imagem, int $cx, int $cy, int $largura, int
$altura, int $cor )
        Desenha uma elipse na tela, também sem preenchimento. A elipse terá o
seu centro definido na posição $cx;$cy, terá $largura de largura e $altura de
altura. Vale lembrar também que um círculo é uma elipse que tem a mesma largura
e altura. $cor, é a cor que criamos usando imagecolorallocate.
    imagestring( resource $imagem, int $font, int $x, int $y, string $s, int
$cor )
        Desenha uma string na imagem, que começa na posição $x,$y. Se fonte for
definido como um numero entre 1 e 5, uma fonte interna do PHP é usada. $sé a
string que desejamos desenhar, e $cor, é a cor que a nossa string deverá ter.
    imagesetpixel( resource $imagem, int $x, int $y, int $cor )]
        Desenha um pixel na posição $x, $y com a cor $color.
Conhecendo essas funções já podemos fazer algumas várias coisinhas. Vejamos
abaixo então um código de exemplo, que mostra a utilização dessas funções e de
mais algumas, que deixará tudo bem claro.

<?php

    // É necessário especificar o header, para informar que se trata de uma
    // imagem
    header('Content-type: image/png');

    $imagem = imagecreatetruecolor( 640, 480 );

    // Criar algumas cores
    $vermelho = imagecolorallocate( $imagem, 255, 0, 0 );
    $verde    = imagecolorallocate( $imagem, 0, 255, 0 );
    $azul     = imagecolorallocate( $imagem, 0, 0, 255 );
    $preto    = imagecolorallocate( $imagem, 0, 0, 0 );
    $branco   = imagecolorallocate( $imagem, 255, 255, 255 );

    // Desenhar um retangulo vermelho
    imagerectangle( $imagem, 10, 100, 250, 150, $vermelho );

    // Escrever dentro do retangulo
    imagestring( $imagem, 3, 11, 120, 'Sou um retangulo sem preenchimento', $branco );

    // Desenhar um circulo azul
    imageellipse( $imagem, 100, 300, 100, 100, $azul );

    // Desenhar um quadrado verde preenchido dentro do circulo
    imagefilledrectangle( $imagem, 75, 275, 125, 325, $verde );

    // Desenhar uma linha de pixels coloridos, na vertical
    for( $i = 0; $i < 200; $i++ ) {
        imagesetpixel( $imagem, 300, $i, imagecolorallocate( $imagem, rand(0,255),rand(0,255),rand(0,255) ) );
    }

    // Desenhar um circulo preenchido verde
    imagefilledellipse( $imagem, 400, 300, 100, 100, $verde );

    imagepng($imagem);

?>

Bem, temos uma imagem com alguns desenhos, porém uma coisa ainda incomoda, e
essa coisa é a cor de fundo. Como mudar a cor de fundo? Basta usar a função
imagefill, que preenche uma determinada area com a cor especificada.
Podemos utilizar essa função para pintarmos apenas a parte interna do nosso
retangulo ou circulo que nao tem preenchimento. Vamos então a um ultimo exemplo
que usa essa função.

<?php

    // É necessário especificar o header, para informar que se trata de uma
    // imagem
    header('Content-type: image/png');

    $imagem = imagecreatetruecolor( 640, 480 );

    // Criar algumas cores
    $vermelho = imagecolorallocate( $imagem, 255, 0, 0 );
    $verde    = imagecolorallocate( $imagem, 0, 255, 0 );
    $azul     = imagecolorallocate( $imagem, 0, 0, 255 );
    $preto    = imagecolorallocate( $imagem, 0, 0, 0 );
    $branco   = imagecolorallocate( $imagem, 255, 255, 255 );

    // pintar o fundo de branco
    imagefill( $imagem, 0, 0, $branco );

    // Desenhar um retangulo vermelho
    imagerectangle( $imagem, 10, 100, 250, 150, $vermelho );

    // Pintar o retangulo de azul
    // 11 e 101, é uma posição dentro do retangulo
    imagefill( $imagem, 11, 101, $azul );

    imagepng($imagem);

?>

Temos ai então uma imagem branca, com um retangulo azul de borda vermelha.
Estamos sempre usando a função imagepng, mas existem outras, para criar a
imagem nos formatos gif e jpg por exemplo, sendo elas:
    imagejpeg
    imagegif

Bom, por hoje é isso. Espero que esse texto possa ter dado uma breve introdução
a extensão GD, e possa te ajudar com alguns problemas, como criação de captchas,
gráficos, e qualquer outra coisa mais que lhe possa ser util (Eu tinha umas
outras ideias, mas sao 3 da manha, e eu ralmente esqueci).
Para maiores informações e mais funções, consulte:
http://php.net/gd

[]s




Leitor de RSS em PHP utilizando 1 função

19 02 2007

Facilidade de uso sempre foi e sempre será um dos objetivos de PHP. Podemos ter, por exemplo, um simples leitor de RSS utilizando apenas uma função e dois construtores da linguagem: Vejamos:


<?php
foreach ( simplexml_load_file (‘http://www.digg.com/rss/index.xml’)->channel->item as $item )
echo
$item->title.“\n”;

Executando, temos:

$ php rss.php
Clinton Fixes N Korea, Bush F-ck’s It Up, China & Russia Go To Clinton Plan
Killer mobile GUI by nVidia… Hasta la “Vista” iPhone!
The UN’s New International Radiation Symbol
Microsoft’s giant ice house in Toronto (pictures)
How I Hacked Your LinkSys Router Which You Probably Bought at Best Buy

Kid’s Drawings Redone with Skill! (Part 2)
An Eraser Shaped Like A Delete Key – Designed by Art Lebedev
Funniest Sexest Washing Machine Tag Ever
Pixelated ‘City Creator’
Senate Falls Short of Advancing Measure Opposing Bush Troop Plan

Não poderia ser mais simples!

Um script mais elaborado, mas não mais complexo, poderia ser demonstrado na seguinte forma:


<?php
foreach ( simplexml_load_file (‘http://www.digg.com/rss/index.xml’)->channel->item as $item )
echo
sprintf(‘<a href=”%s”>%s<a/><br/>%s<br/><br/>’, $item->link, $item->title, $item->description);

Executando podemos visualizar:
Rss utilizando uma função

Com um pouco mais de trabalho podemos criar um leitor de RSS em php mais completo.

É isso





Notícias e links – 18/02

19 02 2007

Pear releases:
Structures_LinkedList 0.1.2

pearweb 1.5.0RC1
Structures_DataGrid_Renderer_Flexy 0.1.0
Console_Getopt 1.2.2
HTML_CSS 1.1.3
Text_CAPTCHA 0.2.1
PHP_CodeSniffer 0.4.0

Pecl releases
htscanner 0.7.0

Detailed Guide On Arrays In PHP
Artigo com uma breve introdução sobre o uso de arrays em php, comentando sobre sintaxe para criação de um array e funções para manipulação

Use Game Music to Increase Your Focus
Artigo descrevendo benefícios que músicas de jogos podem trazer para manter o foco durante o desenvolvimento

8 Ways to Overcome Distractions (for Programmers)
Dicas para manter o foco durante o desenvolvimento, aumentando a produtividade (sem necessarimente trabalhar mais)





Internacionalização de aplicações: PHP + gettext em 5 passos

18 02 2007


Internacionalização (i18n – de InternacionalizatioN) de aplicações em PHP é algo
relativamente simples: Vejamos em alguns passos como criar um “hello world” e
internacionaliza-lo. Note que gettext deve estar disponível para a utilização:

1 – Criação da aplicação: Pré gettext
<?php
// arquivo hello.php

echo “hello world\n”;
?>

2 – Criação da aplicação: Preparando para uso de gettext
<?php
// arquivo hello_gt.php

$lang = ‘en’;

// definimos em uma variavel de ambiente qual o idioma padrao sendo utilizado
putenv(“LANG=$lang”);

// e definimos tambem as informacoes de localizao padrao
setlocale(LC_ALL, $lang);

// e exibimos a mensagem “hello world” no idioma especificado
// Note o “_”: Este e’ um alias para a funcao gettext. _(‘msg’) e’
// equivalente a gettext(‘msg’). Esta funcao sera a responsavel pela
// traducao de “hello world”
echo _(“hello world\n”);
?>

Em ambos os casos, a execução irá apenas exibir a mensagem “hello world”:

$ php hello.php
hello world
$ php hello_gt.php
hello world

3 – Extraindo as strings da aplicação
Para efetuarmos as traduções, é necessário criar um arquivo com as mensagens que a aplicação utiliza. Esta extração pode ser efetuada utilizando o programa “xgettext”:

$ xgettext -o hello.po hello_gt.php

Isso irá criar um arquivo chamado “hello.po”, que é o arquivo com as mensagens que a aplicação possui. Utilizando este arquivo como base, podemos criar arquivos de tradução para outros idiomas.

4 – Criando traduções para outros idiomas:
Utilizando o arquivo “hello.po” criado anteriormente como base, criaremos traduções para português do Brasil (pt_BR) e alemão (de_DE). Os passos são os seguintes:

4.1 – Criamos a seguinte estrutura de diretórios:
a: locale/pt_BR/LC_MESSAGES/
b: locale/de_DE/LC_MESSAGES/

4.2 – Copiamos o arquivo “hello.po” para o diretório “locale/pt_BR/LC_MESSAGES/” e para
“locale/de_DE/LC_MESSAGES/”

4.3 – Editamos estes arquivos recém copiados. As partes do arquivo que devem ser editadas são bastante simples de serem encontradas: Vejamos como ficará o arquivo “locale/pt_BR/LC_MESSAGES/hello.po”:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE’S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid “”
msgstr “”
“Project-Id-Version: PACKAGE VERSION\n”
“Report-Msgid-Bugs-To: \n”
“POT-Creation-Date: 2007-02-17 16:22-0200\n”
“PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n”
“Last-Translator: FULL NAME <EMAIL@ADDRESS>\n”
“Language-Team: LANGUAGE <LL@li.org>\n”
“MIME-Version: 1.0\n”
“Content-Type: text/plain; charset=iso-8859-1\n”
“Content-Transfer-Encoding: 8bit\n”

#: hello_gt.php:17
msgid “hello world\n”
msgstr “Olá mundo”

Ou seja, editamos a “msgstr” referente a msgid “hello world\n” (a última linha) e o charset utilizado pelo arquivo (“Content-Type: text/plain; charset=iso-8859-1\n”) O mesmo deve ser feito para o arquivo “locale/de_DE/LC_MESSAGES/hello.po”:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE’S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid “”
msgstr “”
“Project-Id-Version: PACKAGE VERSION\n”
“Report-Msgid-Bugs-To: \n”
“POT-Creation-Date: 2007-02-17 16:22-0200\n”
“PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n”
“Last-Translator: FULL NAME <EMAIL@ADDRESS>\n”
“Language-Team: LANGUAGE <LL@li.org>\n”
“MIME-Version: 1.0\n”
“Content-Type: text/plain; charset=iso-8859-1\n”
“Content-Transfer-Encoding: 8bit\n”

#: hello_gt.php:17
msgid “hello world\n”
msgstr “hallo welt\n”

4.4 – “Compilamos” o arquivo com as mensagens, para que possa ser utilizado pelo gettext. Para utilizarmos as mensagens que acabamos de traduzir, precisamos gerar um arquivo binário que o gettext irá utilizar para efetuar as traduções. Para criarmos esse arquivo binário, utilizamos o programa “msgfmt”:

$ msgfmt locale/de_DE/LC_MESSAGES/hello.po -o locale/de_DE/LC_MESSAGES/hello.mo
$ msgfmt locale/pt_BR/LC_MESSAGES/hello.po -o locale/pt_BR/LC_MESSAGES/hello.mo

Com isso serão criados dois novos arquivos: “locale/pt_BR/LC_MESSAGES/hello.mo” e “locale/de_DE/LC_MESSAGES/hello.mo”.

5 – Modificando a aplicação para utilizar os novos idiomas:
Após os 4 passos anteriores, já estamos habilitados a utilizar dois novos idiomas na aplicação.
Vejamos como utilizar em “pt_BR”

<?php
// arquivo hello_gt.php

$lang = ‘pt_BR’;

// definimos em uma variavel de ambiente qual o idioma padrao sendo utilizado
putenv(“LANG=$lang”);

// e definimos tambem as informacoes de localizao padrao
setlocale(LC_ALL, $lang);

// definimos que o domínio de textos “hello” esta localizado no diretorio “locale/”
bindtextdomain(‘hello’,‘locale/’);

// e definimos que iremos utilizar o dominio de textos “hello”
textdomain(‘hello’);

// e exibimos a mensagem “hello world” no idioma especificado
// Note o “_”: Este e’ um alias para a funcao gettext. _(‘msg’) e’
// equivalente a gettext(‘msg’). Esta funcao sera a responsavel pela
// traducao de “hello world”
echo _(“hello world\n”);
?>

Executando temos:

$ php hello_gt.php
Ola mundo

Vejamos como utilizar em “de_DE”

<?php
// arquivo hello_gt.php

$lang = ‘de_DE’;

// definimos em uma variavel de ambiente qual o idioma padrao sendo utilizado
putenv(“LANG=$lang”);

// e definimos tambem as informacoes de localizao padrao
setlocale(LC_ALL, $lang);

// definimos que o domínio de textos “hello” esta localizado no diretorio “locale/”
bindtextdomain(‘hello’,‘locale/’);

// e definimos que iremos utilizar o dominio de textos “hello”
textdomain(‘hello’);

// e exibimos a mensagem “hello world” no idioma especificado
// Note o “_”: Este e’ um alias para a funcao gettext. _(‘msg’) e’
// equivalente a gettext(‘msg’). Esta funcao sera a responsavel pela
// traducao de “hello world”
echo _(“hello world\n”);
?>

Executando temos:

$ php hello_gt.php
hallo welt

E assim vimos, simples e rapidamente, como internacionalizar uma aplicação.
É isso.





Notícias e links – 16/02

16 02 2007

VIM for (PHP) Programmers
Slides da apresentação do Andrei Zmievski falando sobre a utilização do VIM para desenvolvimento de aplicações em PHP. São 77 slides com diversos questionamentos sobre como se utiliza uma feature do vim e como pode ser utilizada, além de muitas sugestões que certamente ajudam a aumentar a produtividade. Não é demonstrado o básico, então um conhecimento prévio da utilização é necessário. Muito bom!

Using vim and xdebug DBGp for debugging Drupal (or any PHP application)
Artigo explicando como utilizar o vim para debugging de aplicações em php, em
conjunto com o xdebug. Complementando o post anterior, muito bom também.

Color Theory for Developers
Artigo falando sobre teoria das cores, voltado para desenvolvedores. Diferentemente de vários outros artigos semelhantes, este é escrito usando como base não o modelo RGB ( red, green, blue ) para seleção de cores, mas sim o modelo HSB ( hue, saturation, brightness ). Inicia explicando a importância das cores utilizadas em uma aplicação, explica o que é e como interpretar valores de hue, saturation e brightness e o modo que cada um destes componentes afeta uma cor, exibindo varios exemplos de uso.

Não diretamante relacionado com PHP





Notícias e links – 15/02

15 02 2007

Dynamic thumbnails from websites
Pequeno passo a passo sobre como criar, dinâmicamente, thumbnails de sites

Podcast: PHP: Performance, Scalability, and Web Services
Podcast com Jon Erickson e Andi Gutmans, falando sobre escalabilidade, webservices, zend framework, entre outras coisas (5min25s).
Fonte: devzone.zend.com

An Introduction to PHP Security
Artigo falando sobre segurança no desenvolvimento de aplicações em PHP, indo de uma introdução à questão e passando por register globals, manipulação de erros e outros temas





Notícias e links – 14/02

14 02 2007

Pear releases
PHP_Beautifier 0.1.13

Pecl releases
PDO_INFORMIX 1.1.0

Free Design Templates
Complementando o post falando sobre layouts prontos,
mais milhares de layouts, para quando precisar.

The PHP web sites all PHP developers ought to know about
Link com informações de grandes sites que utilizam PHP e, muitas vezes, não é de conhecimento publico. Interessante para demonstrar àquelas pessoas que costumam dizer que PHP “não serve para projetos grandes”

Create an interactive production wiki using PHP, Part 1:
Tutorial dividido em partes falando sobre como criar um wiki utilizando PHP

Slides for PHP Phone Home
Slides da apresentação de Sean Coates, falando sobre asterisk+php (Vancouver PHP conference)

Review do livro PHP 5 in Practice





Notícias e links

14 02 2007

Vancouver PHP Conference slides
76. eZ components: RAD with PHP
Slides da apresentação do Derick Rethans, falando sobre eZ components.
Inicia falando sobre o que é eZ componentes e alguns benefícios, passa por
instalação, exemplos de uso de alguns dos componentes e finaliza citando o
que deve vir pela frente.

Migrating to PHP 5.2.1 Slides
Slides da apresentação do Ilia Alshanetsky, falando sobre migração para PHP 5.2.1. Inicia citando motivos para migração e novas features, cita melhoras na segurança e performance, passa por mudanças na forma de funcionamento e diferenças para outras versões, boa parte falando sobre migração de php4 para esta versão.

Pecl releases
PDO_IBM