Web,ruby, Ajax ou qualquer outra coisa que me venha a cabeça (com prioridade para esta última)

09 novembro, 2006

Venham as tabelas

O documento que se segue é uma tradução do artigo: Venham as tabelas de Roger Johansson.

  1. Introdução
  2. Cabeçalhos de Tabela
  3. Legendas de Tabela
  4. Explicar a Tabela
  5. Abreviar Cabeçalhos
  6. Associar Cabeçalhos a Dados
  7. Unir Linhas e Colunas
  8. Colunas e Grupos de Colunas
  9. Grupos de Linhas
  10. Só para Tabelas de Dados
  11. As Vantagens
  12. O Que Eu Não Lhe Disse

Introdução

Uma das coisas que confunde as pessoas que são novatas no uso de arranjos (layout) baseados em CSS é o uso de tabelas. Já vi muitos casos onde as pessoas interpretaram evitar usar tabelas para arranjo como não usar tabelas de todo. É importante perceber que o uso de tabelas está certo desde que usadas correctamente.

Sim, faça o seu melhor para evitar usar tabelas para arranjos, mas para dados tabulares, tabelas é o que deve usar-se. Desejo falar de como é que devem ser usadas as tabelas em HTML e XHTML para além das linhas e células. Muito mais. Especialmente se desejar que essas tabelas sejam acessíveis.

Primeiro um pouco de informação de fundo. A expressão "evitar usar tabelas para arranjos" encontra-se na Introdução às tabelas na especificação do HTML 4.01:

As tabelas não deveriam ser utilizadas única e simplesmente como forma de dar uma apresentação ou "layout" aos documentos, dado que isso poderá apresentar problemas para os médias de representação não visual. Adicionalmente e aquando usadas com gráficos, estas tabelas poderão ter de ser desdobradas horizontalmente, de modo a que elas se possam visualizar, sempre que designadas num sistema com uma exibição mais ampla. Para minimizar esses problemas, os autores deveriam usar as folhas de estilo, com vista a controlar os aspectos relacionados com o "layout", em vez das tabelas.

Julgo que isto é suficientemente claro, embora a expressão usada seja deve e não tem que, se assim sendo há alguma flexibilidade na especificação.

Quando são usadas tabelas para marcar dados, elas não são uma mera grelha. As pessoas que vêm podem ter uma ideia da relação entre o cabeçalho e as células de dados olhando para o arranjo e para a apresentação visual da tabela. As pessoas cegas ou dificuldades de visão não o podem fazer. Para que uma tabela seja acessível a pessoas que usam um leitor de ecrã ou um agente utilizador não visual, é necessário dizer ao agente utilizador como é que a informação contida se relacciona.

Cabeçalhos de Tabela, <th>

Comecemos com uma tabela muito simples que tem uma só linha de cabeçalhos, cada um definindo dados numa coluna. Marcada da forma antiga, nós só colocamos linhas e células na tabela, sendo que a marcação seria algo como:


<table>
  <tr>
   <td>Empresa</td>
   <td>Empregados</td>
   <td>Fundada em</td>
  </tr>
  <tr>
   <td>Uma Lda.</td>
   <td>20</td>
   <td>1947</td>
  </tr>
  <tr>
   <td>XYZ</td>
   <td>1955</td>
   <td>1999</td>
  </tr>
</table>

Sem border ou estilização a tabela surge da seguinte forma no seu navegador actual:

Empresa Empregados Fundada em
Uma Lda. 20 1947
XYZ 1955 1999

Se estilizar a tabela com um pouco de CSS, pode tornar os cabeçalhos mais óbvios para os que usem um navegador gráfico:

Empresa Empregados Fundada em
Uma Lda. 20 1947
XYZ 1955 1999

Para uma pessoa com boa visão, é agora fácil e rápido fazer uma ligação entre as células de cabeçalho e as células de dados que os descrevem. Alguém que use um leitor de ecrã, por outro lado, iria ouvir algo semelhante a : empresa empregados fundada em Uma lda. 20 1947 XYZ 55 1999. Não é muito fácil extrair o significado.

O primeiro passo - e o mais fácil - para a frente de modo a tornar esta tabela mais acessível é marcar adequadamente os cabeçalhos. É muito fácil: usar o elemento <th> (table header/cabeçalho de tabela) em vez do <td> (table data/dado de tabela) nas células de cabeçalho


<table>
  <tr>
   <th>Empresa</th>
   <th>Empregados</th>
   <th>Fundada em</th>
  </tr>
  <tr>
   <td>Uma Lda.</td>
   <td>20</td>
   <td>1947</td>
  </tr>
  <tr>
   <td>XYZ</td>
   <td>55</td>
   <td>1999</td>
  </tr>
</table>
Empresa Empregados Fundada em
Uma Lda. 20 1947
XYZ 55 1999

No caso desta tabela simples, isto seria suficiente para que o leitor de ecrã fosse capaz de deixar o utilizador saber com que célula de dados está relacionado cada cabeçalho. O leitor de ecrã poderia dizer algo como: "Empresa: Uma lda. Empregados: 20 Fundada em: 1947, e assim sucessivamente para cada linha. Muito Melhor.

Legendas de tabela: <caption>

O elemento <caption> pode ser usado para oferecer uma breve descrição de uma tabela, tal como uma legenda de uma imagem. Por omissão a generalidade dos navegadores gráficos reproduzem o elemento <caption> centrado por cima da tabela. A propriedade CSS caption-side pode ser usada para o alterar, se necessário. A maior parte dos navegadores só irá mostrar a legenda por cima (top) ou por baixo (bottom) do conteúdo da tabela, alguns aceitam também valores de left (à esquerda) e right (à direita). Deixo-lhe como tarefa experimentar isto.

Quando usado o elemento <caption> deve ser a primeira coisa após a abertura do marcador <table>:


<table>
 <caption>Tabela 1: Dados das empresas</caption>
  <tr>
   <th>Empresa</th>
   <th>Empregados</th>
   <th>Fundada em</th>
  </tr>
  <tr>
   <td>Uma Lda.</td>
   <td>20</td>
   <td>1947</td>
  </tr>
  <tr>
   <td>XYZ</td>
   <td>55</td>
   <td>1999</td>
  </tr>
</table>
Tabela 1: Dados das empresas
Empresa Empregados Fundada em
Uma Lda. 20 1947
XYZ 55 1999

Claro que pode usar CSS para estilizar a legenda caso o deseje. Contudo tenha em atenção que pode ser complicado estilizar a legenda de forma consistente em todos os navegadores. Deixo isto como exercício para si.

Explicar a tabela: o atributo summary

Uma pessoa com visão pode facilmente decidir se deve ou não estudar uma tabela em detalhe. Uma vista rápida informa-lo-à de se a tabela é grande ou pequena e dá-lhe uma primeira aproximação sobre o seu conteúdo. Uma pessoa que use um leitor de ecrã não o pode fazer excepto se adicionarmos um atributo summary ao elemento tablez. Esta é a forma de oferecer-mos uma descrição mais detalhada da tabela do que aquilo que seria adequado com o elemento <caption.

O conteúdo do atributo summary não será reproduzido nos navegadores visuais, assim trate de ser tão explicito quanto possível de forma a que qualquer pessoa que possa ouvir compreenda sobre que assunto a tabela se debruça. Não se exceda, e só use este atributo quando necessário, isto é, para tabelas complexas onde um sumário tornará mais fácil a alguém que use um leitor de ecrã compreender o conteúdo da tabela.


<table 
  summary="Número de funcionários e ano da fundação de 2 empresas imaginárias
 ">
 <caption>Tabela 1: Dados das empresas</caption>
  <tr>
   <th>Empresa</th>
   <th>Empregados</th>
   <th>Fundada em</th>
  </tr>
  <tr>
   <td>Uma Lda.</td>
   <td>20</td>
   <td>1947</td>
  </tr>
  <tr>
   <td>XYZ</td>
   <td>55</td>
   <td>1999</td>
  </tr>
</table>

Abreviar cabeçalhos: o atributo abbr

Quando um leitor de ecrã encontra uma tabela, pode anunciar o cabeçalho associado (ou cabeçalhos) antes de cada célula de dados. Se tiver um cabeçalho extenso, ouvi-los repetidamente pode ser um tédio. Usar o atributo abbr dá a possibilidade aos leitores de ecrã de usarem essas abreviaturas em vez do texto no próprio cabeçalho. Usar o atributo abbr é opcional e a maior parte do tempo os seus cabeçalhos serão (e talvez devam ser) breves de qualquer modo.

Se a tabela de exemplo for ligeiramente alterada de modo a que os cabeçalhos sejam um pouco maiores o atributo abbr pode ser usado da seguinte forma:


<table
  summary="Número de funcionários e ano da fundação de 2 empresas imaginárias
 ">
 <caption>Tabela 1: Dados das empresas</caption>
  <tr>
   <th abbr="Empresa">Razão social</th>
   <th abbr="Empregados">Número de empregados Empregados</th>
   <th abbr="Fundada">Fundada em</th>
  </tr>
  <tr>
   <td>Uma Lda.</td>
   <td>20</td>
   <td>1947</td>
  </tr>
  <tr>
   <td>XYZ</td>
   <td>55</td>
   <td>1999</td>
  </tr>
</table>
Tabela 1: Dados das empresas
Razão social Número de empregados Empregados Fundada em
Uma Lda. 20 1947
XYZ 55 1999

Um leitor de ecrã poderia ler o cabeçalho completo na primeira linha de dados e nas seguintes utilizaria a forma abreviada.

Como provavelmente pode ser mais difícil uma tabela de dados encaixar-se num determinado arranjo, diria que seria mais comum necessitar do oposto: fazer cabeçalhos breves tanto quanto possível, mesmo abreviados, e usar o atributo title ou o elemento <abbr> para fornecer uma explicação mais extensa.

Associar cabeçalhos a dados: os atributos scope (âmbito), id e header (cabeçalho)

Algumas tabelas são mais complexas do que a do exemplo que tenho vindo a usar. Vou torná-la um pouco mais complexa retirando o cabeçalho "Empresa" e alterando as células de dados da primeira coluna em células de cabeçalhos:


<table
  summary="Número de funcionários e ano da fundação de 2 empresas imaginárias
 ">
 <caption>Tabela 1: Dados das empresas</caption>
  <tr>
    <td></td>
   
   <th abbr="Empregados">Número de empregados</th>
   <th abbr="Fundada">Fundada em</th>
  </tr>
  <tr>
   <th>Uma Lda.</th>
   <td>20</td>
   <td>1947</td>
  </tr>
  <tr>
   <th>XYZ</th>
   <td>55</td>
   <td>1999</td>
  </tr>
</table>
Tabela 1: Dados das empresas
Número de Empregados Fundada em
Uma Lda. 20 1947
XYZ 55 1999

Nesta tabela cada célula de dados tem dois cabeçalhos. O método mais simples, em termos de marcação para assegurar que um navegador não visual pode fazer sentido desta tabela é adicionar o atributo scope a todas as células de cabeçalho:


<table
  summary="Número de funcionários e ano da fundação de 2 empresas imaginárias
 ">
 <caption>Tabela 1: Dados das empresas</caption>
  <tr>
    <td></td>
    <th scope="col">Empregados</th>
    <th scope="col">Fundada em</th>
  </tr>
  <tr>
   <th scope="row">Uma Lda.</th>
   <td>20</td>
   <td>1947</td>
  </tr>
   <th scope="row">XYZ</th>
   <td>55</td>
   <td>1999</td>
  </tr>
</table>

O âmbito do atributo scope define se a célula cabeçalho dá informação sobre uma coluna ou de uma linha:

  • col: cabeçalho informativo para a coluna em que se encontra
  • row: cabeçalho informativo para a linha em que se encontra

Adicionar o atributo scope com o valor col aos cabeçalhos na primeira linha declara que se tratam de cabeçalhos para as células de dados por baixo deles. Do mesmo modo os cabeçalhos no início de cada linha com um atributo scope com o valor row torna esses cabeçalhos cabeçalhos das células de dados à sua direita.

O atributo scope pode tomar mais dois valores:

  • colgroup: a informação do cabeçalho para o resto do grupo de colunas que o contem.
  • rowgroup: a informação do cabeçalho para o resto do grupo de linhas que o contem

Um grupo de colunas é definido pelo elemento <colgroup>. Os grupos de linhas são definidos por <thead>, <tfoot> e <tbody>. Voltarei a estes num instante.

O que sucede se desejar manter o cabeçalho "Empresa" e mesmo assim usar o cabeçalhos de linha com os nomes das empresas? Isso levará as células contendo os nomes das empresas a oferecer tanto o cabeçalho como os dados. Neste caso, <td> deve ser usado em conjunto com o atributo scope:


<table
  summary="Número de funcionários e ano da fundação de 2 empresas imaginárias
 ">
 <caption>Tabela 1: Dados das empresas</caption>
  <tr>
    <th scope="col">Empresa</th>
    <th scope="col">Empregados</th>
    <th scope="col">Fundada em</th>
  </tr>
  <tr>
   <td scope="row">Uma Lda.</td>
   <td>20</td>
   <td>1947</td>
  </tr>
   <td scope="row">XYZ</td>
   <td>55</td>
   <td>1999</td>
  </tr>
</table>

Neste caso os navegadores visuais não irão apresentar os nomes das companhias como cabeçalhos por omissão, e assim é necessário um pouco de CSS para corrigir esse facto. Para este exemplo pode usar-se o seguinte CSS:


td[scope] {
  font-weight: bold;
}

Nota: esta regra usa um selector de atributo, o qual o Internet Explorer não suporta. É necessário contornar isto adicionando uma classe a qualquer célula de dados que seja também cabeçalho de linha.

Outra técnica para ligar as células de dados da tabela com os cabeçalhos apropriados envolve dar a cada cabeçalho uma id única. O atributo headers é então adicionado a cada célula de dados. Este atributo contém uma lista, separada por espaços, das id de todas as células de cabeçalhos que lhe sejam aplicados. Esta técnica é mais complicada e deve ser usada só quando as células de dados que necessitam de ser ligadas a mais do que duas células de cabeçalhos, e o atributo scope é insuficiente, como numa tabela muito fora do fulgar e complexa.

Para ilustrar isto alterei a tabela para mostrar o número de empregados de cada género que cada empresa tem:


  <table class="extbl" summary="Número de funcionários e ano da fundação de 2 empresas imaginárias.">
  <caption>Tabela 1: Dados das Empresas</caption>
  <tr>
  <td rowspan="2"></td>
  <th id="empregados" colspan="2">Empregados</th>
  <th id="fundada" rowspan="2">Fundada em</th>
  </tr>
  <tr>
  <th id="homens">Homens</th>
  <th id="mulheres">Mulheres</th>
  </tr>
  <tr>
  <th id="uma">Uma Lda.</th>
  <td headers="uma empregados homens">15</td>
  <td headers="uma empregados mulheres">5</td>
  <td headers="uma fundada">1947</td>
 </tr>
  <tr>
  <th id="xyz">XYZ</th>
  <td headers="xyz empregados homens">1200</td>
  <td headers="xyz empregados mulheres">799</td>
  <td headers="xyz fundada">1973</td>
  </tr>
  </table>
Tabela 1: Dados das Empresas
Empregados Fundada em
Homens Mulheres
Uma Lda. 15 5 1947
XYZ 1200 799 1973

Como pode ver este método torna-se rapidamente complicado, e assim sendo possível use o atributo scope em seu lugar.

Unir (span) linhas e colunas

Na antiguidade, nos dias de tabelas para arranjos, os atributos rowspan e colspan eram frequentemente usados para fazer com que as células da tabela abarcacem várias linhas e ou colunas de forma a posicionar correctamente em conjunto uma imagem correctamente recortada. Esses atributos ainda se encontram por aí - não há forma de especificar com CSS esta junção. Se se pensar um pouco sobre isto é muito lógico: junções de linhas e de colunas são parte da estrutura da tabela e não na sua apresentação.

Colunas e grupos de colunas: <col> e <colgroup>

O HTML oferece os elementos <colgroup> e <col> servem para agrupar colunas relacionadas numa tabela. Isto permite (em alguns navegadores) o uso de CSS para estelizar colunas de forma independente. Grupos de colunas podem ser usadas pelo atributo scope para especificar que uma célula contém informação de cabeçalho para o resto do grupo de colunas que a contenha.

É tudo o que vou dizer, aqui, sobre colunas e grupos de colunas. Para mais informação ler as ligações na secção "O que é que não lhe disse".

Grupos de linhas: <thead>, <tfoot> e <tbody>

As linhas da tabela podem ser agrupadas num cabeçalho da tabela (<thead>), um rodapé da tabela (<tfoot>) e uma ou mais secções de corpos de tabela (<tbody>). Cada grupo de linhas tem que conter uma ou mais linhas.

Se uma tabela possui uma secção de cabeçalho, esta tem que aparecer antes da secção de rodapé de tabela e da ou das secções de corpo da tabela. Uma secção de rodapé tem que aparecer antes da ou das secções de corpo. Se não for usada nenhuma secção de cabeçalho ou rodapé não é necessário usar um elemento <tbody, mas também não é proibido (se quizer pode usar). A estrutura da tabela que tenha grupos de linhas é algo como:


<table>
 <thead>
 <tr></tr>
 … mais linhas para o cabeçalho da tabela
 </thead>
 <tfoot>
 <tr></tr>
 … mais linhas para o rodapé da tabela
 </tfoot>
 <tbody>
 <tr></tr>
… mais linhas para o primeiro corpo da tabela
 </tbody>
 <tbody>
 <tr></tr>
 … mais linhas para o segundo corpo da tabela
 </tbody>
 … mais corpos de tabela se necessário
</table>

O agrupamento de linhas pode ser útil por várias razões:

  • Torna fácil a estilização das secções de cabeçalho, rodapé e corpos de uma tabela independentemente uns dos outros, sem ter que adicionar classes a qualquer elemento.
  • Quando se imprime tabelas extensas, em alguns navegadores (principalmente os baseados no Mozilla) repetem a informação presente nas secções de cabeçalho e rodapé a cada página impressa, tornando a leitura da tabela impressa mais fácil.
  • A separação de cabeçalho e rodapé do corpo torna possível que os navegadores suportem o rolar do corpo da tabela com as restantes secções da tabela fixas.

Só para tabelas de dados

Tudo o que aqui é descrito está relacionado com o uso de tabelas HTML para estruturar e apresentar dados. Se usar tabelas para arranjo, nenhuma das técnicas descritas aqui deve ser usada. Não deve ser usado nenhum atributo summary nenhum cabeçalho, nenhuma legenda (<caption>), nada. Só arranjo de página baseado em tabelas, consistindo em nada mais do que os elementos <table>, <tr> e <td>. Caso contrário corre o risco de confundir os utilizadores dos agentes utilizadores não visuais ainda mais.

As vantagens

Pode parecer muito trabalho para criar tabelas de dados acessíveis. Para tabelas complexas tal é verdade. Por vezes ao ponto de ser quase impossível de o fazer à mão. Para tabelas simples, o uso de células de cabeçalho com o atributo scope é fácil e rápido.

É óbvio que pessoas que usem leitores de ecrã ou outras tecnologias de assistência obtêm vantagens de tabelas que tenham disponíveis capacidades de acessibilidade. Tentar extrair significado de uma tabela grande e complexa ouvindo-a pode ainda ser muito difícil e assim se for possível simplifique a tabela.

Menos óbvio é que os designers e os utilizadores de navegadores gráficos também beneficiam algo: uma tabela acessível tem pontos de ancoragem suficientes para aplicar CSS e uma boa estilização pode tornar uma tabela mais usável para todos.

O que eu não lhe disse

Há ainda muito mais a dizer sobre tabelas de dados do que aquilo que aqui mencionei. Por exemplo, não me referi a um atributo axis até aqui de todo, e também não descrevi em profundidade os elementos <colgroup> e <col>. Também não falei de formatação e estilização ou modelos de bordas. Também falta um exemplo de uma tabela realmente complexa.

Para aqueles que desejem informação mais detalhada eis algumas ligações para leitura adicional:

08 novembro, 2006

Reinventar o HTML

O Maurício Samy Silva alias maujor, traduziu a entrada do blogue do Tim BL sobre reinvenção do HTML. É aliás um dos poucos comentadores de origem linguística portuguesa (se bem que do Brasil) no próprio site do w3c sobre este tema.

Nota: Neste site encontram-se tradução para português do Brasil de uma série de standards.

O Futuro do HTML

O que se segue é uma tradução de um artigo publicado por Lachan, O futuro do HTML, editado por Molly e Roger.

Este artigo foi escrito em nome do Web Hypertext Application Technology Working Group (WHATWG) e foi publicado no The Web Standards Project, Molly.com e 456 Berea Street.

Tem havido uma grande discussão, ultimamente na web, sobre a recente decisão do W3C de continuar o desenvolvimento do HTML. Têm sido efectuadas muitas entradas em blogues, enviadas muitas mensagens a listas de correio ou colocadas em forúns, revelando várias perguntas e conceitos errados sobre o futuro do HTML (incluindo HTML 5 e XHTML 2), o WHATWG e o novo Grupo de Trabalho HTML do W3C.

Algumas pessoas pedem novas características/capacidades; outra imaginam se elementos que tenham sido considerados quase obsoletos voltam; alguns têm comentários e críticas sobre a própria decisão, o processo do WHATWG ou W3C; alguns levantam preocupações sobre o WHATWG e W3C ignorarem necessidades de grupos específicos. O WHATWG, que está em processo de desenvolvimento da nova versão do HTML (designada por HTML5), acha que é importante não só houvir tudo o que se diz (toda a retroalimentação), mas procurar activamente essa retroalimentação e reagir à mesma, de modo a poder desenvolver uma linguagem que vá de encontro às suas necessidades.

Há várias maneiras nas quais pode participar. A mais directa é fazer ouvir a sua voz subscrevendo a lista de correio. Contudo, nem toda a gente tem tempo para participar, ou manter-se actualizado com o elevado volume de mensagens enviado para essa lista. Algumas pessoas acham que os actuais rascunhos do HTML 5 (Aplicações Web e Formulários Web) são algo complicado. Outros acham que devido a não poderem pagar as quotas elevadas de membro do W3C, que não serão ouvidos de qualquer modo.

Se, por qualquer razão, que não pode participar, ou que estaria desconfortável a fazê-lo, isso não quer dizer que não deva ser ouvido. O WHATWG necessita de ouvi-lo e necessita de saber o que é que pensa sobre o HTML.

  • Há limitações com o HTML que gostaria de ver corrigidas?
  • Tem ideias sobre novas características/capacidades?
  • Há algo que possa fazer agora em HTML mas que gostaria de ver melhorado?
  • Tem alguma preocupação com o processo de desenvolvimento?
  • Tem algo a dizer sobre as novas características/capacidades nos actuais rascunhos?
  • Tem alguma pergunta a colocar sobre o HTML 5?

Quaisquer perguntas, comentários, críticas, reclamações ou pedidos de características/capacidades são bem-vindos. Agora é o momento para falar. Não há comentários estúpidos; nenhuma pergunta é demasiado difícil ou demasiado simples; nenhuma crítica é demasiado rude. Se tem algo a dizer, estamos à escuta.

Por favor deixe um comentário ou deixe uma ligação para um artigo que tenha escrito. Será escutado e tentaremos responder.

25 outubro, 2006

Firefox 2.0 chegou!!!

O Firefox 2.0 já cá está. Tenho que admitir que uma das razões que me levou a instalar isto foi o de poder usar o respectivo corrector ortográfico (estou a usar um portátil) sem ter que recorrer ao processador de texto (Já agora tanto uso o OpenOffice como o MS-Office desde que disponíveis na máquina em que esteja a escrever.) O corrector ortográfico funciona, é pena ainda não ter percebido como poderei adicionar palavras/expressões pois como é possível imaginar uso demasiadas expressões não portuguesas. Já agora neste texto o corrector reconhece Firefox e OpenOffice mas não Ms-Office. O corrector tal como o navegador que instalei está em língua portuguesa europeia.

A importância da acessibilidade

Jonathan Snook «viu» para que serve a acessibilidade, mesmo num sítio flash.

Como obter estatísticas de tamanho de navegadores

Em cinco passos: podcast.

p.s. inutilidade absoluta :)

A List Apart 226

Os artigos deste mês no A List Apart226 são:

O artigo repescado é:

Gerir o seu conteúdo com PHP, de Christopher Robbins

Tenho que admitir que achei os artigos um pouco para o fraco, digamos antes básicos, cheios de senso comum em especial o primeiro.

24 outubro, 2006

Parabéns WeBreakStuff

Parabéns ao Frederico Oliveira, Tiago Macedo e Pedro Freitas pelo melhor interface de utilizador do concurso Rails Daya.

Blogged with Flock

Cábulas

Cábulas (para programação) ... ordenadas por assunto e tudo, prontas a servir.

23 outubro, 2006

19 outubro, 2006

Assinaturas CSS

Aprende-se sempre algo de novo (mesmo com documentos e ideias que já cá andavam há algum tempo) quando se passeia pela web.

Hoje fui ver alguns textos de Dezembro de 2001 no css-d (o grupo do css para pessoas que desenvolvem sítios). Deparei-me com um memorando enviado por Eric A. Meyer que dizia que a partir dessa data iria modificar meyerweb.com de forma a que cada página incluísse a seguinte marcação:

<body id="www-meyerweb-com">

E onde ele explicava que o fazia de forma a que qualquer pessoas pudesse alterar o estilo do seu sítio bastando para isso adicionar as regras apropriadas à folha de estilo de utilizador. Ao usar selectores descendentes que começassem com o ID do sítio, os estilos seriam só aplicados às páginas do seu sítio. Ele exemplificava ainda com duas regras css:

#www-meyerweb-com {font: 1em Times, serif;} #www-meyerweb-com * {font-family: Times, serif;}

Acrescentava ainda que se podia alterar cores, recolocar elementos e inclusivamente dizer que display: nome, tudo o que se quizesse. Remetia ainda para um artigo de Simon Willison ensaio beta privado do novo arquivo do css-discuss.

Contudo após uma visita à minha lista de favoritos, só encontrei 4 sítios que usem esta técnica, será que foi considerada inútil.

O que é o C em MVC (estilo ror)

Jamis Buck publicou ontém uma artigo interessante, Controlador magrinho modelo gordinho que responde à questão de onde colocar determinado tipo de código (de programa) quando se desenvolve uma aplicação em Rails On Ruby (RoR).

Lançamento do IE7

Já foi lançado o Internet Explorer 7.

Censura no Irão

Vejam estas páginas de revistas ocidentais censuradas no Irão.

Termos da Licença de Utilização do Windows Vista

Interessante ver que já haja quem esteja a "traduzir" os termos legais da licença de utilização do Windows Vista explicando-os em termos comuns.

12 outubro, 2006

Completamente fora de tópico

The number of school leavers is shrinking and the workforce is ageing. It is estimated that 60% of employees will be over 60 in 2045, when the average retirement age will be 77 for men and 72 for women.

Ao ver marcadas manifestações para hoje por causa do acordo sobre a reforma da segurança social não posso deixar de colocar aqui a citação em epígrafe. Que raio de matemática se estará a ensinar/se ensinou nas nossas escolas como é que se quer continuar a insistir na quadratura do círculo (e não me estou a referir ao programa da SIC).

Façam contas e vamos ver como é que se pode esperar pagar a segurança social se continuarmos a procriar tão pouco (ou importarmos mão de obra já treinada e de preferência jovem e já agora que não tenha filhos - isto é obviamente cínico) e a reformarmo-nos tão cedo.

Ala 225, 09 de Outubro de 2006

Saiu mais um número do A List apart, os dois artigos do mês são:

  • Trabalhar com Outros: Acessibilidade e Pesquisa de Utilizador, de Maurizio Boscarol. Neste artigo Maurizio apresenta a sua visão (não é uma piada) sobre a falta de pesquisa de suporte às especificações do W3C quanto a acessibilidade (quer para cegos quer para pessoas com grandes dificiências visuais). Na prática diz-nos: mais trabalho de base e menos tretas.
  • O segundo artigo do mês trata de dar uma lista de recursos na net para quem está a dar os primeiros passos no desenvolvimento de sítios web. Trata-se da segunda parte do Recursos para Iniciados feito por Erin Lynch. Nele encontram-se recursos para, web design, arquitectura de informação, marcação CSS e scripting, design, marcação estilo standards e acessibilidade.

O artigo repescado do mês foi o de Trenton Moss: O que é Acessibilidade da Web.

11 outubro, 2006

Web 2.0 - Google Docs

Google docs and spreedsheets

Partilha de apresentações/slides (transformando os seus slides de Powerpoint em Flash

Partilha e colaboração na elaboração de documentos e folhas de cálculo com a agregação em Google Docs & Spreadsheets (em beta) com possibilidade de gravação em diversos formatos Word, PDF, HTML, RTF e Open Document.

Os utilizadores do Opera não podem usar.



technorati tags:, , ,

Blogged with Flock

10 outubro, 2006

Dia Mundia da Usabilidade

É já no dia 14 de Novembro

technorati tags:

Blogged with Flock

Rubiadas - II

<< em vez de +

Quando se pretende juntar duas expressões textuais (strings) em ruby, com a excepção de se querer criar uma terceira, é muito mais rápido usar o método << (unir) do que o método + (concatenar).

Subscritor.count em vez de Subscritor.find_all.size

1 segundo contra 45 segundos

Um novo suplemento para o jEdit para edição de Ruby

Compilador Ruby para .Net

Ainda um projecto académico, concorrente ao mercado de máquinas virtuais como a CLR e a JVM.

IRB MIX TAPE

Um quase guia de utilização do IRB no contexto do RoR. Neste mesmo site encontra outros mini-guias muito interessantes.

Javascript não obstrutivo

Notas sobre a RailsConf Europe 2006 de Graeme Mathieson.

Entrevista com o programador de Ferret

Para quem goste do tema interpretação de línguas pode ser interessante dar um salto ao On Ruby.

String#chars

Foi inserido ActiveSupport::MultiByte no Rails Core para suporte de internacionalização

2 ferramentas para análise, melhoria e depuração de aplicações em Ruby

Railsbench

RailDock!

Rails Live CD

Como facilitar a instalação da Rails On Ruby em Linux, Rails, Ruby, jEdit...

Mais uma cábula

Cábula para Rails - Edição para coleccionador

Notas de Navegação 3

DeWitt Clinton tem vindo a falar sobre dois temas que podem vir a ter importância: a especificação de modelos de URL e OpenSearch

O Firefox lança o Release Candidate 2. Só usar por quem sabe...

Uma daquelas coisas que há pouco tempo não se acharia possivel fazer na web uma aplicação para fazer diagramas: Gliffy

23 setembro, 2006

FAQ HTML versus XHTML

Este documento é uma tradução da FAQ HTML and XHTML Frequently Answered Questions

Perguntas frequentes respondidas sobre HTML e XHTML (FAQs)

Editor: Steven Pemberton, W3C/CWI

Data da versão: 21 Julho 2004

Outras FAQs relaccionadas:

Para comentar este documento ou enviar sugestões para pergunta, por favor enviar correio electrónico para www-html-editor@w3.org, e incluir a palavra FAQ no assunto.

Tabela de Conteúdos

  1. Porque é que é necessário o XHTML? O HTML não é suficientemente bom?
  2. Quais as vantagens de usar XHTML no lugar do HTML?
  3. Posso colocar uma declaração XML no topo de documentos HTML existentes? Posso misturar documentos HTML 4.01 e XHTML?
  4. Qual a forma mais fácil de converter documentos HTML em XHTML?
  5. Porque é que os navegadores são tão picuinhas com o XML? Eram mais liberais com o HTML.
  6. Porque é que me devo preocupar com que os meus documentos tenham um HTML correcto? Os documentos são bem apresentados pelo meu navegador.
  7. Onde é que posso ir para verificar se o meu documento usa marcação correcta?
  8. Porque é que se refer a "agente utilizador" em vez de "navegador"?
  9. Porque é que tenho que usar espaços de nomeação em XHTML?
  10. Porque é que é permitido enviar documentos XHTML 1.0 como text/html?
  11. Quais são os navegadores que aceitam o tipo de media application/xhtml+xml?
  12. O Microsoft Internet Explorer aceita o tipo de media application/xhtml+xml?
  13. O CSS tem muitas regras especiais aplicáveis só a HTML. Essas regras são aplicáveis ao XHTML?
  14. document.write funciona em XHTML?
  15. Porque é que não é permitido o envio de documentos XHTML 1.1 como text/html?
  16. Porque é que o atributo target foi eliminado de XHTML 1.1?
  17. O que é a modularização do XHTML?
  18. Porque é que é necessário o XHTML2? Não chega o XHTML 1?
  19. O marcador <img> irá ser substituído pelo marcador <object> no XHTML2?
  20. Porque é que o XHTML2 não usa XLink?
  21. Porque é que o XHTML2 não é retrocompatível?
  22. Porque é que xml:space está igualado a 'preserve' em todos os elementos XHTML? Não desejo ver espaço em branco na minha saída.

Porque é que é necessário o XHTML? O HTML não é suficientemente bom?

O HTML é provavelmente a linguagem de marcação mais bem sucedida no mundo. Mas quando o XMl foi introduzido, foi organizado um workshop de dois dias onde foi discutido se uma nova versão de HTML em XML era ou não necessária. A opinião desse workshop foi um claro "Sim": com um HTML baseado em XML as outras linguagem XML poderiam incluir bocados em XHTML e os documentos XHTML poderiam incluir partes noutras linguagens de marcação. Poderiamos tirar partido da nova concepção para limpar algumas partes do HTML que necessitassem de lavagem, e adicionar alguma funcionalidade nova como melhores formulários..

Quais as vantagens de usar XHTML no lugar do HTML?

Se o seu documento for XHTML 1.0 puro só (sem incluir partes noutras linguagens de marcação) então não irá notar muita diferença. Contudo à medida que mais ferramentas XML estão disponíveis, tais como XSLT para transformação de documentos irá começar a notar vantagens na utilização de XHTML. Por exemplo XForms irá permitir alterar documentos XHTML (ou qualquer outro tipo de documento XML) de modo simples e controlável. As aplicações da Web Semântica irão poder tirar partido dos documentos XHTML.

Se o seu documento é mais do que XHTML 1.0, por exemplo incluindo MathML, SMIL, ou SVG, então as vantagens são imediatas. Não é possível fazer esse tipo de coisas com o HTML.

Posso colocar uma declaração XML no topo de documentos HTML existentes? Posso misturar documentos HTML 4.01 e XHTML?

Não. O HTML não é um formato XML. Tem que proceder às alterações necessárias para tornar o documento num documento XML correcto antes de o poder ver aceite como tal.

Qual a forma mais fácil de converter os meus documentos HTML em XHTML?

HTML Tidy dá-lhe a opção de transformar qualquer documento HTML num documento XHTML. Amaya é um navegador/editor que guarda documentos em HTML como documentos em XHTML.

Porque é que os navegadores são tão picuinhas com o XML? Eram mais liberais com o HTML.

É deliberado. Os navegadores HTML aceitam praticamente qualquer entrada, correcta ou incorrecta, e tentam fazer o que for mais adequado com ela. Esta correção de erros torna os navegadores muito difíceis de escrever em especial se se estiver à espera que se espere deles que se comportem de igual modo. Isto também significa que um grande número de documento HTML está incorrecto, porque como são correctamente apresentados num navegador o autor poderá não se aperceber de que os mesmos contenham erros. Isto torna incrivelmente difícil escrever novos agentes utilizadores para a web visto muitos documentos que reclamam ser escritos em HTML são muito pobres frequentemente.

Porque é que me devo preocupar com que os meus documentos tenham um HTML correcto? Os documentos são bem apresentados pelo meu navegador.

Todos os navegadores sabem como tratar HTML correcto. Contudo se o HTML estiver errado o navegador tem que reparar o documento e visto nem todos os navegadores corrigirem um documento do mesmo modo, isto introduz diferenças, e assim o seu documento pode ser visto de forma diferente em diferentes navegadores. Como há centenas de navegadores diferentes, e estão a sair mais a todo o momento (não só para PC, mas para PDAs, telefones móveis, televisores, impressoras e mesmo figoríficos), é impossível testar o seu documento em todos os navegadores. Se usar HTML incorrecto no seu documento poderá suceder que não possa funcionar num navegador e então a falha é sua, se o seu HTML estiver correcto e não funcionar num determinado navegador então o erro é do navegador.

Onde é que posso ir para verificar se o meu documento usa marcação correcta??

O W3C oferece um serviço em http://validator.w3.org/. O navegador/editor Amaya também verifica se a sua marcação é correcta.

Porque é que se refer a "agente utilizador" em vez de "navegador"?

embora os navegadores sejam importantes utilizadores de HTML e XHTML, há outros programas e sistemas que leem esses documentos. Os motores de busca por exemplo leem documentos mas não são navegadores. Ao usar o termo"agente utilizador" estamos a tentar lembrar as pessoas dessa diferença.

Por exemplo, quando usa o Google irá ver debaixo de alguns dos resultados da busca algo como "Esta página usa frames, mas o seu navegador não os suporta." levando a que algumas pessoas não cliquem nessa ligação. O autor do sítio web em questão não percebeu que há mais do que navegadores, e que devem incluir algo melhor do que este simples texto na secção <noframes>, de forma a não parecerem ideotas a quem faz buscas pelo respectivo sítio.

Porque é que tenho de usar os espaços de nomeação em XHTML?

Nos primórdios do HTML diferentes grupos e companhias adicionavam novos elementos e atributos ao HTML à vontade. Isto ameaçou provocar um caos de versões HTML não inter-operativas. XML (o X está no lugar de eXtensível) permite a qualquer pessoas usar elementos e elementos de difernetes linguagens, mas para que um navegador ou outro agente utilizador saiba onde cada elemento pertence a que linguagem é necessário dizer-lhe. As declarações de espaço de nomeação são só esse mecanismo.

Porque é que é permitido enviar documentos XHTML 1.0 como text/html?

XHTML é um formato XML; isto significa que falando estritamente deve ser enviado num tipo de media relativo a XML (application/xhtml+xml, application/xml, ou text/xml). Contudo o XHTML 1.0 foi concebido cuidadosamente de forma a também funcionar com agentes utilizadores HTML anteriores. Se seguir algumas directrizes simples, pode fazer com que muitos documentos XHTML 1.0 funcionem em navegadores antigos. Contudo esses navegadores só entendem o tipo de media text/html, e assim tem que usar este tipo de media para enviar aos mesmos os documentos em XHTML 1.0. Lembre-se contudo que enviar documentos XHTML aos navegadores como text/html significa que esses documentos são vistos como documentos HTML e não como XHTML por esses navegadores.

Que navegadores aceitam o tipo de media application/xhtml+xml?

Os navegadores conhecidos incluem todos os navegadores baseados em Mozilla tal como o Netscape 5 e versão mais recente, Galeon e Firefox, assim como o Opera, Amaya, Camino, Chimera, DocZilla, iCab, Safari, e todos os navegadores de telefones móveis que aceitem WAP2. De facto qualquer navegador moderno. A maior parte aceita os documentos XHTML como application/xml também. Ver os tipos de media XHTML para detalhes.

O Microsoft Internet Explorer aceita o tipo de media application/xhtml+xml?

Não. Contudo há um truque para permitir servir documentos XHTML1.0 ao Internet Explorer como application/xml.

Incluir no topo do documento a linha a negrito:

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="copy.xsl"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

onde copy.xsl é um ficheiro que contém o seguinte:

<stylesheet version="1.0"
     xmlns="http://www.w3.org/1999/XSL/Transform">
    <template match="/">
        <copy-of select="."/>
    </template>
</stylesheet>

Note que este ficheiro deverá encontrar-se no mesmo sítio do que o documento que se lhe refere.

Embora esteja a server o documento como XML, e seja analisado como XML, o navegador pensa que recebeu text/html, e assim o seu documento XHTML 1.0 tem que seguir algumas directrizes para servir navegadores antigos.

O seu XHTML irá continuar a funcionar nos navegadores que aceitem XHTML 1.0 como application/xml.

CSS has a lot of special rules that only apply to HTML. Do these also apply to XHTML?

No. CSS rules that apply only to HTML, apply only to documents that are delivered as text/html.

document.write funciona em XHTML?

Não. Devido à maneira como o XML foi definido não é possível usar truques como este, esta marcação é gerada por programação dinâmica enquanto o analisador está ainda a analizar a marcação recebida.

Pode ainda alcançar os mesmos efeitos, mas terá que usar o DOM para adicionar ou apagar elementos.

Porque é que não é permitido enviar documentos XHTML 1.1 como text/html?

XHTML 1.1 é XML puro, e só se pretendeu que fosse XML. Não pode ser enviado a navegadores antigos de forma fiável. Assim os documentos XHTML 1.1 têm que ser enviados com um tipo de media relativo a XML, tal como application/xhtml+xml.

Porque é que o atributo target foi eliminado de XHTML 1.1?

Não foi. O XHTML 1.0 vem em três versões: strict, transitional, e frameset. Todas foram mantidas deliberadamente tão proximas da HTML 4.01 na medida em que o XML o permite. O XHTML 1.1 é uma versão actualizada da XHTML 1.0strict, e nenhuma versão HTML strict teve um atributo target. As outras duas versões, transitional e frameset, não foram actualizadas visto não haver nada a actualizar. Se desejar usar o atributo target use XHTML 1.0 transitional.

O que é isso de usar modularização de XHTML?

A modularização XHTML não se destina aos utilizadores normais de XHTML, mas a conceptores de linguagens baseadas em XHTML. Observou-se que companhias e grupos tinham uma tendência para conceber as suas próprias versões de HTML e XHTML que eram frequentemente não interoperacionais a níveis básicos. A modularização do XHTML reparte o XHTML numa número de módulos que podem ser individualmente seleccionados quando se define uma nova linguagem; desta forma uma qualquer linguagem baseada em XHTML que use tabelas garantidamente usa a mesma definição de tabelas e não uma versão divergente. A modularização torna também claro onde é aceitável adicionar novos elementos e onde tal não é razoável.

Porque é que é necessário o XHTML2 ? O XHTML 1 não é suficientemente bom?

O HTML e o XHTML prestaram um bom serviço, mas há muias coisas que podem ser melhoradas. Áreas que receberam atenção particular incluem melhores possibilidades de estruturação, remoção de capacidades que estão duplicadas em XML, usabilidade, acessibilidade, internacionalização, independência de dispositivo, melhores formulários e reduzir necessidade de programação.

O marcador <img> está a ser substituído pelo <object> em XHTML2?

Não. <img> está a ser substituído em XHTML2 mas por outra coisa ( embora possa usar <object> se desejar).

A concepção de <img> levanta vários problemas em HTML:

  • Não tem possibilidades de degradação, assim se usar uma imagem do tipo PNG por exemplo, e o navegador não poder tratar desse tipo, a única alternativa é usar o texto alternativo. Este facto limitou a adopção de imagens PNG, que em muitos casos são melhores do que as GIF e JPG, visto as pessoas terem continuado a usar o formato denominador comum de forma a assegurar que todos possam ver as imagens.
  • O texto alternativo não pode incluir marcação, e portanto se usado só se obtém texto simples.
  • É possível incluir uma ligação longdesc com uma descrição da imagem (ou sua finalidade), para ajudar pessoas que a não possam ver mas isso raramente é feito.

O que o XHTML2 diz é que todas as imagens são equivalentes a uma parte do conteúdo, fá-lo ao permitir-lhe colocar um atributo src em todos os elementos. O que isto significa é que se a imagem está disponível e o navegador a puder processar, usá-la, caso contrário usar o conteúdo do elemento, por exemplo:

<p src="mapa.png">Sair da estação, voltar à esquerda e 
seguir em frente até à <strong>Rua Direita</strong>,
   aí voltar à direita</p>

A vantagem é a de que se a imagem não estiver disponível por qualquer razão (tal como falha de rede) ou o navegador não a puder reproduzir o documento continua a ser útil. Se desejar fornecer mais do que um tipo de imagem pode:

<p src="mapa.png"><span src="mapa.gif">Sair da estação...</span></p>

embora seja melhor usar negociação de conteúdos no caso do seu servidor o suportar (e a maior parte fá-lo):

<p src="mapa">Sair da estação...</p>

o que irá negociar com o navegador que tipo de imagens aceita e qual a preferida do navegador. Se não houver imagem disponível então o conteúdo do elemento será usado. Isto tem a vantagem adicional de pode adicionar outros tipos de imagens no seu servidor e não ter que alterar a página para que esta funcione.

XLink e XHTML têm requisitos diferentes para ligações e verificou-se serem irreconciliáveis.

Porque é que o XHTML2 não é retrocompatível?

É, mas de um modo diferente das anteriores versões de HTML serem retrocompatíveis.

Visto as primeiras versões de HTML serem linguagens de finalidade específica era necessário assegurar um nível de retrocompatibilidade com novas versões de forma a que os novos documentos podessem ser utilizáveis em navegadores antigos. Por exemplo é por essa razão que o elemento <meta> tem o seu conteúdo num atributo em vez de no conteúdo do elemento, porque nesse caso iria aparecer em navegadores antigos.

Contudo graças ao XML e às folhas de estilo, tal retrocompatibilidade estrita ao nível do elemento deixou de ser necessária, visto um navegador baseado em XML, o que significa cerca de 95% dos navegadores em uso no momento de redação desta resposta, pode processar novas linguagens de marcação sem necessidade de ser actualizado. Muito do XHTML 2 funciona nos actuais navegadores, navegadires que não foram pré-programados para aceitar XHTML2. A maior parte funciona mas não tupo: quando os formulários e as tabelas foram adicionadas ao HTML as pessoas tiveram que esperar por novas versões de navegadores; de forma similar algumas partes do XHTML 2, tais como XForms e XML Events, ainda precisam que os agentes utilizadores compreendam essa funcionalidade.

Porque é que xml:space está definida como 'preserve' em todos os elementos XHTML? Não desejo ter espaço em branco extra na minha saída.

O atributo xml:space trata-se de input: isto é, controla se os espaços irão estar presentes no DOM (isto é, se a versão interna do documento dentro do navegador os inclui), nada diz de como irão surgir no ecrã. A saída de espaço em branco é controlada via a propriedade de CSS 'whitespace'. Se a propriedade tiver o valor 'pre' os espaços irão ser preservados no DOM na saída se a propriedade tiver o valor de 'normal' o espaço em branco junta-se (o CSS3 irá ter mais propriedades para permitir um maior controlo).

Esta é a razão pela qual todos os elementos têm xml:space="preserve" em XHTML2, caso contrário a propriedade CSS 'whitespace' não teria efeito e não teria controlo sobre o espaço em branco visível. A folha de estilo por omissão irá tratar de dar o valor a 'whitespace' de 'normal' para todos os elementos com a excepção de <pre>, mas será livre de os alterar.


The Radiant Vista

A web para mim em 1995 era essencialmente um mundo para a palavra. Claro que já havia aqueles sítios que achavam indispensável bombardiar-nos com textos a piscar, a moverem-se e claro já havia muitas imagens. O sítio a que hoje me estou a referir é um sítio que leva a imagem a sério: The Radiant Vista.

The Radiant Vista é constituído por uma série de secções das quais desejava destacar a crítica diária onde são apresentadas e criticadas imagens em vídeos relativamente breves, à volta dos 5 minutos ou menos, o laboratório de photoshop onde são apresentadas técnicas para melhoria de imagens em laboratório digital, quatro secções dedicadas a recursos, podcast, Guias em Vídeo, Guias em PDF, Artigos e claro uma secção para Workshops de fotografia.

As secções que apelidei de recursos, vão desde temas apropriados para principiantes até artigos com profundidade para profissionais ou amadores muito sérios. Salvo a secção de guias PDF as restantes apoiam-se fortemente em screencast's.

07 setembro, 2006

Boas Práticas - II

Um dos assuntos que me tem levado a escrever é a aplicação de boas práticasna produção de sítios web. Em novembro de 2005 esbocei uma linhas sobre o assunto, tenho vindo a tocar no assunto algumas vezes. Eis mais uma:

  1. Validar as páginas web!

    É impossível infatizar isto de mais. Todos os sítios de ministérios que revi nos últimos dias são ou estão inválidos. Como é que é possível esperar que o CSS ou o Javascript baseado no DOM funcione de forma fiável com um códig (x)html inválido?. Conteúdo válido poderá evitar muitas horas de procura de erros em CSS ou DOM. Os que mais se aproximavam de um sítio válido eram os do ministério da justica com um erro ao incluir o erro div align="left" style="padding:0px" (não há atributo align) e o do ministério das finanças com o mesmo erro, repetido, de não efectuar o escape de um e comercial (&) nos comunicados à imprensa, em referências a URL, em quatro sítios na página inicial (existem nessa mesma página referências correctas). Não vou aqui fazer os comentários que pessoas mais abalizadas fazem quando vêem coisas destas.

    Tantek diz que o erro das finanças também o atinge de tempos a tempos.

    Tantek lista os erros mais comuns de validação.

  2. Eliminar tabelas de layout e gifs espaçadores

  3. Não usar <meta>s

  4. Melhorar os nomes das classes

  5. Não usar grandes blocos de linhas em branco

  6. Usar 'rel' e 'hreflang' para traduções

  7. Limpar os comentários no servidor

  8. Usar hcard para indicar contactos

notas de navegação - II

Elly Thompson recentemente formada em Arquitectura (daquela em concreto) apresenta as suas teorias de similitude e dissemilhança entre a construção de um site na web e a construção de um edifício. Além disso dá a sua opinião cívica como por exemplo sobre a obrigação das mulheres se manterem saudáveis.

Dean Edwards explora o método forEach.

Rachel Andrew em junho apresenta as suas ideias sobre selecção de técnicas CSS quando estamos a desenvolver projectos para os quais existe mais do que uma técnica para obtenção do mesmo resultado final. Em particular chama a atenção para aquilo que temos de ter em conta por exemplo quando necessitamos de libertar elementos flutuados (clear). O método recomendado por ela é mesmo o de adicionar a div suplementar, sem significado semântico, que tem como alternativa usar truques de CSS só para a evitar.

Roger Johansson revisitou a construção de pseudo-frames em css.

Richard Rutter continua a sua coleção de artigos sobre tipografia para a web, com base nos Elementos de Estilo Tipográfico de Robert Bringhurst. Uma delícia para os olhos.

No blogue da SimpleBits aparece um texto Educated onde se fala de um curso universitário da Universidade de Boston onde os novos métodos de produção de web sites são enfatizados. Quando Há pouco tempo estive a ver os trabalhos de alunos de mestrado da Universidade Nova de Lisboa fiquei estarrecido pois todos usavam essa maravilhosa técnica de produzirem sítios com ... FrontPage ... o que é que acham da diferença.

Drew McLellan diz-nos por onde tem passado nos últimos tempos, o Barcamp de Londres e o d.Construct que começa na próxima semana. Fala ainda de ferramentas para microformatos que anda a conceber.

06 setembro, 2006

Web standards em Portugal Revisitado

A Imprensa

Em 5 de Outubro de 2005 efectuei uma primeira abordagem à utilização de web standards em Portugal, tendo-me focado na imprensa na altura. Até hoje tanto quanto me é dado a ver passou a haver mais dois sites com declaração de tipo de documento só que continuam a não honrar o que aí dizem (só lá está para inglês ver, como se dizia quando eu era pequeno.)

Esses dois sítios são:

  • Diário digital já tem DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  • e
  • Jornal de Notícias já tem !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd".

technorati tags:,

Blogged with Flock

Notas de navegação

Na Caixas e Setas de 23 de agosto, Shiv Singh apresenta as suas ideias sobre a aplicação em ambiente empresarial dos aspectos humanos da Web 2.0, no mesmo número da Boxes and Arrows é apresentado o desenvolvimento do design do sítio da Volkswagen da África do Sul.

Na entrada de 30/07/2006 do arkitrave.log é apresentado código CSS para estilizar uma lista de pares nome valores (listas de definições) onde o nome (chave) e o descritivo são apresentados um ao lado do outro. O método aqui apresentado permite ser usado com o IE.

Ara Pehlivanian no seu artigo Semântica - necessitamos mesmo dela apresenta as suas dúvidas sobre se por vezes não somos excessivamente levados pelos aspectos técnicas das tecnologias que aplicamos na web.

O excelente informatian aesthetics - form follows data - data visualization & visual design hoje, 5 de setembro mostra como é que o 11 de setembro afectou o número de passageiros a bordo de aviões. De facto chama a atenção para um artigo da BBC.

No User Interface Engineering Joshua Porter apresentou em Abril de 2006 um artigo sobre Folksonomies Uma maneira de organizar conteúdos orientada pelo utilizador.

Vanderwal apresenta um artigo sobre nomes de URL mais humanos e também com mais significado para motores de busca ou escavadores de dados (scrappers). O artigo chama-seO Domínio do Design Digital Inclui Cadeias de Caracteres.

O número de agosto de 2006 do JUS - Journal of usavility studies apresenta 1 artigo sobre o Dia Mundial da Usabilidade, assinado por Elizabeth Rosenweig (artigo convidado) e 3 artigos revistos:

  1. Cultura e Avaliações de Usabilidade: Os efeitos da cultura em entrevistas estruturadas, de Ravi Vatrapu e Manuel A. Pérez-Quiñones,
  2. A revisitação da likebility das personagens animadas: O caso da TV interactiva, de Konstantinos Chorianopoulos,
  3. O sistema da escala de usabilidade em falantes de inglês não nativos, de Kraig Finstad.

Os artigos estão disponíveis em sumários e na sua totalidade. A maior parte dos artigos trata de assuntos ligados a aspectos multiculturais e internacionais. Não esquecer que a periodicidade desta publicação é de cerca de 3 meses.

Croco[Lyle] participou num podcast em conjunto com jared spool. A transcrição desse podcast está presente na User Interface Engineering. Quem ler este artigo deverá ler também o artigo do Ivo Gomes sobre prototipagem em papel.

RawDiz-nos que Chris Messina (um dos autores do Flock) escreveu uma carta aberta ao Blogger para que ele venha a introduzir maior suporte a microformatos no maior motor de blogues. Já agora eu também estou o o chris.

technorati tags:, ,

Blogged with Flock

01 setembro, 2006

Bar Camp Coimbra

Barcamp - Coimbra de 2 e 3 de Setembro, com um alinhamento muito interessante que inclui a gente da WeBrakeStuff.

29 agosto, 2006

Lei n. 46 de 2006

A lei [PDF]46/2006 publicada em 28 de Agosto de 2006 proíbe e pune a discriminação em razão da deficiência. Entra em vigor, hoje, com um pequeno defeito, o governo terá (nos termos da lei) que regulamentar a lei nos próximos 120 dias.

Temo que estes 120 dias se transformem em algo como o da regulamentação da lei sobre protecção dos animais. (Publicação em 1995 ou 6 não tenho a certeza e ainda por regulamentar.)

Como despachar um utilizador

Palavras para quê? É um «artista» português!

24 agosto, 2006

O site da Faculdade de Belas Artes da UP

A página de entrada da Faculdade de Belas Artes da Universidade do Porto está conforme a recomendação XHTML 1.0 (Transitional).

No caso de querer ser mesmo picuinhas (muito mesmo) poderiamos dizer que:

  1. apresenta três referências a URI com um caracter que nelas não deve figurar (espaços) ver rfc1738 e procurar por unsafe (aqui a correção seria apagar o espaço que está entre as pelicas e a palavra http
  2. dois elementos <dt> vazios (ou com espaços), (a solução seria elimina-los)
  3. que um elemento map tem dois atributos name e id com valores diferentes (a solução seria escolher um deles e verificar que não há referências ao outro nome)
  4. existe dois outros pequenos problemas âncoras adjacentes umas às outras
  5. e um elemento input num formulário que não contém um atributo alt.

Não sei se esta página tenderá a ser eliminada ou não devido à integração no site da UP de todas as faculdades sistema Sigarra.

O site acima parece-me não ter sido feito para nenhum público alvo sendo demasiado frio (tal como os sites que se apresentam no Sigarra).

Em resumo uma página cujo código é bom mas que parece não tender a resolver nenhum problema para ninguém.

Outras entradas de blogue recomendo (não se referem a código mas a AI (arquitectura de informação, usabilidade, ...) dos sítios do Sigarra:

  1. Avaliação crítica do sistema Sigarra - design de interacção e norma ISO 9241 de Bruno Silva
  2. Letras imperfeitas
  3. Norma ISO 9241 e ..., de Paula Alexandra Oliveira

P.S.: As páginas do Sigarra são compatíveis com HTML 4.01.

23 agosto, 2006

Rubidinhas (Rapidinhas do Ruby)

Ariel: Uma Biblioteca de Extracção de Informação em Ruby

Alex Bradbury desenvolveu Ariel, uma biblioteca que usa exemplos pré-definidos para compreender como extrair informação de outros documentos. É um projecto do Google Summer of Code Project e foi mencionado por Austin Ziegler em Londres.

Inferência de tipo para RDT Ruby Development tools

Também do Código de Verão de 2006 vem um relato de Jason Morrison sobre o seu projecto de inferência de tipo para usar na RDT para completar código.

Luke Redpath

Luke e Dan criaram um suplemento ujs4rails para a RoR para produção de sites com javascript não obstrutivo.

Com javascript não obstrutivo quero dizer algo como aquilo que é dito no número 218 do ala por Jeremy Keith que nele publicou um artigo designado por Separação de comportamento no qual apresenta uma analogia entre separação de estilo e separação de comportamento para páginas na web, para explicar porque é que se deve separar o javascript das nossas páginas.

No caso de desejar conhecer um pouco mais sobre isto recomendo ainda o artigo do Christian Heilman Unobtrusive Javascript.

Avaliação de percas de memória em Rails

Scott Laird em como avaliar percas de memória em Rails diz-nos que:

Um dos meus problemas mais antigos com a Rails (e a Ruby em geral) é que é difícil depurar as percas de memória. Tive um certo número de casos onde coloquei algo num array ou num hash e descobri muito mais tarde que o meu processo Ruby estava a comer mais de 100 MB de RAM. Embora o ps torne fácil ver onde o Ruby está a usar muita RAM, descobrir para onde é que foi é muito mais difícil.

Entrevista com Zed Shaw

O criador do Mongrel foi entrevistado por Pratik Naik .

eRuby: Utilização da biblioteca DBI de Ruby para ligação a bases de dados

Neste artigo do Hiveminds Magazine explica-se passo a passo o que fazer quando se quer abstrair a camada de ligação a uma base de dados em ruby.

REST e Rails - não há razão para ficar intimidado

Um guia básico sobre como usar REST em Rails. No mesmo sítio há umas notas sobre o que de importante Erik Kastner, o autor, aprendeu na RailsConf e RailsDay.

Porque é que um programador .Net deve aprender Ruby on Rails

O texto e os comentários são importantes para ficarmos com uma melhor visão do assunto.

Guia de Suporte de CSS no Email

Um artrigo interessante para quem deseja saber o que e como usar CSS nas suas mensagens de correio electrónico:

Guia de Suporte de CSS no Email

Neste artigo David Greiner apresenta resultados de uma investigação sobre o comportamento dos clientes de correio electrónico baseados em PC/MAC ou na Web.

Blogged with Flock

18 agosto, 2006

Não aplicação de Web Standards

    Tecnologias e Internet

  • novabase doctype ausente, nestes casos o validador do w3c tenta usar HTML 4.01 Transitional. O validador aponta 111 erros (não esquecer que o primeiro é a ausência de declaração de tipo), seguem-se os erros pelo uso de atributos específicos do IE, erros por uso de atributos há algum tempo substituídos em determinados elementos como por exemplo de height, background em elementos table. Ausência de atributo type em elemento script, valor de atributo que não faz parte do conjunto de valores admissíveis para esse atributo género absbottom em align. Não inclusam do atributo alt em imagens ((> 30) embora tenha que admitir que são espaçadores) na generalidade dos casos. Ignorância de como usar o atributo nowrap, etc, etc, etc. A página seria considerada noutras paragens como sendo feita de forma amadora.
  • compta doctype ausente, no caso de terem escolhido doctype HTML 4.01 Frameset teriamos 4 erros, o fecho do marcador html a mais, uso de atributos que já não são considerados válidos (substituídos por outros meios, deprecated).
  • pararede HTML 4.01 loose, 16 erros, 15 são falta de atributos alt e 1 uso de absmiddle como atributo de align. O tempo necessário para corrigir isto seria de quantos segundos? Embora a solução mais correcta tecnicamente esteja numa forma de construir a página diferente.
  • reditus doctype ausente, o validador não consegue começar o seu trabalho pois alguns bytes não são caracteres UTF-8, se indicarmos um conjunto de caracteres apropriado o sistema reporta 26 erros. A maior parte são ausência do atributo alt em imagens, ausência de atributo type obrigatório num elemento script e uso de atributos em body que foram substituídos por outros meios (deprecated) e uso do atributo hight em table. Tempo para corrigir isto algus minutos?
  • impresa HTML 4.01 Frameset. Parece que não sabem que num documento frameset não há elemento body. Restantes erros ver compta
  • PT Multimedia doctype ausente, 108 erros, uso de dois elementos body. Uso de atributos já substituídos.Fecho de marcadores não abertos, uso de elementos onde já não é possível usá-los (elementos que pertencem à head a surgirem dentro do body. Alguns erros introduzidos por tornar certas linhas comentários. Ignorância quanto à forma de codificar de forma válida um ficheiro flash.
  • SonaeCom HTML 4.01 Transitional, 15 erros, mais um atributo que não é standard scroll no marcador de body. Um não membro de um objecto VIEWASTEXT normalmente gerado pelo VS em desenvolvimento.

Em resumo nenhuma das páginas das empresas de tecnologias e internet registadas na bolsa valida. Algumas com pouco esforço poderiam validar. Mas algumas teriam que ser repensadas (não digo em termos de conteúdos ou aspecto) em termos de código.

Uma coisa de me deixa perplexo é a falta de separação efectiva entre o que é conteúdo, aspecto e comportamento nestas páginas mas a falta de profissionalismo (dos respectivos conceptores) é manifesta.

Rails: Como Saber Que Layout Foi Usado para Reproduzir uma Página?

aceder a params[:action]

Padrões de Sítios na Web

Padrões são soluções óptimas para problemas comuns. À medida que os problemas sejam levantados à volta de uma comunidade e resolvidos, soluções comuns frequentemente emergem de forma espontânea. Eventualmente, a melhor destas destaca-se da ganga e auto identifica-se e vai-se refinando até alcançar o estatuto de Padrão de Concepção.


Christopher Alexander foi o primeiro a nomear este fenómeno em relação aos espaços vividos. Ele e os seus co-escritores introduziram o conceito de Padrões de Arquitectura para descrever características dos espaços vividos fossem eles salas, edifícios ou cidades.


Os Padrões são atómicos no sentido de que podem ser agrupados para formarem padrões mais complexos: um padrão cadeira enquadra-se num padrão sala de jantar que se enquadra num padrão casa que se enquandra num padrão cidade.


Uma ideia que destingue os Padrões de simples prescrições é que os Padrões nunca perdem o sentido do seu contexto; descrevem coisas que funcionam em conjunto e as regras que governam essas colecções.


Os padrões de software encontraram uma grande ressonância na indústria do software em particular entre os que usam Metodologias Ágeis.


Algumas pessoas tiveram aqui inspiração para criar um documento sobre Padrões de Sítio da Web.


  1. Repositórios de Padrões

  2. Artigos e Textos On-Line

  3. Livros

  4. Discussão

05 agosto, 2006

Site da Presidência da República

O novo site da Presidência da República, já de Março, é um verdadeiro salto para a modernidade em comparação com o antigo. Não percebo como foi possível durante tanto tempo haver um site tão mau para nos representar. Em relação ao novo site tenho pena que tenha vindo a degradar-se a qualidade que lhe foi atribuída pelo João Craveiro, já não valida e julgo que tal se deve a uma simples razão não incluirem nas suas práticas uma validação sistemática (dito de outra forma contínua e automática). Só um defeito/caracteristica de que não gosto e que o João não menciona: o logo no cimo de cada página não serve para regressar à página inicial (para isso há uma ligação ao lado). O defeito que ele aponta de não possível ampliar os tipos sem se destruir o arranjo da página provavelmente deve-se a alguém julgar que por haver a possibilidade de ouvir o texto ninguém sentirá a necessidade de ampliar o texto. Outro defeito é ter-se perdido as páginas traduzidas em inglês que ainda eram (se possível) ainda mais pobres (mesmo assim eram (tão) interessantes (quanto o resto)).

Quando as margens se tocam

O colapso das margens é um conceito simples mas que pode gerar alguns problemas quando não estamos atentos. Os maiores problemas surgem quando aparece espaço vertical em branco adicional que parece não querer desaparecer ou o outro problema parace ser a incapacidade de criar espaço em branco na vertical usando o atributo margens (margin) de alguma caixa (de algum elemento com comportamento de caixa).

O que sucede é que quando duas margens verticais estão uma em contacto com a outra, em vez de se adicionarem uma à outra, a margem maior toma a precedência e a outra "colapsa" no nada.

Se der uma margem de 20px a dois parágrafos consecutivos (como elementos de um documento html) a margem do topo do parágrafo de baixo, visto tocar na margem do parágrafo de cima, cai e assim o espaço entre os dois parágrafos mantém-se nos 20px em vez de somar 40px.

A maior parte das pessoas pensar que o colapso de margens sucede quando um elemento do nível de bloco (um elemento com comportamento de caixa) se sucede a outro. Contudo as margens entram em colapso quando uma margem entra em contacto com uma margem adjacente. Isto significa que as margens podem entrar em colapso quando um elemento está contido noutro.

Isto sucede por exemplo quando se coloca um parágrafo (p) dentro de uma divisão (div), ambos com margens verticais. Se a divisão tiver uma borda (border) as margens não se tocam e somam-se, caso contrário juntam-se uma à outra tomando a precedência a mais larga.

Como evitar colapsos

Para evitar colapsos é vulgar adicionar-se uma borda de 1px de forma a que as margens já não se toquem e portanto já não colapsem.

Outro método é mudar a propriedade da posição (position) do elemento. As especificações CSS2(en) [pt] explicam que margens de caixas posicionais absolutamente e relativamente não colapsam. Outra possibilidade ainda é fazer flutuar uma das caixas. Nem sempre é apropriado alterar as propriedades de posição de um elemento, mas em certas circunstâncias quando estiver a ter problemas de colapso de margens poderá ser uma opção.

Há ainda a possibilidade da margem de topo de um elemento estar em contacto com a margem de fundo do mesmo elemento por exemplo um parágrafo vazio e nesse caso poderá suceder que o espaço ocupado pelo parágrafo desapareça de todo.

Pode ainda haver a situação mais complicada de ter elementos flutuados, seguidos de elementos limpos com uma margem de topo pouco mais alta do que o elemento flutuado e ter que se perceber muito bem o que é que se deve à flutuação de um elemento e o que se deve à pequena diferença de alturas entre o primeiro elemento e a margem de topo do segundo elemento (esperando que nenhum esteja completamente vazio).

Colapso de margens

Nesta especificação, a expressão colapso de margens significa que margens adjacentes (sem esquadria ou borda a separá-las) de duas ou mais caixas (que podem estar uma a seguir à outra ou aninhadas) combinam-se para formarem uma só margem.

Em CSS2, as margens horizontais nunca colapsam.

As margens verticais podem colapsar entre certas caixas:

  • As margens verticais adjacentes de duas ou mais caixas bloco em fluxo normal colapsam. A largura da margem resultante é a maior das larguras das margens adjacentes. No caso de margens negativas, o máximo absoluto de margens adjacentes negativas é deduzido do máximo de margens adjacentes positivo. Se não houver margens positivas, a margem negativa máxima absoluta é deduzida de zero.
  • Margens verticais entre uma caixa flutuada e qualquer outra caixa não colapsa.
  • Margens de caixas posicionadas uma absolutamente outra relativamente não colapsam.

Por favor consultar os exemplos de margens, esquadrias e bordas para uma ilustração de margens colapsadas.

RadRails 0.7

RadRails e respectivos suplementos

O RadRails é um IDE para desenvolvimento de aplicações usando Ruby on Rails (RoR). Há cerca de 2 semanas foi actualizado para a versão 0.7. Esta versão trás como características novas capacidades de integração contínua, integração com tarefas rake, modelos de código RHTML, além de correção de erros (e provavelmente alguns novos). Já se sabe que o quem o desenvolve deseja minimizar as diferenças entre um IDE e o ambiente de caracteres, para minimizar essas diferenças podemos iniciar ou parar o servidor web, executar os nossos geradores, aceder à base de dados, instalar a maior parte dos suplementos de rails e executar as tarefas de rake

Rails Plugin Directory é um repositório de suplementos (plugin) para aplicações web desenvolvidas em Ruby on Rails (RoR).

Não se esqueça que os suplementos rails podem ser usados fora do IDE.

20 julho, 2006

Edge e-mag redesenhado

O número de Julho de 2006 do magazine electrónico edge da Adobe foi redesenhado, passando a ser feito aplicando web standards, xhtml e CSS.

technorati tags:, , ,

Blogged with Flock

16 julho, 2006

Quirky serifs aside, Georgia fonts win on Web - Style - International Herald Tribune

Que coisa estranha um jornal generalista a falar de um aspecto tão obscuro como é a tipografia, Georgia ganha na Web

Se quizer ler o artigo completo no Herald Tribune iht.com/articles/2006/0...

14 julho, 2006

Câmara Municipal de Torres Vedras

Uma das coisas que me assusta é continuar-se a assistir à recriação de sítios de diversos organismos públicos que praticamente não servem para nada para além de repositórios de informação.

Veja-se por exemplo que a Câmara Municipal de Torres Vedras acaba de lançar o seu novo sítio na Web em www.cm-tvedras.pt .

O site foi concebido com técnicas standard (uma raridade na web portuguesa pelo que devo dar os parabéns à Slingshot), mas não me interessa só a roupagem (mesmo que só a interior ou seja o código) mas o conteúdo. E este parece-me parco. Será assim tão interessante saber a identificação dos vereadores ou poder efectuar interacção com os serviços do munícipio. Porque é que quando a câmara decidiu partir para um redesenhar da sua presença na net não observou o que de melhor se pratica cá e lá fora e tentou abrir o leque de serviços que se podem usar. Francamente parece-me um desperdício de recursos.

Para mim este sítio tem ainda o defeito de ter um número excessivo de ligações na sua página inícial: 74.

No entanto volto a dizer bom trabalho para quem criou o código, trabalho abaixo do que espero hoje para quem concebeu a arquitectura de informação do sítio por ser excessivamente pobre.

Por exemplo na secção «VISITAR» não há nada noutra língua que não o Português algo que não consigo comentar sem umas fortes palavras impublicáveis...

07 julho, 2006

Ranking de Serviços Publicos - Portais do Cidadão

No sítio da Umic diz-se que:
Subidas de Portugal no Ranking de Disponibilização Completa Online de Serviços Públicos, de Out. 2004 para Abr. 2006: • De 15º para 11º nos 28 países da UE25 + Noruega, Islândia e Suiça, • De 13º para 10º na UE25, • De 11º para 7º na UE15...
Eu até dou de barato que há mais serviços disponíveis em linha por cá o que eu desconfio é da respectiva qualidade. Só encontrei um portal do cidadão declaradamente pior que o nosso o austriaco. Para poder aferir por si eis uma tabela de resumo da situação.
País endereço, não liga erros html obs.
Portugal www.portaldocidadão.pt HTML 4.01 c/ 74 erros trata da acessibilidade como se estivesse em 1998
Espanha www.060.es XHTML 1.0 Transitional (valida) tenta a conformidade com WCAG WAI-AA
Itália www.italia.gov.it HTML 4.01, WAI-A, CSS
Reino Unido direct.gov.uk HTML 4.01 (valida) tenta a conformidade com WCAG WAI-AA
Áustria www.buergerportal.at s/ declaração doctype está ao nível amador, muito pior que o nosso
Alemanha www.buergerportal.de XHTML c/ 2 erros xml:lang e lang com valores nulos (deviam ser de), WAI-AA, CSS, secção 508 a conformidade com WAI-AA não é completamente conseguida
França www.internet.gouv.fr XHTML 1.0 Transitional ao nível do alemão embora não ande para aí a pavoniar-se
Bélgica www.belgium.be HTML 4.01 com o mesmo tipo de erros que o nosso

06 julho, 2006

Estruturando formulários com listas não ordenadas por Bruno Torres ponto net

Passei a usar esta técnica quando deixei de querer que o utilizador abrisse outra aplicação para além do browser. Para que isto funcione deve enviar-se uma cópia da mensagem ao próprio autor para que este a possa arquivar.

brunotorres.net/2006/04...

rikrikrik - CSS Reset

Tenho que voltar aqui, admito que uso esta técnica mas quero estudar mais isto. rikrikrik.com/log/css-r...

RailsBestPractices in Ruby on Rails

Na sequência da minha entrada de ontem só hoje fui

à fonte e vi isto wiki.rubyonrails.com/ra...

05 julho, 2006

Boas Práticas em Rails

Boas Práticas em Rails

Tabela de Conteúdos

Desenvolvimento orientado por testes

Isto é absolutamente essencial. A Rails torna a escrita de testes unitários e testes funcionais muito simples e assim é praticamente obrigatório usar testes para validar aquilo que se irá programar. Devem ser empregues tanto testes positivos como testes negativos: primeiro verificar que a aplicação faz o que deve fazer quando são passadas as variáveis adequadas para a acção correcta e depois verificar se passando variáveis incorrectas se passa a ocorrer o comportamento preferido.

Leitura recomendada

  1. Introdução ao Desenvolvimento Orientado por Teste

Teste Unitário

Como regra geral, os testes unitários devem testar todas as validações nos modelos assim como quaisquer métodos adiccionados a esses modelos.

Por exemplo, se tiver um modelo Utilizador que valide a presença do nome e do apelido (validates_presence_of...) nos respectivos campos e que tenha um método nomecompleto que combina os dois, é provável encontrarem-se os seguintes casos de teste: test_validates_nomes e test_nomecompleto, que irá testar o modelo para se poder verificar se funciona de acordo com o previsto.

Teste Funcional

Os testes funcionais são usados para testar controladores. Como regra, deve haver, pelo menos, um caso de teste por cada acção sendo necessário empregar também aqui os testes pela positiva e pela negativa. Isto significa que se tivermos uma acção create no nosso controlador de entradas PostsController deve haver pelo menos os métodos test_create e test_bad_create nos testes funcionais que efectuam os testes pela positiva e pela negativa. Isto não significa que devam haver só dois testes por cada acção. No caso de haver casos excepcionais para além de um simples bom ou mau, um teste adequado implica cobrir também esses casos.

Leitura recomendada

Migrações

As migrações significam nunca se arrepender de destruir completamente a sua base de dados. Permitem criar esquemas de bases de dados que são agnósticas quanto aos sistema de gestão de bases de dados específico, o que significa que pode desenvolver a sua aplicação localmente com SQLite e depois distribuir a sua aplicação com MySQL sem problema. São mais limpas (e mais fáceis) de escrever do que os seus esquemas à medida e devem ser sempre que possíveis usadas.

NUNCA, NUNCA, NUNCA por nunca alterar o ficheiro schema.rb pois é uma reflexão da sua base de dados. As migrações devem ser usadas para fazer a evolução. Se não usar as migrações e em seu lugar alterar o schema.rb as coisas passaram a ficar pouco estáveis e os seus utilizadores (e clientes) ficaram deveras pouco satizfeitos.

Nota: Deve sempre executar um svn update antes de gerar uma migração de modo a não ter que efectuar prefixos em colisões.

Leitura recomendada

  1. A Alegria das Migrações
  2. Manual abreviado sobre migrações em ActiveRecord
  3. Guia superfácil sobre de migrações

SQLite

SQLite é um motor de SQL que corre num único ficheiro em vez de num servidor. É normalmente tão rápido quando o MySQL e torna-se assim uma ferramente excelente para teste e desenvolvimento. De facto com a possibilidade de executar uma base de dados directamente e completamente da memória (uma pequena base de dados excepto se tiver muita memória RAM disponível) os testes são acelerados de forma significativa. Com o aparecimento das migrações, faz todo o sentido usar o SQL para teste pois não há trabalho adicional para a instalação da sua aplicação num ambiente MySQL.

DRY - Não se repita

A principal ideia da DRY (seca) é a de que se o código se repete é extraído para um ajudante (helper) ou uma função, assim passa a ter só um lugar para ver (e alterar se for caso disso) se algo correr mal. Se encontrar código similar em vários lugares poderá querer ler atentamente esse código e extraí-lo para uma função ou um parcial.

Leitura recomendada

  1. Rails API - Reproduzir parciais
  2. Refactoring de Marting Fowler

Convenções dos nomes

Não use abreviaturas, em especial nos nomes das colunas de uma tabela. Deve ser óbvio qual o conteúdo de uma coluna (pelo menos qual o significado do nome) quando se lê o respectivo nome. além disso o sistema de erros da Rails sabe como humanizar os nomes das colunas, quando usar um nome que descreva bem o conteúdo de uma coluna será mais fácil a apresentação de erros.

Se os nomes forem demasiado compridos, pense noutra expressão (palavra ou frase) com o mesmo significado, mas que seja óbvia.

Controlo de Versões (Subversion)

Deve ser usado algum modo de controlo de versões de forma contínua. Isto permite voltar atrás de forma fácil se algo correr mal, assim como a possibilidade de nos referir-mos a código antigo se necessário. A Rails tem alguns ficheiros que não devem ser incluidos no repositório central de fontes (gosto mais da palavra originais mas estou em minoria) e assim deve consultar esta página do wiki sobre preparação da importação inicial.

Sistemas de autenticação

Já foram escritos vários módulos para autenticação para Rails, alguns são melhores que os outros.

acts_as_authenticated
Deve ser o suplemento de autenticação preferido. É facilmente instalável via script/plugin, é fácil de ampliar e pode tratar de todos os aspectos dos restantes módulos de autenticação. Além disso o código de teste é excelente o que o torna fácil de alterar
login_generator
login_generator é o gem gerador de login original desenvolvido por Tobias Luetke. A desvantagem é que se surgir um erro que danifica a palavra de passe se gravar um utilizador já existente. Não deve ser usado por esta razão. Foi substituído e ultrapassado por acts_as_authenticated
SaltedHashLoginGenerator
Foi a primeira tentativa de criar um gerador de login (sem transporte da palavra de passe a descoberto) que conseguia alterar senhas e fazer activações. Foi extraído para login_generator. É excessivo e difícil de alterar. Deve ser evitado.
login_engine
É uma extração do SaltedHashLoginGenerator e como tal tem as suas desvantagens. Além disso usa o sistema de Rails Engines que deve ser evitado pois está quase a ser descontinuado. Se necessitar mais do que de uma pequena alteração deve ser evitado.

Sobre andaimes

Os andaimes podem ser uma forma de poupar tempo ou um verdadeiro aborrecimento. Quando os usar assegure-se de que compreende exactamente o que é que o código está a fazer e porquê. Uma fez alcançado tal pode tornar-se mais fácil e rápido escrever o seu próprio código pois é frequente ter que se alterar cada uma das secções que o scaffolding nos oferece.

Leitura recomendada (geral)

  1. The Pragmatic Programmer, por Dave Thomas e Andy Hunt
  2. Refactoring por Martin Fowler
  3. Agile Web Development with Rails por Dave Thomas e David Heinemeier Hannson
  4. Ruby for Rails por David A. Black
  5. Programming Ruby por Dave Thomas, com Chad Fowler e Andy Hunt

13 junho, 2006

Uma carta aberta ao governo português

Que efeito teria uma carta aberto sobre ensino de desenvolvimento para a web se fosse enviada ao governo português (julgo que o efeito seria nulo mas qual é a opinião dos leitores?) semelhante à enviada pelos suecos?