<slideshow>
<slides>
<slide time="70" >
<image x="110" y="320" src="photo1.jpg" wait="0" stay="20" fadein="20" fadeout="20" />
</slide>
<slide time="70" >
<image x="310" y="320" src="photo5.jpg" wait="10" stay="20" fadein="20" fadeout="20" />
</slide>
<slide time="100" >
<image x="210" y="220" src="photo2.jpg" wait="0" stay="50" fadein="20" fadeout="30" />
<image x="510" y="220" src="photo3.jpg" wait="10" stay="40" fadein="20" fadeout="30" />
<image x="810" y="220" src="photo4.jpg" wait="20" stay="30" fadein="20" fadeout="30" />
</slide>
<slide time="100" >
<image x="210" y="220" src="photo2.jpg" wait="0" stay="20" fadein="20" fadeout="30" />
<image x="510" y="220" src="photo2.jpg" wait="10" stay="20" fadein="20" fadeout="30" />
<image x="810" y="220" src="photo2.jpg" wait="20" stay="20" fadein="20" fadeout="30" />
<image x="1110" y="220" src="photo2.jpg" wait="30" stay="20" fadein="20" fadeout="30" />
<image x="1410" y="220" src="photo2.jpg" wait="40" stay="20" fadein="20" fadeout="30" />
</slide>
<slide time="160" >
<image x="1000" y="220" src="photo2.jpg" wait="0" stay="80" fadein="40" 'fadeout="40"/>
</slide>
</slides> </slideshow>
quinta-feira, 28 de janeiro de 2010
Flash Slideshow feito em PHP lendo XML
Ferramentas para BPMN
Pontos Fortes
- Ferramenta completa para a geração de BPMN 1.0;
- Licença sem restrição de uso comercial;
- Exportação em imagem de alta qualidade;
- Exportação para PDF, sharepoint, wiki, etc.;
- Ferramenta de fácil uso;
- Consideravelmente Estável.
Recomendação
Para ambientes de trabalho onde todos trabalhem com máquinas Windows, essa provavelmente é uma das melhores opções gratuitas.
O controle das alterações faz falta. Mas já aviso, fará falta na maioria das ferramentas aqui descritas, logo não é uma característica exclusiva.
Pontos Fortes
- Fácil de instalar;
- Roda em Windows XP, Windows Vista, Linux e Apple Mac;
- Acesso remoto via Web;
- Gera uma documentação PDF baseada no diagrama;
- Permite a execução do fluxo como uma aplicação, que tenha até 3 usuários, caso este seja descrito conforme o recomendado pela ferramenta;
- Permite a alimentação de informações de entidades, execução de decisões baseadas em informações, execução de eventos de interação e de eventos de tempo;
- Sub-Processos.
- Não apresenta histórico das edições do BPMN;
- Apresenta muitas instabilidades;
- A exportação da imagem de saída é de baixa qualidade;
- Não exporta para imagem vetorial;
- Não é de tão fácil uso.
- Não permite edição remota pela aplicação web disponibilizada;
Para quem deseja fazer uso dessas ferramentas que, teoricamente, dispensam a programação, essa pode ser uma boa solução.
Poder executar o fluxo em discussão na frente do cliente, sempre é um ponto positivo, mas o custo para poder usufruir tal funcionalidade é discutível.
Para poder utilizar essa ferramenta na sua equipe é necessário que todos que venham a necessitar ver o diagrama tenham ela instalada, pois a imagem resultante de um diagrama de tamanho médio já fica ilegível.
Alguns bugs na manipulação do zoom e das fontes, que foram observados na execução num ambiente linux, são realmente incômodos. Quando a ferramenta fecha sem aviso e sem salvar no meio da edição é desanimador.
Intalio|Designer Community Edition
Pontos Fortes
- Muito facil de instalar. Na verdade, nem precisa instalar;
- Roda no ambiente Eclipse logo em Windows, Linux, Apple e qualquer outra coisa que rode Eclipse;
- Apresenta mapeamento de dados;
- Edição de formulários integrados ao processo por WSIWYG;
- Excelente integração com SOA, Schemas, LDAP, dentre outros ;
- Geração de WSDL;
- Exportação de Imagens em boa qualidade para PDF, PNG , JPEG, GIF e SVG;
- Suporte a Reutilização de Processo;
- Suporte a Tratamento de Exceções;
- Ferramenta de facil uso;
- Muita documentação;
- Formato dos arquivos é de facil exportação para outras ferramentas;
- Suporte a BPMN 1.1;
- Apresenta histórico de alterações;
- Validações automáticas geram alertas para possíveis erros.
Pontos Fracos
- A manipulação dos conectores é limitada;
- Não gera documentação além do próprio diagrama;
- Não ter uma opção de execução assistida, sendo as saídas das decisões e eventos escolhidos dentre os disponíveis;
- O histórico é restrito por execução ou pelo controle de versão, sendo a comparação no xml fonte do diagrama e não visual.
- Não permite edição colaborativa;
- Não permite edição remota pela aplicação web disponibilizada;
A ferramenta apresenta uma extensa gama de opções para quem desejar fazer uso de desenvolvimento sem código, geração automática de código BPEL, etc.
Para quem deseja apenas uma ferramenta de geração de diagramas ela atende muito bem. Como exporta em SVG, pode-se gerar a imagem no formato e na resolução que se desejar. Mas a imagem na resolução
padrão em GIF e JPEG poderiam ter as dimensões configuráveis.
A limitação da manipulação dos conectores incomoda, mas é superável.
A falta do controle de versão integrado ao diagrama em forma de histórico é grande, mas é compartilhada entre todas as ferramentas encontradas.
Os alertas da validação automática são muito úteis.
Conclusão
Dentre as ferramentas encontradas, a que melhor atendeu a minha necessidade foi a Intalio|Designer Community Edition, a qual tenho utilizado para a geração dos meus diagramas BPMN. Os fatores decisivos foram a facilidade de instalação, a exportação em SVG e a execução em várias plataformas.
sexta-feira, 14 de agosto de 2009
Dicas
Convenção de Código
Controle de Versão
- Controlar "o que", "quando", "por quem" e "por que" de cada alteração feita.
- Comparar versões do sistema.
- Voltar a uma versão do sistema.
- Combinar alterações.
- Ver o histórico de um arquivo ou pasta.
- Interface com várias aplicações que montam diferentes tipos de relatórios a partir dos dados do servidor.
- Interface com várias aplicações possibilitando o disparo de testes automáticos, criação / alteração de demandas via mensagens de envio.
Documentação automática
Teste Unitário
Padrões da Web
Prototipagem
Modelagem de banco
Modelagem de Processos de Negócio - BPM
UML
Dentre as ferramentas para criação de diagramas UML gratuitas e que rodam tanto no linux quando no windows, a que, até o momento, tem me mostrado os melhores resultados é o JDeveloper. Ferramenta muito boa para geração dos casos de uso, diagramas de classes, com sincronia codigo x diagrama, diagrama de negócio ( uma versão do UML do BPM ), etc. Não é, obviamente, o visual paradigm, mas, dentre as restrições apresentadas, me tem sido muito útil.
O diagrama no JDeveloper que para mim mostrou as maiores limitações foi o de sequencia. Mesmo após se informar que um "LifeTime" é um objeto de uma classe já existente ele não procura pelos métodos, trava as vezes sem nenhum motivo aparente, etc. Mas, como os projetos que eu tenho trabalhado recentemente são todos PHP, eu peguei o rascunho de código Java gerado pelo JDeveloper, converti em classes PHP e usei o CodeToDiagram conseguindo resultados muito legais.
Tenho também analisado outras opções como o Jude e StarUml mas confesso com pouca dedicação pela falta de tempo. Caso alguma dessas ferramentas venha a me encantar, farei um post novo a respeito.
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.
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
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

</UML:GraphEdge.waypoints>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.
<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>
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!!!