Português Português English English

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 | No comments

O tempo passa

Poema, de Cazuza e Frejat

Eu hoje tive um pesadelo
E levantei atento, a tempo
Eu acordei com medo
E procurei no escuro
Alguém com o seu carinho
E lembrei de um tempo

Porque o passado me traz uma lembrança
De um tempo que eu era ainda criança
E o medo era motivo de choro
Desculpa pra um abraço, um consolo

Hoje eu acordei com medo
Mas não chorei nem reclamei abrigo
Do escuro, eu via o infinito
Sem presente, passado ou futuro
Senti um abraço forte, já não era medo
Era uma coisa sua que ficou em mim
E que não tem fim

De repente, a gente vê que perdeu
Ou está perdendo alguma coisa
Morna e ingênua que vai ficando no caminho
Que é escuro e frio, mas também bonito porque é iluminado
Pela beleza do que aconteceu há minutos ou anos atrás

Posted in Misc | No comments

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 | No comments

Namespaces no PHP 6

Navegando - e procurando coisas novas sobre PHP - achei um post interessante no blog PHP 10.0. É um FAQ sobre como vai funcionar namespaces no PHP 6. Tudo bem, não é novidade que o PHP terá namespace, mas o legal é assistir como ele está sendo construído. Achei o texto interessante e resolvi traduzí-lo.

Para acessar o texto original clique aqui. Veja também outro post sobre namespace e o design de como poderá ser o namespace em PHP 6.

Por que é necessário namespaces em PHP?
Porque nomes grandes como PEAR_Form_Loader_Validate_Table_Element_Validator_Exception são cansativos.

Qual é o principal objetivo do namespace?
Resolver o problema acima citado.

O que significa “namespace X::Y::Z”?
Todas as classes e funções são prefixadas com X::Y::Z

O que significa “import X::Y::Z as Foo”?
Um apelido para um namespace. Toda vez que uma classe ou função com o prefixo Foo for chamado, ele será traduzido para X::Y::Z.

O que significa “import X::Y::Z”?
Significa “import X::Y::Z as Z”, como no item anterior.

O que significa “import Foo”?
Nada.

Qual é o escopo do namespace e import?
Arquivo atual.

Um mesmo namespace pode ser utilizado em vários arquivos?
Sim.

Existe relação entre os namespaces X::Y::Z e X::Y?
Só na cabeça do programador.

Como faço para importar todas as classes de um namespace X::Y::Z para o escopo global?
Não é possível, isso nos traria o problema global da poluição espacial.
Entretanto você pode importar X::Y::Z e então prefixar sua classe com Z::.

Isso não faz com que haja nomes grandes?
Não maiores que três elementos: Namespace::Classe::Elemento.

Por que isso não é implementado como em <coloque sua linguagem favorita aqui>?
Porque PHP não é <coloque sua linguagem favorita aqui>.

Posted in Development, PHP | No comments
BrasilMato GrossoRondôniaDistrito Federal