<?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>Silvio Delgado  &#187; técnicas</title>
	<atom:link href="http://www.silviodelgado.com.br/tag/tecnicas/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.silviodelgado.com.br</link>
	<description>ASP.NET, MVC, C#, Design Patterns, jQuery, CSS, Webstandards, SEO et cetera</description>
	<lastBuildDate>Thu, 15 Dec 2011 04:37:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Dica: Grid zebrado com jQuery</title>
		<link>http://www.silviodelgado.com.br/dica-grid-zebrado-com-jquery/</link>
		<comments>http://www.silviodelgado.com.br/dica-grid-zebrado-com-jquery/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 03:20:07 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/?p=157</guid>
		<description><![CDATA[Aqui vai uma dica simples, mas bem útil, para você zebrar o grid (alternar linhas coloridas) com jQuery. Isto é muito utilizado para destacar a separação das linhas do grid, sem, no entanto, utilizar as bordas do mesmo, o que não gera um efeito plenamente satisfatório. &#160; Vamos ao código! O primeiro passo é criar [...]]]></description>
			<content:encoded><![CDATA[<p>Aqui vai uma dica simples, mas bem útil, para você zebrar o grid (alternar linhas coloridas) com jQuery.</p>
<p>Isto é muito utilizado para destacar a separação das linhas do grid, sem, no entanto, utilizar as bordas do mesmo, o que não gera um efeito plenamente satisfatório.</p>
<p>&nbsp;</p>
<p>Vamos ao código!</p>
<p><span id="more-157"></span></p>
<p>O primeiro passo é criar uma classe que irá conter a cor de fundo:</p>
<p><code>&lt;style type="text/css"&gt;<br />
.bgCinza { background-color: #f5f5f5; }<br />
&lt;/style&gt;<br />
</code></p>
<p>No caso, eu utilizei um tom de cinza para fazer a alternância das linhas.</p>
<p>Em seguida, basta incluir no <em>header</em> da página o seguinte código:</p>
<p><code>&lt;script type="text/javascript"&gt;&lt;br /&gt;<br />
$(document).ready(function () { $('table tr:even').addClass('bgCinza'); });&lt;br /&gt;<br />
&lt;/script&gt;<br />
</code></p>
<p>Se preferir, você pode setar uma classe para a <em>table</em> e fazer a chamada acima para a classe criada. Assim, ao invés de setar a classe <em>bgCinza</em> para <strong>todas</strong> tabelas, somente aqueles que tiverem a classe serão modificadas:</p>
<p><code>$(document).ready(function () { $('<span style="color: #0000ff;"><strong>.grid</strong></span> tr:even').addClass('bgCinza'); });</code></p>
<p>Note que, obviamente, você também deverá incluir, <strong>antes</strong> do código javascript acima, uma chamada para o <em>core</em> do jQuery:</p>
<p><code>&lt;script type="text/javascript" src="/path/to/jquery.1.6.2.min.js"&gt;&lt;/script&gt;<br />
</code></p>
<p>O resultado final fica como mostrado na imagem abaixo:</p>
<p><a href="http://www.silviodelgado.com.br/wp-content/uploads/2011/09/grid.png" target="_blank"><img class="aligncenter size-medium wp-image-158" title="Grid Zebrado" src="http://www.silviodelgado.com.br/wp-content/uploads/2011/09/grid-300x178.png" alt="grid zebrado" width="300" height="178" /></a></p>
<p>Espero que sirva para você também!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/dica-grid-zebrado-com-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DateTime.CompareTo() Desvendado</title>
		<link>http://www.silviodelgado.com.br/datetime-compareto-desvendado/</link>
		<comments>http://www.silviodelgado.com.br/datetime-compareto-desvendado/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 19:47:44 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/?p=126</guid>
		<description><![CDATA[Um problema recorrente no desenvolvimento é a utilização do CompareTo para DateTime. Apesar de ser uma solução ótima, melhor do que a comparação simples (=, &#62;, &#60;), há sempre uma pequena confusão com o resultado da operação. Os valores possíveis são 1, 0 ou -1. Mas, afinal, qual deles vem em que situação? Veja a [...]]]></description>
			<content:encoded><![CDATA[<p>Um problema recorrente no desenvolvimento é a utilização do CompareTo para DateTime.</p>
<p>Apesar de ser uma solução ótima, melhor do que a comparação simples (=, &gt;, &lt;), há sempre uma pequena confusão com o resultado da operação.</p>
<p>Os valores possíveis são 1, 0 ou -1. Mas, afinal, qual deles vem em que situação?</p>
<p><span id="more-126"></span></p>
<p>Veja a tabela abaixo e acabe com as dúvidas de uma vez por todas:</p>
<table border="1">
<tbody>
<tr>
<th>Valor</th>
<th>Descrição</th>
</tr>
<tr>
<td>&lt; Zero</td>
<td>A instância é menor do que a data do parâmetro</td>
</tr>
<tr>
<td>Zero</td>
<td>A instância é igual à data do parâmetro</td>
</tr>
<tr>
<td>&gt; Zero</td>
<td>A instância é maior do que a data do parâmetro</td>
</tr>
</tbody>
</table>
<p>Exemplo:</p>
<p><code><br />
if (data.CompareTo(new DateTime(2009, 11, 17)) &gt; 0)<br />
{<br />
// "data" é maior do que o dia de hoje<br />
}<br />
</code></p>
<p>Resumindo, se a &#8220;data&#8221;, que está na esquerda, for maior, o resultado do if é true.</p>
<p>Ou seja, se você fizer um data.CompareTo(outraData), caso o resultado retorne 1, é porque &#8220;data&#8221; é maior do que &#8220;outraData&#8221; (veja que &#8220;data&#8221; está à esqueda, equivale ao &#8220;&gt; 0&#8243;). Caso retorne 0, elas são iguais. Caso retorne -1, &#8220;outraData&#8221; é maior do que &#8220;data&#8221; (repare que &#8220;outraData&#8221; está à direita, equivale ao &#8220;&lt; 0&#8243;).</p>
<table border="1">
<tbody>
<tr>
<th>Maior</th>
<th>Igual</th>
<th>Menor</th>
</tr>
<tr>
<td style="text-align: center;">1</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">-1</td>
</tr>
</tbody>
</table>
<p>Espero ter ajudado. <img src='http://www.silviodelgado.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Amplexos!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/datetime-compareto-desvendado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Busca por data no Google</title>
		<link>http://www.silviodelgado.com.br/busca-por-data-no-google/</link>
		<comments>http://www.silviodelgado.com.br/busca-por-data-no-google/#comments</comments>
		<pubDate>Sun, 04 May 2008 02:03:35 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[Assuntos Diversos]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/post.php?id=72</guid>
		<description><![CDATA[Um recurso da busca do Google que pouca gente conhece é a limitação da busca por resultados de um certo período de tempo. É possível, por exemplo, buscar os resultados apenas da última semana, ou até mesmo das últimas 24 horas! Para isso, basta acrescentar o seguinte código à URL do Google após a busca: [...]]]></description>
			<content:encoded><![CDATA[<p>Um recurso da busca do Google que pouca gente conhece é a limitação da busca por resultados de um certo período de tempo.</p>
<p>É possível, por exemplo, buscar os resultados apenas da última semana, ou até mesmo das últimas 24 horas!</p>
<p>Para isso, basta acrescentar o seguinte código à URL do Google após a busca:</p>
<p><code>&amp;as_qdr=X</code></p>
<p>Onde está o &#8220;X&#8221; substitua por:</p>
<ul>
<li>d &#8211; para buscas nos resultados das últimas 24 horas</li>
<li>w &#8211; para a última semana</li>
<li>m &#8211; último mês</li>
<li>m2 &#8211; últimos 2 meses</li>
<li>m3 &#8211; últimos 3 meses</li>
<li>m6 &#8211; últimos 6 meses</li>
<li>y &#8211; último ano</li>
<li>all &#8211; qualquer data</li>
</ul>
<p>A URL do resultado ficará assim então:</p>
<p><a href="http://www.google.com.br/search?hl=pt-BR&amp;q=%22Silvio+Delgado%22&amp;meta=&amp;as_qdr=m" target="_blank">http://www.google.com.br/search?hl=pt-BR&amp;q=%22Silvio+Delgado%22&amp;meta=&amp;as_qdr=m</a></p>
<p>Espero que seja útil!</p>
<p>Abraços.</p>
<p>P.S.: publicado no <a href="http://www.undergoogle.com/" target="_blank">UnderGoogle</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/busca-por-data-no-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Captcha Inverso</title>
		<link>http://www.silviodelgado.com.br/captcha-inverso/</link>
		<comments>http://www.silviodelgado.com.br/captcha-inverso/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 12:47:24 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[Assuntos Diversos]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/post.php?id=59</guid>
		<description><![CDATA[Uma das técnicas utilizadas atualmente para evitar o preenchimento de formulários por robôs (geralmente para o envio de spam ou tentativa de invasão de senha por força bruta) é a utilização de uma imagem de verificação, chamada de Captcha (sigla para &#8220;Completely Automated Public Turing Test to Tell Computers and Humans Apart&#8221;, ou algo como [...]]]></description>
			<content:encoded><![CDATA[<p>Uma das técnicas utilizadas atualmente para evitar o preenchimento de formulários por robôs (geralmente para o envio de spam ou tentativa de invasão de senha por força bruta) é a utilização de uma imagem de verificação, chamada de Captcha (sigla para &#8220;Completely Automated Public Turing Test to Tell Computers and Humans Apart&#8221;, ou algo como &#8220;Teste público totalmente automatizado para diferenciar humanos de computadores&#8221; no português).</p>
<p>O funcionamento é bem simples: o sistema gera uma imagem com um texto aleatório e uma sessão com uma chave complementar. O usuário, para poder enviar o formulário, deve digitar, num campo apropriado, o conteúdo da imagem. No lado servidor, é feita a verificação dos dados inseridos. Caso esteja OK, o formulário é enviado. Caso contrário, uma mensagem de erro é exibida.</p>
<p>Implementar o Captcha é relativamente simples. Cada um pode desenvolver seu próprio algoritmo ou utilizar um entre os milhares já existente pela internet. No entanto, alguns hospedeiros limitam as extensões passíveis de utilização nos seus servidores, deixando os usuários com uma grande limitação. Uma destas extensões é a biblioteca GDLib, para o PHP.</p>
<p>Sendo assim, como fazer então para que você possa ter a segurança de que o seu formulário não foi preenchido por um robô, mas sem utilizar o Captcha tradicional?</p>
<p>A solução é extremamente simples: Captcha Inverso.</p>
<p>Consiste em se incluir mais um campo no formulário (um input normal), mas com uma classe CSS específica para deixá-lo invisível.</p>
<p>A explicação para isso é que os robôs que preenchem os formulários não conseguem interpretar o CSS. Assim, este campo, que seria oculto, fica visível para aqueles.</p>
<p>Basta, então, verificar no servidor se este campo está preenchido. Caso negativo, os dados são legítimos e você pode dar prosseguimento no seu processamento. Em caso positivo, o formulário foi preenchido por um robô e não deve ser enviado.</p>
<p>Esta solução não é 100% segura (como praticamente tudo na internet), mas já é um bom começo para quem necessita de um mecanismo simples de verificação e, principalmente, não dispõe de muitos recursos disponíveis.</p>
<p>Obs.: mesmo com a utilização do Captcha tradicional, já existem diversos robôs que conseguem &#8220;varrer&#8221; a imagem e descobrir o seu conteúdo, burlando o esquema de segurança.</p>
<p>Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/captcha-inverso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sistema de Login em PHP</title>
		<link>http://www.silviodelgado.com.br/sistema-de-login-em-php/</link>
		<comments>http://www.silviodelgado.com.br/sistema-de-login-em-php/#comments</comments>
		<pubDate>Fri, 09 Nov 2007 00:02:47 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[Assuntos Diversos]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/post.php?id=53</guid>
		<description><![CDATA[Dia desses um colega de trabalho me pediu um help para criar um sistema de login em PHP. Como eu estava meio sem tempo para explicar muita coisa, fiz um sistema básico, com alguns comentários, e resolvi postar aqui para ajudar a mais alguém. Siga os passos: Crie uma página que irá conter o formulário [...]]]></description>
			<content:encoded><![CDATA[<p>Dia desses um colega de trabalho me pediu um <em>help</em> para criar um sistema de login em PHP.<br />
Como eu estava meio sem tempo para explicar muita coisa, fiz um sistema básico, com alguns comentários, e resolvi postar aqui para ajudar a mais alguém.</p>
<p>Siga os passos: Crie uma página que irá conter o formulário de acesso do usuário:</p>
<p><strong>index.php</strong></p>
<p><code>&lt;form action="login.php" method="post"&gt;<br />
Usuário &lt;input type="text" name="TxtLogin" id="TxtLogin" size="15" /&gt;&lt;br /&gt;<br />
Senha &lt;input type="password" name="TxtSenha" id="TxtSenha" size="15" /&gt;&lt;br /&gt;<br />
&lt;input type="submit" name="BtnLogin" id="BtnLogin" value="Login" /&gt;<br />
&lt;/form&gt;</code></p>
<p>Segue abaixo a página que receberá as informações:</p>
<p><strong>login.php</strong></p>
<p><code>&lt;?php<br />
session_start();<br />
if (isset($_POST['BtnLogin']))<br />
{</code><code>// testa se a página foi chamada pelo form de login<br />
    $login = $_POST['TxtLogin'];<br />
    $senha = $_POST['TxtSenha'];<br />
    // se quiser, criptografe para comparar com o banco<br />
    $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die(&#8217;Erro&#8217;);<br />
    mysql_select_db($dbname, $conn);<br />
    $sql = &#8220;SELECT id, nome, email FROM usuarios &#8221;<br />
        .&#8221; WHERE login = &#8216;$login&#8217; AND senha = &#8216;$senha&#8217;&#8221;;<br />
    $result = mysql_query($sql, $conn);<br />
    if (mysql_num_rows($result) &gt; 0) // usuario existe<br />
    {<br />
        // pega o array de resultados<br />
        $dados = mysql_result($result, 0);<br />
        // grava a sessão<br />
        $_SESSION['usuario']['id_user'] = $dados['id'];<br />
        $_SESSION['usuario']['nome'] = $dados['nome'];<br />
        $_SESSION['usuario']['email'] = $dados['email'];<br />
        header(&#8217;Location: logado.php&#8217;);<br />
    }<br />
    else<br />
    {<br />
        header(&#8217;Location: index.php&#8217;);<br />
        // falha na autenticação<br />
    }<br />
    mysql_close();<br />
}<br />
else<br />
{<br />
    header(&#8217;Location: index.php&#8217;);<br />
    // caso negativo, volta para index.php<br />
}<br />
?&gt;</code></p>
<p>Em todas as páginas que o usuário deva estar logado para acessar, insira o seguinte código:</p>
<p><strong>logado.php</strong><br />
<code>&lt;?php<br />
session_start();<br />
if (!isset($_SESSION['usuario']))<br />
{<br />
    header(&#8217;Location: index.php&#8217;); // vai para a página de login<br />
    exit; // é importante para não executar o restante da página<br />
}<br />
// restante do código da página<br />
echo &#8220;Olá, &#8220;.$_SESSION['usuario']['nome'].&#8221;! Seja bem-vindo de volta!&#8221;;<br />
echo &#8220;&lt;br /&gt;&lt;br /&gt;n&#8221;<br />
    .&#8221;&lt;a href=&#8221;logout.php&#8221;&gt;Sair&lt;/a&gt;&#8221;;<br />
?&gt;</code></p>
<p>Para o usuário efetuar o logout, escreva uma página como a seguir:</p>
<p><strong>logout.php</strong></p>
<p><code>&lt;?php<br />
session_start();<br />
session_destroy(); // "mata" TODAS as sessões criadas<br />
// ou<br />
unset($_SESSION['usuario']);<br />
// &#8220;mata&#8221; somente a sessão criada para o usuário<br />
header(&#8217;Location: index.php&#8217;);<br />
?&gt;</code></p>
<p>Espero que seja útil.<br />
Caso queira, poderá utilizar orientação a objetos para isso, inclusive com serialização de dados antes de passar à sessão. Mas isso é assunto para outro post! <img src='http://www.silviodelgado.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/sistema-de-login-em-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>nl2br() no ASP.NET</title>
		<link>http://www.silviodelgado.com.br/nl2br-no-aspnet/</link>
		<comments>http://www.silviodelgado.com.br/nl2br-no-aspnet/#comments</comments>
		<pubDate>Thu, 01 Nov 2007 22:43:03 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[Assuntos Diversos]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/post.php?id=51</guid>
		<description><![CDATA[Uma das funções mais úteis existentes no PHP para utilização em gerenciadores de conteúdo é a nl2br(). Esta função acrescenta, nos textos digitados em controles Textareas, um &#60;br /&#62; ao final de cada linha. Com isso, auxilia na renderização de textos armazenados em banco de dados. Porém, há poucas semanas necessitei de uma função semelhante [...]]]></description>
			<content:encoded><![CDATA[<p>Uma das funções mais úteis existentes no PHP para utilização em gerenciadores de conteúdo é a <strong>nl2br()</strong>.</p>
<p>Esta função acrescenta, nos textos digitados em controles Textareas, um &lt;br /&gt; ao final de cada linha. Com isso, auxilia na renderização de textos armazenados em banco de dados.</p>
<p>Porém, há poucas semanas necessitei de uma função semelhante no ASP.NET e não encontrei.<br />
A solução que desenvolvi foi a seguinte:</p>
<p><code>public string nl2br(string texto)<br />
{<br />
    return texto.Replace("n", "&lt;br /&gt;");<br />
}<br />
</code></p>
<p>Abraços e até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/nl2br-no-aspnet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>INNER JOIN x LEFT OUTER JOIN</title>
		<link>http://www.silviodelgado.com.br/inner-join-x-left-outer-join/</link>
		<comments>http://www.silviodelgado.com.br/inner-join-x-left-outer-join/#comments</comments>
		<pubDate>Sun, 30 Sep 2007 03:49:43 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[Assuntos Diversos]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/post.php?id=46</guid>
		<description><![CDATA[Banco de dados é uma coisa simples&#8230; quando se quer fazer coisas simples! Às vezes, mesmo para se fazer uma coisa simples, é necessário um procedimento um pouco mais rebuscado. Já para fazer uma coisa complicada&#8230; O que eu quero fazer não é complicado, mas como eu nunca trabalhei com os INNER, LEFT, RIGHT, OUTER [...]]]></description>
			<content:encoded><![CDATA[<p>Banco de dados é uma coisa simples&#8230; quando se quer fazer coisas simples!</p>
<p>Às vezes, mesmo para se fazer uma coisa simples, é necessário um procedimento um pouco mais rebuscado. Já para fazer uma coisa complicada&#8230;</p>
<p>O que eu quero fazer não é complicado, mas como eu nunca trabalhei com os INNER, LEFT, RIGHT, OUTER etc., não foi tão trivial assim.</p>
<p><span id="more-50"></span></p>
<p>Estou desenvolvendo um pequeno sistema de cobrança (sim, em PHP mesmo!) onde, na listagem de clientes, entre outras coisas, é exibida a cidade e uf a que pertencem.</p>
<p>Até aí, tudo bem! Nada demais. Fiz um JOIN simples:</p>
<p><code>SELECT cli.*, cid.nome AS nome_cidade, cid.uf<br />
FROM clientes AS cli, cidades AS cid<br />
WHERE cid.id_cidade = cli.cidade</code></p>
<p>O problema é que, da forma como foi feita, a frase só me retorna os clientes cujo campo cidade esteja preenchido com um valor que conste na tabela cidades. Valores nulos ou inexistentes não retornam os registros.</p>
<p>Uma &#8220;solução&#8221; (ou seria bacalhau?? [1]) para isso seria não permitir a deleção da cidade na sua tabela, mas isso acaba nos limitando, por diversos motivos.</p>
<p>Eu nunca fiz um JOIN que me retornasse registros desta forma (com os correspondentes nulos ou inexistentes), mas chegara a hora de ter de fazê-lo.</p>
<p>Pesquisando um pouco (foi pouco mesmo!), descobri como fazer um JOIN que me retornasse o que a query acima me retorna:</p>
<p><code>SELECT * FROM clientes AS cli<br />
INNER JOIN cidades AS cid ON cli.cidade = cid.id_cidade</code></p>
<p>Bom, até aí, tudo bem! Mas não resolveria o meu problema&#8230;</p>
<p>Lembrando um pouco do que eu já tinha lido sobre o tema, vi o &#8220;INNER&#8221; na frase e lembrei do seu &#8220;oposto&#8221;: &#8220;LEFT OUTER&#8221;, que mantém os registros. Logo cheguei à seguinte formulação:</p>
<p><code>SELECT * FROM clientes AS cli<br />
LEFT OUTER JOIN cidades AS cid ON cli.cidade = cid.id_cidade</code></p>
<p>Ei-lo como qui-lo! (Ou quase&#8230;)</p>
<p>A sentença me retornou todos os campos da tabela de clientes, inclusive aquele registro que tinha o cídogi inválido para a cidade. Agora só faltava manipular os nomes dos campos, por causa da duplicidade (nome do cliente x nome da cidade):</p>
<p><code>SELECT cli.*, cid.nome AS nome_cidade, cid.uf<br />
FROM clientes AS cli<br />
LEFT OUTER JOIN cidades AS cid ON cli.cidade = cid.id_cidade</code></p>
<p>Pronto! Estava resolvido o meu problema. E espero que o seu agora também esteja. <img src='http://www.silviodelgado.com.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Até a próxima!</p>
<p>[1] &#8211; O termo provém do antigo ditado que dizia &#8220;pra quem é, bacalhau serve&#8221;, que era um eufemismo para dizer que, para uma pessoa sem muita importância, uma coisa mal-feita já estava bom. Mas isso era no tempo em que bacalhau e manjubinha disputavam clientes no boteco&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/inner-join-x-left-outer-join/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MasterPages e Estrutura de Diretórios (com CSS)</title>
		<link>http://www.silviodelgado.com.br/masterpages-e-estrutura-de-diretorios-com-css/</link>
		<comments>http://www.silviodelgado.com.br/masterpages-e-estrutura-de-diretorios-com-css/#comments</comments>
		<pubDate>Thu, 20 Sep 2007 13:49:25 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[Assuntos Diversos]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/post.php?id=42</guid>
		<description><![CDATA[Trabalhando em um projeto para a web, em ASP.NET e C#, me deparei com um problema que, acredito eu, seja muito comum entre os desenvolvedores: como trabalhar com masterpages em uma estrutura de diretórios complexa (multiníveis)? Após alguns testes, encontrei uma solução que funcionou adequadamente. Não sei se é a melhor maneira de fazer isso [...]]]></description>
			<content:encoded><![CDATA[<p>Trabalhando em um projeto para a web, em ASP.NET e C#, me deparei com um problema que, acredito eu, seja muito comum entre os desenvolvedores: como trabalhar com masterpages em uma estrutura de diretórios complexa (multiníveis)?</p>
<p>Após alguns testes, encontrei uma solução que funcionou adequadamente. Não sei se é a melhor maneira de fazer isso e se você souber, envie para cá que eu publico. <img class="wp-smiley" src="http://www.silviodelgado.com.br/wp-includes/images/smilies/icon_wink.gif" alt=";)" /></p>
<p><span id="more-42"></span></p>
<p>Para as MasterPages funcionarem corretamente com uma estrutura complexa de diretórios, é necessário seguir os passos a seguir:</p>
<p>Estrutura básica dos diretórios de exemplo:</p>
<p><code>[Root]<br />
|<br />
+—{Default.aspx}<br />
|<br />
+—{Default2.aspx}<br />
|<br />
+—[Css]<br />
|    |<br />
|    +—{estilo.css}<br />
|<br />
+—[MasterPages]<br />
|    |<br />
|    +—{MasterPage.master}<br />
|<br />
+—[Images]<br />
|    |<br />
|    +—{imagem1.jpg}<br />
|    |<br />
|    +—[Img1]<br />
|    |<br />
|    +—{imagem2.jpg}<br />
|<br />
+—[Dir1]<br />
|    |<br />
|    +—[Dir1a]<br />
|    |    |<br />
|    |    +—{Default.aspx}<br />
|    |<br />
|    +—{Default.aspx}<br />
|<br />
+—[Dir2]<br />
|<br />
+—{Default.aspx}</code></p>
<p>Para que todas as páginas, independente do nível de diretório em que estejam, acessem o estilo corretamente, é necessário colocar no &lt;head&gt; da MasterPage.master:</p>
<p><code>&lt;head runat="server"&gt;</code></p>
<p>A chamada para a folha de estilos deverá ser feita levando-se em conta a referência do arquivo CSS em relação à MasterPage.master:</p>
<p><code>&lt;link href="../Css/estilo.css" rel="stylesheet" type="text/css" /&gt;</code></p>
<p>Note que o path é informado em HTML normal, não em ASP.NET (”~”).</p>
<p>Dentro da folha de estilos, as chamadas às imagens deverão ser feitas com o caminho relativo do arquivo CSS ao diretório onde as imagens estão armazenadas:</p>
<p><code>.classe1<br />
{<br />
background: White url('../Images/imagem1.jpg') no-repeat;<br />
}</code></p>
<p>Dentro das páginas, caso seja necessário designar uma imagem para um ImageButton, por exemplo, basta colocar o símbolo “~” no caminho da imagem que o compilador traça o caminho corretamente:</p>
<p><code>&lt;asp:ImageButton runat="server" ImageUrl="~/Images/Img1/imagem2.jpg" /&gt;</code></p>
<p>Caso você utilize uma imagem simples (em HTML), utilize a mesma técnica acima e acrescente o runat=”server” à tag &lt;img&gt;:</p>
<p><code>&lt;img src="~/Images/imagem1.jpg" runat="server" /&gt;</code></p>
<p>Para chamar páginas com o Response.Redirect(), é necessário utilizar também o “~”:</p>
<p><code>Response.Redirect("~/Dir1/Default.aspx");</code></p>
<p>Uma solução que resolveria o problema das imagens seria, ao invés de utilizar o “~”, colocar apenas a barra e fornecer o caminho completo relativo ao domínio. No entanto, caso você mude o sistema de diretório (colocando em um subdiretório do que está no momento, por exemplo), todos os caminhos deverão ser revisados, o que enterra a produtividade.</p>
<p>Este sistema “joga” todos os controles para o servidor, o que compromete um pouco a performance, porém o custo x benefício vale muito a pena.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/masterpages-e-estrutura-de-diretorios-com-css/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Photoshop &#8211; Efeito espelhado</title>
		<link>http://www.silviodelgado.com.br/photoshop-efeito-espelhado/</link>
		<comments>http://www.silviodelgado.com.br/photoshop-efeito-espelhado/#comments</comments>
		<pubDate>Fri, 14 Sep 2007 23:49:20 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[Assuntos Diversos]]></category>
		<category><![CDATA[Photoshop]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/post.php?id=39</guid>
		<description><![CDATA[Ontem um colega do trabalho elogiou uma logo que eu fiz para um projeto meu e me pediu que o ensinasse a fazer o efeito. Apesar de ter feito no CorelDraw, depois que aprendi as principais ferramentas do Photoshop, descobri que é bem mais fácil fazer nesta ferramenta, aplicando camadas e máscaras. Então, inaugurando a [...]]]></description>
			<content:encoded><![CDATA[<p>Ontem um colega do trabalho elogiou uma <a href="http://www.housemarket.com.br/" target="_blank">logo</a> que eu fiz para um projeto meu e me pediu que o ensinasse a fazer o efeito.</p>
<p>Apesar de ter feito no CorelDraw, depois que aprendi as principais ferramentas do Photoshop, descobri que é bem mais fácil fazer nesta ferramenta, aplicando camadas e máscaras.</p>
<p>Então, inaugurando a seção Photoshop e uma série de pequenos tutoriais, vou descrever o efeito aqui, para vocês.</p>
<p><span id="more-57"></span></p>
<p>Estou usando o Photoshop CS2 em inglês, então, façam seus ajustes.</p>
<p>Vamos a passo-a-passo:</p>
<p>1 &#8211; Crie um novo documento com fundo preto, tamanho 500 x 200 pixels, resolução de 72 pixels, CMYK de 8 bits e com background transparente;</p>
<p>2 &#8211; Escolha uma cor escura para o fundo (eu utilizei um azul com RGB = 0, 52, 113) e pinte a camada existente;</p>
<p>3 &#8211; Selecione a ferramenta Texto, com uma fonte de boa espessura (na dúvida, escolha Arial Black), tamanho 72, com anti-aliasing Smooth e, como cor, um azul mais claro (RGB = 2, 164, 233);</p>
<p><img src="http://www.silviodelgado.com.br/images/tutoriais/2007-09-14-photoshop/1.jpg" border="1" alt="" /></p>
<p>4 &#8211; Duplique a camada, segure a tecla Shift e mova essa nova camada para baixo (até ficar imediatamente abaixo da camada principal). Em seguida, vá no menu Edit -&gt; Transform -&gt; Flip Vertical. Neste ponto, já temos o nosso espelho, mas agora vamos adicionar os efeitos para dar um toque de realismo;</p>
<p><img src="http://www.silviodelgado.com.br/images/tutoriais/2007-09-14-photoshop/2.jpg" border="1" alt="" /></p>
<p>5 &#8211; Selecione a camada de cópia e adicione uma Máscara e selecione a ferramenta Gradient;</p>
<p>6 &#8211; Retorne as cores do pincel para preto e branco (com o branco de fundo) e selecione o gradiente &#8220;Foreground to Transparent&#8221;;</p>
<p>7 &#8211; Em seguida, clique na máscara criada, clique à meia altura do texto da camada de cópia e arraste até o final da mesma. Durante esta operação, segure o Shift para manter o degradê em 90°;</p>
<p>8 &#8211; Ajuste a opacidade desta camada para 20%;</p>
<p><img src="http://www.silviodelgado.com.br/images/tutoriais/2007-09-14-photoshop/3.jpg" border="1" alt="" /></p>
<p>9 &#8211; Selecione a camada de texto principal e adicione o efeito &#8220;Bevel and Emboss&#8221; (Chanfro e Entalhe). Ajuste o tamanho para 1. Adicione também o efeito &#8220;Gradient Overlay&#8221; (Sobreposição de Degradê). Agora você deve selecionar as cores que deseja para o seu texto e pode dar um efeito de luz direta. Eu utilizei as cores RGB(0, 104, 169) para a base e RGB(172, 225, 250) para o topo;</p>
<p><img src="http://www.silviodelgado.com.br/images/tutoriais/2007-09-14-photoshop/4.jpg" border="1" alt="" /></p>
<p>10 &#8211; O efeito está pronto! Agora só falta ajustar o tamanho final da imagem: com a camada de texto principal selecionada, segure o CTRL e clique na camada adicional (para usuários do Photoshop CS, utilize a âncora &#8211; ao lado do olho de cada camada &#8211; para agrupar camadas). Pressione CTRL + T para redimensionar o conteúdo. Com o Shift pressionado (para manter a escala), segure em uma das pontas do retângulo e altere o tamanho conforme o seu gosto. Ao terminar, pressione Enter para fixá-lo;</p>
<p><img src="http://www.silviodelgado.com.br/images/tutoriais/2007-09-14-photoshop/5.jpg" border="1" alt="" /></p>
<p>11 &#8211; Para dar um efeito ainda mais bonito, adicione o efeito &#8220;Drop Shadow&#8221; (Sombra Projetada) na camada de texto principal. Coloque as seguintes configurações: cor = branca, Blend Mode = Normal, Opacity = 40%, Distance = 0, Size = 20.</p>
<p>12 &#8211; Voilá! Está pronto seu nome com efeito de reflexo!</p>
<p>Veja abaixo o resultado final:</p>
<p><img src="http://www.silviodelgado.com.br/images/tutoriais/2007-09-14-photoshop/6.jpg" border="1" alt="" /></p>
<p>Este tutorial é bem simples, mas mostra como, em poucos passos, dá pra se conseguir um ótimo resultado com os poderosos recursos do Photoshop.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/photoshop-efeito-espelhado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acentuação no AJAX</title>
		<link>http://www.silviodelgado.com.br/acentuacao-no-ajax/</link>
		<comments>http://www.silviodelgado.com.br/acentuacao-no-ajax/#comments</comments>
		<pubDate>Fri, 09 Mar 2007 14:08:30 +0000</pubDate>
		<dc:creator>Silvio Delgado</dc:creator>
				<category><![CDATA[Assuntos Diversos]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[técnicas]]></category>

		<guid isPermaLink="false">http://www.silviodelgado.com.br/post.php?id=26</guid>
		<description><![CDATA[Escrever aplicativos com ajax é a vontade de 11 em cada 10 programadores web atualmente. A linguagem facilita, e muito, a experiência do usuário no site e, além de ser um dos maiores ícones da web 2.0, coloca o(s) responsável(is) pelo projeto na &#8220;vanguarda da tecnologia&#8221; (assim dizem os profetas). Só que nem tudo são [...]]]></description>
			<content:encoded><![CDATA[<p>Escrever aplicativos com ajax é a vontade de 11 em cada 10 programadores web atualmente.<br />
A linguagem facilita, e muito, a experiência do usuário no site e, além de ser um dos maiores ícones da web 2.0, coloca o(s) responsável(is) pelo projeto na &#8220;vanguarda da tecnologia&#8221; (assim dizem os profetas).</p>
<p>Só que nem tudo são flores quando o assunto é AJAX (Asynchronous JavaScript and XML). Principalmente se você for um programador brasileiro, como eu.<br />
Digo isso por causa do nosso belo alfabeto, originado do latim e com seus acentos e caracteres peculiares.</p>
<p>Nós, brasileiros, utilizamos a codificação ISO-8859-1, enquanto que, por padrão, o AJAX trabalha com o UTF-8.<br />
O resultado? Hieróglifos egípcios aparecem no lugar de palavras acentuadas e outros caracteres particulares do nosso idioma.</p>
<p>A solução?</p>
<p>Procurei por diversas soluções, mas nenhuma me atendia satisfatoriamente. Só uma, que posto a seguir:</p>
<p>header(&#8221;Content-Type: text/html; charset=ISO-8859-1&#8243;), true);</p>
<p>Não vou oferecer explicações a respeito da função nativa do PHP, header(). Deixo que vocês mesmos consultem o <a href="http://br.php.net/docs.php" target="_blank">manual</a> da linguagem para que entendam como funciona.</p>
<p>Existem outras alternativas, como modificar o header direto no HTML, com a tag META, mas geralmente não funcionam a contento.</p>
<p>Quem tiver outras soluções funcionais, postem nos comentários.</p>
<p>Abraços a todos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silviodelgado.com.br/acentuacao-no-ajax/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

