<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4058717336638114408</id><updated>2011-09-09T14:20:07.783-07:00</updated><category term='conversa fiada'/><category term='bpm'/><category term='flash'/><category term='tools'/><category term='javascript'/><category term='html5'/><category term='cache'/><category term='3d'/><category term='web'/><category term='academico'/><category term='actor'/><category term='festa'/><category term='gratis'/><category term='head tracking'/><category term='template'/><category term='eu'/><category term='execucao'/><category term='firefox'/><category term='css'/><category term='codetodiagram'/><category term='sequencia'/><category term='uml'/><category term='banco'/><category term='tv'/><category term='xhtml'/><category term='debug'/><category term='xml'/><category term='pessoal'/><category term='metodos_magicos'/><category term='inep'/><category term='php'/><category term='sequence'/><category term='wii'/><category term='oop'/><category term='unb'/><category term='casamento'/><category term='doente'/><category term='ie'/><category term='historia'/><category term='projeto'/><category term='diagrama'/><category term='smarty'/><category term='html'/><category term='BPMN'/><category term='swf'/><category term='assembla'/><category term='coruja'/><category term='zend'/><category term='ferramenta'/><category term='tree'/><category term='php reflection extends code trick'/><title type='text'>Thiago Mata</title><subtitle type='html'>Programação, Praia e Sinuca.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-305522924437516095</id><published>2011-09-09T14:02:00.000-07:00</published><updated>2011-09-09T14:20:07.863-07:00</updated><title type='text'>Resolvendo Problemas com Aspas Duplas do Zend_Db_Table_Abstract</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: large;"&gt;Resumo,&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quando você tentar apontar o Zend_Db_Table_Abstract do Zend Framework com o Oracle, para gerar comandos SQL é possível que você enfrente o mesmo problema que nós enfrentamos, aspas duplas aparecem e fazem seus comandos SQL inválidos. Para resolver isso adicione &amp;nbsp;a seguinte linha:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;resources.db.params.options.autoQuoteIdentifiers = 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;no seu application.ini e seja feliz.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Versão Longa,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quando o&amp;nbsp;Zend_Db_Table_Abstract gera erros ao tentar executar seus comandos SQL triviais, gerados automaticamente, qual é o 1º passo? Eu costumo gerar o assemble() do comando SQL para poder testa-lo diretamente no banco de dados.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como o problema que temos é com qualquer método, então testamos no mais simples, sobrescrevendo o getAll e fazendo isso:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;public function getAll($where = null, $order = null, $count = null, $offset = null)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;{&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;var_export( $this-&amp;gt;select()-&amp;gt;assemble() );&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;exit();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Então obtemos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: #f0f0f0; font-family: monospace; white-space: pre;"&gt;SELECT "&lt;b&gt;tb_estado&lt;/b&gt;".* FROM "&lt;b&gt;db_projeto"."tb_estado"&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: #f0f0f0; font-family: monospace; white-space: pre;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Sabemos agora qual é o problema: As consultas geradas automaticamente pelo Zend estão colocando aspas duplas no nome das tabelas e do schema, o que não é aceito no Oracle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Após pesquisar um pouco achei esse link&amp;nbsp;&lt;a href="http://doczf.mikaelkael.fr/1.10/pt-br/zend.db.select.html"&gt;http://doczf.mikaelkael.fr/1.10/pt-br/zend.db.select.html&lt;/a&gt;&amp;nbsp;que informa:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: #f4f4f4; font-family: Verdana; font-size: 14px; line-height: 21px;"&gt;&lt;i&gt;O método&amp;nbsp;&lt;code class="code" style="font-family: monospace;"&gt;quoteIdentifier()&lt;/code&gt;&amp;nbsp;usa aspas no SQL para delimitar o identificador, o que deixa claro que ele é um identificador de uma tabela ou coluna e não parte da síntaxe SQL.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: Verdana; font-size: 14px; line-height: 21px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="background-color: white; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Agora qual é o problema: As consultas geradas automaticamente pelo Zend estão colocando aspas duplas no nomes devido ao método&amp;nbsp;_quoteIdentifier, que funciona do seguinte modo:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: #f4f4f4; font-family: Verdana; font-size: 14px; line-height: 21px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: #f4f4f4; font-family: Verdana; font-size: 14px; line-height: 21px;"&gt;&lt;a href="http://www.tig12.net/downloads/apidocs/zf/Db/Adapter/Abstract.php.source.html#line1016"&gt;http://www.tig12.net/downloads/apidocs/zf/Db/Adapter/Abstract.php.source.html#line1016&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: #f4f4f4; font-family: Verdana; font-size: 14px; line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: monospace; font-size: small; line-height: normal;"&gt;&lt;span style="color: #007700;"&gt;&lt;span style="color: black;"&gt;1009&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1009" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff8000;"&gt;/**&lt;br /&gt;&lt;span style="color: black;"&gt;1010&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1010" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Quote&amp;nbsp;an&amp;nbsp;identifier.&lt;br /&gt;&lt;span style="color: black;"&gt;1011&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1011" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&lt;br /&gt;&lt;span style="color: black;"&gt;1012&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1012" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;&amp;nbsp;string&amp;nbsp;$value&amp;nbsp;The&amp;nbsp;identifier&amp;nbsp;or&amp;nbsp;expression.&lt;br /&gt;&lt;span style="color: black;"&gt;1013&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1013" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;boolean&amp;nbsp;$auto&amp;nbsp;If&amp;nbsp;true,&amp;nbsp;heed&amp;nbsp;the&amp;nbsp;AUTO_QUOTE_IDENTIFIERS&amp;nbsp;config&amp;nbsp;option.&lt;br /&gt;&lt;span style="color: black;"&gt;1014&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1014" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The&amp;nbsp;quoted&amp;nbsp;identifier&amp;nbsp;and&amp;nbsp;alias.&lt;br /&gt;&lt;span style="color: black;"&gt;1015&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1015" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&lt;span style="color: black;"&gt;1016&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1016" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;protected&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_quoteIdentifier&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$value&lt;/span&gt;&lt;span style="color: #007700;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$auto&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;false&lt;/span&gt;&lt;span style="color: #007700;"&gt;)&lt;br /&gt;&lt;span style="color: black;"&gt;1017&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1017" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: black;"&gt;1018&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1018" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$auto&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;===&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;false&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;||&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$this&lt;/span&gt;&lt;span style="color: #007700;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_autoQuoteIdentifiers&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;===&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;true&lt;/span&gt;&lt;span style="color: #007700;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: black;"&gt;1019&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1019" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$q&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$this&lt;/span&gt;&lt;span style="color: #007700;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;getQuoteIdentifierSymbol&lt;/span&gt;&lt;span style="color: #007700;"&gt;();&lt;br /&gt;&lt;span style="color: black;"&gt;1020&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1020" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$q&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;str_replace&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"$q"&lt;/span&gt;&lt;span style="color: #007700;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"$q$q"&lt;/span&gt;&lt;span style="color: #007700;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$value&lt;/span&gt;&lt;span style="color: #007700;"&gt;)&amp;nbsp;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$q&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&lt;br /&gt;&lt;span style="color: black;"&gt;1021&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1021" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: black;"&gt;1022&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1022" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$value&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&lt;br /&gt;&lt;span style="color: black;"&gt;1023&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line1023" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: #f4f4f4; font-family: Verdana; font-size: 14px; line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: monospace; font-size: small; line-height: normal;"&gt;&lt;span style="color: #007700;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;O nosso problema agora tem um foco bem mais específico. Como fazer o atributo &lt;b&gt;protegido&lt;/b&gt;&amp;nbsp;_autoQuoteIdentifiers ser falso. Logicamente se o atributo fosse público ou ao menos tivesse um setAutoQuoteIndentifiers ou algo similar, estaria agora resolvido o problema, na nossa classe pai que herda o&amp;nbsp;&lt;/span&gt;Zend_Db_Table_Abstract, algo muito parecido com:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; public function init()&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;$this-&amp;gt;_db-&amp;gt;setAutoQuoteIndentifiers( false );&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mas, para nossa tristeza e agonia esse método setter não existe. Então precisamos descobrir como esse atributo recebe um valor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fazendo uma busca na classe, vemos que esse atributo pode ter seu valor atribuído caso ele venha no Array que é recebido no método construtor da classe&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.tig12.net/downloads/apidocs/zf/Db/Adapter/Abstract.php.source.html#line142"&gt;http://www.tig12.net/downloads/apidocs/zf/Db/Adapter/Abstract.php.source.html#line&lt;/a&gt;240&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span style="color: #007700;"&gt;&lt;span style="color: black;"&gt;238&lt;/span&gt;&amp;nbsp;&lt;a href="" name="line238" style="text-decoration: none;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;239&lt;/span&gt;&amp;nbsp;&lt;a href="" name="line239" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff8000;"&gt;//&amp;nbsp;obtain&amp;nbsp;quoting&amp;nbsp;property&amp;nbsp;if&amp;nbsp;there&amp;nbsp;is&amp;nbsp;one&lt;br /&gt;&lt;span style="color: black;"&gt;240&lt;/span&gt;&amp;nbsp;&lt;a href="" name="line240" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;array_key_exists&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;Zend_Db&lt;/span&gt;&lt;span style="color: #007700;"&gt;::&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;AUTO_QUOTE_IDENTIFIERS&lt;/span&gt;&lt;span style="color: #007700;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$options&lt;/span&gt;&lt;span style="color: #007700;"&gt;))&amp;nbsp;{&lt;br /&gt;&lt;span style="color: black;"&gt;241&lt;/span&gt;&amp;nbsp;&lt;a href="" name="line241" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$this&lt;/span&gt;&lt;span style="color: #007700;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_autoQuoteIdentifiers&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;nbsp;(bool)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$options&lt;/span&gt;&lt;span style="color: #007700;"&gt;[&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;Zend_Db&lt;/span&gt;&lt;span style="color: #007700;"&gt;::&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;AUTO_QUOTE_IDENTIFIERS&lt;/span&gt;&lt;span style="color: #007700;"&gt;];&lt;br /&gt;&lt;span style="color: black;"&gt;242&lt;/span&gt;&amp;nbsp;&lt;a href="" name="line242" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: black;"&gt;243&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: monospace;"&gt;&lt;span style="color: #007700;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Tentando entender como essa variável $options é montada, vemos que essa variável é um Array que é inicializado com os valores padrões:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: monospace;"&gt;&lt;span style="color: #007700;"&gt;&lt;span style="color: black;"&gt;185&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line185" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$options&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;nbsp;array(&lt;br /&gt;&lt;span style="color: black;"&gt;186&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line186" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;Zend_Db&lt;/span&gt;&lt;span style="color: #007700;"&gt;::&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;CASE_FOLDING&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$this&lt;/span&gt;&lt;span style="color: #007700;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_caseFolding&lt;/span&gt;&lt;span style="color: #007700;"&gt;,&lt;br /&gt;&lt;span style="color: black;"&gt;187&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line187" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;Zend_Db&lt;/span&gt;&lt;span style="color: #007700;"&gt;::&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;AUTO_QUOTE_IDENTIFIERS&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$this&lt;/span&gt;&lt;span style="color: #007700;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_autoQuoteIdentifiers&lt;br /&gt;&lt;span style="color: black;"&gt;188&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line188" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mas que tem esses valores alterados conforme os elementos que são recebidos no campo "options" do $config. Sendo $config o Array que é recebido no construtor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: monospace;"&gt;&lt;span style="color: #007700;"&gt;&lt;span style="color: black;"&gt;190&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line190" style="text-decoration: none;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;191&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line191" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff8000;"&gt;/*&lt;br /&gt;&lt;span style="color: black;"&gt;192&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line192" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;normalize&amp;nbsp;the&amp;nbsp;config&amp;nbsp;and&amp;nbsp;merge&amp;nbsp;it&amp;nbsp;with&amp;nbsp;the&amp;nbsp;defaults&lt;br /&gt;&lt;span style="color: black;"&gt;193&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line193" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&lt;span style="color: black;"&gt;194&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line194" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;array_key_exists&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'options'&lt;/span&gt;&lt;span style="color: #007700;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$config&lt;/span&gt;&lt;span style="color: #007700;"&gt;))&amp;nbsp;{&lt;br /&gt;&lt;span style="color: black;"&gt;195&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line195" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff8000;"&gt;//&amp;nbsp;can't&amp;nbsp;use&amp;nbsp;array_merge()&amp;nbsp;because&amp;nbsp;keys&amp;nbsp;might&amp;nbsp;be&amp;nbsp;integers&lt;br /&gt;&lt;span style="color: black;"&gt;196&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line196" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;foreach&amp;nbsp;((array)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$config&lt;/span&gt;&lt;span style="color: #007700;"&gt;[&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'options'&lt;/span&gt;&lt;span style="color: #007700;"&gt;]&amp;nbsp;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$key&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$value&lt;/span&gt;&lt;span style="color: #007700;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: black;"&gt;197&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line197" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$options&lt;/span&gt;&lt;span style="color: #007700;"&gt;[&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$key&lt;/span&gt;&lt;span style="color: #007700;"&gt;]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$value&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&lt;br /&gt;&lt;span style="color: black;"&gt;198&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line198" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: black;"&gt;199&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line199" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Procurando então em que local do&amp;nbsp;Zend_Db_Table_Abstract que é instanciado o atributo&amp;nbsp;$this-&amp;gt;_db&lt;/div&gt;&lt;div&gt;Chegamos nas seguintes linhas:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #007700; font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="background-color: white; color: black;"&gt;&lt;span style="color: #007700;"&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;575&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line575" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff8000;"&gt;/**&lt;br /&gt;&lt;span style="color: black;"&gt;576&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line576" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;&amp;nbsp;mixed&amp;nbsp;$db&amp;nbsp;Either&amp;nbsp;an&amp;nbsp;Adapter&amp;nbsp;object,&amp;nbsp;or&amp;nbsp;a&amp;nbsp;string&amp;nbsp;naming&amp;nbsp;a&amp;nbsp;Registry&amp;nbsp;key&lt;br /&gt;&lt;span style="color: black;"&gt;577&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line577" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;Zend_Db_Table_Abstract&amp;nbsp;Provides&amp;nbsp;a&amp;nbsp;fluent&amp;nbsp;interface&lt;br /&gt;&lt;span style="color: black;"&gt;578&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line578" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&lt;span style="color: black;"&gt;579&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line579" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;protected&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_setAdapter&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$db&lt;/span&gt;&lt;span style="color: #007700;"&gt;)&lt;br /&gt;&lt;span style="color: black;"&gt;580&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line580" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: black;"&gt;581&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line581" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$this&lt;/span&gt;&lt;span style="color: #007700;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_db&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;self&lt;/span&gt;&lt;span style="color: #007700;"&gt;::&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_setupAdapter&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$db&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&lt;br /&gt;&lt;span style="color: black;"&gt;582&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line582" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$this&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&lt;br /&gt;&lt;span style="color: black;"&gt;583&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line583" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #007700; font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="background-color: white; color: black;"&gt;&lt;span style="color: #007700;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Seguindo o rastro, vamos ao método _setupAdapter:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: monospace;"&gt;&lt;span style="color: #007700;"&gt;&lt;span style="color: black;"&gt;594&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line594" style="text-decoration: none;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;595&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line595" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff8000;"&gt;/**&lt;br /&gt;&lt;span style="color: black;"&gt;596&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line596" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;&amp;nbsp;mixed&amp;nbsp;$db&amp;nbsp;Either&amp;nbsp;an&amp;nbsp;Adapter&amp;nbsp;object,&amp;nbsp;or&amp;nbsp;a&amp;nbsp;string&amp;nbsp;naming&amp;nbsp;a&amp;nbsp;Registry&amp;nbsp;key&lt;br /&gt;&lt;span style="color: black;"&gt;597&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line597" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;Zend_Db_Adapter_Abstract&lt;br /&gt;&lt;span style="color: black;"&gt;598&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line598" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@throws&amp;nbsp;Zend_Db_Table_Exception&lt;br /&gt;&lt;span style="color: black;"&gt;599&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line599" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&lt;span style="color: black;"&gt;600&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line600" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;protected&amp;nbsp;static&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_setupAdapter&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$db&lt;/span&gt;&lt;span style="color: #007700;"&gt;)&lt;br /&gt;&lt;span style="color: black;"&gt;601&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line601" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;span style="color: black;"&gt;602&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line602" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$db&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;===&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;null&lt;/span&gt;&lt;span style="color: #007700;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: black;"&gt;603&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line603" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;null&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&lt;br /&gt;&lt;span style="color: black;"&gt;604&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line604" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: black;"&gt;605&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line605" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;is_string&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$db&lt;/span&gt;&lt;span style="color: #007700;"&gt;))&amp;nbsp;{&lt;br /&gt;&lt;span style="color: black;"&gt;606&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line606" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;require_once&amp;nbsp;&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'Zend/Registry.php'&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&lt;br /&gt;&lt;span style="color: black;"&gt;607&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line607" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$db&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;Zend_Registry&lt;/span&gt;&lt;span style="color: #007700;"&gt;::&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;get&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$db&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&lt;br /&gt;&lt;span style="color: black;"&gt;608&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line608" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: black;"&gt;609&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line609" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$db&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;instanceof&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;Zend_Db_Adapter_Abstract&lt;/span&gt;&lt;span style="color: #007700;"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;span style="color: black;"&gt;610&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line610" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;require_once&amp;nbsp;&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'Zend/Db/Table/Exception.php'&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&lt;br /&gt;&lt;span style="color: black;"&gt;611&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line611" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;Zend_Db_Table_Exception&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'Argument&amp;nbsp;must&amp;nbsp;be&amp;nbsp;of&amp;nbsp;type&amp;nbsp;Zend_Db_Adapter_Abstract,&amp;nbsp;or&amp;nbsp;a&amp;nbsp;Registry&amp;nbsp;key&amp;nbsp;where&amp;nbsp;a&amp;nbsp;Zend_Db_Adapter_Abstract&amp;nbsp;object&amp;nbsp;is&amp;nbsp;stored'&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&lt;br /&gt;&lt;span style="color: black;"&gt;612&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line612" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;span style="color: black;"&gt;613&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line613" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$db&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&lt;br /&gt;&lt;span style="color: black;"&gt;614&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line614" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: black;"&gt;&lt;div style="font-family: 'Times New Roman';"&gt;&lt;br class="Apple-interchange-newline" /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Vemos então que esse método consulta o Zend_Registry, o que já era esperado. Sem querer entrar na complexidade desse Registry, nós sabemos que o Zend_Registry do Banco de Dados é informado no application.ini. É lá que informamos dados como login, senha, nome do banco de dados, etc. Então, será que os dados que o construtor do Zend_Db_Table_Abstract apenas lê os dados vindos do application.ini, na parte dos "resources.db"?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Para testar essa hipótese eu vou imprir o $config do construtor do&amp;nbsp;Zend_Db_Table_Abstract. Como qualquer alteração feita no código do Zend Framework isso é apenas para auxiliar o nosso entendimento e deverá ser desfeita em breve.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Ao adicionar no construtor a seguinte linha:&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman';"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; public function __construct($config)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; {&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;var_export( $config );&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;exit();&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;		&lt;/span&gt;// (...)&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman';"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman';"&gt;Obtemos o seguinte resultado:&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman';"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;array (&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'host' =&amp;gt; 'banco_do_projeto',&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'username' =&amp;gt; 'usuario_do_servidor',&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'password' =&amp;gt; '******',&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'dbname' =&amp;gt; 'db_projeto',&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'charset' =&amp;gt; 'utf8',&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'profiler' =&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; array (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 'enabled' =&amp;gt; '1',&lt;/div&gt;&lt;div&gt;&amp;nbsp; ),&lt;/div&gt;&lt;div&gt;)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Precisamos adicionar uma linha no nosso application.ini para testar se essa chegará até o $config. Mas qual seria o valor dessa linha. Por semelhança aos demais elementos que chegaram, deve ser algo similar a&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;resources.db.params.options.xxxxxxxxxxx = 0&lt;/span&gt;. Mas, para encontrarmos o valor que desejamos, precisamos saber qual é o valor da chave. Esse valor nós podemos ver aqui:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.tig12.net/downloads/apidocs/zf/Db/Adapter/Abstract.php.source.html#line187"&gt;http://www.tig12.net/downloads/apidocs/zf/Db/Adapter/Abstract.php.source.html#line187&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: monospace;"&gt;&lt;span style="color: #007700;"&gt;&lt;span style="color: black;"&gt;185&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line185" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$options&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;nbsp;array(&lt;br /&gt;&lt;span style="color: black;"&gt;186&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line186" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;Zend_Db&lt;/span&gt;&lt;span style="color: #007700;"&gt;::&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;CASE_FOLDING&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$this&lt;/span&gt;&lt;span style="color: #007700;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_caseFolding&lt;/span&gt;&lt;span style="color: #007700;"&gt;,&lt;br /&gt;&lt;span style="color: black;"&gt;187&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line187" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;Zend_Db&lt;/span&gt;&lt;span style="color: #007700;"&gt;::&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;AUTO_QUOTE_IDENTIFIERS&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$this&lt;/span&gt;&lt;span style="color: #007700;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;_autoQuoteIdentifiers&lt;br /&gt;&lt;span style="color: black;"&gt;188&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=4058717336638114408" name="line188" style="text-decoration: none;"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;Usando o CRTL+Click da IDE, já fui direto para a declaração desta constante, conforme:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;a href="http://www.tig12.net/downloads/apidocs/zf/Db.php.source.html#line48"&gt;http://www.tig12.net/downloads/apidocs/zf/Db.php.source.html#line48&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: monospace;"&gt;&lt;span style="color: #007700;"&gt;const&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;AUTO_QUOTE_IDENTIFIERS&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'autoQuoteIdentifiers'&lt;/span&gt;&lt;span style="color: #007700;"&gt;;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Logo a nossa nova linha no application.ini, deve ser:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;resources.db.params.options.autoQuoteIdentifiers = 0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;Obtemos o seguinte resultado:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;array (&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'host' =&amp;gt; 'banco_do_projeto',&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'username' =&amp;gt; 'usuario_do_servidor',&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'password' =&amp;gt;&amp;nbsp;'******',&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'dbname' =&amp;gt; 'db_projeto',&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'charset' =&amp;gt; 'utf8',&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'options' =&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; array (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 'autoQuoteIdentifiers' =&amp;gt; '1',&lt;/div&gt;&lt;div&gt;&amp;nbsp; ),&lt;/div&gt;&lt;div&gt;&amp;nbsp; 'profiler' =&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; array (&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 'enabled' =&amp;gt; '1',&lt;/div&gt;&lt;div&gt;&amp;nbsp; ),&lt;/div&gt;&lt;div&gt;)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;Esse novo elemento no $config vai alterar o atributo protegido&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #0000bb; font-family: monospace;"&gt;_autoQuoteIdentifiers&amp;nbsp;&lt;/span&gt;retirando as aspas dos SQL gerados e resolvendo o nosso problema.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Espero que isso tenha ajudado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Um grande abraço.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-305522924437516095?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/305522924437516095/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=305522924437516095' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/305522924437516095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/305522924437516095'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2011/09/resolvendo-problemas-com-aspas-duplas.html' title='Resolvendo Problemas com Aspas Duplas do Zend_Db_Table_Abstract'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-8871485363289416033</id><published>2011-05-16T08:14:00.000-07:00</published><updated>2011-05-19T12:09:59.254-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xhtml'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='coruja'/><category scheme='http://www.blogger.com/atom/ns#' term='template'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='zend'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='inep'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='smarty'/><category scheme='http://www.blogger.com/atom/ns#' term='oop'/><title type='text'>O Template do InepZend</title><content type='html'>Ainda sem nome próprio, o template do &lt;a href="http://thiagomata.blogspot.com/2011/05/framework-php-inep-zend.html"&gt;Inep Zend Framework&lt;/a&gt; tem sido uma das partes mais desafiadoras e excitantes de todo o projeto. Por isso resolvi começar falando logo deste componente.&lt;br /&gt;&lt;br /&gt;Provavelmente, você deve estar com alguma(s) das seguintes indagações abaixo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;PHP precisa de Template?&lt;/li&gt;&lt;li&gt;Smarty já não é bom o bastante?&lt;/li&gt;&lt;li&gt;Será que vou ter de aprender mais uma linguagem de Template?&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;PHP precisa de Template?&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É possível desenvolver bons projetos, de alta complexidade em PHP sem utilizar templates? &lt;b&gt;Sim&lt;/b&gt;. Tanto que o Zend Framework vem nativamente sem nenhuma camada de Template. Mas então, qual é a vantagem do Template? Em linhas gerais, ao se manter a complexidade lógica da aplicação separada do controle da apresentação se reduz o risco de que mudanças no layout gerem impacto sob a lógica da aplicação e vice-versa. A vantagem da camada de Template é bem similar a vantagem de se dividir o código em camadas. Se reduz o acoplamento sem perder a coesão. Com o uso de Templates, o impacto de alterações se torna menor e se facilita identificar o local responsável por um erro. Os pontos negativos também são similares a divisão de camadas, se tem um aumento de complexidade do projeto e um provável aumento no tempo de processamento.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Se a sua empresa tem a divisão entre programadores e designers é quase certo que você precisa de fazer uso de uma camada de Template ( mesmo que não esteja fazendo isso ). Se o seu projeto faz uso de mascaras nos elementos de entrada, tais como mascaras para entradas de valores em dinheiro, entradas de datas, etc., pense seriamente no impacto de alterar essa sua mascara para funcionar num navegador novo, por exemplo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um outro problema&amp;nbsp;freqüente&amp;nbsp;é que os programadores não se preocupam tanto com a qualidade do HTML gerado. Basta tentar validar o seu projeto com alguma das ferramentas disponíveis, tais como o&amp;nbsp;&lt;a href="http://validator.w3.org/"&gt;http://validator.w3.org/&lt;/a&gt;&amp;nbsp;para perceber isso. É muito comum que o HTML válido que o designer passa para a equipe de programação, é alterado várias vezes pela equipe de programação, até que passa a apresentar vários erros de HTML, que são simplesmente ignorados pelos programadores. A complexidade de algumas solução de Template, dificultam ainda mais o controle sobre o HTML desenvolvido. Uma solução clássica de cabeçalho e rodapé gera um problema muitas vezes difícil de resolver. Não será intuitivo, para quem for dar manutenção nos seus arquivos, saber qual é, de todos os arquivos que contém HTML, aquele que fecha a tag da tabela que é aberta no arquivo atual.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Finalmente uma camada de Template pode facilitar a utilização de soluções complexas de modo mais transparente e padronizado. Por exemplo, transformar um formulário de submissão tradicional POST em Ajax pode ser automatizado pela ferramenta desde que informado algum atributo específico. Evita-se assim a criação de várias soluções diferentes para o mesmo problema que além de serem um problema para a manutenção do projeto é um&amp;nbsp;desperdício&amp;nbsp;do tempo de desenvolvimento do programador.&amp;nbsp;Mais argumentos sobre isso você pode encontrar &lt;a href="http://www.worksforweb.com/publications/php-template-engines/"&gt;aqui&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Smarty já não é bom o bastante?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Entre as soluções disponíveis de Templates para PHP, o &lt;a href="http://www.smarty.net/"&gt;Smarty&lt;/a&gt; certamente é a mais popular. O &lt;a href="http://wiki.dwoo.org/index.php/GettingStarted"&gt;Dwoo&lt;/a&gt; intenta ser uma versão um pouco mais moderna do Smarty, mas mantendo o máximo possível de compatibilidade e mantém também vários dos problemas descritos abaixo. As outras soluções encontradas, tais como o &lt;a href="http://pear.php.net/manual/en/package.html.html-template-sigma.intro-syntax.php"&gt;Sigma&lt;/a&gt;, &lt;a href="http://www.twig-project.org/"&gt;Twig&lt;/a&gt;, &lt;a href="http://haanga.org/"&gt;Haanga&lt;/a&gt;&amp;nbsp;também apresentam alguns dos problemas citados no caso do Smarty.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Os principais motivos que nos levou a decidir não utilizar o Smarty foram:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Não disponibilizar validação do HTML gerado;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Para o Smarty, assim como no PHP nativo, o resultado gerado é um texto. Se o texto gerado é um HTML ou não, é um controle que é feito apenas pelo programador. Deste modo, caso o HTML gerado não seja válido, o Smarty não irá fazer nenhum tipo de alerta a respeito, deixando o resultado inválido ser entregue ao usuário.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Não ser XML;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Praticamente qualquer IDE é capaz de fazer uma validação de XMLs. O padrão XML é conhecido tanto por designers quanto por programadores e é o formato padrão em que o XHTML é escrito. Nada faz mais sentido de que o próprio Template seja também em XML.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Não ser flexível para novas funcionalidades;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;O Smarty, segundo a avaliação da nossa equipe, se mostrou pouco flexível para a criação de novas funcionalidades. Chegamos até a editar algumas das expressões regulares do Smarty para tentar deixar o comportamento dele mais flexível antes de decidirmos partir para uma solução própria.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Não ser orientado a objetos.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Por ter sido desenvolvido para PHP4. O Smarty não faz uso dos recursos de orientação a objetos do PHP5. Um componente de template que faça uso de orientação a objetos viabiliza uma personalização e compreensão mais fácil do código em execução, mais flexibilidade na geração de tags personalizadas e ainda a geração e alteração de telas por métodos &lt;a href="http://en.wikipedia.org/wiki/Document_Object_Model"&gt;DOM&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Será que vou ter de aprender mais uma linguagem de Template?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Agora que espero que você já esteja convencido de que precisa de algum Template mais moderno que o Smarty, você deve estar sofrendo com o problema de ter de aprender uma nova gramática de Template. Essa preocupação é perfeitamente compreensível, pois cada ferramenta de Template cria uma versão tão personalizada "para melhor" das tags do HTML. Então, passar a utiliza-la é quase como aprender um HTML diferente. As confusões são inevitáveis assim como o ódio das alterações de nome sem sentido.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;Uma das metas nessa nossa nova ferramenta de Template foi, no máximo possível, não criar tags novas. Então todas as tags do HTML5 funcionam exatamente como são no HTML5. Exatamente isso, escreva um HTML válido e ele já é um Template válido. Se você escrever um HTML inválido o PHP irá gerar uma Exception informando qual regra do HTML5 foi quebrada. Isso mesmo, o PHP através do Template faz validação Server Side do HTML gerado pelo Template. Na versão atual da ferramenta essa validação é obrigatória mas devemos deixa-la opcional para que possa deixar o sistema mais rápido em produção, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mas a vantagem de uma ferramenta de Template é exatamente seu dinamismo então, foi inevitável se criar as tags de repetição, de condição, etc. Então, foram sim criadas tags de template que provavelmente você terá que aprender. A vantagem é que todas essas novas tags são Classes PHP bem documentadas e com exemplos. Conforme pode ser visto &lt;a href="http://www.assembla.com/code/inepzendframework/subversion/nodes/trunk/src/InepZend/library/xhtml/template"&gt;aqui&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Na verdade &lt;b&gt;todas&lt;/b&gt; as tags do Template são classes PHP. Inclusive as tags do HTML5, tornando assim possível a validação do HTML conforme citado acima. Transformamos cada Template XML num arquivo PHP, usando o componente &lt;a href="http://www.assembla.com/code/inepzendframework/subversion/nodes/trunk/src/InepZend/library/coruja/xml2Php/Xml2Php.php"&gt;Xml2Php&lt;/a&gt;, fazendo cache, usando o componente de &lt;a href="http://www.assembla.com/code/inepzendframework/subversion/nodes/trunk/src/InepZend/library/coruja/cache/CorujaCache.php"&gt;Cache&lt;/a&gt;, que monta uma arvore de objetos que, quando desenhada, monta uma página XHTML.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Então temos &lt;a href="http://www.assembla.com/code/inepzendframework/subversion/nodes/trunk/src/InepZend/library/xhtml"&gt;aqui&lt;/a&gt; todas as tags do HTML5 escritas no formato de classes bem documentadas. Mesmo que você não tenha se convencido da idéia dos Templates ou não tenha gostado da nossa solução, pode ser útil como ferramenta de pesquisa.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Todas as tags podem ser estendidas, podendo você ter tags específicas do seu projeto. Por exemplo essa tag &lt;a href="http://www.assembla.com/code/inepzendframework/subversion/nodes/trunk/src/projeto/application/template/tags/Numero.php"&gt;Numero&lt;/a&gt;&amp;nbsp;estende a tag &lt;a href="http://www.assembla.com/code/inepzendframework/subversion/nodes/trunk/src/InepZend/library/xhtml/Input.php"&gt;Input&lt;/a&gt; colocando uma mascara Javascript.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Então, resumindo tudo num exemplo: esse &lt;a href="http://www.assembla.com/code/inepzendframework/subversion/nodes/trunk/src/projeto/application/template/scripts/example.pxml"&gt;template&lt;/a&gt;, vira esse&lt;a href="http://www.assembla.com/code/inepzendframework/subversion/nodes/trunk/src/projeto/application/cache/example_7f9f4f32ce08790050d44037545ca1e5.php"&gt; arquivo php&lt;/a&gt; que quando interpretado é validado e monta dinamicamente uma página XHTML5.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Espero que tenham gostado do nosso Template. Em breve devemos disponibilizar tutoriais para explicar melhor item a item dentro do site do projeto. Esse post foi mais um making-off das motivações e decisões que levaram o projeto até onde ele está.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Abraços,&lt;/div&gt;&lt;div&gt;Thiago&amp;nbsp;Mata.&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #444444; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;span style="color: #888888;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;dd style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-collapse: separate; font-family: 'Times New Roman'; line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.75em;"&gt;&lt;div style="line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #888888;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Algumas perguntas e repostas:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/dd&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Verdana, sans-serif; font-size: 15px; font-weight: bold; line-height: 20px; white-space: nowrap;"&gt;&lt;span dir="ltr"&gt;&lt;a href="http://www.blogger.com/profile/08074490186320991844" rel="nofollow" style="color: #3366cc; font-weight: bold; text-decoration: underline;"&gt;Rafael Barbosa&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Verdana, sans-serif; font-size: 15px; font-weight: bold; line-height: 20px; white-space: nowrap;"&gt;&amp;nbsp;disse...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;dd style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.75em;"&gt;&lt;div style="line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Sem querer desmerecer o projeto, mas pelas motivações e implicações colocadas eu não entendi porque não utilizar um template engine pronto. O Twig, por exemplo, tem tudo que você precisa e já está pronto.&lt;br /&gt;&lt;br /&gt;Sem contar que transformar markup em objetos pra transformar em markup de novo simplesmente pra garantir que esteja bem formado me parece MUITO overkill.&lt;br /&gt;&lt;br /&gt;Eu trabalhei muito tempo no governo e sei que é difícil conseguir agregar um ferramental novo ao trabalho, mas ainda acho que vale o esforço de tentar utilizar algo que já está estável e é amplamente aceito pela comunidade do que construir algo do zero.&lt;/div&gt;&lt;/dd&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.thiagomata.blogspot.com/"&gt;Thiago Mata&lt;/a&gt; responde...&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Primeiramente seu comentário é muito pertinente. A resposta que eu vou lhe passar devo colocar na própria documentação do projeto mas talvez ainda assim faça um adendo no post falando disso.&lt;br /&gt;&lt;br /&gt;Conforme você já deve ter notado, a solução que fizemos foi muito similar ao Jsf http://exadel.com/web/portal/jsftags-guide, Seam, ColdFusion, JLibs http://code.google.com/p/jlibs/wiki/XMLDocument, &amp;nbsp;então vou evitar ser repetitivo e dizer que os pontos positivos e negativos dessas soluções são bem próximos. Basta uma busca sobre Jsf ou Jlibs e você verá pessoas defendendo e apoiando conforme o contexto. Apenas ressaltando que na nossa implementação, foram mantidas os nomes e os atributos das tags do html.&lt;br /&gt;&lt;br /&gt;Apesar do custo das conversões Xml =&amp;gt; OO =&amp;gt;&amp;nbsp;Xml ser de fato um custo grande, a diferença em termos de tempo resposta, mesmo quando fizemos simulações de vários milhares de acessos simultâneos, não foi tão grande ao ponto de ser considerado impeditivo, tendo em vista o porte das máquinas que temos. Mas compreendo que isso pode não ser o caso em outras empresas.&lt;br /&gt;&lt;br /&gt;Utilizar esse recurso de Xml =&amp;gt; OO =&amp;gt; Xml nos permite muito mais do que apenas validar o Xhtml, esse foi um dos argumentos do post que já estava muito extenso. &amp;nbsp;Esse argumento se mostrou importante aqui na empresa por que foi uma das reclamações que nossos usuários finais fazem dos nossos sistemas. Como estamos ainda tendo que trabalhar com fabricas de softwares, controlar a qualidade do xhtml gerado é essencial. Lembre-se que temos sistemas em que os usuários são deficientes visuais ou com inabilidades motoras onde uma página html mal feita pode ser impeditivo ao uso.&lt;br /&gt;&lt;br /&gt;Dentre outras vantagens dessa solução temos o encapsulamento de componentes complexos de tela em objetos. Podemos ter as tags personalizadas como &lt;graficodepizza&gt; &lt;paginacao&gt; &lt;comentarios&gt; &lt;botaofacebooklike&gt; etc. E, a mesma validação que funciona nas tags do xhtml, irá validar se os campos de cada uma dessas tags foram adequadamente preenchidos, assim como já está funcionando com as tags de template. A criação dessas tags personalizadas pode ser feita utilizando outros templates combinados com comandos DOM, ou fazendo uso apenas de objetos e DOM, etc. Tudo isso utilizando as vantagens de uma organização OO. Essa capacidade de encapsulamento de complexidade e padronização de arquitetura de modo intuitivo no template foi uma das melhorias solicitadas para a nossa equipe.&lt;/botaofacebooklike&gt;&lt;/comentarios&gt;&lt;/paginacao&gt;&lt;/graficodepizza&gt;&lt;br /&gt;&lt;br /&gt;Se você avaliar o exemplo da tag personalizada Number que utilizei no post, irá notar que uma tag no meio do conteúdo adicionou um script no head. Então, conforme pode ser visto nesse exemplo, as tags podem interagir entre si, adicionando ou alterando o comportamento de tags anteriores. Com isso nós podemos fazer, por exemplo, páginas que façam carga apenas dos arquivos javascript e css que forem ser utilizados. Podemos também fazer facilmente que uma tag especial seja a soma dos valores de outras tags, a média dos valores, etc. sem exigir conhecimento de javascript.&lt;br /&gt;&lt;br /&gt;Uma das idéias das próximas é viabilizar a "adequação" do html de resultado para o navegador do cliente. O programador / designer continuará escrevendo HTML5 e será de responsabilidade do framework fazer as "correções" necessárias para funcionar nos browsers não modernos.&lt;br /&gt;&lt;br /&gt;Por último, tendo em vista que temos uma versão server side da página do usuário, podemos armazena-la na sessão, e então fazer uma sincronia das alterações usando ajax. Em outras palavras, podemos fazer manipulações server side no objeto tela, a partir de eventos de tela enviados ao servidor, que depois é sincronizado no cliente via ajax. Esse passo ainda está em iniciação no Inep Zend mas no Coruja Php Framework já conseguimos isso com sucesso. Chegamos a desenvolver uma planilha similar ao Excel / Calc utilizando esta técnica com toda lógica de negócio necessária para a interpretação das fórmulas e alteração em cascata do valor dos campos no Server Side.&lt;br /&gt;&lt;br /&gt;Além de tudo, não obrigamos nossa equipe a utilizar esse template o tempo todo. Conforme foi dito mantemos a compatibilidade do tudo que já funcionava no Zend, inclusive o phtml. Então, caso numa página ou layout o uso do template se mostre desnecessário ou inadequado, o programador pode fazer uso da solução padrão do Zend. Pode-se até pensar de maneira invertida, utilizando sempre phtml e ter essa ferramenta de template caso se deseje fazer alguma página de maior complexidade.&lt;br /&gt;&lt;br /&gt;Espero ter esclarecido,&lt;br /&gt;Thiago Mata.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;dd style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-collapse: separate; font-family: 'Times New Roman'; font-size: medium; line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.75em;"&gt;&lt;div style="line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #888888;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/dd&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Verdana, sans-serif; font-size: 15px; font-weight: bold; line-height: 20px; white-space: nowrap;"&gt;&lt;span dir="ltr"&gt;&lt;a href="http://www.blogger.com/profile/08074490186320991844" rel="nofollow" style="color: #3366cc; font-weight: bold; text-decoration: underline;"&gt;Rafael Barbosa&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Verdana, sans-serif; font-size: 15px; font-weight: bold; line-height: 20px; white-space: nowrap;"&gt;&amp;nbsp;disse...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #444444; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #444444; font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: #333333; font-family: Arial, Verdana, sans-serif; font-weight: bold; line-height: 20px; white-space: nowrap;"&gt;&lt;/span&gt;Caro Thiago,&lt;br /&gt;&lt;br /&gt;posso postar no seu blog esse comentário depois sem problema.&lt;br /&gt;&lt;br /&gt;Eu entendo o embasamento que você teve de outras ferramentas, e acho válida a iniciativa de querer melhorar as ferramentas de trabalho. O que me preocupa é o tempo gasto com algo que, a meu ver, tem muito mais desvantagens do que vantagens.&lt;br /&gt;&lt;br /&gt;A parte da validação de markup não deveria ser responsabilidade da framework e pode ser remediada de N formas. A mais simples delas é exigir a validação das páginas com as ferramentas da w3c na rotina de testes/homologação do seu sistema. Isso é muito simples de justificar e eu julgo necessário mesmo tendo a validação interna no pré-processamento da requisição. Logo, esse problema de validação tem uma solução que não necessita escrever 1 linha de código.&lt;br /&gt;&lt;br /&gt;O custo da transformação do markup para objeto se torna linear se vc usar algum ferramenta (por mais simples que seja) de cache. Eu não disse que o custo era ALTO e sim DESNECESSÁRIO (usei o termo OVERKILL). O que você vai ter com isso é mais um ponto de falha, mais um módulo para dar manutenção e mais um pedaço da sua arquitetura para documentar e testar sem ter o ganho que isso deveria te proporcionar.&lt;br /&gt;&lt;br /&gt;Quanto às tags personalizadas elas já existiam no Smarty (apesar de ser um inferno extender aquilo) e existem no Twig (que na minha humilde opinião é a melhor engine de template que existe) e em outras ferramentas. Talvez o que exista no seu caso seja uma preferência em usar tags fechadas por &amp;lt;&amp;gt; (o que eu não acho legal, mas entendo ser outra questão), nesse caso basta alterar uma dessas bibliotecas para utilizar as tags como você gosta, assim você não precisa reinventar a roda.&lt;br /&gt;&lt;br /&gt;Guardar a página do usuário em sessão e atualizar via ajax. Isso realmente é algo que você deveria repensar antes de implementar. Alguns motivos para isso:&lt;br /&gt;1 - Você já tem todo o DOM bonitinho na tela do seu usuário ( em JavaScript). Ter isso em sessão é simplesmente duplicar uma informação, uma vez que o servidor não pode fazer muita coisa com ela.&lt;br /&gt;2 - Tudo que existir na tela (client) vai ter que de alguma forma sincronizar de volta com o servidor. Isso é completamente desnecessário, visto que o browser já armazena o estado da tela e em último caso você pode armazenar isso em um cookie via javascript e poupar uma requisição.&lt;br /&gt;3 - Quando você mandar do servidor de volta todo o markup pra tela do cliente você vai precisar carregar de novo todos os binds de objetos no javascript (inclusive os que não mudaram), o browser vai ter que renderizar de novo a página toda. (O cache ajuda, mas não vai fazer milagre)&lt;br /&gt;4 e mais importante: Se você, de alguma forma, for atualizar pedaços da interface com a resposta do servidor em vez de atualizá-la por completo, qualquer framework de javascript faz esse trabalho de forma stateless/rápida e ainda te permite alterar o history do browser com o pushState sem quebrar o botão de voltar.&lt;br /&gt;&lt;br /&gt;A parte de corrigir o markup de acordo com a versão do browser faz sentido, mas dificilmente você vai esbarrar com uma situação em que alterar o html resolva uma incompatibilidade que você não consiga resolver com alguma camada de abstração pronta em javascript/css.&lt;br /&gt;&lt;br /&gt;Mais uma vez, eu aprecio a iniciativa e pelo nível de complexidade de uma ferramenta dessas eu acredito que você e os membros da sua equipe sejam ótimos programadores, mas acho que a força de trabalho de vocês deveria ser utilizada pra construir algo novo e melhor e não ficar reescrevendo ferramentas que já existem.&lt;br /&gt;&lt;br /&gt;Dá uma olhada do que tem sido feito nos projetos da sensio-labs. Especialmente o Symfony 2 e o Doctrine 2. Eles estão escrevendo as bibliotecas mais avançadas em php 5.3 que existem. Vale a pena dar uma olhada e tentar participar dessa evolução da das ferramentas e da linguagem junto com a comunidade.&lt;br /&gt;&lt;br /&gt;Atenciosamente,&lt;br /&gt;&lt;span style="color: #888888;"&gt;Rafael Barbosa&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;dd style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-collapse: separate; font-family: 'Times New Roman'; font-size: medium; line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.75em;"&gt;&lt;div style="line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #888888;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/dd&gt;&lt;br /&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;a href="http://www.thiagomata.blogspot.com/"&gt;Thiago Mata&lt;/a&gt;&amp;nbsp;&lt;/span&gt;responde...&lt;/b&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: inherit;"&gt;Gostei dos seus comentários como sempre,&lt;/span&gt;&lt;/div&gt;&lt;div class="im"&gt;&lt;div style="color: #333333;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: #3d85c6; font-family: inherit;"&gt;Eu entendo o embasamento que você teve de outras ferramentas, e acho válida a iniciativa de querer melhorar as ferramentas de trabalho. O que me preocupa é o tempo gasto com algo que, a meu ver, tem muito mais desvantagens do que vantagens.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #333333;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="color: #444444;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="border-collapse: separate; color: black; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #888888;"&gt;&lt;span style="color: #444444;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="border-collapse: separate; color: black; font-family: inherit;"&gt;Ainda não vi tantas desvantagens. Replicar as tags do HTML foi um trabalho massante, de fato, mas feito com baixa complexidade e em relativamente pouco tempo. Bastou lermos a especificação do Mozilla&amp;nbsp;&lt;a href="http://developer.mozilla.org/en/HTML/Element/" style="color: #222222;" target="_blank"&gt;http://developer.mozilla.org/&lt;wbr&gt;&lt;/wbr&gt;en/HTML/Element/&lt;/a&gt;&amp;nbsp;&amp;nbsp;e &amp;nbsp;como eu te falei não tem tanto impacto na performance. A complexidade do código não é tão grande e pretendemos fazer bons testes com ele com PHPUnit o que deve reduzir consideravelmente a chance de algum erro. Então não vi as desvantagens.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="im"&gt;&lt;div style="color: #333333;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="color: #444444;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="border-collapse: separate; color: black; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="border-collapse: separate;"&gt;&lt;span style="border-collapse: collapse; color: #3d85c6; font-family: inherit;"&gt;A parte da validação de markup não deveria ser responsabilidade da framework e pode ser remediada de N formas. A mais simples delas é exigir a validação das páginas com as ferramentas da w3c na rotina de testes/homologação do seu sistema. Isso é muito simples de justificar e eu julgo necessário mesmo tendo a validação interna no pré-processamento da requisição. Logo, esse problema de validação tem uma solução que não necessita escrever 1 linha de código.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #333333;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="color: #444444;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="border-collapse: separate; color: black;"&gt;&lt;span style="border-collapse: collapse; color: #444444; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;Estou certo que não preciso te lembrar que todas as páginas são&amp;nbsp;dinâmicas&amp;nbsp;e testar todas as combinações pode ser um trabalho sem fim. Garantir continuamente a qualidade do HTML é um ponto positivo. O teste de validação vai continuar existindo mas será feito sempre em algumas poucas das saídas possíveis. Além do que as mensagens de erro do Framework podem ser mais claras do que a validação externa como mostrar em qual arquivo de Template o erro aconteceu. Lembrando que essa validação de atributos obrigatórios, valores default, etc. deve existir para as tags personalizadas então estamos reaproveitando esse recurso para validar também as tags do HTML.&lt;/span&gt;&lt;/div&gt;&lt;div class="im"&gt;&lt;div style="color: #333333;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: #3d85c6; font-family: inherit;"&gt;Quanto às tags personalizadas elas já existiam no Smarty (apesar de ser um inferno extender aquilo)&lt;/span&gt;&lt;span style="color: #3366ff; font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #333333;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: #3366ff; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #888888;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: #3366ff;"&gt;&lt;span style="border-collapse: separate; color: black; font-family: inherit;"&gt;INFERNO!!!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="im"&gt;&lt;div style="color: #333333;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: #3366ff;"&gt;&lt;span style="border-collapse: separate; color: black; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: #3d85c6; font-family: inherit;"&gt;e existem no Twig (que na minha humilde opinião é a melhor engine de template que existe) e em outras ferramentas. Talvez o que exista no seu caso seja uma preferência em usar tags fechadas por &amp;lt;&amp;gt; (o que eu não acho legal, mas entendo ser outra questão), nesse caso basta alterar uma dessas bibliotecas para utilizar as tags como você gosta, assim você não precisa reinventar a roda.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #333333;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="color: #444444;"&gt;&lt;span style="color: black;"&gt;&lt;span style="border-collapse: collapse; color: #444444; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;Até onde eu sei. O Twig ainda segue uma linha de templates de arquivos incluindo arquivos que já vi várias vezes fugindo de controle. Mas prometo que vou avalia-lo mais a fundo. Se ele se mostrar uma solução que venha a atender nossas necessidades nós poderemos passar a utiliza-lo ou deixa-lo como uma opção de template alternativa.&lt;/span&gt;&lt;/div&gt;&lt;div class="im"&gt;&lt;div style="color: #333333;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: #3d85c6; font-family: inherit;"&gt;Guardar a página do usuário em sessão e atualizar via ajax. Isso realmente é algo que você deveria repensar antes de implementar. Alguns motivos para isso:&lt;br /&gt;1 - Você já tem todo o DOM bonitinho na tela do seu usuário ( em JavaScript). Ter isso em sessão é simplesmente duplicar uma informação, uma vez que o servidor não pode fazer muita coisa com ela.&lt;br /&gt;2 - Tudo que existir na tela (client) vai ter que de alguma forma sincronizar de volta com o servidor. Isso é completamente desnecessário, visto que o browser já armazena o estado da tela e em último caso você pode armazenar isso em um cookie via javascript e poupar uma requisição.&lt;br /&gt;3 - Quando você mandar do servidor de volta todo o markup pra tela do cliente você vai precisar carregar de novo todos os binds de objetos no javascript (inclusive os que não mudaram), o browser vai ter que renderizar de novo a página toda. (O cache ajuda, mas não vai fazer milagre)&lt;br /&gt;4 e mais importante: Se você, de alguma forma, for atualizar pedaços da interface com a resposta do servidor em vez de atualizá-la por completo, qualquer framework de javascript faz esse trabalho de forma stateless/rápida e ainda te permite alterar o history do browser com o pushState sem quebrar o botão de voltar.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;1. Ter 100kb a mais para cada sessao de cada usuário logado não é exatamente um problema terrível. Lembre-se que essa página já existe como arvore de objetos no servidor então eu só serializo e salvo na sessão. No ambiente de produção muitas vezes os "arquivos" da sessão ficam numa area da memória RAM. Então fica muito realmente rápido. Podemos também guardar esse dado serializado em outros lugares além da sessão como no banco ou num arquivo separado, etc.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;2. Não entendi. Tenho a impressão que você não entendeu exatamente como nós fizemos essa sincronia. As operações nesse contexto vão acontecer no servidor. Veja GWT, que é algo muito similar a isso.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;3. Não vamos mandar de volta uma versão toda nova da tela. Apenas receber um json com o que mudou em quais tags. Novamente recomendo você dar uma boa olhada no GWT.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;4. Pretendo sim utilizar algum framework Javascript para fazer essa comunicação com o servidor. Mas isso não impede de precisamos de um servidor capaz de receber o evento e saber quais tags devem ser alteradas e quais devem ser seus novos conteúdos etc.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Thiago Mata.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;dd style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-collapse: separate; font-family: 'Times New Roman'; font-size: medium; line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.75em;"&gt;&lt;div style="line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #888888;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/dd&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Verdana, sans-serif; font-size: 15px; font-weight: bold; line-height: 20px; white-space: nowrap;"&gt;&lt;span dir="ltr"&gt;&lt;a href="http://www.blogger.com/profile/08074490186320991844" rel="nofollow" style="color: #3366cc; font-weight: bold; text-decoration: underline;"&gt;Rafael Barbosa&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Verdana, sans-serif; font-size: 15px; font-weight: bold; line-height: 20px; white-space: nowrap;"&gt;&amp;nbsp;disse...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #444444; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #444444; font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: #333333; font-family: Arial, Verdana, sans-serif; font-weight: bold; line-height: 20px; white-space: nowrap;"&gt;&lt;/span&gt;Caro Thiago,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #444444; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="im"&gt;&lt;div&gt;&lt;div class="im" style="border-collapse: collapse;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="border-collapse: separate; font-family: arial;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;Ainda não vi tantas desvantagens. Replicar as tags do HTML foi um trabalho massante, de fato, mas feito com baixa complexidade e em relativamente pouco tempo. Bastou lermos a especificação do Mozilla&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-collapse: collapse;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="border-collapse: separate; font-family: arial;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;&lt;a href="http://developer.mozilla.org/en/HTML/Element/" target="_blank"&gt;http://developer.mozilla.org/&lt;wbr&gt;&lt;/wbr&gt;en/HTML/Element/&lt;/a&gt;&amp;nbsp;&amp;nbsp;e &amp;nbsp;como eu te falei não tem tanto impacto na performance. A complexidade do código não é tão grande e pretendemos fazer bons testes com ele com PHPUnit o que deve reduzir consideravelmente a chance de algum erro. Então não vi as desvantagens.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span class="Apple-style-span" style="border-collapse: collapse; color: #444444; font-family: inherit;"&gt;Ter testes unitários vai mesmo reduzir bugs e te ajudar a dar manutenção, o que não quer dizer que essa manutenção deixe de existir. Como eu disse, como qualquer parte do sistema, tem que ter uma razão pra estar lá senão não vale o esforço de manutenção.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="border-collapse: collapse; color: #444444;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span style="color: #444444; font-family: arial, sans-serif;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="border-collapse: separate; color: black; font-family: arial;"&gt;&lt;span style="border-collapse: collapse; color: #444444; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="border-collapse: collapse;"&gt;&lt;div class="im"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;Estou certo que não preciso te lembrar que todas as páginas são&amp;nbsp;dinâmicas&amp;nbsp;e testar todas as combinações pode ser um trabalho sem fim. Garantir continuamente a qualidade do HTML é um ponto positivo. O teste de validação vai continuar existindo mas será feito sempre em algumas poucas das saídas possíveis. Além do que as mensagens de erro do Framework podem ser mais claras do que a validação externa como mostrar em qual arquivo de Template o erro aconteceu. Lembrando que essa validação de atributos obrigatórios, valores default, etc. deve existir para as tags personalizadas então estamos reaproveitando esse recurso para validar também as tags do HTML.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span style="color: #444444;"&gt;Manter o HTML válido sempre é interessante, mas eu acho que isso deveria ser uma tarefa executada ao empacotar sua aplicação e não a cada request. Uma solução mais limpa (e que não exigiria a recriação das views da sua aplicação) seria a criação de testes de aceitação pra cada uma das funcionalidades onde, além de executar o teste de aceitação da especificação você utilizasse os webservices da W3C para validar o markup gerado ao final do teste. Dá um pouco de trabalho adaptar o PHPUnit pra fazer esse tipo de teste mas o tempo que isso vai te poupar a longo prazo é absurdo!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-collapse: collapse;"&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span style="color: #444444; font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="border-collapse: collapse;"&gt;&lt;div class="im"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;Até onde eu sei. O Twig ainda segue uma linha de templates de arquivos incluindo arquivos que já vi várias vezes fugindo de controle. Mas prometo que vou avalia-lo mais a fundo. Se ele se mostrar uma solução que venha a atender nossas necessidades nós poderemos passar a utiliza-lo ou deixa-lo como uma opção de template alternativa.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span style="color: #444444;"&gt;Como todo código extensível (e isso inclui o próprio php) se você não definir um padrão de uso os arquivos vão fugir do controle. Como exemplo o ministério da saúde migrou de phtml para twig. Os arquivos em si não mudaram, só o conteúdo, o twig não exige nenhuma extensão específica. Dessa forma a sanidade em relação aos arquivos foi mantida.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span style="color: #444444;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="im" style="border-collapse: collapse;"&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;1. Ter 100kb a mais para cada sessao de cada usuário logado não é exatamente um problema terrível. Lembre-se que essa página já existe como arvore de objetos no servidor então eu só serializo e salvo na sessão. No ambiente de produção muitas vezes os "arquivos" da sessão ficam numa area da memória RAM. Então fica muito realmente rápido. Podemos também guardar esse dado serializado em outros lugares além da sessão como no banco ou num arquivo separado, etc.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;2. Não entendi. Tenho a impressão que você não entendeu exatamente como nós fizemos essa sincronia. As operações nesse contexto vão acontecer no servidor. Veja GWT, que é algo muito similar a isso.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;3. Não vamos mandar de volta uma versão toda nova da tela. Apenas receber um json com o que mudou em quais tags. Novamente recomendo você dar uma boa olhada no GWT.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="border-collapse: collapse;"&gt;&lt;div class="im"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;4. Pretendo sim utilizar algum framework Javascript para fazer essa comunicação com o servidor. Mas isso não impede de precisamos de um servidor capaz de receber o evento e saber quais tags devem ser alteradas e quais devem ser seus novos conteúdos etc.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;1 - Não é um problema terrível se você precisar mesmo disso. Eu ainda não entendi a vantagem de se passar a lógica do cliente para o servidor.&lt;br /&gt;&lt;br /&gt;2 e 3 - Realmente eu tinha entendido diferente. Dessa forma realmente faz sentido.&lt;br /&gt;&lt;br /&gt;4 - Nesse caso depende muito do que você vai precisar fazer. Eu acho que apesar de não existirem grandes problemas, a priori, de manter a página em sessão acredito que para boa parte dos casos não existe essa necessidade. Movimentar coisas na tela por exemplo não precisaria chegar no servidor.&amp;nbsp;Pode ser que para o tipo de aplicação que você desenvolva aí&amp;nbsp;isso faça sentido e eu esteja falando besteira =)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #444444; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;Atenciosamente,&lt;br /&gt;&lt;span style="color: #888888;"&gt;Rafael Barbosa&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;dd style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.75em;"&gt;&lt;div style="line-height: 18px; margin-bottom: 0.75em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="color: #888888;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/dd&gt;&lt;br /&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;a href="http://www.thiagomata.blogspot.com/"&gt;Thiago Mata&lt;/a&gt;&amp;nbsp;&lt;/span&gt;responde...&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span style="color: #888888;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="border-collapse: separate; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: inherit;"&gt;Gostei dos seus comentários como sempre,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: inherit;"&gt;Acredito que você tenha entendido muito bem a solução. Sei que ela apresenta uma complexidade relativamente alta que pode em alguns casos não compensar o uso. Mas conforme você mesmo citou existem casos e casos. Não digo que essa solução precisa / deva ser utilizada em qualquer caso. Na verdade, não acredito que nenhuma solução deva ser utilizada em qualquer caso, num complexo de "bala de prata".&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: inherit;"&gt;Mas conforme os exemplos já citados de GWT, JSF, JLIBS, SEAM, etc. existem contextos onde fazer essa conversão se justifica. Existem ainda cenários que utilizar essa solução não é &lt;b&gt;necessário&lt;/b&gt;&amp;nbsp;mas pode parecer &lt;b&gt;interessante&lt;/b&gt;. Com o framework maduro e já bem otimizado, utilizar essa solução em contextos mais simples pode ser uma boa opção, pensando-se nos ganhos já citados. Novos pontos positivos serão criados a cada dia conforme enriquecemos a solução. Certamente terá pontos negativos, como qualquer decisão. Talvez quando eu tiver exemplos da interação entre os arquivos de template sem os muitos includes, fique mais claro outros ganhos que a utilização desse tipo de solução venha a apresentar. A solução em SEAM, com componentes personalizados, foi muito bem aceita pela equipes, por exemplo, aumentou a produtividade, a padronização e a qualidade dos softwares desenvolvidos. Estamos tentando aprender com as soluções que deram mais certo e errado dentro do nosso cenário e gerar soluções adequadas ao mesmo.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: inherit;"&gt;Resumindo, o que estamos oferecendo aqui é uma opção de solução que temos desenvolvido para se adequar à nossa demanda e ao nosso cenário. Acreditamos que ela pode vir a ser útil em outros cenários também. Certamente ela não será a melhor solução em qualquer cenário mas talvez venha a ser uma boa opção para um cenário que vocês venham a encontrar.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Atenciosamente,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Thiago Mata.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-collapse: separate; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: arial, sans-serif;"&gt;&lt;span style="font-family: arial;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-8871485363289416033?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/8871485363289416033/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=8871485363289416033' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/8871485363289416033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/8871485363289416033'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2011/05/o-template-do-inepzend.html' title='O Template do InepZend'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-113058923912178157</id><published>2011-05-16T04:39:00.000-07:00</published><updated>2011-05-16T05:04:57.023-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xhtml'/><category scheme='http://www.blogger.com/atom/ns#' term='coruja'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='zend'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='inep'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='oop'/><title type='text'>Framework PHP - Inep Zend</title><content type='html'>&lt;div style="text-align: justify;"&gt;Olá colegas,&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Como muitos já sabem tenho trabalhado bastante nesses dias na intenção de migrar para dentro do Zend Framework alguns componentes úteis que criamos para o Coruja Framework. Além disso, estamos criando algumas solução que visam melhorar a produtividade / qualidade dos softwares aqui da empresa, utilizando o Zend Framework. Muitas dessas soluções novas devem fazer o caminho reverso e terem uma versão dentro do Coruja Framework que seja independente do Zend Framework.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Dito isso, eu apresento a vocês o &lt;a href="http://www.ohloh.net/p/inepzend"&gt;Inep Zend Framework&lt;/a&gt;. O projeto,&amp;nbsp;apesar de ainda está numa versão bem preliminar, já está apresentado bons resultados e uma boa receptividade por quem o avalia. Entre suas principais funcionalidades estão:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Modelo Entidade Relacional mais prático, utilizando Anotações;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Zend Forms mais práticos, utilizando Anotações e métodos mágicos;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Possibilidade de se receber parametros, nos métodos das Controladoras;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Uma camada de Template bastante intuitiva, rica e flexível.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Pretendo detalhar melhor, em posts separados, cada uma desses componentes, e dos novos que venham a surgir. Comentários, críticas e sugestões serão sempre bem-vindos.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Espero que gostem,&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Thiago Mata.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-113058923912178157?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/113058923912178157/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=113058923912178157' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/113058923912178157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/113058923912178157'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2011/05/framework-php-inep-zend.html' title='Framework PHP - Inep Zend'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-3513762981036285592</id><published>2010-02-26T09:11:00.000-08:00</published><updated>2010-02-26T09:34:51.666-08:00</updated><title type='text'>PhpUnit 3.4</title><content type='html'>Como instalar o &lt;a href="http://www.phpunit.de/manual/current/en/appendixes.configuration.html"&gt;PhpUnit 3.4&lt;/a&gt; no ubuntu.&lt;div&gt;# apt-get install php5 php5-dev&lt;br /&gt;# pecl install xdebug&lt;br /&gt;# pear channel-discover pear.phpunit.de&lt;br /&gt;# pear install --alldeps phpunit/PHPUnit&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-3513762981036285592?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/3513762981036285592/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=3513762981036285592' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/3513762981036285592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/3513762981036285592'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2010/02/phpunit-34.html' title='PhpUnit 3.4'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-5959210617841991918</id><published>2010-01-28T18:47:00.000-08:00</published><updated>2010-01-28T19:45:50.185-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='swf'/><category scheme='http://www.blogger.com/atom/ns#' term='coruja'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='tree'/><title type='text'>Flash Slideshow feito em PHP lendo XML</title><content type='html'>&lt;div style="text-align: justify;"&gt;Estive precisando recentemente de criar uma galeria de imagens que tivessem alguns recursos interessantespara um site de um fotografo&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Logicamente eu não queria ter de editar a galeria toda vez que ele quisesse adicionar uma nova foto ou alterar a apresentação. Pensando em fazer uma ferramenta que possibilite que o fotografo venha a editar a apresentação do seu slideshow ,sem exigir conhecimentos computacionais, eu criei um componente que lendo um &lt;a href="http://en.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt; numa formatação específica, que ainda não tem um schema para descreve-la, venha a criar um &lt;a href="http://en.wikipedia.org/wiki/SWF"&gt;SWF&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O resultado é uma ferramenta que converte esse XML:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="overflow:auto"&gt;&lt;pre&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;slideshow&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;slides&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;slide&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;time&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"70"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"110"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"320"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo1.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"0"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/slide&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;slide&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;time&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"70"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"310"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"320"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo5.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"10"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/slide&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;slide&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;time&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"100"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"210"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"220"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo2.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"0"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"50"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"30"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"510"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"220"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo3.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"10"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"40"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"30"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"810"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"220"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo4.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"30"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"30"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/slide&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;slide&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;time&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"100"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"210"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"220"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo2.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"0"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"30"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"510"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"220"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo2.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"10"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"30"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"810"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"220"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo2.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"30"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"1110"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"220"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo2.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"30"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"30"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"1410"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"220"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo2.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"40"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"20"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"30"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/slide&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;slide&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;time&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"160"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;image&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"1000"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"220"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;src&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"photo2.jpg"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;wait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"0"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;stay&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"80"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadein&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"40"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt; '&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fadeout&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"40"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span style="color:navy;"&gt;&lt;/span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;span style="color:navy;"&gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/slide&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span style="color:navy;"&gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:navy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/slides&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:olive;"&gt;&lt;span style="display: none;"&gt;...&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;/slideshow&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&amp;gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Nessa apresentação:&lt;/div&gt;&lt;div&gt;&lt;center&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;   &lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0" id="objects" width="500" height="200"&gt;&lt;br /&gt;&lt;param name="movie" value="example.swf"&gt;&lt;br /&gt;&lt;embed src="http://www.thiagomata.com/coruja/svn/coruja/extra/mingSlideshow/example/example.swf" width="500" height="200" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/object&gt;&lt;/center&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O código fonte desse componente se encontra disponível no &lt;a href="http://code.assembla.com/corujaphpframework/subversion/nodes/coruja/extra/mingSlideshow/MingSlideshow.class.php?rev=362"&gt;repositório&lt;/a&gt; do &lt;a href="http://www.assembla.com/spaces/corujaphpframework/"&gt;projeto&lt;/a&gt; assim como o fonte do &lt;a href="http://code.assembla.com/corujaphpframework/subversion/nodes/coruja/extra/mingSlideshow/example/example.php?rev=362"&gt;exemplo&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O componente depende do componente &lt;a href="http://code.assembla.com/corujaphpframework/subversion/nodes/coruja/coruja/components/default/tree/CorujaTree.class.php?rev=362"&gt;CorujaTree&lt;/a&gt; que é uma classe para facilitar a manipulação de &lt;a href="http://en.wikipedia.org/wiki/XML"&gt;XMLs&lt;/a&gt; mas, com um pouco de esforço pode ser adaptado para funcionar de modo independente.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-5959210617841991918?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/5959210617841991918/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=5959210617841991918' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/5959210617841991918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/5959210617841991918'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2010/01/flash-slideshow-feito-em-php-lendo-xml.html' title='Flash Slideshow feito em PHP lendo XML'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-3855762494004688601</id><published>2010-01-28T17:55:00.000-08:00</published><updated>2010-01-28T18:38:21.770-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uml'/><category scheme='http://www.blogger.com/atom/ns#' term='ferramenta'/><category scheme='http://www.blogger.com/atom/ns#' term='gratis'/><category scheme='http://www.blogger.com/atom/ns#' term='diagrama'/><category scheme='http://www.blogger.com/atom/ns#' term='BPMN'/><title type='text'>Ferramentas para BPMN</title><content type='html'>&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;Recentemente estive procurando ferramentas gratuitas para criação de diagramas &lt;a href="http://en.wikipedia.org/wiki/Business_Process_Modeling_Notation"&gt;BPMN&lt;/a&gt;. Resolvi fazer este post para listar as melhores opções encontradas:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;a href="http://www.bizagi.com/"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;BizAgi&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pontos Fortes&lt;br /&gt;&lt;/b&gt;&lt;ul&gt;&lt;li&gt;   Ferramenta completa para a geração de BPMN 1.0;&lt;/li&gt;&lt;li&gt;   Licença sem restrição de uso comercial;&lt;/li&gt;&lt;li&gt;   Exportação em imagem de alta qualidade;&lt;/li&gt;&lt;li&gt;   Exportação para &lt;a href="http://en.wikipedia.org/wiki/PDF"&gt;PDF&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Microsoft_SharePoint"&gt;sharepoint&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Wiki"&gt;wiki&lt;/a&gt;, etc.;&lt;/li&gt;&lt;li&gt;   Ferramenta de fácil uso;&lt;/li&gt;&lt;li&gt;   Consideravelmente Estável.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Pontos Fracos&lt;br /&gt;&lt;/b&gt;&lt;ul&gt;&lt;li&gt;   Roda apenas no sistema Windows;&lt;/li&gt;&lt;li&gt;   Não apresenta histórico de alterações;&lt;/li&gt;&lt;li&gt;   Não permite a geração de &lt;a href="http://en.wikipedia.org/wiki/Business_Process_Modeling_Notation"&gt;BPMN&lt;/a&gt; 1.1 ou &lt;a href="http://en.wikipedia.org/wiki/Business_Process_Modeling_Notation"&gt;BPMN&lt;/a&gt; 2.0;&lt;/li&gt;&lt;li&gt;   Não exporta para imagem vetorial &lt;a href="http://en.wikipedia.org/wiki/SVG"&gt;SVG&lt;/a&gt;;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Recomendação&lt;/b&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;br /&gt;Para ambientes de trabalho onde todos trabalhem com máquinas Windows, essa provavelmente é uma das melhores opções gratuitas.&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;a href="http://www.billfishsoftware.com/communityedition.html"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;BillFish Community Edition&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pontos Fortes&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;ul&gt;&lt;li&gt;   Fácil de instalar;&lt;/li&gt;&lt;li&gt;   Roda em Windows XP, Windows Vista, Linux e Apple Mac;&lt;/li&gt;&lt;li&gt;   Acesso remoto via Web;&lt;/li&gt;&lt;li&gt;   Gera uma documentação &lt;a href="http://en.wikipedia.org/wiki/Pdf"&gt;PDF&lt;/a&gt; baseada no diagrama;&lt;/li&gt;&lt;li&gt;   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;&lt;/li&gt;&lt;li&gt;   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;&lt;/li&gt;&lt;li&gt;   Sub-Processos.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Pontos Fracos&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;ul&gt;&lt;li&gt;   Não apresenta histórico das edições do &lt;a href="http://en.wikipedia.org/wiki/BPMN"&gt;BPMN&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;   Apresenta muitas instabilidades;&lt;/li&gt;&lt;li&gt;   A exportação da imagem de saída é de baixa qualidade;&lt;/li&gt;&lt;li&gt;   Não exporta para imagem vetorial;&lt;/li&gt;&lt;li&gt;   Não é de tão fácil uso.&lt;/li&gt;&lt;li&gt;   Não permite edição remota pela aplicação web disponibilizada;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Recomendação&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;br /&gt;Para quem deseja fazer uso dessas ferramentas que, teoricamente, dispensam a programação, essa pode ser uma boa solução.&lt;br /&gt;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.&lt;br /&gt;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.&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.intalioworks.com/products/bpm/opensource-edition/designer/#bpmn"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:large;"&gt;Intalio|Designer Community Edition&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pontos Fortes&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;   Muito facil de instalar. Na verdade, nem precisa instalar;&lt;/li&gt;&lt;li&gt;   Roda no ambiente &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; logo em Windows, Linux, Apple e qualquer outra coisa que rode Eclipse;&lt;/li&gt;&lt;li&gt;   Apresenta mapeamento de dados;&lt;/li&gt;&lt;li&gt;   Edição de formulários integrados ao processo por &lt;a href="http://en.wikipedia.org/wiki/WSIWYG"&gt;WSIWYG&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;   Excelente integração com &lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture"&gt;SOA&lt;/a&gt;, Schemas, &lt;a href="http://en.wikipedia.org/wiki/LDAP"&gt;LDAP&lt;/a&gt;, dentre outros ;&lt;/li&gt;&lt;li&gt;   Geração de &lt;a href="http://en.wikipedia.org/wiki/Web_Services_Description_Language"&gt;WSDL&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;   Exportação de Imagens em boa qualidade para &lt;a href="http://en.wikipedia.org/wiki/PDF"&gt;PDF&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Portable_Network_Graphics"&gt;PNG&lt;/a&gt; , &lt;a href="http://en.wikipedia.org/wiki/JPEG"&gt;JPEG&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/GIF"&gt;GIF&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/SVG"&gt;SVG&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;   Suporte a Reutilização de Processo;&lt;/li&gt;&lt;li&gt;   Suporte a Tratamento de Exceções;&lt;/li&gt;&lt;li&gt;   Ferramenta de facil uso;&lt;/li&gt;&lt;li&gt;   Muita documentação;&lt;/li&gt;&lt;li&gt;   Formato dos arquivos é de facil exportação para outras ferramentas;&lt;/li&gt;&lt;li&gt;   Suporte a&lt;a href="http://docs.google.com/viewer?a=v&amp;amp;q=cache:Q54YiOs5USAJ:www.inubit.com/bpmn+BPMN+1.1&amp;amp;hl=pt-BR&amp;amp;gl=br&amp;amp;pid=bl&amp;amp;srcid=ADGEESg_lGXWf_wr7EPbjyWehv77G8i6evrTlW29OHHv4u825eoV3jCgtTjcr6Bsin8kkEr7lWtPfbpb4vtIigRnAKdzWABv-IWEbjlS0VlRW7DW0Pral1wNQdsnVHP0vgG30F9PY3ni&amp;amp;sig=AHIEtbQjtvGw9iMlM_G_tNwJT9LhiWP6GA"&gt; BPMN 1.1&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;   Apresenta histórico de alterações;&lt;/li&gt;&lt;li&gt;   Validações automáticas geram alertas para possíveis erros.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Pontos Fracos&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;   A manipulação dos conectores é limitada;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;   Não gera documentação além do próprio diagrama;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;   Não ter uma opção de execução assistida, sendo as saídas das decisões e eventos escolhidos dentre os disponíveis;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;   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.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;   Não permite edição colaborativa;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;   Não permite edição remota pela aplicação web disponibilizada;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;b&gt;Recomendação&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;br /&gt;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 &lt;a href="http://en.wikipedia.org/wiki/BPEL"&gt;BPEL&lt;/a&gt;, etc.&lt;br /&gt;Para quem deseja apenas uma ferramenta de geração de diagramas ela atende muito bem. Como exporta em &lt;a href="http://en.wikipedia.org/wiki/SVG"&gt;SVG&lt;/a&gt;, pode-se gerar a imagem no formato e na resolução que se desejar. Mas a imagem na resolução&lt;br /&gt;padrão em &lt;a href="http://en.wikipedia.org/wiki/GIF"&gt;GIF&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/JPEG"&gt;JPEG&lt;/a&gt; poderiam ter as dimensões configuráveis.&lt;br /&gt;A limitação da manipulação dos conectores incomoda, mas é superável.&lt;br /&gt;A falta do controle de versão integrado ao diagrama em forma de histórico é grande, mas é compartilhada entre todas as ferramentas encontradas.&lt;br /&gt;Os alertas da validação automática são muito úteis.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Conclusão&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;br /&gt;Dentre as ferramentas encontradas, a que melhor atendeu a minha necessidade foi a &lt;a href="http://www.intalioworks.com/products/bpm/opensource-edition/"&gt;Intalio|Designer Community Edition&lt;/a&gt;, a qual tenho utilizado para a geração dos meus diagramas &lt;a href="http://en.wikipedia.org/wiki/BPMN"&gt;BPMN&lt;/a&gt;. Os fatores decisivos foram a facilidade de instalação, a exportação em &lt;a href="http://en.wikipedia.org/wiki/SVG"&gt;SVG&lt;/a&gt; e a execução em várias plataformas.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-3855762494004688601?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/3855762494004688601/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=3855762494004688601' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/3855762494004688601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/3855762494004688601'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2010/01/ferramentas-para-bpmn.html' title='Ferramentas para BPMN'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-2279004321117264270</id><published>2009-09-15T13:39:00.000-07:00</published><updated>2009-09-15T13:46:37.743-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='historia'/><category scheme='http://www.blogger.com/atom/ns#' term='eu'/><category scheme='http://www.blogger.com/atom/ns#' term='casamento'/><category scheme='http://www.blogger.com/atom/ns#' term='doente'/><title type='text'>Um final de semana conturbado</title><content type='html'>&lt;p style="margin-bottom: 0in"&gt;Era uma semana puxada conforme o esperado, faltando menos de 100 dias para o casamento e com muita coisa para resolver, passando raiva com um Web Service no trabalho, botando contas em dia, etc. Eu passo essa semana com uma leve dor de garganta, mas aliviado. O Web Service funcionou perfeitamente. Finalmente eu havia encerrado os últimos detalhes do emprego anterior, incluindo é claro o plano de saúde. Estava então, numa pequena janela sem plano de saúde pois estava negociando no plano novo. Havíamos achado a viajem que queríamos e agora era fechar negocio. Detalhes, tudo se resolveria em uma semana. Pensava eu.&lt;/p&gt; &lt;p style="margin-bottom: 0in"&gt;Numa sexta-feira essa leve dor se agrava um pouco e ir de encontro ao vento durante o almoço foi realmente doloroso. A noite enquanto ia buscar a minha noiva comecei a ter tontura e ficar realmente ruim. Ao encontra-la passei o carro para ela e já cancelamos toda a programação da noite.&lt;/p&gt; &lt;p style="margin-bottom: 0in"&gt;Após custarmos a decidir se ela deveria ir me deixar em casa e voltar de táxi ou eu deveria deixa-la em casa e ir para a casa dirigindo, decidimos que era melhor eu deixa-la por que a casa dela era logo ali e eu aquentava ir para a casa. No caminho encontro uma barreira do detran aonde eu descubro que minha carteira esta vencida 2 dias além do limite permitido. Então eu, piorando, tenho que ligar para um motorista habilitado para não ter meu carro levado ao deposito.&lt;/p&gt; &lt;p style="margin-bottom: 0in"&gt;Então, eu consigo ligar para minha noiva que vem com a sua irmã muito prestativa me buscar. Agora eu estava doente, sem plano de saúde, com uma multa e proibido de dirigir meu próprio carro. Devo confessar, fiquei um pouco desanimado.&lt;/p&gt; &lt;p style="margin-bottom: 0in"&gt;Os próximos dias foram típicos de um doente.  Hoje, terça-feira, já comecei a me sentir bem, tanto que até resolvi fazer esse resumo para os meus preocupados amigos. Ainda mais porque eu não estava atendendo muito o telefone o que deixou alguns ainda mais preocupados.&lt;/p&gt; &lt;p style="margin-bottom: 0in"&gt;Hoje eu estou já bem melhor, uns 5kgs mais magro, naquela fase da doença onde se tosse muito, não sente fome mas ainda assim se sente bem melhor.&lt;/p&gt; &lt;p style="margin-bottom: 0in"&gt;Achei na minha mãe, como sempre, uma pessoa em quem confiar nas horas difíceis. Minha noiva me viu fedido, doente, com o nariz escorrendo e de mal humor. Agora ela não pode reclamar de ter sido enganada. Além disso foi muito companheira e compreensiva em toda a situação, o que me fez gostar ainda mais dela. Ela até fez um macarrão! Percebi ter muitos amigos e até meu chefe foi mais compreensível do que eu estava acostumado. Fiquei 4 dias sem tocar num computador ( um recorde ! ) e consegui perder a pança que sairia nas fotos do casamento.&lt;/p&gt;&lt;p style="margin-bottom: 0in"&gt;Por hora é só. Estarei voltando ao meu repouso e não devo ficar on-line muito tempo. Mas estou bem, cada dia melhor e cada dia mais satisfeito com as pessoas que estão ao meu redor. A todos, obrigado pelo carinho.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-2279004321117264270?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/2279004321117264270/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=2279004321117264270' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/2279004321117264270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/2279004321117264270'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2009/09/um-final-de-semana-conturbado.html' title='Um final de semana conturbado'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-8205872324754909688</id><published>2009-08-14T20:52:00.000-07:00</published><updated>2011-06-17T12:51:08.118-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='codetodiagram'/><category scheme='http://www.blogger.com/atom/ns#' term='uml'/><category scheme='http://www.blogger.com/atom/ns#' term='bpm'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='banco'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Dicas</title><content type='html'>&lt;div style="text-align: justify;"&gt;Alguns alunos meus e amigos me perguntaram em diferentes momentos o que eu recomendaria como primeiros passos para quem está começando no mundo do desenvolvimento. Então aqui vão algumas dicas:&lt;/div&gt;&lt;h3 style="text-align: justify;"&gt;Convenção de Código&lt;/h3&gt;&lt;div style="text-align: justify;"&gt;Sempre que eu lido com o código, eu fico impressionado com a criatividade de programadores em codificar. Infelizmente, essa criatividade é utilizada de maneira a complicar algo simples, o que virá a dificultar a manutenibilidade do projeto.  Quando se está aprendendo a programar, é comum se desenvolver de maneira desleixada se preocupando apenas com o resultado da execução. Essa prática deve ser evitada o quanto antes e uma das melhores maneiras de se fazer isso é se adotando uma convenção de código.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Não se espante ao discordar de algo da convenção. Praticamente todas as pessoas discordam da convenção em um ou mais itens, mas, ainda assim, é importante se aplicar a convenção combinada do começo ao fim do projeto. Num próximo projeto , caso toda a equipe fique de acordo, pode-se aperfeiçoar a convenção para o seu contexto, baseando-se também nas próprias lições aprendidas dos projetos passados.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Recomendo se começar com alguma convenção madura como a da &lt;a href="http://framework.zend.com/manual/en/coding-standard.html" id="g7mw" title="Zend"&gt;Zend&lt;/a&gt; ou da &lt;a href="http://java.sun.com/docs/codeconv/" id="ur6k" title="Sun"&gt;Sun&lt;/a&gt;.&lt;/div&gt;&lt;h3 style="text-align: justify;"&gt;Controle de Versão&lt;br /&gt;&lt;/h3&gt;&lt;div style="text-align: justify;"&gt;Hoje em dia, é praticamente impossível se trabalhar com programação sem se utilizar uma ferramenta de controle de versão. A qualidade das informações que esse tipo de ferramenta traz para o controle das alterações e versões do seu sistema torna-se imprecindivel quando se começa a desenvolver projetos grandes, seja em equipe ou não.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vantagens:&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Controlar "o que", "quando", "por quem" e "por que" de cada alteração feita.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Comparar versões do sistema.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Voltar a uma versão do sistema.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Combinar alterações.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ver o histórico de um arquivo ou pasta.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Interface com várias aplicações que montam diferentes tipos de relatórios a partir dos dados do servidor.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Interface com várias aplicações possibilitando o disparo de testes automáticos, criação / alteração de demandas via mensagens de envio.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Dentre os mais famosos do momento temos o &lt;a href="http://subversion.tigris.org/faq.html" id="g9jm" title="subversion"&gt;Subversion&lt;/a&gt; e o &lt;a href="http://www.selenic.com/mercurial" id="lp9f" title="mercurial"&gt;Mercurial&lt;/a&gt;.&lt;/div&gt;&lt;h3 style="text-align: justify;"&gt;Documentação automática &lt;/h3&gt;&lt;div style="text-align: justify;"&gt;Documentar todos os métodos, classes e pacotes para possibilitar uma melhor manutenção é requisito mínimo para um bom projeto. Quando se documenta utilizando algum padrão de de documentação estilo &lt;a href="http://java.sun.com/j2se/javadoc/writingdoccomments/" id="rkhn" title="javadoc"&gt;javadoc&lt;/a&gt;, algumas ferramentas, entre elas o &lt;a href="http://www.doxygen.org/" id="ayhk" title="doxygen"&gt;doxygen&lt;/a&gt;, possibilita a saída de relatórios muito ricos a partir da documentação criada. Um exemplo disto pode ser visto &lt;a href="http://www.assembla.com/code/codetodiagram/subversion/node/live/133/doc/dox/html/annotated.html" id="d93b" title="aqui"&gt;aqui&lt;/a&gt;, onde a documentação do projeto foi criada automaticamente a partir dos comentários existentes.&lt;/div&gt;&lt;h3 style="text-align: justify;"&gt;Teste Unitário &lt;/h3&gt;&lt;div style="text-align: justify;"&gt;Apesar de ser algo essencial para a criação de softwares de qualidade, os testes unitários ainda são difíceis de serem encontrados em aplicações comerciais. Esses testes automáticos, também conhecidos como &lt;a href="http://msdn.microsoft.com/pt-br/library/ms182613.aspx" id="xd9-" title="teste de fumaça"&gt;teste de fumaça&lt;/a&gt; quando aplicados a contextos pequenos, são similares aos &lt;a href="http://sembugs.blogspot.com/2007/08/casos-de-teste.html" id="bzda" title="casos de teste"&gt;casos de teste&lt;/a&gt; só que feitos automaticamente desde de contextos pequenos, como pequenos métodos que alteram uma string, até em contextos complexos, onde se pode testar todo um fluxo de funcionalidades, trabalhando em conjunto, num projeto.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ao escrever esses testes automáticos existem ferramentas que podem executa todos eles em seu sistema, informar quais testes falharam, quais classes, métodos e linhas não foram executados, o que lhe informa que ou faltam testes no seu sistema ou existe código excedente.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Essas validações automáticas podem ser feitas a cada atualização do seu controle de versão, o que possibilita se saber de novos erros existentes no sistema assim que eles surgem, tornando seu sistema mais confiável e a manutenção facilitada.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As ferramentas mais conhecidas de teste unitário sao o  &lt;a href="http://www.junit.org/" id="dgw." title="JUnit"&gt;JUnit&lt;/a&gt; e o &lt;a href="http://www.phpunit.de/" id="uhdu" title="PHPUnit"&gt;PHPUnit&lt;/a&gt; e um exemplo de saída do PHPUnit pode ser vista &lt;a href="http://code.assembla.com/corujaphpframework/subversion/node/live/175/corujito/coruja/components/default/library/test/coverage/index.html" id="p1-i" title="aqui"&gt;aqui&lt;/a&gt;.&lt;/div&gt;&lt;h3 style="text-align: justify;"&gt;Padrões da Web&lt;br /&gt;&lt;/h3&gt;&lt;div style="text-align: justify;"&gt;Conhecer os padrões da W3C deveria ser o ponto de partida de qualquer programador web. Infelizmente, isso não é nem de longe a regra. Eu, quando dou aula de programação, sempre me dedico a falar sobre o que é um XML, Schema e DTD, ensino os meus alunos a desenvolverem XHTML e falo um pouco sobre as validações da W3C.  Para auxiliar no aperfeiçoamento das suas páginas desenvolvidas eu recomendo mais um plugin do firefox chamado &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60" id="v6dn" title="Web Developer"&gt;Web Developer&lt;/a&gt; além do &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3939" id="rcnz" title="Relaxed"&gt;Relaxed&lt;/a&gt; e o &lt;a href="http://users.skynet.be/mgueury/mozilla/" id="ot8f" title="Html Validator"&gt;Html Validator&lt;/a&gt; que infelizmente ainda não funciona no linux.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para quem está realmente começando, um dos melhores sites em português é o  &lt;a href="http://www.tableless.com.br/categoria/client-side/html-xhtml" id="wycv" title="Tableless.com.br"&gt;Tableless.com.br&lt;/a&gt;. O &lt;a href="http://www.w3schools.com/" id="jujl" title="w3schools"&gt;w3schools&lt;/a&gt;  é outra excelente referencia em relação ao assunto.&lt;/div&gt;&lt;h3 style="text-align: justify;"&gt;Prototipagem&lt;br /&gt;&lt;/h3&gt;&lt;div style="text-align: justify;"&gt;Prototipo, WireFrame, Rascunho de Tela, etc. Todos esses nomes são para desenhos das telas que devem guiar os designers na criação do desenho final da tela. Esse rascunho será comparado com o fluxo de teste planejado e deve ser apresentado ao cliente antes de se iniciar a construção real do sistema. É natural que, com o desenvolvimento do sistema, alterações sejam feitas nas telas. Mas, ainda assim, o protótipo auxilia muito a reduzir a quantidade futura de alterações já dando um ponto de partida confiável para o desenvolvimento do sistema.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Algumas empresas fazem protótipo de tela em ferramentas não especializadas como powerpoint ou até mesmo no photoshop ou gimp mas existem muitas ferramentas feitas especialmente com este propósito. Dentre as gratuitas, a que eu mais recomendo é o &lt;a href="http://www.evolus.vn/Pencil/" id="x.:d" title="Pencil Project"&gt;Pencil Project&lt;/a&gt;, um plugin para firefox muito bom para prototipagem.&lt;/div&gt;&lt;h3 style="text-align: justify;"&gt;Modelagem de banco&lt;br /&gt;&lt;/h3&gt;&lt;div style="text-align: justify;"&gt;Saber modelar bem um banco de dados e compreender um modelo é essencial para um bom sistema. Ao meu ver, a ferramenta gratuita mais popular é o &lt;a href="http://fabforce.net/dbdesigner4/" id="cfn7" title="DBDesigner4"&gt;DBDesigner4&lt;/a&gt;, mas, eu não a considero a melhor opção. Algumas outras opções,  ainda gratuitas, que eu recomendo são o &lt;a href="http://www.oracle.com/technology/products/jdev/index.html" id="g:2w" title="JDeveloper"&gt;JDeveloper&lt;/a&gt; e o &lt;a href="http://www.sqlpower.ca/page/architect" id="gnos" title="Power Architect"&gt;Power Architect&lt;/a&gt;. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mas, é essencial estudar como fazer uma boa modelagem de banco de dados, não se restrigindo apenas às ferramentas. É importante estudar como deve ser uma boa modelagem de banco de dados, e existem muitos bons livros gratuitos para leitura como o &lt;a href="http://books.google.com/books?id=AdGXZWVdJ_MC&amp;amp;printsec=frontcover#v=onepage&amp;amp;q=&amp;amp;f=false" id="iqb2" title="Data Modeling Fundamentals"&gt;Data Modeling Fundamentals&lt;/a&gt;&lt;/div&gt;&lt;h3 style="text-align: justify;"&gt;Modelagem de Processos de Negócio - &lt;a href="http://en.wikipedia.org/wiki/Business_process_modeling" id="en4l" title="BPM"&gt;BPM&lt;/a&gt; &lt;/h3&gt;&lt;div style="text-align: justify;"&gt;Uma das ( muitas ) maneiras de se modelar um processo antes de implementa-lo é pelo bpm. Uma representação gráfica do negócio a ser implementado utilizando uma &lt;a href="http://en.wikipedia.org/wiki/Business_Process_Modeling_Notation" id="pbqy" title="notação"&gt;notação&lt;/a&gt; padrão. Quanto a ferramentas gratuitas para geração de bpms, recomendo o &lt;a href="http://www.bizagi.com/" id="tzjb" title="BizAgi"&gt;BizAgi&lt;/a&gt; apesar de não funciona no linux ( sem wine ou vbox ). Estou testando recentemente algumas aplicações novas, dentre elas o &lt;a href="http://www.bonitasoft.com/products/bonita-v4.php" id="dgyc" title="BonitaSoft"&gt;BonitaSoft&lt;/a&gt;, mas, ainda estou as estudando.&lt;/div&gt;&lt;h3 style="text-align: justify;"&gt;UML &lt;/h3&gt;&lt;div style="text-align: justify;"&gt;Muito se fala de &lt;a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language" id="hk:4" title="UML"&gt;UML&lt;/a&gt; e existem muitos livros sobre o assunto, principalmente os livros de Engenharia de Software como o &lt;a href="http://compare.buscape.com.br/engenharia-de-software-8-edicao-2007-ian-sommerville-8588639289.html" id="qckw" title="Sommerville"&gt;Sommerville&lt;/a&gt;. Não querendo entrar na discussão ideológica do assunto, um bom programador precisa conhecer os diagramas UML.&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://www.oracle.com/technology/products/jdev/index.html" id="wv9-" title="JDeveloper"&gt;JDeveloper&lt;/a&gt;. 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 &lt;a href="http://www.visual-paradigm.com/"&gt;visual paradigm&lt;/a&gt;, mas, dentre as restrições apresentadas, me tem sido muito útil.&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://thiagomata.com/codetodiagram/svn/public/"&gt;CodeToDiagram&lt;/a&gt; conseguindo resultados muito legais.&lt;br /&gt;&lt;br /&gt;Tenho também analisado outras opções como o &lt;a href="http://jude.change-vision.com/jude-web/index.html" id="i5cl" title="Jude"&gt;Jude&lt;/a&gt; e &lt;a href="http://staruml.sourceforge.net/en/" id="i.d8" title="StarUml"&gt;StarUml&lt;/a&gt; mas confesso com pouca dedicação pela falta de tempo. Caso alguma dessas ferramentas venha a me encantar, farei um post novo a respeito.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Espero que essa descrição geral possa vir a ajudar a todos. Criticas e sujestões fiquem a vontade. Um grande abraço.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-8205872324754909688?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/8205872324754909688/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=8205872324754909688' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/8205872324754909688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/8205872324754909688'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2009/08/dicas.html' title='Dicas'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-7900160678782580574</id><published>2009-05-20T21:19:00.000-07:00</published><updated>2009-06-11T21:16:19.407-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php reflection extends code trick'/><title type='text'>Reflections Entendidas e Estendidas</title><content type='html'>&lt;span class="Apple-style-span"  style=" ;font-family:'Times New Roman';"&gt;&lt;div style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; width: auto; font: normal normal normal 100%/normal Georgia, serif; text-align: left; "&gt;&lt;span class="Apple-style-span"  style="font-family:'Times New Roman';"&gt;&lt;div style="margin-top: 6px; margin-right: 6px; margin-bottom: 6px; margin-left: 6px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; min-height: 1100px; counter-reset: __goog_page__ 0; font-family: Verdana; font-size: 10pt; line-height: normal; background-color: rgb(255, 255, 255); "&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://nz.php.net/oop5.reflection"&gt;PHP Reflections&lt;/a&gt; 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.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;&lt;code&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;/**&lt;br /&gt;* Apenas um pequeno exemplo&lt;br /&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;class &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;exemplo&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;$objReflection = &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;new ReflectionClass&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;( $strClass );&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;print &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;$objReflection-&gt;getClassName();&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;print &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;$objReflection-&gt;getDocComment&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); "&gt;();&lt;/span&gt;&lt;/code&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://code.google.com/p/backtrace/wiki/usag"&gt;backtrace&lt;/a&gt; do &lt;a href="http://www.renandelima.com/"&gt;Renan de Lima.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Por exemplo:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;code&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;class &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;teste{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;class &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;novaReflection &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;extends &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;ReflectionClass&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;{}&lt;br /&gt;$objNovo = &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;novaReflection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;"teste"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;if &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;( $objNovo-&gt;getMethod( &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;'vai'&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;)-&gt;getDeclaringClass() &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;instanceof&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;novaReflection )&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    &lt;/span&gt;print &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;"bem que você gostaria."&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;;&lt;br /&gt;}&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/code&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;    &lt;/span&gt;print &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;"problema dificil de resolver"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;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-&gt;getFilho()-&gt;getPai() falha não retornando um objeto da mesma classe do Elemento.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Ficou confuso? Então vamos a um exemplo:&lt;br /&gt;Ao invés de se estender diretamente a classe do ReflectionClass você irá estender a classe &lt;a href="http://code.assembla.com/codetodiagram/subversion/nodes/components/extendedReflection"&gt;ExtendedReflectionClass&lt;/a&gt; e deverá sobrescrever os seguintes métodos:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;createExtendedReflectionClass&lt;br /&gt;&lt;/li&gt;&lt;li&gt;createExtendedReflectionProperty&lt;br /&gt;&lt;/li&gt;&lt;li&gt;createExtendedReflectionMethod&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Um pacote estendido para demonstrar isso é o&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); text-decoration: underline; "&gt; &lt;/span&gt;&lt;a href="http://code.assembla.com/codetodiagram/subversion/nodes/components/codeReflection"&gt;Code Reflection&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;note em especial os seguintes métodos:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;/**&lt;br /&gt;* Make the recursive calls and indirectly call return the extended reflection object and not&lt;br /&gt;* a native reflection property.&lt;br /&gt;*&lt;br /&gt;* @see ExtendedReflectionClass::createExtendedReflectionProperty( ReflectionProperty )&lt;br /&gt;* @param ReflectionProperty $objOriginalReflectionClass&lt;br /&gt;* @return CodeReflectionProperty&lt;br /&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;protecte function &lt;strong&gt;createExtendedReflectionProperty ( ReflectionProperty &lt;span class="Apple-style-span" style="font-weight: normal;"&gt;$objOriginalReflectionProperty&lt;/span&gt; )&lt;br /&gt;{&lt;br /&gt;return new CodeReflectionProperty( $this&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;-&gt;getName()&lt;/span&gt; , &lt;span class="Apple-style-span" style="font-weight: normal;"&gt;$objOriginalReflectionProperty-&gt;getName()&lt;/span&gt; );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;/**&lt;br /&gt;* Make the recursive calls and indirectly call return the extended reflection object and not&lt;br /&gt;* a native reflection method.&lt;br /&gt;*&lt;br /&gt;* @see ExtendedReflectionClass::createExtendedReflectionMethod( ReflectionMethod )&lt;br /&gt;* @param ReflectionMethod $objOriginalReflectionClass&lt;br /&gt;* @return CodeReflectionMethod&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;protected function   createExtendedReflectionMethod ( ReflectionMethod &lt;span class="Apple-style-span" style="font-weight: normal;"&gt;$objOriginalReflectionMethod&lt;/span&gt; )&lt;br /&gt;{&lt;br /&gt;return new CodeReflectionMethod ( $this&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;-&gt;getName()&lt;/span&gt; , &lt;span class="Apple-style-span" style="font-weight: normal;"&gt;$objOriginalReflectionMethod-&gt;getName()&lt;/span&gt; );&lt;br /&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 102); "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;strong&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;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.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;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 &lt;/span&gt;&lt;a href="http://www.assembla.com/spaces/codetodiagram"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;CodeToDiagram&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/strong&gt;&lt;/div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-7900160678782580574?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/7900160678782580574/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=7900160678782580574' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/7900160678782580574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/7900160678782580574'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2009/05/reflections-entendidas-e-estendidas.html' title='Reflections Entendidas e Estendidas'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-3850828317243279223</id><published>2009-04-07T12:10:00.000-07:00</published><updated>2009-04-07T12:59:58.374-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='codetodiagram'/><category scheme='http://www.blogger.com/atom/ns#' term='assembla'/><category scheme='http://www.blogger.com/atom/ns#' term='uml'/><category scheme='http://www.blogger.com/atom/ns#' term='execucao'/><category scheme='http://www.blogger.com/atom/ns#' term='sequencia'/><category scheme='http://www.blogger.com/atom/ns#' term='eu'/><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='projeto'/><category scheme='http://www.blogger.com/atom/ns#' term='diagrama'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Code To Diagram</title><content type='html'>&lt;div class="intro"&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;h4&gt;Gerando Diagramas de Sequência a Partir de Uma Execução PHP&lt;/h4&gt;      &lt;p style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" title="Code To Diagram" href="http://www.assembla.com/wiki/show/codetodiagram"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 204px; height: 165px;" src="http://1.bp.blogspot.com/_eY_gQcCXBWI/Sdus0o19_wI/AAAAAAAAACY/ADZdYTztgjQ/s320/Intro2.jpg" alt="" id="BLOGGER_PHOTO_ID_5322037404985327362" border="0" /&gt;&lt;/a&gt; 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 &lt;a href="http://www.blogger.com/www.assembla.com"&gt;www.assem&lt;/a&gt;&lt;a href="http://www.blogger.com/www.assembla.com"&gt;bla.com&lt;/a&gt; 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. &lt;/p&gt;&lt;div&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt;        O diagrama de sequência talvez seja a mais intuitiva maneira de se compreender      uma execução.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt;        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.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt;        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.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt;        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. &lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt;        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.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt; 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.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;div style="width: 100%;"&gt;    Em poucas palavras:    &lt;div style="width: 49%; float: left;"&gt;     &lt;p&gt;        Este código:     &lt;/p&gt;     &lt;p&gt;      &lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;&lt;span style="color: rgb(0, 119, 0);font-size:85%;" &gt;require_once( &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);font-size:85%;" &gt;'../../public/codetodiagram.php' &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);font-size:85%;" &gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);font-size:85%;" &gt;CodeToDiagram&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);font-size:85%;" &gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);font-size:85%;" &gt;getInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);font-size:85%;" &gt;()-&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);font-size:85%;" &gt;start&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);font-size:85%;" &gt;();&lt;br /&gt;&lt;br /&gt;require_once( &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);font-size:85%;" &gt;'Wolf.class.php' &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);font-size:85%;" &gt;);&lt;br /&gt;require_once( &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);font-size:85%;" &gt;'Pig.class.php' &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);font-size:85%;" &gt;);&lt;br /&gt;require_once( &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);font-size:85%;" &gt;'House.class.php' &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);font-size:85%;" &gt;);&lt;br /&gt;require_once( &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);font-size:85%;" &gt;'History.class.php' &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);font-size:85%;" &gt;);&lt;br /&gt;&lt;br /&gt;new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);font-size:85%;" &gt;History&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);font-size:85%;" &gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;&lt;span style="font-size:85%;"&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;    &lt;/span&gt;      &lt;/span&gt;&lt;/code&gt;                     &lt;/p&gt;     &lt;/div&gt;    &lt;div style="width: 49%; float: left;"&gt;     &lt;p&gt;      Resulta nesse diagrama&lt;/p&gt;     &lt;p&gt;      &lt;img style="float: left; cursor: pointer; width: 100%;" src="http://www.thiagomata.com/codetodiagram/public/images/pigs_small.png" alt="" border="0" /&gt;    &lt;/p&gt;    &lt;/div&gt;   &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;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 &lt;a href="http://www.thiagomata.com/codetodiagram/public/xmlToDiagram.php"&gt;     aqui&lt;/a&gt;      onde um XML de exemplo já foi informado mas pode ser alterado a vontade.    &lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt;        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.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt;        Se você quiser utilizar esta solução em sua última versão, basta baixar do nosso      &lt;a href="http://subversion.assembla.com/svn/codetodiagram"&gt;SVN.&lt;/a&gt; Mas para apenas navegar no código ele é melhor legível &lt;a href="http://code.assembla.com/codetodiagram/subversion/nodes"&gt;aqui&lt;/a&gt;.      Para testar a aplicação em funcionamento nos exemplos disponíveis clique &lt;a href="http://www.thiagomata.com/codetodiagram/examples/"&gt;aqui&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;p style="text-align: justify;"&gt;   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.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;a&gt;   &lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: justify;"&gt;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.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;a&gt;   &lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: justify;"&gt;&lt;a&gt;        Clique &lt;/a&gt;&lt;a href="http://www.assembla.com/wiki/show/codetodiagram/How_To_Use" title="Code To Diagram - How To Use"&gt;aqui&lt;/a&gt; para saber como utilizar essa solução.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt;        Clique &lt;a href="http://www.ibm.com/developerworks/rational/library/3101.html" title="IBM - UML's Sequence Diagram"&gt;aqui&lt;/a&gt; para saber mais sobre diagramas de sequência.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt;        Clique &lt;a href="http://tkyte.blogspot.com/2005/06/instrumentation.html" title="The Tom Kyte      Blog"&gt;aqui&lt;/a&gt; e &lt;a href="http://www.glenmccl.com/instr/instr.htm" title="Java(tm) Source Code     Instrumentation"&gt;aqui&lt;/a&gt; para saber mais sobre Instrumentação de Código.    &lt;/p&gt;&lt;div style="text-align: justify;"&gt;    &lt;/div&gt;&lt;p style="text-align: justify;"&gt;        Clique &lt;a href="http://www.assembla.com/wiki/show/codetodiagram/Team" title="Code to Diagram - Team"&gt;aqui&lt;/a&gt; para conhecer a equipe de desenvolvimento     responsável por este produto.    &lt;/p&gt;   &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-3850828317243279223?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/3850828317243279223/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=3850828317243279223' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/3850828317243279223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/3850828317243279223'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2009/04/code-to-diagram-conforme-prometido-apos_07.html' title='Code To Diagram'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_eY_gQcCXBWI/Sdus0o19_wI/AAAAAAAAACY/ADZdYTztgjQ/s72-c/Intro2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-8178857525071962611</id><published>2009-02-17T11:30:00.000-08:00</published><updated>2009-02-17T12:59:33.823-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='uml'/><category scheme='http://www.blogger.com/atom/ns#' term='actor'/><category scheme='http://www.blogger.com/atom/ns#' term='sequence'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='pessoal'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Gerador de Diagramas de Seqüência a partir de XMLs</title><content type='html'>&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 255px;" src="http://2.bp.blogspot.com/_eY_gQcCXBWI/SZseaDhUkMI/AAAAAAAAAA8/Q4_QKubsDiM/s320/sequencePigsClose.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5303866419129389250" /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;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 &lt;a href="http://uml2svg.sourceforge.net/samples/index.html"&gt;Xmi2Svg&lt;/a&gt; e o &lt;a href="http://www.netbeans.org/features/uml/index.html"&gt; Net Beans Uml Diagrams &lt;/a&gt;. 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:&lt;br /&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 102, 255);"&gt;&amp;lt;/UML:GraphEdge.waypoints&amp;gt;&lt;br /&gt;&amp;lt;UML:GraphElement.semanticModel&amp;gt;&lt;br /&gt;&amp;lt;UML:Uml2SemanticModelBridge presentation="Message" xmi.id="xmi_id"&amp;gt;&lt;br /&gt;&amp;lt;UML:Uml2SemanticModelBridge.element&amp;gt;&lt;br /&gt;&amp;lt;UML:Message xmi.idref="DCE.1F882CFB-E059-6341-7A50-2D9D63879AEB"/&amp;gt;&lt;br /&gt;&amp;lt;/UML:Uml2SemanticModelBridge.element&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; 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 &lt;a href="http://thiagomata.com/uml/public/index.php"&gt; Gerador de Diagramas de Seqüência &lt;/a&gt;. Como é um código PHP, este está num link externo do meu ainda inutilizado dominio pessoal.&lt;br /&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 102, 255);"&gt;&amp;lt;sequence&amp;gt;&lt;br /&gt;&amp;lt;actors&amp;gt;&lt;br /&gt;&amp;lt;actor id="1" type="user"&amp;gt;me:people&amp;lt;/actor&amp;gt;&lt;br /&gt;&amp;lt;actor id="2" type="system"&amp;gt;you:people&amp;lt;/actor&amp;gt;&lt;br /&gt;&amp;lt;/actors&amp;gt;&lt;br /&gt;&amp;lt;messages&amp;gt;&lt;br /&gt;&amp;lt;message type="call" from="1" to="2" text="hi"/&amp;gt;&lt;br /&gt;&amp;lt;message type="return" from="2" to="1" text="hello"/&amp;gt;&lt;br /&gt;&amp;lt;/messages&amp;gt;&lt;br /&gt;&amp;lt;/sequence&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;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!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-8178857525071962611?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/8178857525071962611/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=8178857525071962611' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/8178857525071962611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/8178857525071962611'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2009/02/gerador-de-diagramas-de-sequencia.html' title='Gerador de Diagramas de Seqüência a partir de XMLs'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_eY_gQcCXBWI/SZseaDhUkMI/AAAAAAAAAA8/Q4_QKubsDiM/s72-c/sequencePigsClose.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-2082301292352563262</id><published>2009-01-12T14:28:00.000-08:00</published><updated>2009-02-17T12:45:21.835-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metodos_magicos'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='ie'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Métodos Mágicos no Javascript.</title><content type='html'>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.&lt;ul&gt;&lt;li&gt;O equivalente ao &lt;a href="http://br2.php.net/__call"&gt;__call&lt;/a&gt; é o &lt;a href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Global_Objects:Object:_noSuchMethod"&gt;__noSuchMethod__&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;O equivalente ao &lt;a href="http://br2.php.net/__set"&gt;__set&lt;/a&gt; é o &lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/lookupSetter"&gt;__lookupSetter__&lt;/a&gt;&lt;/li&gt;&lt;li&gt;O equivalente ao __&lt;a href="http://br2.php.net/__get"&gt;get&lt;/a&gt; é o &lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/lookupGetter"&gt;__lookupGetter__&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Tudo isso e muito mais pode ser visto neste &lt;a href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/Object"&gt;link&lt;/a&gt; do site da Mozilla Firefox.&lt;/p&gt;&lt;p&gt;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 &lt;span style="font-weight: bold;"&gt;CERTAMENTE&lt;/span&gt; não funciona no Internet Explorer.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;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 &lt;a href="http://www.mozilla.org/projects/tamarin/"&gt;Tamarin&lt;/a&gt;!! Alguma idéia ?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-2082301292352563262?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/2082301292352563262/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=2082301292352563262' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/2082301292352563262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/2082301292352563262'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2009/01/mtodos-mgicos-no-javascript.html' title='Métodos Mágicos no Javascript.'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-7826097619180239262</id><published>2008-09-27T09:57:00.000-07:00</published><updated>2009-02-17T12:46:48.584-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='head tracking'/><category scheme='http://www.blogger.com/atom/ns#' term='wii'/><category scheme='http://www.blogger.com/atom/ns#' term='3d'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Head Tracking - Web 3D</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;Nesse video, &lt;a href="http://johnnylee.net/"&gt;Jonnhy Chung Lee&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Jd3-eiid-Uw&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/Jd3-eiid-Uw&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Apesar do resultado já impressionante, este método ainda exige que o usuário do seu site tenha um Nitendo Wii. Bem, &lt;a href="http://www.chrisharrison.net/"&gt;Chris Harrison&lt;/a&gt; em seu &lt;a href="http://www.chrisharrison.net/projects/headtracking/index.html"&gt;projeto&lt;/a&gt; de &lt;span style="font-style: italic;"&gt;Head Tracking&lt;/span&gt;, 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.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Q-nrmxNKt84&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/Q-nrmxNKt84&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Por último, falta "apenas" colocar isto tudo num flash. Aparentemente, no que depender de &lt;a href="http://www.madvertices.com/"&gt;Jim Foley&lt;/a&gt;, não vai demorar tanto. Ele já está rascunhando um flash que faz este processo usando o infra vermelho.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IWguWpKkMI0&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/IWguWpKkMI0&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Muito mais nesta área está para vir. Como podemos ver em &lt;a href="http://wiiflash.org/"&gt;http://wiiflash.org/&lt;/a&gt; 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 &lt;span style="font-style: italic;"&gt;Head tracking&lt;/span&gt;, pode ser utilizado para várias outras aplicações, como podemos ver em outro projeto do &lt;a href="http://www.chrisharrison.net/projects/leanandzoom/index.html"&gt;Chris Harrison &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-7826097619180239262?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/7826097619180239262/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=7826097619180239262' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/7826097619180239262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/7826097619180239262'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2008/09/head-tracking-web-3d.html' title='Head Tracking - Web 3D'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-5233934985764697858</id><published>2008-09-27T09:26:00.000-07:00</published><updated>2009-02-17T12:45:50.981-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unb'/><category scheme='http://www.blogger.com/atom/ns#' term='festa'/><category scheme='http://www.blogger.com/atom/ns#' term='academico'/><category scheme='http://www.blogger.com/atom/ns#' term='pessoal'/><title type='text'>Formei!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_eY_gQcCXBWI/SN5lYhPLmqI/AAAAAAAAAAM/kpmkL01vXXg/s1600-h/ThiagoMataFormado.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_eY_gQcCXBWI/SN5lYhPLmqI/AAAAAAAAAAM/kpmkL01vXXg/s320/ThiagoMataFormado.jpg" alt="" id="BLOGGER_PHOTO_ID_5250745687473887906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Gostaria de agradecer a todos aqueles que de alguma forma contribuíram para isto.&lt;br /&gt;&lt;br /&gt;Um agradecimento especial ao meu grande amigo &lt;a href="http://renedelima.com/blog/"&gt;Renê de Lima&lt;/a&gt; , que foi meu companheiro de curso, de trabalho, de sinuca, e parceiro na nossa monografia, a professora &lt;a href="http://www.cic.unb.br/~nalon/"&gt;Cláudia Nalon&lt;/a&gt;,  a qual eu tenho muito orgulho de ter sido aluno, e a toda a minha família é claro.&lt;br /&gt;&lt;br /&gt;Muitos projetos pessoais que estavam na gaveta ou em marcha lenta estão aos poucos, saindo do papel.&lt;br /&gt;&lt;br /&gt;Em breve muitas novidades.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-5233934985764697858?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/5233934985764697858/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=5233934985764697858' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/5233934985764697858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/5233934985764697858'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2008/09/formei.html' title='Formei!'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_eY_gQcCXBWI/SN5lYhPLmqI/AAAAAAAAAAM/kpmkL01vXXg/s72-c/ThiagoMataFormado.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4058717336638114408.post-2436899287667609610</id><published>2008-05-28T18:00:00.000-07:00</published><updated>2008-05-28T18:15:43.333-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unb'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='conversa fiada'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Ok. Vocês venceram</title><content type='html'>Olá todos. Meu nome é Thiago da Mata ou na versão longa Thiago Henrique Ramos da Mata.&lt;br /&gt;&lt;br /&gt;Eu tenho, ou talvez devesse dizer tinha, um blog no thiagomata.blog.com. De fato um endereço facil de se achar.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Acredito que neste blog do google não vou ter esse tipo de problema.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Bastante curioso em várias areas do desenvolvimento, o meu forte até o presente momento é o desenvolvimento em PHP e o Javascript.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Abraços e até mais,&lt;br /&gt;Thiago Mata.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4058717336638114408-2436899287667609610?l=thiagomata.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagomata.blogspot.com/feeds/2436899287667609610/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4058717336638114408&amp;postID=2436899287667609610' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/2436899287667609610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4058717336638114408/posts/default/2436899287667609610'/><link rel='alternate' type='text/html' href='http://thiagomata.blogspot.com/2008/05/ok-vocs-venceram.html' title='Ok. Vocês venceram'/><author><name>Blaine</name><uri>http://www.blogger.com/profile/04614716776066662172</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_eY_gQcCXBWI/S17FeZu6wwI/AAAAAAAAACk/2M6JERK6bh8/S220/pequena.jpg'/></author><thr:total>1</thr:total></entry></feed>
