Português Português English English

Latinoware 2009 e o futuro deste blog

I made a speech about ZendFramework called “ZendFramework como le gusta” at Latinoware 2009. I’ve tried show it in a odd and nice way. The goal was change developers’ mind to feel free about how to use it and if it’s really necessary use this. You can download the presentation file using this link:

Baixar slides do “ZendFramework como le gusta”

Now, about the future of this blog… soon it’s gonna die!! I’m gonna to twitter, because i am not so smarty and i have no time to keep it running.

Posted in Development, PHP | No comments

Zend Framework vs PEAR, class loading war

I want to show you (PHP developer) that you must to be care about class loading when using Zend Framework with PEAR. Why don’t I suggest you to use Zend Framework with PEAR in PHP applications?

Zend Framework: Zend_Loader is the system classes loader, when it doesn’t find the class, an exception is throw.

PEAR: This library have some packages that tries load some classes (SOAP for example), but if these classes don’t exists, no problem, the application must be running yet.

We saw we have a ideology problem to solve. Sometimes class loader have to throw an exception, sometimes else not. I haven’t found a easy solution for that. I’ve had to do a cut corner for PEAR classes in my class loader.

That’s all folks. Good luck!

Posted in Development, PHP | No comments

Ascending and Descending Order and Pagination with LDAP

LDAP hasn’t a good documentation. Users of wonderful database API’s may feel no good when using this technology in PHP.

I had one of these problems when I needed to paginate LDAP entries. The ldap_sort function sorts in ascending order only. Result: I had to do pagination and ordering in two direction using ldap_count_entries, ldap_sort, ldap_first_entry, ldap_next_entry, ldap_get_attributes, array_reverse and a bit of voodoo :-P . The result is in a post left in the ldap_search documentation.

see the solution here

Posted in Development, PHP | No comments

Projects at Google Code

Hello all. Usually I post releases, documentation and everything related of some my libraries in this blog.

I opted to create some projects at GoogleCode because I don’t want to post about it here. I think this will be better for all of us.

I announce too that the WSDLDocument 0.2 was relasead at http://code.google.com/p/wsdldocument. There is a wiki with changelog and usage tips.

The BackTrace library don’t have news, but you can see it at http://code.google.com/p/backtrace.

Posted in Development, PHP | No comments

WSDL + PHP = WSDLDocument

This post was made to release the WSDLDocument, a WSDL generator in PHP to webservices.

The way how some subjects are saying about TI hides the expert developer that exists inside a lot of professionals from our area. One of these subjects is webservices. It’s easy to do a client in PHP. But to do a server it’s necessary more work because the WSDL generation. Of course there are others things to look at during the development with webservices.

WSDLDocument

Why is to make WSDL in PHP difficult? A variable in PHP change its type during the script running. The webservices needs you declare the returns’ and arguments’ type.

The goal is look out it to generate the WSDL. To do this isn’t easy, but this isn’t as hard as find mustache on Elephant. So dear, the WSDL generation may be made with two steps:

  1. Find out the type of the parameters and returns of the services;
  2. Generate the XML.

The developer who implemented each service must to describe any where the types information. No more magic, ok? We’re not mage, we’re TI professionals. A good place to put it is the method documentation. The notations help us to solve this problem and keep our code well documented. With the types information we can generate the WSDL. The WSDL generation must to follow W3C stardards.

I release today the WSDLDocument!

This library isn’t a new thing. I did it - only - to improve my knowledges and to understand the WSDL structure. Some another libraries:

As someone may see the WSDLDocument extends DOMDocument. You create a instance of this and… go planet! You have a XML in your hand. You may - for example - link a XSLT file to show a bit beautiful on the browser. I didn’t want to be intrusive and oblige you change your framework. This have to be saw as a library to be put inside your application.

Above a sample how to use this library.

<?php

// generating the wsdl
$class "MyWebserviceClass";
$url "http://mydomain.com/?class=" $class;
$wsdl = new WSDLDocument$class$url );

// showing the wsdl
echo $wsdl->saveXml();

<?php

class MyWebserviceClass
{
    
    
/**
     * Transfering complex type.
     *
     * @param Person
     * @return integer
     */
    
public function anyMethodPerson $type )
    {
        
// ...
        
return 100;
    }
    
    
/**
     * Transfering array of complex type.
     *
     * @param integer
     * @return Person[]
     */
    
public function another$quantity )
    {
        
$list = array();
        for ( 
$i 0$i $quantity$i++ )
        {
            
array_push$list, new Person() );
        }
        return 
$list;
    }
    
}

class 
Person
{
    
    
/**
     *
     * @var string
     */
    
public $name "";
    
    
/**
     *
     * @var integer
     */
    
public $children "";
    
}

I will try keep this library updated. I’m busiest this time, because this I don’t know what it’ll happen.

download the WSDLDocument here

Posted in Development, PHP | 9 Comments

Patterns para elementos visuais

Você precisou alguma vez justificar para seu cliente o motivo pelo qual um menu gigantesco ficaria ruim em sua aplicação?

Hélio Miranda, amigo meu, me mostrou o Interaction Design Pattern Library. É um repositório com vários padrões de elementos de interface muito interessante. O site organiza os padrões em categorias. Visualizei várias coisas boas.

Uma delas é a padronização de nomes. Não precisamos mais nos referir ao Parts Selector  como “pra-lá pra-cá” e ter que explicar que diabos é isso. O padrão está lá, e documentado.

Outra coisa coisa é a visão orientada a solução de problemas. Todo bom arquiteto (informação/interface/…) escolhe (ou faz) um pattern para a resolução de problemas. O site indica qual problema está sendo resolvido em cada um dos patterns.

Usem a abusem. See you soon!

Posted in Development | No comments

A morte do Smarty

Em uma lista de discussão Hasin Hayder divulgou um post de seu blog (Foi se o tempo do Smarty), nele ele explica o motivo da não necessidade de se utilizar Smarty ou qualquer outra engine de template similar.

Hasin, basicamente, justifica sua teoria com uma pergunta, “Por que?”. Responda você as seguintes perguntas:

  • Por que minha equipe deve gastar tempo em aprender uma nova linguagem?
  • Por que devo utilizar uma nova linguagem que faz tudo que o PHP faz e ainda é mais lenta?
  • Por que não posso escolher/melhorar uma arquitetura para o meu projeto que implemente MVC, ao invés de forçar isso com bibliotecas isoladas em minha aplicação?

Alguns podem falar “mas o Smarty faz filtro e um monte de mágicas pra mim”. Hoje é possível manipular frameworks para que nos auxiliem nessas tarefas e em diversas outras. E o melhor, tudo em PHP. Sem precisar gastar tempo aprendendo outra linguagem. Zend_View, por exemplo, adota a idéia de helpers, que nada mais é que disponibilizar métodos para a camada de visualização. Nos helpers você pode aplicar o filtro ou qualquer outra coisa que quiser!

Na minha opnião arquitetura da aplicação é mais importante que as bibliotecas que ela utiliza. Utilizar uma biblioteca não significa que sua aplicação seja uma maravilha. Mas sem escapar muito do assunto, acho que Smarty morreu mesmo quando se iniciou o boom de frameworks para PHP como o Cake, PHP2Go, ZendFramework, CodeIgniter, Prado e tantos outros.

Posted in Development, PHP | 2 Comments

Alternativa para anexo em SOAP

Para quem tem medo, acha trabalhoso demais implementar o SOAP com os padrões W3C ou não tem uma biblioteca poderosa que faça a tarefa de anexar arquivo binário em seu servidor ou cliente SOAP, um sujeito achou uma solução simplificada pra coisa.

A idéia é transformar o arquivo binário em texto no cliente para que possa depois, no servidor, ser transformado em binário novamente. A codificação proposta é a base64. O conteúdo do parâmetro é passado normalmente para o servidor.

Quem já precisou fazer anexo em e-mails na mão isso não foi surpresa, esta é a codificação utilizada para tal. Se estiver curioso abra seu leitor de e-mail, escolha uma mensagem que contenha anexo e veja o texto original, no final do arquivo está lá o seu anexo em base64.

Original http://blog.phpdeveloper.org/?p=88

Posted in Development | 1 Comment

how to: fazer hello world em PHP-CLI

Estudando um pouco de PHP - pra variar - acabei conhecendo mais a fundo uma biblioteca muito legal do Zend Framework (ZF), é o Zend_Console_Getopt. Neste post vou fazer um passo-a-passo para quem quiser saber como fazer um script com interface via linha de comando (CLI) utilizando essa biblioteca.

Pra entender esse post você precisa saber programar (em qualquer linguagem que use o paradigma imperativo) e o que é CLI. Quem é da computação, com os links indicados, consegue prosseguir em poucos minutos de leitura.

Primeiro precisamos saber o que essa biblioteca faz e no que ela irá nos ajudar. Zend_Console_Getopt é uma classe que auxilia aplicações com interface linha de comando a fazerem o parser dos parâmetros. Imagino eu que essa atividade é a mais difícil pra quem está iniciando no mundo CLI. Logo essa biblioteca vai tornar as coisas mais fáceis.

Precisamos também definir o que nossa aplicação vai fazer. Eu sugiro que ele imprima um “hello world”, e como não tem ninguém pra contrariar é isso que ele vai fazer e pronto! :-) .

Mas (…) ele não exibirá um simples “alô”. Nosso programa devera mostrar um alô em três línguas: português, espanhol e inglês. Isso deverá ser determinado pelo usuário com o parâmetro language, exemplo de uso: “–language=pt” ou “-l es”.

Outra opção que nossa aplicação vai ter é o famoso “verbose”. Passando esse parâmetro (”-v” ou “–verbose”) o nosso programa vai imprimir o que está acontecendo.

Vamos ao trabalho!

  • instale um linux qualquer em sua máquina com php5-cgi (é CGI e não módulo do apache!);
  • crie um diretório da aplicação chamado “sample” em qualquer lugar que você tenha permissão de escrita;
  • crie um arquivo dento do diretório criado acima chamado “hello_world”;
  • dê permissão de execução para o arquivo criado no passo anterior, use “chmod 753 hello_cli” ;-) ;
  • baixe o ZendFramework e copie o diretório “library” (somente esse diretório!) no mesmo lugar que você colocou o arquivo “hello_cli” (deve ficar assim: sample/libray/Zend/*);
  • edite o arquivo “hello_cli” com o código que será apresentado.

O código do arquivo “hello_cli” está “jogado” logo abaixo, porém irei detalhá-lo depois.

Nota: na primeira linha é necessário indicar que o php é quem irá interpretar nosso código. O caminho do interpretador PHP no meu computador é “/usr/bin/php5-cgi”, caso em seu sistema operacional seja diferente altere essa linha (use o comando locate no terminal caso não lembre aonde está).

#!/usr/bin/php5-cgi -q
<?php

############### CONFIGURATION

# Error
# programmers wrong never! rigth?
ini_set"error_reporting"E_ALL );
ini_set"display_errors");
ini_set"display_startup_errors");
ini_set"html_errors");

# Constants
define"DIR_ROOT"realpathdirname__FILE__ ) ) . "/" );
define"DIR_LIBRARY"DIR_ROOT "library/" );

# alter include_path
ini_set"include_path"ini_get"include_path" ) . PATH_SEPARATOR DIR_LIBRARY );

# Zend Framework
# configures autoload to call zend class loader
require "Zend/Loader.php";
spl_autoload_register( array( "Zend_Loader""autoload" ) );

# Functions
function output$sText )
{
    echo 
$sText "\n";
}

############### ARGUMENTS

# configure arguments and options
# see http://framework.zend.com/manual/en/zend.console.getopt.rules.html
$_rules = array(
    
"verbose|v" => "",
    
"language|l=s" => ""
);
$_argument = new Zend_Console_Getopt$_rules );

# fetchs arguments
try
{
    
$verbose = isset( $_argument->verbose );
    
$language $_argument->language;
}
catch ( 
Zend_Console_Getopt_Exception $_exception )
{
    
output$_exception->getUsageMessage() );
    exit();
}

############### APPLICATION

# finally, the application!
# let's go!
if ( $verbose )
{
    
output"starting..." );
}
switch ( 
strtolower$language ) )
{
    case 
"pt":
        
output"Alô mundo CLI!" );
        break;
    case 
"es":
        
output"¡Hola mundo CLI!" );
        break;
    case 
"en":
    default:
        
output"Hello CLI world!" );
        break;
}
if ( 
$verbose )
{
    
output"ending, bye..." );
}

Perceba que nosso código possui, na ordem, três partes: configuração; tratamento da entrada; regra de negócio. Inicialmente configuramos a exibição de erro, o ZendFramework e criamos uma funçãozinha de output. A configuração do ZF exige algumas tarefas específicas que não vou abordar aqui, mas fica pra outro post, ok?

A segunda parte é a mais importante, nela determinamos quais os parâmetros possíveis para nossa aplicação, capturamos os dados e tratamos os erros de entrada. A variável “$_rules” possui os parâmetros que a classe da Zend deverá tratar, não vou aqui detalhar como funciona, mas olhando já da pra se ter uma idéia, mas quem quiser saber mais acesse o link de configuração de parâmetros. No bloco “try” pegamos os parâmetros que foram passados à nossa aplicação, veja que basta acessar os parâmetros como se fossem atributos da classe Zend_Console_Getopt. Ao mesmo tempo que pegamos as entradas o tratamento de erro é feito com a captura de possíveis exceções que são soltas pela biblioteca Zend.

A última parte é tranquila, com tudo feito e os parâmetros carregados nos resta aplicar as regras que definimos anteriormente e acenar para o novo mundo que nos abre. Veja alguns exemplos de uso da nossa apliação.

renan@renan:~/sample$ ./hello_cli -l pt
Alô mundo CLI!
renan@renan:~/sample$ ./hello_cli --language=es
¡Hola mundo CLI!
renan@renan:~/sample$ ./hello_cli
Hello CLI world!
renan@renan:~/sample$ ./hello_cli -vl en
starting...
Hello CLI world!
ending, bye
renan@renan:~/sample$ ./hello_cli -vl pt
starting...
Alô mundo CLI!
ending, bye

Abaixo o download do resultado final pra quem estiver com preguiça de seguir os passos indicados ou teve problemas na criação da aplicação.

Hello CLI World!

Posted in Development, PHP | 1 Comment

PHPSource 0.0.1

Alguns posts meus aqui vão precisar que eu mostre alguns código fontes em PHP. Procurei um pouco e não achei nenhum simples. Procurei insistentemente durante 60 segundos (…) ok, não é muito tempo, mas o que eu queria era muito simples, e como não achei decidi fazer o meu próprio.

A intenção foi ser simples. Você precisa, antes, fazer o upload de um arquivo PHP que deseje exibir em seu blog WordPress. O primeiro “parâmetro” é a altura do bloco de código. O segundo é o caminho do arquivo relativo ao diretório “wp-content/uploads/”. Os parâmetros são separados por “:”. É preciso colocar esses parâmetros como no exemplo abaixo:

[phpsource:250:2001/02/exemplo.php]

O plugin é um filtro que captura o que estiver escrito parecido com o que está aí em cima e exibe o arquivo acionando a função highlight_file.

Baixe o plugin PHPSource 0.0.1

Como no mundo nada se cria, tudo se transforma. Créditos ao Élcio Ferreira e seu plugin Dirty PHP Include, que me permitiu fazer esse aqui.

Posted in Development, Linux, PHP | 1 Comment
BrasilMato GrossoRondôniaDistrito Federal