<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gonçalo Rodrigues &#187; Programação</title>
	<atom:link href="http://www.goncalorodrigues.com/blog/category/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.goncalorodrigues.com</link>
	<description>Página pessoal e blog</description>
	<lastBuildDate>Fri, 30 Jul 2010 07:59:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Anchors Menu um plugin para o WordPress</title>
		<link>http://www.goncalorodrigues.com/blog/anchors-menu-um-plugin-para-o-wordpress/</link>
		<comments>http://www.goncalorodrigues.com/blog/anchors-menu-um-plugin-para-o-wordpress/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 19:46:34 +0000</pubDate>
		<dc:creator>Gonçalo Rodrigues</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[plugin wordpress]]></category>

		<guid isPermaLink="false">http://www.goncalorodrigues.com/?p=1046</guid>
		<description><![CDATA[Desenvolvi um simples e pequeno plugin para o WordPress que intitulei de Anchors Menu. Este plugin funciona no formato de widget e permite gerar dinamicamente um menu com links que apontam para as palavras que se encontrem entre as tags HTML que forem seleccionadas. Foi inicialmente pensado para criar ligações que apontassem para as palavras [...]]]></description>
			<content:encoded><![CDATA[<p>Desenvolvi um simples e pequeno plugin para o WordPress que intitulei de Anchors Menu. Este plugin funciona no formato de widget e permite gerar dinamicamente um menu com links que apontam para as palavras que se encontrem entre as tags HTML que forem seleccionadas.</p>
<p>Foi inicialmente pensado para criar ligações que apontassem para as palavras entre as tags de headings do HTML (h1, h2, h3&#8230;), contudo é possível utilizar este plugin para outros tipos de tags.</p>
<p>O plugin foi elaborado para dar resposta a uma necessidade imediata e por isso pode apresentar alguns aspectos menos elegantes ou optimizados, pelo que agradeço todas as eventuais correcções ou sugestões que possam fazer.</p>
<p>Podem consultar a página do plugin e efectuar o seu download no seguinte link: <a href="http://wordpress.org/extend/plugins/anchors-menu" onclick="pageTracker._trackPageview('/outgoing/wordpress.org/extend/plugins/anchors-menu?referer=');">http://wordpress.org/extend/plugins/anchors-menu</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goncalorodrigues.com/blog/anchors-menu-um-plugin-para-o-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimização de websites ao nível do front-end</title>
		<link>http://www.goncalorodrigues.com/blog/optimizacao-de-websites-ao-nivel-do-front-end/</link>
		<comments>http://www.goncalorodrigues.com/blog/optimizacao-de-websites-ao-nivel-do-front-end/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 18:33:04 +0000</pubDate>
		<dc:creator>Gonçalo Rodrigues</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[optimizações]]></category>
		<category><![CDATA[steve souders]]></category>

		<guid isPermaLink="false">http://www.goncalorodrigues.com/?p=844</guid>
		<description><![CDATA[Uma interacção eficaz entre o utilizador e um determinado website está dependente de aspectos gráficos ao nível do design e usabilidade das páginas mas também fortemente condicionada pelo facto do website conseguir responder rapidamente às acções do utilizador. É sobre este último aspecto da melhoria do tempo de resposta de aplicações de Internet que este [...]]]></description>
			<content:encoded><![CDATA[<p>Uma interacção eficaz entre o utilizador e um determinado website está dependente de aspectos gráficos ao nível do design e usabilidade das páginas mas também fortemente condicionada pelo facto do website conseguir responder rapidamente às acções do utilizador. É sobre este último aspecto da melhoria do tempo de resposta de aplicações de Internet que este artigo se debruça.</p>
<p>A maior parte das optimizações normalmente efectuadas a websites é feita nos processos de geração do documento HTML, traduzindo-se maioritariamente por ajustes e melhorias ao nível de servidores web e sistemas de gestão de bases de dados. Contudo é de realçar que as optimizações a esse nível apenas vão incidir em cerca de 20% do tempo total de resposta do documento até que este chegue ao utilizador. É pois facilmente compreensível que é de extrema importância optimizar os outros 80% do tempo de resposta, é aqui que surge o conceito de front-end optimization associado a páginas de Internet. Neste artigo estão descritas 20 boas práticas que devem ser tidas em conta de forma a efectuar-se correctamente este tipo de optimizações.</p>
<p>Esta lista não tem a pretensão de enumerar todas as boas práticas que devem ser seguidas no desenvolvimento de um <em>site</em> de Internet, pretende apenas chamar a atenção para algumas delas cabendo ao leitor deste documento ter a devida precaução quanto a outros aspectos que poderão eventualmente ser relevantes. As primeiras 14 boas práticas foram retiradas do livro do <a href="http://stevesouders.com/" onclick="pageTracker._trackPageview('/outgoing/stevesouders.com/?referer=');">Steve Souders</a> com o título de <a href="http://oreilly.com/catalog/9780596529307" onclick="pageTracker._trackPageview('/outgoing/oreilly.com/catalog/9780596529307?referer=');">High Performance Web Sites</a>.</p>
<p><span id="more-844"></span></p>
<h2>1 &#8211; Fazer menos HTTP requests</h2>
<p>Apenas entre 10% a 20% do tempo de resposta de uma página de Internet é gasto na resposta do ficheiro HTML sendo os restantes 80% a 90% gastos em HTTP requests de todos os componentes da página (imagens, scripts, folhas-de-estilo, Flash&#8230;) que se encontram referenciadas no documento HTML. Assim este é provavelmente o aspecto que caso seja correctamente optimizado irá causar maiores melhorias no desempenho de uma determinada página de Internet. A remoção de componentes da página iria proporcionar uma melhoria automática no desempenho, contudo também iria comprometer o design final da página. O ideal é manter o design desejado e ao mesmo tempo diminuir o número de HTTP requests, para isso podem-se seguir um conjunto de simples técnicas que conseguem melhorar o tempo de resposta de algumas páginas para metade ou até menos.</p>
<p>A ideia principal por detrás dessas técnicas passa por a fusão de conteúdos de forma a que um elevado número de HTTP requests possa ser transformado num número mais reduzido. Para imagens existem variadas técnicas que permitem essa união, nomeadamente: <a href="http://en.wikipedia.org/wiki/Image_map" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Image_map?referer=');">Image Maps</a> ou <a href="http://www.alistapart.com/articles/sprites" onclick="pageTracker._trackPageview('/outgoing/www.alistapart.com/articles/sprites?referer=');">CSS Sprites</a>, de seguida encontram-se dois pequenos exemplos destes mecanismos. Existe também para imagens uma técnica que permite eliminar os pedidos de HTTP dessas mesmas imagens denominado de Inline Images, ainda que este método não se encontra disponível na versão actual de alguns browsers incluindo o Internet Explorer. Relativamente a outros ficheiros que não sejam imagens o principio a aplicar deverá ser o mesmo, e sendo assim ficheiros como folhas-de-estilo ou JavaScripts devem na medida do possível serem fundidos num menor número.</p>
<h3>Image Maps</h3>
<p><strong>Image Maps &#8211; Server side &#8211; Não aconselhável</strong></p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;a href=&quot;navbar.cgi&quot;&gt;&lt;img ismap src=&quot;imagemap.gif&quot;&gt;&lt;/a&gt;</pre></div></div>

<p>Utilizador envia as coordenadas do <em>clique</em>: http://&#8230;/navbar.cgi?127,13.</p>
<p><strong>Image Maps &#8211; Client side &#8211; Recomendável</strong></p>
<p>O mecanismo de Image Map do lado do cliente é preferível essencialmente por permitir ser utilizado independentemente da localização do rato estar ou não numa determinada zona.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;img usemap=&quot;#map1&quot; border=0 src=&quot;/images/imagemap.gif&quot;&gt;
&lt;map name=&quot;map1&quot;&gt;
  &lt;area shape=&quot;rect&quot; coords=&quot;0,0,31,31&quot; href=&quot;home.html&quot; title=&quot;Home&quot;&gt;
   …
&lt;/map&gt;</pre></div></div>

<h3>CSS Sprites</h3>
<p>Atenção: Não é suportado em alguns <em>browsers</em> mais antigos como é o caso do Opera 6!</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;span style=&quot;
  background-image: url('sprites.gif');
  background-position: -260px -90px;&quot;&gt;
&lt;/span&gt;</pre></div></div>

<p></p>
<h2>2- Usar uma Content Delivery Network</h2>
<p>As <a href="http://en.wikipedia.org/wiki/Content_delivery_network" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Content_delivery_network?referer=');">Content Delivery Networks</a> conseguem fornecer um factor de proximidade bastante apetecível do utilizador final, conseguindo-se tempos de resposta melhorados. Além disso as CDN permitem servir como cópias-de-segurança, aumentar a capacidade de storage, permitir mecanismos de caching mais precisos e  absorver picos de tráfego.<br />
Maioritariamente as CDN são utilizadas para servir conteúdos estáticos, como imagens, scripts, Flash, etc&#8230; Isto acontece porque os ficheiros estáticos têm poucas dependências. Por outro lado os conteúdos dinâmicos estão dependentes de um conjunto variado de factores como ligação a base de dados, autenticação, optimizações a nível do hardware  e do Sistema Operativos entre outros aspectos.</p>
<p></p>
<h2>3 – Adicionar cabeçalhos de expiração</h2>
<p>A promoção da utilização de mecanismos de cache para conteúdos que mudam pouco frequentemente pode trazer significativas melhorias. Para o conseguir pode-se fazer uso dos mecanismos de <a href="http://httpd.apache.org/docs/2.0/mod/mod_expires.html" onclick="pageTracker._trackPageview('/outgoing/httpd.apache.org/docs/2.0/mod/mod_expires.html?referer=');">header expires e max-age</a>. Em conteúdos que mudam mais frequentemente também se podem utilizar estes mecanismos mas com o cuidado de usar tempos de cache mais reduzidos ou então mudar o nome do ficheiro a ser alterado (por exemplo recorrendo à numeração numérica de versões do ficheiro) . Como é compreensível estes mecanismos só trazem melhorias quando a cache do utilizador se encontra preenchida pelo que da primeira vez que ele visita a página as melhorias são inexistentes.</p>
<p></p>
<h2>4 – Compressão G-Zip</h2>
<p>Reduzir o tempo da resposta HTTP pode ser alcançado reduzindo o tamanho dessa mesma resposta, uma vez que assim o tempo de transferência diminui visto que menos pacotes de informação têm de ser transferidos para o utilizador.<br />
Como a maior parte dos browsers suportam esta forma de compressão de resposta HTTP é aconselhável instalar os módulos nos servidores web e activar este mecanismo em todos os tipos de ficheiros que se encontram no servidor, não esquecendo os scripts e folhas-de-estilo.</p>
<p>Num servidor Apache 1.3 deve-se utilizar o <a href="http://sourceforge.net/projects/mod-gzip/" onclick="pageTracker._trackPageview('/outgoing/sourceforge.net/projects/mod-gzip/?referer=');">mod_gzip</a>, já num servidor Apache 2.x deve ser usado o <a href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html" onclick="pageTracker._trackPageview('/outgoing/httpd.apache.org/docs/2.0/mod/mod_deflate.html?referer=');">mod_deflate</a>.  </p>
<p></p>
<h2>5 – Colocar as folhas-de-estilo no topo</h2>
<p>Ao colocar as folhas-de-estilo no topo do documento HTML permite com que a página seja reenderizada de forma progressiva. Assim o utilizador não fica perante uma simples página em branco durante um elevado período de tempo, o que caso acontecesse poderia fazer com que o utilizador ficasse impaciente e saísse da página. Com a folha-de-estilo no topo o browser consegue ler o estilo da página inicialmente e ir mostrando correctamente os vários componentes à medida que os vai recebendo. A colocação da folha-de-estilo no fundo impede o browser de mostrar os conteúdos sem que a folha-de-estilo tenha sido completamente descarregada.</p>
<p></p>
<h2>6 – Colocar os JavaScripts externos no fundo</h2>
<p>Relativamente aos JavaScripts a regra é a oposta à das folhas-de-estilo, devendo neste caso serem colocados no fundo do documento HTML. Tal regra é recomendada porque o download destes scripts bloqueia o paralelismo que se processa ao nível do download dos outros vários componentes da página. Ficando o mecanismo de reenderização progressivo da página fortemente prejudicada quando a ligação para estes scripts se encontra no topo da página.   </p>
<p></p>
<h2>7 – Evitar as expressions do CSS</h2>
<p>Devem ser evitadas ao máximo expressions do CSS uma vez que estas expressões são analisadas não apenas quando a página é carregada mas também com bastante frequência noutras situações, inclusivamente quando se faz scroll na página ou se move o rato. Esta análise constante destas expressões causa um overhead que provoca uma degradação do desempenho na visualização das páginas de Internet.</p>
<p>Assim deve-se fazer um esforço para evitar expressões deste tipo:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> expression<span style="color: #00AA00;">&#40;</span> 
  document<span style="color: #6666ff;">.body</span><span style="color: #6666ff;">.clientWidth</span> &lt; <span style="color: #cc66cc;">600</span> ? 
  “<span style="color: #933;">600px</span>” <span style="color: #00AA00;">:</span> “<span style="color: #993333;">auto</span>” <span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span></pre></div></div>

<p></p>
<h2>8 – Utilizar o Javascript e o CSS em ficheiros externos</h2>
<p>Geralmente sempre que possível deverá optar-se pela utilização de ficheiros Javascript e CSS externos por forma a promover a utilização da memoria cache, uma vez que normalmente estes ficheiros são utilizados em diversas páginas ao longo do mesmo <em>site</em> de Internet. Apesar de se estar a aumentar o número de pedidos HTTP (a ir contra a regra número 1 da redução dos pedidos HTTP) normalmente a utilização de ficheiros externos nesta situação é compensatória.</p>
<p>Deve ser sempre usada a directiva LINK em vez de ser usada a directiva @import, para efectuar a importação do ficheiro CSS.</p>
<p></p>
<h2>9 – Reduzir os DNS lookups</h2>
<p>A Internet está fortemente dependente do conceito de DNS lookups onde o nome de um determinado <em>site</em> é convertido para uma sequência numérica, designada por IP, que define qual a máquina onde está alojada a página. Esta conversão acarreta um custo temporal ainda considerável, tipicamente entre os 20 e os 120 milissegundos. Sabendo que o browser não consegue descarregar nada sem que o DNS lookup tenha sido efectuado facilmente se percebe que por cada DNS lookup se está a impor um travão à reenderização progressiva da página. Assim e na medida em que for possível deve-se procurar reduzir ao máximo o número de DNS lookups.</p>
<p></p>
<h2>10 – Minificar o Javascript</h2>
<p>A minificação é um conceito que traduz a tentativa de redução do tamanho dos ficheiros através da remoção de espaços e outros caracteres desnecessários, permitindo assim a optimização do seu tempo de carregamento. Neste caso em particular permite uma melhoria do tempo de resposta uma vez que o tamanho do ficheiro Javascript se torna mais pequeno. As melhorias do tempo de resposta são tipicamente entre 15% e 30% quando se utiliza este método.</p>
<p>Um compressor gratuito e <em>on-line</em>: <a href="http://www.minifyjavascript.com" onclick="pageTracker._trackPageview('/outgoing/www.minifyjavascript.com?referer=');">http://www.minifyjavascript.com</a>. </p>
<p></p>
<h2>11 – Evitar Reendereçamento</h2>
<p>Um reendereçamento é usado para encaminhar um utilizador de um determinado URL para outro URL distinto. Existem variadíssimas situações em que os reendereçamentos são utilizados, nomeadamente website redesign, controlo de fluxo de tráfego ou tradução em URLS mais facilmente memorizáveis.<br />
Acontece que muitas vezes o reendereçamento é utilizado para carregar alguns componentes dentro de um documento HTML. Facilmente se percebe que até que o reendereçamento esteja completo nada relativo a esse componente poderá ser descarregado. Esta situação é muito utilizada em mecanismos publicitários dentro de páginas de Internet.<br />
Assim devem ser usados os mecanismos de reendereçamento com especial cuidado e devem ser evitados ao máximo.</p>
<p></p>
<h2>12 – Remover scripts duplicados</h2>
<p>Existem muitas situações, por estranho que possa parecer, onde na mesma página é carregado o mesmo script por mais do que uma vez. Isto acontece tipicamente porque os websites são construídos por grandes e diferentes equipas onde os mecanismos de sincronização entre elas por vezes não funcionam da melhor forma.<br />
Esta situação acarreta pedidos HTTP desnecessários para o caso do Internet Explorer se os scripts não estiverem em cache. Assim como execução de Javascript desnecessária e redundante em todos o browsers actuais. É pois perceptível que esta situação causa um overhead desnecessário.</p>
<p></p>
<h2>13 – Configurar Entity tags (ETags)</h2>
<p>Como já foi expresso a redução do número de pedidos de HTTP é o factor que melhor permite acelerar a experiência de utilização para o utilizador. Ao maximizar a capacidade do browser para colocar em cache componentes está-se automaticamente a reduzir o número de pedidos de HTTP. A maximização dessa capacidade é uma das características das ETags uma vez que permite validar se um componente em cache é válido ou não.<br />
Ainda assim este mecanismo deve ser utilizado com cuidados redobrados uma vez que não funciona caso exista alteração do servidor a utilizar. Alem disso a não utilização deste mecanismo permite obter cabeçalhos de resposta HTTP mais pequenos.<br />
Em situações convencionais é aconselhável desligar este mecanismo. No Apache este sistema pode ser desligado adicionando <em>FileETag none</em> ao ficheiro de configuração do Apache. Para desligar no IIS deve consultar o seguinte <a href="http://support.microsoft.com/kb/922703/" onclick="pageTracker._trackPageview('/outgoing/support.microsoft.com/kb/922703/?referer=');">link</a>.</p>
<p></p>
<h2>14 – Permitir a permanência em cache do Ajax</h2>
<p>Com o surgimento do conceito de Web 2.0 os websites para além de ganharem uma dimensão mais social também sofreram grandes alterações ao nível dos interfaces e da agregação de informação através de diferentes serviços web. De facto as páginas de Internet tornaram-se mais em aplicações com os conceitos de input e output bem definidos. O DHTML e o Ajax vieram facilitar a implementação desse novo paradigma.<br />
Apesar do Ajax ser uma tecnologia que permite que os pedidos sejam feitos num formato assíncrono, o utilizador pode acabar na mesma por ficar à espera da resposta. É verdade que graças ao Ajax os utilizadores não são forçados a efectuar um reload à página e que o interface continua a responder mesmo quando o utilizador está à espera. Ainda assim o utilizador pode (e continua muitas vezes) ter de ficar à espera que os resultados sejam mostrados antes de tomar qualquer nova acção. É importante esclarecer que um evento ser assíncrono é diferente de um evento ser instantâneo.<br />
Basicamente para melhorar o desempenho devem-se permitir entradas na cache do utilizador para os pedidos activos do Ajax, pois são estes os principais responsáveis por causar o maior impacto na experiência do utilizador. Outras das regras já apresentadas anteriormente também podem ser aplicadas ao pedidos do Ajax, entre elas estão a compressão GZip, a redução dos DNS lookups ou a minificação dos Javascripts.</p>
<p></p>
<h2>Bónus &#8211; 15 – Promover download ficheiros Javascript em paralelo</h2>
<p><i>Nota: Este mecanismo de paralelismo deve ser usado com precaução, uma vez que se a página a ser carregada necessite de código de um dos ficheiros que seja carregado paralelamente e se esse ficheiro ainda não tiver sido totalmente descarregado irão ocorrer problemas.</i></p>
<p>É possível descarregar ficheiros Javascript em paralelo, tirando partido da cada vez mais vulgar banda larga e da sua tipicamente elevada velocidade de acesso à Internet. Seguem-se dois pequenos excertos de código HTML que mostra como o fazer.</p>
<p><strong>Sem paralelismo:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span>...<span style="color: #009900;">&#41;</span>
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;Script1.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;Script2.js&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #009900;">&#40;</span>...<span style="color: #009900;">&#41;</span></pre></div></div>

<p><strong>Com paralelismo:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">(...)
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
  document.<span style="color: #660066;">writeln</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&lt;script type='text/javascript' src='Script1.js'&gt;&lt;&quot;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;/script&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  document.<span style="color: #660066;">writeln</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&lt;script type='text/javascript' src='Script2.js'&gt;&lt;&quot;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;/script&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
(...)</pre></div></div>

<h2>Bónus &#8211; 16 – Utilizar favicon.ico pequeno e armazenável em cache</h2>
<p>O favicon.ico é uma pequena imagem que tipicamente é apresentada na barra onde se encontra o endereço do <em>site</em> em que o utilizador se encontra. Mesmo que opte por não utilizar favicon.ico no desenvolvimento da sua página o browser vai sempre realizar um request à sua procura. Caso o icon não esteja presente o resultado devolvido pelo servidor irá ser um 404 Not Found e não aparecerá nenhum icon ao utilizador.<br />
Como o custo associado ao request do icon não pode ser evitado é recomendável que faça proveito desta oportunidade e coloque um icon com um tamanho reduzido de forma a reforçar a identidade da sua página. Tipicamente o tamanho do icon não deverá ultrapassar 1kbyte por forma a não prejudicar o desempenho. É ainda possível definir o parâmetro expires com um valor elevado, por exemplo na ordem dos 4 meses, de forma a esse icon permanecer na cache dos utilizadores. </p>
<p></p>
<h2>Bónus &#8211; 17 – Não redimensionar imagens em HTML</h2>
<p>Ao diminuir o tamanho de imagens recorrendo a código em HTML está-se a exigir o download de um ficheiro de maior tamanho do que aquele que será efectivamente visualizado. Como é facilmente perceptível esta situação acarreta um overhead desnecessário, sendo que as reduções de tamanho das imagens devem sempre ser realizadas no próprio ficheiro da imagem.</p>
<p></p>
<h2>Bónus &#8211; 18 – Utilizar o formato de ficheiro de imagens correcto</h2>
<p>Existem diversos formatos com que as imagens podem ser guardados, uma escolha adequada desse mesmo formato pode fazer com que essa imagem se torne mais leve, ocupando menos espaço, sem que exista perda perceptível da sua qualidade para o utilizador.</p>
<p></p>
<h2>Bónus &#8211; 19 – Declarar sempre as dimensões das imagens</h2>
<p>Deve-se sempre declarar a altura e o comprimento dos diferentes componentes como imagens ou vídeos uma vez que isso evita que o browser tenha que “adivinhar” o tamanho desses objectos fazendo com que o carregamento da página demore mais. Além disso assim o browser ao reservar automaticamente o respectivo espaço para esses componentes faz com que o carregamento da página seja muito mais consistente.</p>
<p></p>
<h2>Bónus &#8211; 20 – Codificar as folhas-de-estilo mais pequenas possíveis</h2>
<p>É possível codificar as folhas-de-estilo recorrendo a código mais sucinto sem que isso traga alterações ao resultado final. Deixo alguns exemplos.</p>
<p><strong>Exemplo 1:</strong></p>
<p>O código:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#div_xpto</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">padding-top</span><span style="color: #00AA00;">:</span><span style="color: #933;">15px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">padding-bottom</span><span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">padding-left</span><span style="color: #00AA00;">:</span><span style="color: #933;">13px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">padding-right</span><span style="color: #00AA00;">:</span><span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>produz exactamente o mesmo resultado do que:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#div_xpto</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">15px</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">10px</span> <span style="color: #933;">13px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div>

<p><strong>Exemplo 2:</strong></p>
<p>O código:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">div <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">background-image</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;fundo.jpg&quot;</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#ffffff</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background-repeat</span><span style="color: #3333ff;">:repeat-</span>x<span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background-position</span><span style="color: #3333ff;">:<span style="color: #000000; font-weight: bold;">top</span> </span>center<span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>produz exactamente o mesmo resultado do que:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">div <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;fundo.jpg&quot;</span><span style="color: #00AA00;">&#41;</span> <span style="color: #cc00cc;">#fff</span> <span style="color: #000000; font-weight: bold;">top</span> <span style="color: #993333;">center</span> <span style="color: #993333;">repeat-x</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Também é recomendável comprimir o código CSS, tal poderá ser feito neste compressor gratuito e <em>on-line</em>: <a href="http://www.cssdrive.com/index.php/main/csscompressor" onclick="pageTracker._trackPageview('/outgoing/www.cssdrive.com/index.php/main/csscompressor?referer=');">http://www.cssdrive.com/index.php/main/csscompressor</a>. </p>
<p></p>
<p>Para um estudo mais aprofundado sobre todo este tema recomendo vivamente a leitura do <a href="http://oreilly.com/catalog/9780596529307" onclick="pageTracker._trackPageview('/outgoing/oreilly.com/catalog/9780596529307?referer=');">livro</a> onde fui buscar inspiração para este artigo. Como referi inicialmente estas são apenas algumas das boas práticas que devem ser seguidas para optimização de websites ao nível do seu front-end, se tiverem mais algumas partilhem comentando este artigo. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.goncalorodrigues.com/blog/optimizacao-de-websites-ao-nivel-do-front-end/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Erro em função recursiva</title>
		<link>http://www.goncalorodrigues.com/blog/erro-em-funcao-recursiva/</link>
		<comments>http://www.goncalorodrigues.com/blog/erro-em-funcao-recursiva/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 20:46:57 +0000</pubDate>
		<dc:creator>Gonçalo Rodrigues</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[humor]]></category>

		<guid isPermaLink="false">http://www.goncalorodrigues.com/?p=710</guid>
		<description><![CDATA[Imagem da autoria de Žiga Aljaž. Ao ver esta imagem recordei as aulas de programação onde os meus Professores utilizavam sempre as Matrioshkas para ilustrar o mecanismo de programação recursiva. Existem dois erros que frequentemente são cometidos e que acontecem por não se perceber bem este mecanismo de programação. Por um lado a incorrecta definição [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-713" src="http://www.goncalorodrigues.com/wp-content/uploads/2009/09/materjoshka-aljaz.jpg" alt="materjoshka-aljaz" width="500" height="439" /></p>
<p><span style="font-size: small;">Imagem da autoria de <a href="http://www.aljaz.org" onclick="pageTracker._trackPageview('/outgoing/www.aljaz.org?referer=');">Žiga Aljaž</a>.</span></p>
<p>Ao ver esta imagem recordei as aulas de programação onde os meus Professores utilizavam sempre as <a href="http://pt.wikipedia.org/wiki/Matrioshka" onclick="pageTracker._trackPageview('/outgoing/pt.wikipedia.org/wiki/Matrioshka?referer=');">Matrioshkas</a> para ilustrar o mecanismo de programação recursiva.</p>
<p>Existem dois erros que frequentemente são cometidos e que acontecem por não se perceber bem este mecanismo de programação. Por um lado a incorrecta definição do ponto-de-paragem, neste ponto o problema tem de ser resolvido sem recurso à recursividade sendo muitas vezes algo semelhante a um limite superior ou inferior da regra geral. O outro erro comum é o facto da regra geral não estar a caminhar correctamente na direcção do ponto-de-paragem, sendo necessário que através da invocação recursiva se esteja cada vez mais a convergir para o ponto-de-paragem. Se não se cometerem estes erros e caso não se subestime a &#8220;força&#8221;* a programação recursiva pode ser uma ferramenta bastante útil.</p>
<p>* <em>Darth Vader: Don&#8217;t underestimate the Force.</em></p>
<p><br class="spacer_" /></p>
<p><em>Mais informações sobre este tema:</em></p>
<ul>
<li><a href="http://pt.wikipedia.org/wiki/Recursividade_%28ci%C3%AAncia_da_computa%C3%A7%C3%A3o%29" onclick="pageTracker._trackPageview('/outgoing/pt.wikipedia.org/wiki/Recursividade_28ci_C3_AAncia_da_computa_C3_A7_C3_A3o_29?referer=');">Recursividade (ciência da computação) (Wikipédia)</a></li>
<li><a href="http://www.ime.usp.br/~pf/algoritmos/aulas/recu.html" onclick="pageTracker._trackPageview('/outgoing/www.ime.usp.br/_pf/algoritmos/aulas/recu.html?referer=');">Paulo Feofiloff &#8211; Projeto de Algoritmos: Recursão</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.goncalorodrigues.com/blog/erro-em-funcao-recursiva/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
