Quarta-feira, 20 de Maio de 2009

Reflections Entendidas e Estendidas

PHP Reflections são recursos muito interessante que se você ainda não conhece precisa conhecer agora. O princípio é basicamente o seguinte: Você pode executar métodos que lhe trazem detalhamento sobre o funcionamento de arquivos / classes / funções que existam no seu código em execução.


/**
* Apenas um pequeno exemplo
*
/

class exemplo
{}

$objReflection = new ReflectionClass( $strClass );
print $objReflection->getClassName();
print $objReflection->getDocComment
();



Utilizando reflections é possível, por exemplo, se listar os parametros de um método ou função, podendo obter o nome, tipo e valor padrão, se houver, se cada um deles. Esses recursos podem ser extremamente úteis para possibilitar um debuger melhor, como se pode ver na ferramenta de backtrace do Renan de Lima.

Mas, as vezes, para poder se fazer funcionalidades realmente avançadas pode-se precisar d estender a classe das notações. Isso pode se tornar algo um tanto trabalhoso de se fazer tendo em vista as referencias cruzadas.

Por exemplo:


class teste{

}


class novaReflection extends ReflectionClass{}
$objNovo =
new novaReflection( "teste" );


if ( $objNovo->getMethod( 'vai' )->getDeclaringClass() instanceofnovaReflection )

{

print "bem que você gostaria.";
}

else

{
print "problema dificil de resolver";
}


Ao se tentar pegar a classe de reflexão da classe que contém o método ‘vai’ o php não retornou a classe estendida ‘novaReflection’ mas a classe ReflectionClass original. A referencia Elemento->getFilho()->getPai() falha não retornando um objeto da mesma classe do Elemento.

Essa situação problema se replica em todas as classes do Reflection. E, na idéia de se facilitar a criação de estensões para classes de reflection eu lhes ofereço o pacote de ExtendedReflection. Esse pacote de classes são estensões das classes do Reflection, mas com métodos chaves que, ao serem sobrepostos tornam fácil o processo de criação de estensões das classes dos reflections.

Ficou confuso? Então vamos a um exemplo:
Ao invés de se estender diretamente a classe do ReflectionClass você irá estender a classe ExtendedReflectionClass e deverá sobrescrever os seguintes métodos:

  • createExtendedReflectionClass
  • createExtendedReflectionProperty
  • createExtendedReflectionMethod

Estes métodos servem para converter um objeto do pacote Reflection nativo em uma objeto do pacote estendido de Reflection, tornando os links internos válidos.

Um pacote estendido para demonstrar isso é o Code Reflection que estende o pacote ExtendedReflection adicionando métodos novos nas classes de reflection o que torna possível se obter os códigos php dos objetos refletidos.

note em especial os seguintes métodos:

/**
* Make the recursive calls and indirectly call return the extended reflection object and not
* a native reflection property.
*
* @see ExtendedReflectionClass::createExtendedReflectionProperty( ReflectionProperty )
* @param ReflectionProperty $objOriginalReflectionClass
* @return CodeReflectionProperty
*/

protecte function createExtendedReflectionProperty ( ReflectionProperty $objOriginalReflectionProperty )
{
return new CodeReflectionProperty( $this->getName() , $objOriginalReflectionProperty->getName() );
}

/**
* Make the recursive calls and indirectly call return the extended reflection object and not
* a native reflection method.
*
* @see ExtendedReflectionClass::createExtendedReflectionMethod( ReflectionMethod )
* @param ReflectionMethod $objOriginalReflectionClass
* @return CodeReflectionMethod
*/

protected function createExtendedReflectionMethod ( ReflectionMethod $objOriginalReflectionMethod )
{
return new CodeReflectionMethod ( $this->getName() , $objOriginalReflectionMethod->getName() );
}


Todas as referencias a objetos do pacote do reflection externos passaram antes, necessariamente, por esses métodos, que convertem o objeto reflection nativo no objeto reflection estendido.


Deste modo você tem a flexibilidade de estender uma classe com a riqueza dos recursos de uma classe de reflexão sem complicação, podendo gerar produtos bem legais como estamos fazendo no CodeToDiagram

Terça-feira, 7 de Abril de 2009

Code To Diagram

Gerando Diagramas de Sequência a Partir de Uma Execução PHP

Conforme prometido, após muito trabalho, estou publicando de fato o projeto CodeToDiagram de geração de diagramas. Para prover esse projeto estou utilizando o www.assembla.com um site para administração de projetos muito legal. A ideia desse projeto é possibilitar a geração de diagramas de sequência a partir de execuções de código PHP. A descrição no site do projeto está em inglês. Mas aqui eu mando uma introdução a respeito do mesmo em português.

O diagrama de sequência talvez seja a mais intuitiva maneira de se compreender uma execução.

O seu uso na fase de pré-projeto é bastante comum para descrever o funcionamento esperado de um software. A partir dele podem-se desenvolver diagramas de teste, como também conferir se todas as funcionalidades descritas foram detalhadas em demais fases do planejamento tal qual o caso de uso, por exemplo.

Ao se descrever funcionalidades mais próximas das linhas de código, tal qual a interação de objetos através de métodos, se consegue planejar como serão as classes e as interfaces do sistema. Mas, a medida que o desenvolvimento avança, seja por falhas na análise ou por uma mudança nos requisitos, os diagramas vão se distanciando da realidade, perdendo o caráter descritivo e ganhando uma característica de legado.

Além disto, se solicitar a um analista que exista um diagrama de sequência de todos os testes do projeto seria um gasto enorme de tempo tanto na criação quanto na manutenção desses diagramas, tendo em vista que a mudança do nome de um método ou de um atributo num método alteraria todos os diagramas que envolvem este elemento.

A solução aqui proposta e implementada é a geração de diagramas de seqüência a partir de execuções de código PHP. Uma execução ou o trecho da execução é monitorado por classes de instrumentação de código que geram a partir das informações recebidas um diagrama daquela execução. Esse diagrama pode ser visto como HTML, salvo como HTML e em breve salvo como XML e futuramente exportado como imagem JPEG.

Todo este processo deve ser simples o suficiente para ser utilizado bastando uma simples chamada, mas também flexível para atender a todos os casos especiais. A idéia é gerar o diagrama de uma execução interferindo o mínimo possível no código-fonte o qual ela irá executar.

Em poucas palavras:

Este código:

<?php

require_once( '../../public/codetodiagram.php' );
CodeToDiagram::getInstance()->start();

require_once(
'Wolf.class.php' );
require_once(
'Pig.class.php' );
require_once(
'House.class.php' );
require_once(
'History.class.php' );

new
History();
?>

Resulta nesse diagrama


















Um componente menor que foi gerado no processo da geração desta solução mas que pode ser utilizado individualmente é o gerador de diagramas de sequência a partir de um XML. Esta aplicação pode ser testada aqui onde um XML de exemplo já foi informado mas pode ser alterado a vontade.

A meta desta aplicação é a geração de um diagrama de sequência para cada método das classes de teste sendo cada um destes diagramas salvo com um nome de fácil localização. Algumas futuras funcionalidades devem ser acrescidas como mostrar a linha de código das chamadas, melhorar a explanação dos parâmetros, dentre outras.

Se você quiser utilizar esta solução em sua última versão, basta baixar do nosso SVN. Mas para apenas navegar no código ele é melhor legível aqui. Para testar a aplicação em funcionamento nos exemplos disponíveis clique aqui

Por hora o projeto ainda não funciona completamente no Internet Explorer. Mas ainda assim, o gerador já torna a vida mais simples na manutenção desse tipo de diagramas. Nós agradeceremos a qualquer um que tiver a paciencia e o desejo de fazer as mudanças no CSS necessárias para fazer o sistema funcionar no Internet Explorer.

Lembrando ainda, que a aplicação completa da UML 2.0 ainda está em desenvolvimento. Qualquer um que tiver interesse em trabalhar nesse campo é bem vindo ao time. Se você tiver uma correção ou uma extensão ao projeto que deseje nos enviar, será também muito bem recebida. E lembre-se, este é um software livre, e como tal, não dispõe de nenhuma garantia. Use por sua conta e risco. Ainda sendo um projeto em desenvolvimento sem nenhuma versão estável, erros podem ser encontrados. Caso os encontre por favor nos avise, teremos muito prazer em corrigi-los assim que possível.

Clique aqui para saber como utilizar essa solução.

Clique aqui para saber mais sobre diagramas de sequência.

Clique aqui e aqui para saber mais sobre Instrumentação de Código.

Clique aqui para conhecer a equipe de desenvolvimento responsável por este produto.

Terça-feira, 17 de Fevereiro de 2009

Gerador de Diagramas de Seqüência a partir de XMLs



Recentemente, precisei gerar diagramas de seqüência automaticamente. Comecei a procurar geradores de diagramas de seqüência e de fato eu encontrei várias ferramentas que geram diagramas a partir de XMI. Dentre elas algumas que valem a pena serem citadas são: a Xmi2Svg e o Net Beans Uml Diagrams . O problema de todas as soluções apresentadas é que as entradas eram em XMI e, o pior um XMI extremamente específico, problema comum no XMI, o que o faz sair do próprio propósito original. O código do XMI é muito esquisito, na falta de uma palavra melhor. Um trecho de um diagrama de seqüência simples do Net Beans pode ajudar a demonstrar o que eu quero dizer:
</UML:GraphEdge.waypoints>
<UML:GraphElement.semanticModel>
<UML:Uml2SemanticModelBridge presentation="Message" xmi.id="xmi_id">
<UML:Uml2SemanticModelBridge.element>
<UML:Message xmi.idref="DCE.1F882CFB-E059-6341-7A50-2D9D63879AEB"/>
</UML:Uml2SemanticModelBridge.element>

Após muito procurar, eu resolvi partir para a filosofia "faça você mesmo". Então, após alguns dias de esforço, eu apresento a vocês o meu Gerador de Diagramas de Seqüência . Como é um código PHP, este está num link externo do meu ainda inutilizado dominio pessoal.

Neste conversor o XML de entrada é muito mais simples que o XMI, focado apenas no diagrama de seqüência , sendo facilmente compreensível. Conforme exemplo:

<sequence>
<actors>
<actor id="1" type="user">me:people</actor>
<actor id="2" type="system">you:people</actor>
</actors>
<messages>
<message type="call" from="1" to="2" text="hi"/>
<message type="return" from="2" to="1" text="hello"/>
</messages>
</sequence>


Gere então seu próprio XML, divirta-se no exemplo dos "Três Porquinhos" e me diga o que achou. Esse gerador de diagramas faz parte de um plano muito maior que eu ainda não revelarei para os senhores. Mas saibam que no fim tudo será revelado!!!

Segunda-feira, 12 de Janeiro de 2009

Métodos Mágicos no Javascript.

Uma das coisas que eu mais gosto em php é a simplicidade junto com a riqueza de recursos. Um recurso muito conhecido, de uso simples mas que é extremamente interessante são os métodos mágicos. Uma vez eu estava me perguntando se existiria algo parecido com isto em javascript e a resposta é: "depende". Na verdade esse recurso está disponível no firefox e foi nele que eu achei a documentação a respeito.

Tudo isso e muito mais pode ser visto neste link do site da Mozilla Firefox.

Não sei se ele chega a funcionar no Safari ou no Google Chrome, eu particularmente duvido devido ao fato de não ser padrão, mas CERTAMENTE não funciona no Internet Explorer.

Ainda assim, quando se deseja depurar páginas javascript no Firefox, fazer esses métodos gerarem uma exceção já ajuda bastante a se encontrar o erro, pode-se ainda fazer as "classes" de seu framework todas extenderem de uma classe padrão que ao se tentar ler ou escrever qualquer atributo inexistente ou chamar um método inexistente gere uma exceção evitando, principalmente ao lidar com atributos, que valores "undefined" possam ser lidos ou que novos atributos "fantasmas" possam aparecer nos seus objetos.

Infelizmente não podemos utilizar isso como recurso de framework tendo em vista a restrição de uso, salvo alguem tenha alguma ideia genial para fazer isso funcionar em qualquer navegador. Não vale citar o projeto Tamarin!! Alguma idéia ?

Sábado, 27 de Setembro de 2008

Head Tracking - Web 3D

Maioria de nós, já vimos em ficções científicas como no futuro a internet seria 3D. Muito barulho foi feito de como isso poderia ser fantástico, mas o "como fazer", "de que forma", "a que custo" e talvez até o mais importante, "como isso pode ser útil" sempre são questões que apenas a realidade responde.

Nesse video, Jonnhy Chung Lee fala a respeito de como isso pode ser feito com um monitor normal, se alterando a imagem apresentada, ainda em 2D, através de uma projeção a partir do ponto de vista do observador. Para se rastrear a posição do observador, ele utilizou o contole do Nitendo Wii.



Apesar do resultado já impressionante, este método ainda exige que o usuário do seu site tenha um Nitendo Wii. Bem, Chris Harrison em seu projeto de Head Tracking, numa tradução livre "Monitoramento de Face", utiliza a web cam para detectar aonde está o observador e faz a mesma triangulação sem necessitar do Nitendo Wii.



Por último, falta "apenas" colocar isto tudo num flash. Aparentemente, no que depender de Jim Foley, não vai demorar tanto. Ele já está rascunhando um flash que faz este processo usando o infra vermelho.



Muito mais nesta área está para vir. Como podemos ver em http://wiiflash.org/ os desenvolvedores e designers estão a todo vapor, em breve estaremos vendo várias páginas com contéudo 3D. Além disto, o Head tracking, pode ser utilizado para várias outras aplicações, como podemos ver em outro projeto do Chris Harrison

Formei!


Gostaria de agradecer a todos aqueles que de alguma forma contribuíram para isto.

Um agradecimento especial ao meu grande amigo Renê de Lima , que foi meu companheiro de curso, de trabalho, de sinuca, e parceiro na nossa monografia, a professora Cláudia Nalon, a qual eu tenho muito orgulho de ter sido aluno, e a toda a minha família é claro.

Muitos projetos pessoais que estavam na gaveta ou em marcha lenta estão aos poucos, saindo do papel.

Em breve muitas novidades.

Quarta-feira, 28 de Maio de 2008

Ok. Vocês venceram

Olá todos. Meu nome é Thiago da Mata ou na versão longa Thiago Henrique Ramos da Mata.

Eu tenho, ou talvez devesse dizer tinha, um blog no thiagomata.blog.com. De fato um endereço facil de se achar.

Eu não sou o tipo de pessoa mais exigente com recursos, mas o blog.com, mesmo para alguem pouco exigente como eu, apresentou vários problemas que me fizeram decidir mudar de endereço e tudo mais.

O maior motivo foi a incapacidade de lidar com vários acessos simultaneos, várias pessoas reclamaram de que não conseguiam acessar o blog, que ele ficava fora do ar, demorava muito, etc.

Acredito que neste blog do google não vou ter esse tipo de problema.

Caso você não me conhecia antes, eu sou um desenvolvedor, prioritariamente web, gosto de acompanhar as novidades de recursos no mercado, principalmente os gratuitos.

Bastante curioso em várias areas do desenvolvimento, o meu forte até o presente momento é o desenvolvimento em PHP e o Javascript.

Estou desenvolvendo um framework PHP com alguns amigos que está bastante interessante. Mas ainda faltam alguns detalhes de desenvolvimento e principalmente de documentação para ser publicado.

O rítmo está meio lento devido a minha provável e possível e inacreditável tão esperada formatura na UnB sendo o final de uma saga de vários e vários e vários anos.

Não sou do tipo que escreve muito mas vou utilizar este recurso como uma maneira de me comunicar como de guardar algumas coisas que eu considero interessante. Não pretendo falar estritamente de desenvolvimento apesar de até o momento todos os posts que eu enviei ( no blog anterior ) são relacionados a area.

Abraços e até mais,
Thiago Mata.