sexta-feira, junho 29, 2007

Mau CSS

No projecto em que estou actualmente, que é um projecto em ASPX, o design das páginas é feito por uma empresa especializada em design como faz todo o sentido porque a grande parte dos programadores (eu incluído) tem um sentido estético simplesmente brilhante (sarcástico...).
Depois de 6 horas a "partir pedra", a tentar perceber porque o código HTML que eu estava a gerar, apesar de ser idêntico a um exemplo que utilizava a CSS não apresentava um design igual ao do exemplo, cheguei à seguinte conclusão, para o CSS ter:

<div class="clear" /> é diferente de <div class="clear" ></div>

Isto é totalmente ridiculo porque analisado do ponto de vista do XML as duas coisas são exactamente iguais, além disso ainda poupava uns bytes na transferência se pudesse por <div class="clear" />.

quinta-feira, junho 28, 2007

Sensibilidade no rato

Num dos meus raids matinais pelos blogs que costumo ler encontrei uma referência para este jogo http://dagobah.biz/flash/Cursor_Invisible.swf. Acho que é um jogo engraçado que testa a sensibilidade que cada um tem em relação aos movimentos que faz com o rato. Divirtam-se...

segunda-feira, junho 18, 2007

Built-in templates

Tome-se como exemplo o seguinte XML:

<elem>Valor_1
<data>
Data_2
</data>
<data>
Data_3
</data>
</elem>

Agora vou definir uma template em que só quero ter como output os valores dentro das tags <data>:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>

<xsl:template match ="/elem/data">
<xsl:value-of select ="."/>
</xsl:template>
</xsl:stylesheet>

Como output tenho:

Valor_1
Data_2
Data_3

Porque raio aparece o "Valor_1" se só defini template para mostrar os valores dentro da tag <data>? O motivo é um dos buil-in templates. O que são buil-in templates? São templates definidas por omissão, que estão presentes mesmo que não sejam definidas explicitamente, a solução é fazer o override ao template. Neste caso o template é algo do género:

<xsl:template match ="text()|@*">
<xsl:value-of select ="."/>
</xsl:template>

Logo para obtermos o resultado desejado inicialmente o nosso ficheiro XSLT será algo do género:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>

<xsl:template match ="/elem/data">
<xsl:value-of select ="."/>
</xsl:template>

<!-- override Built-in template rule para texto e atributos dos nós -->
<xsl:template match="text()|@*"/>

</xsl:stylesheet>

terça-feira, junho 12, 2007

Bom conceito mal interpretado

Após duas semanas a trabalhar num novo projecto no qual tenho o uso intensivo de XSLT comecei a ler o livro "XSLT" da editora O'REILLY. Uma frase com a qual concordo inteiramente despertou-me a atenção:

"The separation of content and presentation is a long-established tenet of the publishing industry; unfortunately, most HTML pages aren't even close to approaching this ideal. An XML document should contain information, marked up with tags that describe what pieces of information are, as well as the relationship between those items."

No projecto em que estou esta efectivamente é a ideia que está a ser utilizada, então surgiram-me umas dúvidas - Porquê muitas vezes tenho de andar a refazer XSLTs? Qual o facto que torna todo o trabalho que tenho feito tão volátil? Porquê que às vezes a representação dos dados em XML para gerar uma apresentação me parece forçada?

A conclusão à qual cheguei é a instabilidade e complexidade desnecessária do XML que representa os dados, ou seja, o facto do XML estar em constante mudança provoca que os XSLTs também estejam em constante mudança. E porquê o XML está em constante mudança? Porque o modelo de dado está mal definido, dando origem a falhas que provocam remodelações ao XML.

segunda-feira, junho 11, 2007

Obter um máximo com XSLT

Algo tão simples como obter o máximo valor de um dos filhos de um nó acabou por dar-me um enorme trabalho a descobrir como se fazia. Apesar de ter feito imensas pesquisas por essa internet fora, consegui chegar a uma implementação que não me agrada muito porque acho que em XSLT deve de haver uma forma muito mais optimizada de o fazer, contudo não deixa de ser uma implementação simples de se perceber. Imagine-se o seguinte XML:

<parent>
<value>20</value>
<value>50</value>
<value>10</value>
<value>30</value>
</parent>

Para obter o valor mais alto a implementação a que cheguei foi a seguinte:

<xsl:for-each select="parent/value" >
<xsl:sort data-type="number" order="descending" />
<xsl:if test="position() = 1">
<xsl:value-of select="number(.)" />
</xsl:if>
</xsl:for-each>

Um dos problemas desta implementação é o facto de se fazerem tantos ciclos quanto o número de filhos existentes, para não falar que o XSLT não é uma linguagem pensada para ser iterativa, logo os ciclos devem de ser evitados. Já agora só por curiosidade se o objectivo for obter o mínimo basta mudar o order="descending" para order="ascending".

O curso

Este domingo fui tirar um curso, e agora qual terá sido o curso que eu como programador terei feito? Quem disse curso de sushi acertou, acho que a resposta até é um pouco óbvia demais. Posso até não ter muito jeito para cortar o peixe visto que ainda acabei por cortar-me a mim próprio, mas pronto isso são detalhes, contudo a fazer bolinhas de arroz é pá estava imbatível. Ficam aqui umas fotos só para verem o manjar que eu e os meus colegas de curso preparámos.


segunda-feira, junho 04, 2007

Canoagem

Este sábado fui experimentar pela primeira vez canoagem em rio e foi uma experiência bastante agradável, um dia esplendoroso de calor, os passarinhos a cantarem e as rãs a coaxarem um hambiente de descontração total.

Estou mesmo a pensar em comprar uma canoazinha para poder desfrutar mais vezes deste belo prazer sem estar dependente de outras pessoas. A seguir à canoagem ainda tive um almoção daqueles, grelhados e porco no espeto a sair directamente do espeto para o prato, ai ai que dia...