<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Tech Attack</title>
	
	<link>http://www.techattack.com.br</link>
	<description>desenvolvimento de software, infraestrutura em TI e internet</description>
	<lastBuildDate>Tue, 30 Jun 2009 07:07:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/TechAttack" /><feedburner:info uri="techattack" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>TechAttack</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Cache básico com variáveis estáticas</title>
		<link>http://feedproxy.google.com/~r/TechAttack/~3/RML4P6EnpEM/</link>
		<comments>http://www.techattack.com.br/artigos/cache-basico-com-variaveis-estaticas/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 03:09:27 +0000</pubDate>
		<dc:creator>Jan Seidl</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[otimizacao]]></category>
		<category><![CDATA[static]]></category>

		<guid isPermaLink="false">http://www.techattack.com.br/?p=71</guid>
		<description><![CDATA[Quando uma função é chamada mais de N vezes (para os neuróticos, mais de 1), costumamos empregar técnicas de caching (cacheamento de informações) para evitar que a lógica seja recalculada para retornar um valor já previamente calculado.
Na área da computação, cache é um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário [...]]]></description>
			<content:encoded><![CDATA[<p>Quando uma função é chamada mais de N vezes (para os neuróticos, mais de 1), costumamos empregar técnicas de caching (cacheamento de informações) para evitar que a lógica seja recalculada para retornar um valor já previamente calculado.</p>
<blockquote><p>Na área da computação, cache é um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário entre um operador de um processo e o dispositivo de armazenamento ao qual esse operador acede. A vantagem principal na utilização de uma cache consiste em evitar o acesso ao dispositivo de armazenamento &#8211; que pode ser demorado -, armazenando os dados em meios de acesso mais rápidos</p></blockquote>
<p>Um dos níveis possíveis de cacheamento é através de variáveis locais e é recomendado para funções chamadas mais de N vezes <em>na mesma execução</em> e pode resultar em um ganho de performance absurdo tanto no código quanto no banco de dados atrás da operação.<br />
<span id="more-71"></span><br />
Digamos que temos a seguinte função abaixo representada em PHP:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> loadAllData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">/* Realiza query no banco */</span>
    <span style="color: #666666; font-style: italic;">/* Processa informação */</span>
    <span style="color: #666666; font-style: italic;">/* Calcula valores */</span>
    <span style="color: #666666; font-style: italic;">/* Processa valor em outra função */</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* retorna o valor */</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end :: function :: loadAllData</span></pre></td></tr></table></div>

<h2>Implementando o cache com o uso de variáveis estáticas</h2>
<p>As variáveis estáticas (do tipo <code>static</code>) mantém seu valor único dentre as instâncias da função ao longo da aplicação e estão implementadas em praticamente todas as linguagens de programação.</p>
<p>Veja abaixo a mesma função <acronym title="Pre-Hypertext Processing">PHP</acronym> com o cache em variáveis estáticas:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> loadAllData<span style="color: #009900;">&#40;</span><span style="color: #000088;">$reset</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    static <span style="color: #000088;">$cache</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$reset</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">/* Realiza query no banco */</span>
    <span style="color: #666666; font-style: italic;">/* Processa informação */</span>
    <span style="color: #666666; font-style: italic;">/* Calcula valores */</span>
    <span style="color: #666666; font-style: italic;">/* Processa valor em outra função */</span>
        <span style="color: #000088;">$cache</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* Atualiza o cache */</span>
    <span style="color: #b1b100;">else</span><span style="color: #339933;">:</span>
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$cache</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* Lê direto do cache */</span>
    <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* retorna o valor */</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end :: function :: loadAllData</span></pre></td></tr></table></div>

<p>O código acima verifica se a nossa variável <code>$cache</code> está definida e lê o valor diretamente dela caso verdadeiro. Caso contrário, roda a lógica e depois associa o valor computado à variável <code>$cache</code>.</p>
<p><em>NOTA: O parâmetro <code>$reset</code> foi adicionado para forçar que o valor seja atualizado.</em></p>
<h2>Implementando o cache com variáveis estáticas em funções com parâmetros</h2>
<p>Para isto, basta usarmos a variável que vai receber o cache como array associativo e então puxar a chave correspondente. Esta chave pode ser qualquer string baseada nos parâmetros informados para haver diferenciação / relação entre a chave e o que vai ser obtido nela. É imperativo que a relação com os parâmetros seja facilmente parseada.</p>
<p>Implementação em <acronym title="Pre-Hypertext Processing">PHP</acronym></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> loadAllData<span style="color: #009900;">&#40;</span><span style="color: #000088;">$data_id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$time_start</span><span style="color: #339933;">,</span> <span style="color: #000088;">$reset</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    static <span style="color: #000088;">$cache</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$cacheKey</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$data_id}</span>_<span style="color: #006699; font-weight: bold;">{$time_start}</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* Chave que será utilizada para diferenciar as entradas no cache */</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$cacheKey</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$reset</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">/* Realiza query no banco */</span>
    <span style="color: #666666; font-style: italic;">/* Processa informação */</span>
    <span style="color: #666666; font-style: italic;">/* Calcula valores */</span>
    <span style="color: #666666; font-style: italic;">/* Processa valor em outra função */</span>
        <span style="color: #000088;">$cache</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$cacheKey</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* Atualiza o cache */</span>
    <span style="color: #b1b100;">else</span><span style="color: #339933;">:</span>
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$cache</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$cacheKey</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* Lê direto do cache */</span>
    <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* retorna o valor */</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end :: function :: loadAllData</span></pre></td></tr></table></div>

<h2>Implementando outros níveis de cache</h2>
<p>Pode-se aninhar este cache com variáveis estáticas a outros caches como <em><a href="http://www.danga.com/memcached/">memcached</a></em>.</p>
<p>Implementação de cache aninhado em <acronym title="Pre-Hypertext Processing">PHP</acronym></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$m</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Memcached<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$m</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addServer</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">11211</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> loadAllData<span style="color: #009900;">&#40;</span><span style="color: #000088;">$data_id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$time_start</span><span style="color: #339933;">,</span> <span style="color: #000088;">$reset</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    static <span style="color: #000088;">$cache</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$cacheKey</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$data_id}</span>_<span style="color: #006699; font-weight: bold;">{$time_start}</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* Chave que será utilizada para diferenciar as entradas no cache */</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$cacheKey</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$reset</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$m</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'loadAllData_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$cacheKey</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">/* Realiza query no banco */</span>
    <span style="color: #666666; font-style: italic;">/* Processa informação */</span>
    <span style="color: #666666; font-style: italic;">/* Calcula valores */</span>
    <span style="color: #666666; font-style: italic;">/* Processa valor em outra função */</span>
        <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$cache</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$cacheKey</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* Atualiza o cache */</span>
    <span style="color: #b1b100;">else</span><span style="color: #339933;">:</span>
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$cache</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$cacheKey</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* Lê direto do cache */</span>
    <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* retorna o valor */</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// end :: function :: loadAllData</span></pre></td></tr></table></div>

<p>E você, otimiza como?</p><img src="http://feeds.feedburner.com/~r/TechAttack/~4/RML4P6EnpEM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.techattack.com.br/artigos/cache-basico-com-variaveis-estaticas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.techattack.com.br/artigos/cache-basico-com-variaveis-estaticas/</feedburner:origLink></item>
		<item>
		<title>CakePHP: Evitando hardcode de URLs no código</title>
		<link>http://feedproxy.google.com/~r/TechAttack/~3/wMzBj6DQM58/</link>
		<comments>http://www.techattack.com.br/artigos/cakephp-evitando-hardcode-de-urls-no-codigo/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 05:05:59 +0000</pubDate>
		<dc:creator>Jan Seidl</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[hardcode]]></category>
		<category><![CDATA[routes]]></category>

		<guid isPermaLink="false">http://www.techattack.com.br/?p=61</guid>
		<description><![CDATA[Quando tivermos que referenciar uma váriavel ou enviar um $this->redirect() para uma URL que corresponde a um par controlador/ação não é legal que tenhamos este endereço escrito &#8220;hardcoded&#8221; (na mão) no código. A classe Route do CakePHP nos ajuda a manter o código limpo e reduz a manutenção, caso necessária.
Os exemplos abaixo são uma tentativa [...]]]></description>
			<content:encoded><![CDATA[<p>Quando tivermos que referenciar uma váriavel ou enviar um <code>$this->redirect()</code> para uma <acronym title="Uniform Resource Locator">URL</acronym> que corresponde a um par controlador/ação não é legal que tenhamos este endereço escrito &#8220;hardcoded&#8221; (na mão) no código. A classe <code>Route</code> do <a href="http://www.cakephp.org">CakePHP</a> nos ajuda a manter o código limpo e reduz a manutenção, caso necessária.</p>
<p><span id="more-61"></span>Os exemplos abaixo são uma tentativa de levar o usuário para seu painel de controle.<br />
Suponhamos que tenhamos a rota para o controlador <code>clients</code> e método <code>myaccount</code>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Route<span style="color: #339933;">::</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/clientes/minhaconta'</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'clients'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'action'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'myaccount'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h2>Modelo Hardcoded</h2>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$var</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/clientes/minhaconta&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;"># (saída) 
</span><span style="color: #666666; font-style: italic;"># $var = &quot;/clientes/minhaconta&quot;;</span></pre></td></tr></table></div>

<h2>Modelo com o auxílio da classe Route</h2>
<p>Nesta classe, contamos com o método estático <code>url</code> que tranforma a instrução de array (a mesma usada no <code>connect</code>) para seu endereço relativo respectivo.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$var</span> <span style="color: #339933;">=</span> Route<span style="color: #339933;">::</span><span style="color: #004000;">url</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'clients'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'action'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'myaccount'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;"># (saída) 
</span><span style="color: #666666; font-style: italic;"># $var = &quot;/clientes/minhaconta&quot;;</span></pre></td></tr></table></div>

<h2>O truque da ação <em>index</em> com <em>named parameters</em></h2>
<p>É comum usarmos as rotas genéricas do CakePHP que ao chamar <code>/controlador/método</code> chama a respectiva função no controlador. O problema existe quando a rota não está definida explicitamente, chamamos o controlador sem função <code>/controlador</code> (que vai buscar a função <code>index</code> quando não definido explicitamente) e passamos os famosos <em><a href="#ref_1">named parameters [1]</a></em>: Como a ação padrão <code>index</code> é omitida (pois é deduzida pelo <a href="http://en.wikipedia.org/wiki/Convention_over_Configuration" title="Convention over Configuration @ Wikipedia ~ inglês"><acronym title="Convention over Configuration">CoC</acronym></a> do CakePHP), as <em>named parameters</em> são acrescidas ao final da url e acabam sendo confundidas com a ação que deveria ser chamada.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$urlData</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'controlador'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'namedarg'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'valor'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
debug<span style="color: #009900;">&#40;</span>Router<span style="color: #339933;">::</span><span style="color: #004000;">url</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlData</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;"># (saida)
</span><span style="color: #666666; font-style: italic;"># /controlador/namedarg:valor</span></pre></td></tr></table></div>

<p>Para contornar este problema basta definirmos a rota explícitamente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Route<span style="color: #339933;">::</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/controlador/:action'</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'controlador'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'action'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Tendo assim a saída conforme esperado: <code>/controlador/index/namedarg:valor</code></p>
<p>Pronto, agora se mudares o nome da acão o código se adaptará. <b>Diga não ao hardcode!</b></p>
<p><em>NOTA: A função <code>url</code> também recebe um segundo parâmetro do tipo <code>boolean</code> que indica se a <acronym title="Uniform Resource Locator">URL</acronym> retornada é absoluta ou não (relativa). O valor padrão é <code>false</code>.</em></p>
<p><em>NOTA: A dica só vale para o framework CakePHP.</em></p>
<h2>Referências</h2>
<ul>
<li><a name="ref_1">[1]</a> <a href="http://book.cakephp.org/pt/view/541/Par%C3%A2metros-nomeados">http://book.cakephp.org/pt/view/541/Par%C3%A2metros-nomeados</a></li>
</ul><img src="http://feeds.feedburner.com/~r/TechAttack/~4/wMzBj6DQM58" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.techattack.com.br/artigos/cakephp-evitando-hardcode-de-urls-no-codigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.techattack.com.br/artigos/cakephp-evitando-hardcode-de-urls-no-codigo/</feedburner:origLink></item>
		<item>
		<title>Manutenção e monitoração com o mínimo de impacto ao usuário</title>
		<link>http://feedproxy.google.com/~r/TechAttack/~3/JkGTL52mDjA/</link>
		<comments>http://www.techattack.com.br/artigos/manutencao-e-monitoracao-com-o-minimo-de-impacto-ao-usuario/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 05:26:49 +0000</pubDate>
		<dc:creator>Jan Seidl</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[error handling]]></category>
		<category><![CDATA[gerenciamento de erros]]></category>
		<category><![CDATA[manutencao]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.techattack.com.br/?p=34</guid>
		<description><![CDATA[Quando temos um estabelecimento físico e nos deparamos com um problema que necessita de reparo ou alguma reforma não é de bom grado deixar o &#8220;defeito&#8221; à mostra aos clientes. Queremos passar a imagem perfeita.
Problemas todos temos, há inúmeras ações preventivas como Unit Testing (inglês) e afins, porém dado o dano, é imperativo que toda [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.techattack.com.br/wordpress/wp-content/uploads/2009/06/Plumber.jpg" alt="" title="" width="300" height="300" class="alignleft size-full wp-image-48" />Quando temos um estabelecimento físico e nos deparamos com um problema que necessita de reparo ou alguma reforma não é de bom grado deixar o &#8220;defeito&#8221; à mostra aos clientes. Queremos passar a imagem perfeita.</p>
<p>Problemas todos temos, há inúmeras ações preventivas como <a href="http://en.wikipedia.org/wiki/Unit_testing">Unit Testing</a> (inglês) e afins, porém dado o dano, é imperativo que toda operação seguinte transcorra com a maior cautela e menor aparência possível para minimizar quaisquer impactos com o relacionamento com o cliente.</p>
<p><span id="more-34"></span><br />
<h2>Visão geral da falha</h2>
<p>Uma falha é quando o conteúdo (input) passado para uma operação (função) não possui forma de ser tratado dentro da mesma, causando um erro, uma <em>excessão</em> à regra. Em caso de falha é como um incêndio: Precisamos primeiro acalmar as pessoas e evacuar o local para reduzir as casualidades.</p>
<h2>Evitando que o usuário tenha contato com a mensagem de erro</h2>
<p>Além de ser anti-estético também é uma falha de segurança. As mensagens de erro contém informações valiosas para o desenvolvedor localizar a falha entretanto também são valiosas para um usuário experiente mal-intencionado.</p>
<h2>Reportando o erro aos desenvolvedores</h2>
<p>Use um &#8220;error handler&#8221; (gerenciador de erros) de acordo com sua linguagem de programação que se encarregue de interceptar os erros e repassar aos desenvolvedores. Algumas das opções são:</p>
<dl>
<dt>File Logging (monitoramento passivo)</dt>
<dd>Consiste em gravar os erros em um arquivo de texto para análise forense. É imperativo que estes registros sejam monitorados constantemente.</dd>
<dt><acronym title="Structured Query Language">SQL</acronym> Logging (monitoramento passivo)</dt>
<dd>Consiste em gravar os erros em um banco de dados (MySQL, PostgreSQL, Sqlite etc) para análise forense. É imperativo que estes registros sejam monitorados constantemente.</dd>
<dt>E-mail Logging (monitoramento ativo)</dt>
<dd>O gerenciador envia o erro para contas de email previamente configuradas.</dd>
<dt>SMS Logging (monitoramento ativo)</dt>
<dd>Algumas operadoras de celular fornecem serviços de SMS via webservice ou alguma intervenção <acronym title="HyperText Transfer Protocol">HTTP</acronym>. Este tipo de gerenciamento consiste em enviar a mensagem de erro por mensagem de texto SMS para números de celulares. <em>NOTA: Algumas operadoras fornecem serviço de SMS através de uma conta de e-mail, podendo assim usar o modelo de E-Mail Logging)</em></dd>
<dt>I.M. Logging (monitoramento ativo)</dt>
<dd>Temos inúmeras classes que implementam o protocolo <code>MSNP9</code> e <code>MSNP12</code> do Windows Live Messenger além do <code>XMPP</code> (Jabber/Google Talk). Neste modelo, as mensagens de erro são enviadas diretamente para contas de mensageiros instantâneos.</dd>
<dt>Screen Logging (monitoramento ativo)</dt>
<dd>Este é o que reporta as mensagens de erro na tela durante a execução da página. Deve ser habilitado somente para ambiente de desenolvimento.</dd>
</dl>
<h2>O que enviar como mensagem de erro</h2>
<p>Tudo que for possível sobre o estado do ambiente onde o erro foi gerado é importante. Em termos de web: As informações do servidor, os headers de request do browser, a sessão do usuário, o que foi enviado tanto por <code>GET</code> quanto por <code>POST</code>, os cookies e a cor da meia do usuário. Em <acronym title="Pre-Hypertext Processing">PHP</acronym> seriam as variaveis <code>$_SERVER</code>, <code>$_REQUEST</code>, <code>$_SESSION</code>, <code>$_GET</code>, <code>$_POST</code> e <code>$_COOKIE</code> respectivamente. <em>(Ainda não fomos capazes de detectar o último item)</em></p>
<h2>O polimorfismo comportamental</h2>
<p>O sistema deve ser &#8220;duas caras&#8221;: se comportar de uma maneira quando no ambiente de desenolvimento quanto no de produção sem que seja necessária pilhas de configuração. Uma boa prática é deixar os módulos de logging encapsulados entre <code>if</code>s de checagem de ambiente. Esta checagem pode ser tanto automática (por distinção do host) ou manual (por setagem de uma variável ou constante que defina o ambiente em vigor). Assim, o sistema saberá se enviará o erro na tela ou para os desenvolvedores ou ambos de forma natural.</p>
<h2>Error reporting além da aplicação</h2>
<p>Além de erros gerados durante o funcionamento da aplicação precisamos também monitorar erros 404 [página não encontrada] (decorrentes de linkagens errôneas) e 500 [erro interno do servidor] (que pode ser decorrente de N casualidades). O core do servidor web <a href="http://httpd.apache.org/">Apache</a> fornece as diretivas <code>ErrorDocument</code> onde pode-se colocar scripts que façam o encaminhamento das informações de debug (página que estava tentando ser acessada que não foi encontrada etc) para os desenvolvedores da forma apropriada.</p>
<h2>Combatendo a falha</h2>
<p>Em caso de falha, mesmo que os erros estejam sendo omitidos do usuário, as coisas não funcionarão como esperado podendo gerar dados errôneos causando ainda mais prejuízo. Se você não tem um ambiente de testes / desenvolvimento (cenário muito comum) certamente precisará ecoar texto na tela para fins de debug (dumps de variáveis, sinalização de checkpoints etc). Precisamos de alguns passos para realizar o combate:</p>
<h3>Colocando o serviço em modo de manutenção</h3>
<p>Precisamos redirecionar todo o tráfego (exceto o proveniente da equipe de manutenção) para um local com uma mensagem indicando que o serviço está ativo mas encontra-se suspenso para manutenção e será retomado em instantes para minimizar a <em>bounce rate</em> (taxa de rejeição) que é alta no caso dos usuários se depararem diretamente com mensagens de erro. Tal rejeição pode ser crucial em varejistas na perda da venda para o concorrente. </p>
<p><em>NOTA: Um exemplo é o Submarino que frequentemente presenteia seus usuários com mensagens de erro do <code>Asp.NET</code>.</em></p>
<p>Para realizamos esta operação quando sob um servidor web Apache precisamos estar com permissão de <code>AllowOverride Options</code> para o diretório raiz da aplicação no seu arquivo de configuração do servidor além de estarmos com o módulo de Url Rewriting <code>mod_rewrite</code> instalado no mesmo (muito comum na maioria dos hostings).</p>
<p>Basta a simples colocação de um arquivo (de preferência <code>html</code> estático) e um <code>.htaccess</code> com o código abaixo na raiz do servidor.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">Options</span> +<span style="color: #0000ff;">FollowSymlinks</span>
<span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">on</span>
<span style="color: #00007f;">RewriteCond</span> %{REQUEST_URI} !/em-manutencao.html$
<span style="color: #00007f;">RewriteCond</span> %{REMOTE_HOST} !^<span style="color: #ff0000;">200</span>\.200\.200\.200 <span style="color: #adadad; font-style: italic;"># IP da equipe de manutenção</span>
<span style="color: #00007f;">RewriteRule</span> $ /em-manutencao.html [R=<span style="color: #ff0000;">302</span>,L] <span style="color: #adadad; font-style: italic;"># arquivo com a mensagem de manutenção</span></pre></td></tr></table></div>

<p>Podemos ligar e desligar o modo de manutenção apenas modificando a diretiva <code>RewriteEngine on</code> para <code>RewriteEngine off</code>. </p>
<p><em>Note que além do envio do header 302 (Movido temporariamente) você deve manter <code>meta</code> tags de <code>noindex</code> para não afetar sua indexação no google.</em></p>
<h2>Como debugar?</h2>
<p>Bom, aí vai de desenvolvedor para desenvolvedor. A minha técnica consiste em diversas operações. </p>
<h3>Análise da mensagem</h3>
<p>Começo pela análise forense das informações de erro que me foram passadas que costumam mostrar o problema em 80% dos casos. Ler atentamente a mensagem de erro pode dizer tudo o que você precisa saber. </p>
<h3>Olhando para o paciente</h3>
<p>Com a experiência conseguimos ver alguns erros só de olhar, assim como um médico experiente. Identifico depois o bloco onde o erro foi localizado e o observo por erros de lógica e falhas aparentes. </p>
<h3>Checkpoints</h3>
<p>Em algumas vezes (principalmente quando mexendo em códigos de terceiros) preciso colocar checkpoints: <code>print</code>s de mensagens com identificadores para saber quando o programa passa por ele para identificar por quais pontos do código aquela regra está passando.</p>
<h3>Dumps</h3>
<p>Obter dumps (saídas na tela ou texto) de uma função ou variável ajuda muito em ver como está sendo gerada a saída que pode estar conflitando. Em <acronym title="Pre-Hypertext Processing">PHP</acronym> uso muito o <code>var_dump</code> por me mostrar até o tipo do dado em questão visto que no <acronym title="Pre-Hypertext Processing">PHP</acronym> temos o famoso <em>type juggling</em> (conversão de tipo on-the-fly) e pode gerar conflitos.</p>
<p>E aí, qual a sua boa prática de monitoração e debug?</p><img src="http://feeds.feedburner.com/~r/TechAttack/~4/JkGTL52mDjA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.techattack.com.br/artigos/manutencao-e-monitoracao-com-o-minimo-de-impacto-ao-usuario/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.techattack.com.br/artigos/manutencao-e-monitoracao-com-o-minimo-de-impacto-ao-usuario/</feedburner:origLink></item>
		<item>
		<title>Badges de votação e WP Minify</title>
		<link>http://feedproxy.google.com/~r/TechAttack/~3/nEB6_fhgF_I/</link>
		<comments>http://www.techattack.com.br/artigos/badges-de-votacao-e-wp-minify/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 23:28:29 +0000</pubDate>
		<dc:creator>Jan Seidl</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[badges]]></category>
		<category><![CDATA[minify]]></category>
		<category><![CDATA[rec6]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp-minify]]></category>

		<guid isPermaLink="false">http://www.techattack.com.br/?p=44</guid>
		<description><![CDATA[Nós bons bloggers de tecnologia gostamos de ver o quanto nossos usuários gostaram do que escrevemos e frequentemente usamos badges de votação como do D-Zone, Rec6 etc.
Eu como fanático da otimização sempre andei de mãos dadas com minificadores de código (préprocessadores de compressão e remoção de dados desnecessários) e quando encontrei o WP-Minify achei que [...]]]></description>
			<content:encoded><![CDATA[<p>Nós bons bloggers de tecnologia gostamos de ver o quanto nossos usuários gostaram do que escrevemos e frequentemente usamos badges de votação como do <a href="http://www.dzone.com/">D-Zone</a>, <a href="http://rec6.via6.com.br/">Rec6</a> etc.</p>
<p>Eu como fanático da otimização sempre andei de mãos dadas com minificadores de código (préprocessadores de compressão e remoção de dados desnecessários) e quando encontrei o <a href="http://omninoggin.com/wordpress-plugins/wp-minify-wordpress-plugin/"><acronym title="WordPress">WP</acronym>-Minify</a> achei que meus problemas de wordpress com os plugins que possuem arquivos externos . Falácia! O <acronym title="WordPress">WP</acronym>-Minify conseguia lidar belamente com os arquivos que acresciam suas linhas através dos hooks <code>wp_register_script</code> e <code>wp_enqueue_script</code> porém os scripts que não tinham este cuidado (e que não são poucos) e geravam código inline ou adicionavam ao <code>head</code> através de <code>print</code>s acabavam ficando.</p>
<p>Thaya Kareeson, autor do plugin, lançou recentemente uma nova versão que poe o output do tema em buffer e então o processa, pegando assim toda e qualquer aparição inline. O resultado da coleta é colocado em um arquivo temporário e chamado junto com o resto dos javascripts. Excelente!</p>
<p>O problema veio que meu badge do Rec6 (este no fim do artigo) depende do <code>the_permalink()</code> que não está disponível para o arquivo temporário <strike>cagand</strike>quebrando o código do badge.</p>
<p>Comecei a me deseperar, parei, respirei, abri a página de configuração esperando alguma opção para desligar o préprocessamento inline mas não havia. Comecei a me desesperar mais um pouco. Respirei e vi que tinha uma &#8216;blacklist&#8217; de scripts e estilos para não serem minificados. Resolvi arriscar jogar a url do <code>src</code> do javascript (que era um <code>.php</code>). Maravilha, worked like a charm!</p>
<p>Espero que esta dica ajude algúem que, como eu, está(va) &#8220;batendo cabeça&#8221; com esse problema.</p><img src="http://feeds.feedburner.com/~r/TechAttack/~4/nEB6_fhgF_I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.techattack.com.br/artigos/badges-de-votacao-e-wp-minify/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.techattack.com.br/artigos/badges-de-votacao-e-wp-minify/</feedburner:origLink></item>
		<item>
		<title>Definindo relacionamentos semanticamente entre documentos XHTML</title>
		<link>http://feedproxy.google.com/~r/TechAttack/~3/_o1WAzvoN0M/</link>
		<comments>http://www.techattack.com.br/artigos/definindo-relacionamentos-semanticamente-entre-documentos-xhtml/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 00:00:16 +0000</pubDate>
		<dc:creator>Jan Seidl</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[rel]]></category>
		<category><![CDATA[relacionamentos]]></category>
		<category><![CDATA[semantica]]></category>
		<category><![CDATA[web standards]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.techattack.com.br/?p=15</guid>
		<description><![CDATA[
Quando temos páginas que se relacionam entre si ou que pertencem a um grupo de páginas, podemos definir o relacionamento entre elas de forma que parsers e crawlers possam identificá-los corretamente.
O responsável por isso é uma tag muito conhecida mas pouco compreendida: a tag link. Esta tag é conhecida por ser a responsável pela inclusão [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/artigos/definindo-relacionamentos-semanticamente-entre-documentos-xhtml"><img src="http://www.techattack.com.br/wordpress/wp-content/uploads/2009/04/rel_documentos_xhtml.jpg" alt="" title="Definindo relacionamentos semânticamente entre documentos XHTML" width="517" height="200" class="alignnone size-full wp-image-24" /></a><br />
Quando temos páginas que se relacionam entre si ou que pertencem a um grupo de páginas, podemos definir o relacionamento entre elas de forma que parsers e crawlers possam identificá-los corretamente.<span id="more-15"></span></p>
<p>O responsável por isso é uma tag muito conhecida mas pouco compreendida: a tag <code>link</code>. Esta tag é conhecida por ser a responsável pela inclusão de arquivos <acronym title="Cascading Style Sheets">CSS</acronym> em documentos html mas pouca gente sabe por quê.</p>
<p>A tag <code>link</code> é responsável por definir qualquer relacionamento direto ou relacionamento reverso. Esta tag é uma short-tag e portanto não possui tag de fechamento, seguindo o terminador <acronym title="eXtensible HyperText Markup Language">XHTML</acronym> de short-tag <code>&lt;tag /&gt;</code></p>
<h2>Análise</h2>
<p>A tag de <code>link</code> possui a seguinte estrutura básica:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #66cc66;">&#91;</span>direção<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">=</span><span style="color: #66cc66;">&#91;</span>tipo<span style="color: #66cc66;">&#93;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'[documento relacionado]'</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>

<h2>Tipos e direções de relacionamento</h2>
<h3>Direção do relacionamento</h3>
<p>Um relacionamento pode ter apenas duas direções: direta ou reversa.</p>
<dl>
<dt>Relacionamento direto</dt>
<dd>é o relacionamento do documento referenciado com o documento atual. Representado pelo atributo <code>rel</code></dd>
<dt>Relacionamento reverso</dt>
<dd>é o relacionamento do documento atual com o documento referenciado. Representado pelo atributo <code>rev</code></dd>
</dl>
<h3>Tipos de relacionamento</h3>
<p>Os relacionamentos entre documentos devem ter seu tipo especificado para que se possa saber como o documento se relaciona com o atual. Múltiplos tipos podem ser definidos através da mesma expressão sendo separados por espaços dentro do atributo <code>rel</code> ou <code>rev</code>. Ex: no caso da página anterior ser o índice.</p>
<h4>Genéricos</h4>
<dl>
<dt><code>alternate</code></dt>
<dd>Uma versão alternativa do documento (uma versão para impressão, versão em outra língua etc).</dd>
<dt><code>appendix</code></dt>
<dd>Um apêndice (como em livros) do documento.</dd>
<dt><code>bookmark</code></dt>
<dd>Documentos relacionados ao atual, como bibliografias ou artigos relacionados em geral</dd>
<dt><code>canonical</code></dt>
<dd>Um outro endereço para o documento atual.</dd>
<dt><code>copyright</code></dt>
<dd>A página de termos de uso e copyright do documento atual.</dd>
<dt><code>glossary</code></dt>
<dd>Um glossário (explicação) de termos empregados no documento.</dd>
<dt><code>help</code></dt>
<dd>Ajuda para o documento em questão. Muito útil para indicar páginas de <acronym title="Frequently Asked Questions">FAQ</acronym>.</dd>
<dt><code>stylesheet</code></dt>
<dd>Um arquivo de folha de estilo (<acronym title="Cascading Style Sheets">CSS</acronym>) alocado externamente.</dd>
</dl>
<h4>Seção</h4>
<p>Definem relacionamento entre documentos que pertencem ao mesmo grupo contínuo de documentos. Muito comum para arquivos seccionados como manuais ou artigos de múltiplas páginas.</p>
<dl>
<dt><code>start</code></dt>
<dd>O primeiro documento da série.</dd>
<dt><code>next</code></dt>
<dd>O próximo documento da série.</dd>
<dt><code>prev</code></dt>
<dd>O documento anterior da série.</dd>
<dt><code>contents</code></dt>
<dd>O documento é demonstra as páginas da série aninhadas por conteúdo. Uma espécie de índice geral.</dd>
<dt><code>index</code></dt>
<dd>O índice da série.</dd>
</dl>
<h4>Referenciadores de índice</h4>
<p>Usados para indicar relações específicas através do documento índice.</p>
<dl>
<dt><code>chapter</code></dt>
<dd>Um capítulo do documento.</dd>
<dt><code>section</code></dt>
<dd>Uma seção do documento.</dd>
<dt><code>subsection</code></dt>
<dd>Uma sub-seção do documento.</dd>
</dl>
<p><em>NOTA: Pode-se utilizar referências para seções no mesmo documento através de âncoras <code>a</code>.</em></p>
<h2>Definindo o tipo de mídia</h2>
<p>O <em>tipo de mídia</em> é o tipo de dispositivo de saída (monitor de PC, televisão, display de celular, display de handheld etc) onde a regra especificada no <code>link</code></p>
<p>Definimos através do atributo <code>media</code>, dentro da tag <code>link</code>. O padrão (em caso de omissão da tag) é <code>screen</code>.</p>
<h3>Tipos de mídia</h3>
<dl>
<dt>screen</dt>
<dd>Monitores de computador</dd>
<dt>tty</dt>
<dd>Terminais Shell (navegadores texto como <a href="http://links.sourceforge.net/">links</a> ou <a href="http://www.lynxbrowser.com/">lynx</a>)</dd>
<dt>tv</dt>
<dd>Televisores</dd>
<dt>projection</dt>
<dd>Projetores multimídia / datashows (costuma ser setado pelo browser quando no modo &#8220;tela cheia&#8221;)</dd>
<dt>handheld</dt>
<dd>Palm-tops e handhelds em geral</dd>
<dt>print</dt>
<dd>Versão para impressão</dd>
<dt>braille</dt>
<dd>Impressoras e dispositivos braille.</dd>
<dt>aural</dt>
<dd>Leitores de texto para deficientes visuais.</dd>
<dt>all</dt>
<dd>Todos os dispositivos de mídia.</dd>
</dl>
<h2>Definindo língua e a codificação de caracteres</h2>
<p>As tags <code>hreflang</code> e <code>charset</code> definem, respectivamente, a língua e o conjunto de caracteres empregados no documento referenciado no relacionamento. Para isso a <acronym title="World Wide Web Consortium">W3C</acronym> disponibiliza a <a title="Referência de Códigos de Língua @ W3Schools" href="http://www.w3schools.com/TAGS/ref_language_codes.asp">tabela de códigos de lingua (em inglês)</a> e a <a title="Referência de Charsets @ W3Schools" href="http://www.w3schools.com/TAGS/ref_charactersets.asp">tabela de códigos de conjunto de caracteres (charsets) (em inglês)</a>.</p>
<h3>Mime-type</h3>
<p>O mime-type do documento referenciado é identificado pelo atributo <code>type</code> comum em elementos <acronym title="eXtensible HyperText Markup Language">XHTML</acronym>. Uma <a href="http://www.iana.org/assignments/media-types/">lista de mime-types (em inglês)</a> pode ser encontrado no site da <acronym title="Internet Assigned Numbers Authority">IANA</acronym>.</p>
<h2>O caso do tipo de relacionamento <code>icon</code></h2>
<p>Os já conhecido <em>favourite icon</em> ou <em>favicon</em>s foram introduzidos pela Microsoft como recurso do Internet Explorer 5 e eram reconhecidos pelo browser quando encontrava-se um arquivo <em>Microsoft Icon Format</em> (*.ico) na raiz do site com o seguinte nome: <code>/favicon.ico</code></p>
<p>Como era de se esperar, a notação da tag <code>link</code> empregada pelo Internet Explorer era a definição de tipo de atributo <code>rel</code> como <code>shortcut icon</code> e violava o padrão <acronym title="World Wide Web Consortium">W3C</acronym> do atributo <code>rel</code> que deveria ter seus tipos de relacionamento separados por espaços (conforme dito previamente), transformando assim esta instrução nos tipos <code>shortcut</code> (que é inválido) e <code>icon</code>.</p>
<p>A Mozilla Labs implementou então que a tag deveria ficar apenas <code>icon</code> e foi seguida por navegadores como o Opera e está em vias de ser reconhecida como padrão.</p>
<p><em>NOTA: Algumas versões do Internet Explorer suportam apenas quando chamado por <code>shortcut icon</code></em></p>
<h2>Exemplos</h2>
<h3>Caso comum: Definindo <acronym title="Cascading Style Sheets">CSS</acronym></h3>
<p>Conforme citado no início deste artigo, o exemplo da definição de arquivos <acronym title="Cascading Style Sheets">CSS</acronym> externos é o caso mais comum e emprega os atributos <code>type</code> e <code>media</code> (opcional)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;">    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/css/site.css&quot;</span> <span style="color: #000066;">media</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;screen&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/css/print.css&quot;</span> <span style="color: #000066;">media</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;print&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/handheld.css&quot;</span> <span style="color: #000066;">media</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;handheld&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>

<h3>Páginas do grupo</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"> <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;contents&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;index.php&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
 <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;index&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/secao/index.php&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
 <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;prev&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/secao/artigo3.php&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
 <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;next&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/secao/artigo5.php&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>

<h3>Múltiplos tipos de relacionamento</h3>
<p>O caso da primeira página da série</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"> <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;index prev&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;index.php&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>

<h3>Documentos em outra língua</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"> <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;alternate&quot;</span> <span style="color: #000066;">hreflang</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;en&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/secao/en/artigo3.php&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>

<h3>Feeds <acronym title="Really Simple Syndication">RSS</acronym></h3>
<p>O Wordpress utiliza as tags <code>link</code> para especificar seus dois tipos de feeds <acronym title="Really Simple Syndication">RSS</acronym></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;alternate&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;application/rss+xml&quot;</span> <span style="color: #000066;">title</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;RSS 2.0&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/feed/&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;alternate&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;application/atom+xml&quot;</span> <span style="color: #000066;">title</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Atom 1.0&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/feed/atom/&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>

<p><em>UPDATE: 23/05/2009</em><br />
O Bruno Lustosa do <a href="http://www.ataraxia.com.br">Ataraxia!</a> costuma acrescer uma querystring (texto após o <code>?</code>) a <acronym title="Uniform Resource Locator">URL</acronym> para trackear a origem de algumas campanhas de email marketing e feeds e <a href="http://www.ataraxia.com.br/posts/evitando-conteudo-duplicado/" title="Evitando conteúdo duplicado @ Ataraxia">utilizou a tag <code>link</code></a> com o atributo <code>canonical</code> para evitar ter seu conteúdo dado como duplicado pelos buscadores que achariam que as páginas acrescidas da querystring seriam páginas distintas porém com o mesmo conteúdo.</p>
<p><em>NOTA: A tag <code>link</code> não deve ser usada para criar links de texto (apontadores de documento). São tags para definição de estrutura de documento e não são visíveis para o usuário final. Para isso utilize as tags <code>a</code>.</em></p>
<p><em>NOTA: Não há nenhuma declaração nem teste por minha parte de que o Google ou qualquer outro crawler considere esta tag em sua relevância entretanto programar corretamente nunca é demais.</em></p>
<h2>Referências</h2>
<ul>
<li><a href="http://www.w3schools.com/TAGS/tag_link.asp">Documentação oficial da W3Schools (em inglês) sobre a tag <code>link</code></a></li>
<li><a href="http://en.wikipedia.org/wiki/Favicon">História do Favicon (em inglês) @ Wikipedia</a></li>
</ul><img src="http://feeds.feedburner.com/~r/TechAttack/~4/_o1WAzvoN0M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.techattack.com.br/artigos/definindo-relacionamentos-semanticamente-entre-documentos-xhtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.techattack.com.br/artigos/definindo-relacionamentos-semanticamente-entre-documentos-xhtml/</feedburner:origLink></item>
		<item>
		<title>Abrindo corretamente links em nova janela</title>
		<link>http://feedproxy.google.com/~r/TechAttack/~3/6XMEPGbyptk/</link>
		<comments>http://www.techattack.com.br/artigos/abrindo-corretamente-links-em-nova-janela/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 22:46:54 +0000</pubDate>
		<dc:creator>Jan Seidl</dc:creator>
				<category><![CDATA[Desenvolvimento de Software]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[não-obstrusivo]]></category>

		<guid isPermaLink="false">http://www.techattack.com.br/?p=8</guid>
		<description><![CDATA[A boa prática nos conduz a abrir links em nova janela apenas quando são páginas de sites externos e desde que o atributo target="_blank" dos links a morreram (se você não sabia eu lamento muitíssimo em contar-lhe), o único caminho que nos resta é o JavaScript.
O evento click no link não pode mais ser chamado [...]]]></description>
			<content:encoded><![CDATA[<p>A boa prática nos conduz a abrir links em nova janela apenas quando são páginas de sites externos e desde que o atributo <code>target="_blank"</code> dos links <code>a</code> morreram (se você não sabia eu lamento muitíssimo em contar-lhe), o único caminho que nos resta é o JavaScript.<span id="more-8"></span></p>
<p>O evento <code>click</code> no link não pode mais ser chamado pelo atributo <code>onclick</code> das tags <code>a</code> porque todos os atributos <code>on*</code> morreram também (Eu sei, é um massacre!) o que confirma o uso do JavaScript para atribuir o evento (observe/attach).</p>
<p>Usarei os seletores <a href="http://www.jquery.com">JQuery</a> para pegar o que precisamos com uma pitadinha de <acronym title="Regular Expression">REGEX</acronym>.</p>
<p><em>Todos os links externos</em><br />
[sourcecode language="javascript"]<br />
$(document).ready(function() {<br />
	$(&#8221;a[href^='http://']&#8220;).click(function(ev){<br />
		ev.preventDefault();<br />
		window.open(this.href);<br />
	});<br />
});<br />
[/sourcecode]</p>
<p><em>Todos os links dentro da div com o atributo <code>id</code> &#8216;#div_id&#8217;</em><br />
[sourcecode language="javascript"]<br />
$(document).ready(function() {<br />
    $(&#8217;div#id_div a&#8217;).bind(&#8217;click&#8217;,function(ev) {<br />
        ev.preventDefault();<br />
        window.open(this.href);<br />
    }<br />
    );<br />
});<br />
[/sourcecode]</p>
<p><em>NOTA: Sempre encapsulo observadores de evento (também conhecidos como event listeners, event attachment ou event binding) na instrução <code>$(document).ready()</code> para garantir que o elemento a ser observado já esteja presente na memória quando o observador for anexado a ele.</em></p>
<p><em>NOTA: O uso do <code>ev.preventDefault()</code> ao invés de <code>return false</code> para seguir o padrão do JQuery. Apenas uma boa prática.</em></p>
<p><em>NOTA: <code>ev</code> é apenas um nome da váriavel. Você pode escolher o nome que melhor convir.</em></p>
<p><em>NOTA: Quando digo &#8220;corretamente&#8221; digo &#8220;seguindo os standards&#8221;. Não quero ofender a ideologia nem religião de nenhum desenvolvedor.</em></p>
<p>Alguem com uma ideia &#8220;correta&#8221; diferente?</p><img src="http://feeds.feedburner.com/~r/TechAttack/~4/6XMEPGbyptk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.techattack.com.br/artigos/abrindo-corretamente-links-em-nova-janela/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.techattack.com.br/artigos/abrindo-corretamente-links-em-nova-janela/</feedburner:origLink></item>
		<item>
		<title>Convertendo arquivos OOXML (.docx,.xlsx,.pptx) do MS Office 2007</title>
		<link>http://feedproxy.google.com/~r/TechAttack/~3/jpmkeGzR1_I/</link>
		<comments>http://www.techattack.com.br/artigos/convertendo-arquivos-ooxml-docxxlsxpptx-do-ms-office-2007/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 05:46:22 +0000</pubDate>
		<dc:creator>Jan Seidl</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[docx]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[ms office 2007]]></category>

		<guid isPermaLink="false">http://www.seidl.com.br/wordpress/?p=1</guid>
		<description><![CDATA[A versão mais recente do Office da Microsoft (aquela da interface azul que mudaram tudo de lugar) trabalha com um novo formato de documentos chamado &#8220;Office Open XML&#8221; que tem feito muita gente esquentar a cabeça ao receber documentos neste formato de clientes ou fornecedores.
Para as pessoas que não usam editores de textos compatíveis com [...]]]></description>
			<content:encoded><![CDATA[<p>A versão mais recente do Office da Microsoft (aquela da interface azul que mudaram tudo de lugar) trabalha com um novo formato de documentos chamado &#8220;Office Open <acronym title="eXtensible Markup Language">XML</acronym>&#8221; que tem feito muita gente esquentar a cabeça ao receber documentos neste formato de clientes ou fornecedores.<span id="more-1"></span></p>
<p>Para as pessoas que não usam editores de textos compatíveis com este formato (como versões anteriores do Office), a Microsoft disponibilizou o <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=941B3470-3AE9-4AEE-8F43-C6BB74CD1466&#038;displaylang=en">&#8220;Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint 2007 File Formats&#8221;</a> para sistemas operacionais Windows.</p>
<p>Para quem usa Mac há o widget para desktop em <a title=".docx Converter" href="http://docx-converter.com/">http://docx-converter.com/</a> que também provê o serviço de conversão gratuito pela web que é independente de platafoma.</p>
<p>Para Linux, o OpenOffice 3 já lida com estes arquivos porém a conversão não é muito boa. Para quem quiser experimentar uma conversão melhor deve utilizar a dupla de odf-converter com odf-converter-integrator. No site do desenvolvedor (em inglês) há screenshots do <a href="http://lh5.ggpht.com/_1XYQfEGGEIw/STybNhCil1I/AAAAAAAABYE/szlZI5-upzI/s640/OpenOfficeOrg300_docx_bugs-word.png">documento original criado no Office</a>, da <a href="http://lh6.ggpht.com/_1XYQfEGGEIw/STybNulj9XI/AAAAAAAABX8/gp-CYr2Ck5c/s640/OpenOfficeOrg300_docx_bugs-ooo300.png">conversão do OpenOffice 3</a> e da <a href="http://lh3.ggpht.com/_1XYQfEGGEIw/STybNXV9I_I/AAAAAAAABX0/AbLU9pTqh4s/s640/OpenOfficeOrg300_docx_bugs-oci021.png">conversão feita pelo odf-converter/odf-converter-integrator</a>.</p>
<p>Para saber mais sobre o OOXML visite a entrada do mesmo na Wikipedia (em inglês): <a title="Office Open XML @ Wikipedia" href="http://en.wikipedia.org/wiki/Office_Open_XML">http://en.wikipedia.org/wiki/Office_Open_XML</a></p><img src="http://feeds.feedburner.com/~r/TechAttack/~4/jpmkeGzR1_I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.techattack.com.br/artigos/convertendo-arquivos-ooxml-docxxlsxpptx-do-ms-office-2007/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.techattack.com.br/artigos/convertendo-arquivos-ooxml-docxxlsxpptx-do-ms-office-2007/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 14.446 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-02-15 13:00:44 --><!-- Compression = gzip -->
