<?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>Alexandre.Gaigalas.Net</title>
	
	<link>http://alexandre.gaigalas.net/blog</link>
	<description />
	<lastBuildDate>Tue, 26 Jan 2010 04:13:00 +0000</lastBuildDate>
	
	<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/alganet" /><feedburner:info uri="alganet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Mantendo a Simplicidade com HTML e CSS – Parte 2</title>
		<link>http://feedproxy.google.com/~r/alganet/~3/kQhz90k1hZY/</link>
		<comments>http://alexandre.gaigalas.net/blog/2010/01/mantendo-a-simplicidade-com-html-e-css-parte-2/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 04:13:00 +0000</pubDate>
		<dc:creator>Alexandre Gomes Gaigalas</dc:creator>
				<category><![CDATA[Semântica]]></category>
		<category><![CDATA[Simplicidade no HTML e CSS]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[kiss]]></category>
		<category><![CDATA[markup]]></category>
		<category><![CDATA[simplicodade]]></category>
		<category><![CDATA[tableless]]></category>

		<guid isPermaLink="false">http://alexandre.gaigalas.net/blog/?p=33</guid>
		<description><![CDATA[Veja aqui a Parte 1.
Simplicidade em código pode ser resumida em a menor coisa que funcionar. Se a intenção é exibir um conteúdo, exiba-o da maneira mais simples e direta possível, dentro dos limites do projeto.
Funcionar é a palavra variável do princípio. Texto puro com capturas de tela funciona muito bem para tutoriais, por exemplo. [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Mantendo a Simplicidade com HTML e CSS - Parte 1" href="http://alexandre.gaigalas.net/blog/2009/10/mantendo-a-simplicidade-com-html-e-css-parte-1/">Veja aqui a Parte 1</a>.</p>
<p>Simplicidade em código pode ser resumida em <strong>a menor coisa que funcionar</strong>. Se a intenção é exibir um conteúdo, exiba-o da maneira mais simples e direta possível, dentro dos limites do projeto.</p>
<p><em>Funcionar</em> é a palavra variável do princípio. Texto puro com capturas de tela funciona muito bem para <a title="Publicações de Alexandre Gomes Gaigalas" href="http://gaigalas.net/publicacoes">tutoriais</a>, por exemplo. Para campanhas de marketing é geralmente preciso um pouco mais de apelo na aparência para funcionar.</p>
<p>Animações são excelentes exemplos de facas de dois gumes. Um alerta que aparece animado na tela pode funcionar melhor do que um alerta estático, mas muitos alertas animados podem irritar o visitante. Simplicidade, usabilidade e conforto estão intimamente relacionados.</p>
<p>Projetar HTML para o conteúdo é fácil. A princípio basta deixar de lado qualquer decoração de lado, incluindo fontes, tamanhos, cores e posição dos elementos. Sem essas preocupações, você estará apto a criar uma marcação pura e objetiva.</p>
<p>Nesse e nos próximos posts da série, utilizarei a <a href="http://www.tableless.com.br/contato">página de contato do Tableless</a> como base para nosso projeto simplificado. Eu poderia ter escolhido sites ruins com código sujo, contudo escolhi o Tableless, que já possui um código enxuto e bem-feito, para levar a técnica ao extremo.</p>
<p>Procure extrair o máximo de simplicidade da página. Por exemplo esse topo:</p>
<div id="attachment_36" class="wp-caption aligncenter" style="width: 605px"><img class="size-full wp-image-36 " title="Barra Superior do Tableless.com.br" src="http://alexandre.gaigalas.net/blog/wp-content/uploads/2009/10/screenshot1.png" alt="Barra Superior do Tableless.com.br" width="595" height="98" /><p class="wp-caption-text">Barra Superior do Tableless.com.br</p></div>
<p>Vira um texto similar a isso:</p>
<div id="attachment_37" class="wp-caption aligncenter" style="width: 329px"><img class="size-full wp-image-37" title="Texto Puro da Barra Superior do Tableless.com.br" src="http://alexandre.gaigalas.net/blog/wp-content/uploads/2009/10/screenshot2.png" alt="Texto Puro da Barra Superior do Tableless.com.br" width="319" height="347" /><p class="wp-caption-text">Texto Puro da Barra Superior do Tableless.com.br</p></div>
<p>Note que ignorei a ordem em que os elementos são exibidos. O logo aparece depois da barra superior, mas seu texto é mais visível e importante, por isso coloquei <em>Tableless</em> lá em cima. Ignorei também quaisquer firulas no texto. O que estava em maiúsculo eu digitei como texto normal, porque sei que posso mudar isso por CSS depois.</p>
<p>Dá uma olhada na <a href="http://gaigalas.net/lab/simplicidade/textopuro.txt">versão em texto puro</a>, tomei a liberdade de remover algumas coisas redundantes do conteúdo da página (A parte &#8220;Nós também fazemos&#8221;, por exemplo).</p>
<p>Agora que temos um texto puro, precisamos começar a marcá-lo semanticamente. Nossas ferramentas na próxima parte serão:</p>
<ul>
<li>Tags de marcação de títulos: <strong>&lt;h1&gt;</strong>,<strong>&lt;h2&gt;</strong> e <strong>&lt;h3&gt; </strong>(tem<strong>&lt;h4&gt;</strong>,<strong>&lt;h5&gt;</strong> e<strong>&lt;h6&gt;</strong> mas não precisaremos desses)</li>
<li>Parágrafos <strong>&lt;p&gt;</strong> e imagens <strong>&lt;img&gt;</strong></li>
<li>Formulários <strong>&lt;form&gt;</strong></li>
<li>Grupos de campos <strong>&lt;fieldset&gt;</strong> com legendas <strong>&lt;legend&gt;</strong></li>
<li>Campos de formulários <strong>&lt;input&gt;</strong>, <strong>&lt;textarea&gt;</strong> e <strong>&lt;button&gt;</strong></li>
<li>Listas sem ordem específica <strong>&lt;ul&gt;</strong> e itens de lista <strong>&lt;li&gt;</strong></li>
</ul>
<p>Apenas com esses elementos, iniciaremos a reconstrução da barra superior mantendo o foco na simplicidade. Se eu demorar pra publicar a parte 3, puxem minha orelha nos comentários ou no twitter <a href="http://twitter.com/alganet">@alganet</a></p>
<ul><strong> </strong></ul>
]]></content:encoded>
			<wfw:commentRss>http://alexandre.gaigalas.net/blog/2010/01/mantendo-a-simplicidade-com-html-e-css-parte-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://alexandre.gaigalas.net/blog/2010/01/mantendo-a-simplicidade-com-html-e-css-parte-2/</feedburner:origLink></item>
		<item>
		<title>goo.gl: Encurte URLs com o novo serviço do Google</title>
		<link>http://feedproxy.google.com/~r/alganet/~3/8YAtB_zvnJY/</link>
		<comments>http://alexandre.gaigalas.net/blog/2009/12/goo-gl-encurte-urls-com-o-novo-servico-do-google/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 04:26:03 +0000</pubDate>
		<dc:creator>Alexandre Gomes Gaigalas</dc:creator>
				<category><![CDATA[Hacks]]></category>
		<category><![CDATA[encurtador]]></category>
		<category><![CDATA[goo.gl]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[migre.me]]></category>

		<guid isPermaLink="false">http://alexandre.gaigalas.net/blog/?p=84</guid>
		<description><![CDATA[Ontem mesmo o Google lançou seu próprio serviço de encurtar URLs, o goo.gl. Inicialmente apenas usuários da Google Toolbar e do Feedburner poderiam encurtar suas URLs, mas aparentemente até mesmo a Google Toolbar não estava encurtando como devia.
Como sou bicho curioso, resolvi inspecionar o funcionamento dos cabeçalhos HTTP no momento em que a toolbar compartilhava [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_87" class="wp-caption aligncenter" style="width: 443px"><a href="http://gaigalas.net/lab/googl"><img class="size-full wp-image-87" title="Encurte usando o goo.gl" src="http://alexandre.gaigalas.net/blog/wp-content/uploads/2009/12/screenshot1.png" alt="Encurte usando o goo.gl" width="433" height="215" /></a><p class="wp-caption-text">Encurte usando o goo.gl</p></div>
<p>Ontem mesmo o Google lançou seu próprio serviço de encurtar URLs, o <a href="http://goo.gl">goo.gl</a>. Inicialmente apenas usuários da Google Toolbar e do Feedburner poderiam encurtar suas URLs, mas aparentemente até mesmo a Google Toolbar não estava encurtando como devia.</p>
<p>Como sou bicho curioso, resolvi inspecionar o funcionamento dos cabeçalhos HTTP no momento em que a toolbar compartilhava links e notei que, embora a barra <strong>fizesse</strong> a requisição nos servidores do Google, essa requisição falhava. Também havia um parâmetro obscuro de autenticação que eu não pude compreender.</p>
<p>Abri o código do arquivo .xpi da Google Toolbar e fuçei até encontrar a função que gera o token de autenticação. Fiz algumas alterações nela pra funcionar fora do ambiente de extensões do Firefox e comecei a testar! Também custou pra descobrir que as chamadas tem que ser feitas em uma URL específica: /api/url, o que indica que provavelmente eles abrirão essa API no futuro. De qualquer forma, consegui! E aqui estou compartilhando com vocês um encurtador-protótipo:</p>
<p><a href="http://gaigalas.net/lab/googl">http://gaigalas.net/lab/googl</a></p>
<p>Para quem não leu as letras miúdas na página, fiz uma breve sacanagem: Qualquer link encurtado por aí passa pelo migre.me. Yep. Você leva a URL do migre.me se quiser contar estatísticas e tudo mais, coisa que o Google não faz.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexandre.gaigalas.net/blog/2009/12/goo-gl-encurte-urls-com-o-novo-servico-do-google/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://alexandre.gaigalas.net/blog/2009/12/goo-gl-encurte-urls-com-o-novo-servico-do-google/</feedburner:origLink></item>
		<item>
		<title>Aba de serviços do Chrome OS no Firefox</title>
		<link>http://feedproxy.google.com/~r/alganet/~3/iPG6XJMVJz4/</link>
		<comments>http://alexandre.gaigalas.net/blog/2009/11/aba-de-servicos-do-chrome-os-no-firefox/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 10:49:55 +0000</pubDate>
		<dc:creator>Alexandre Gomes Gaigalas</dc:creator>
				<category><![CDATA[Hacks]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[chrome os]]></category>
		<category><![CDATA[chromium os]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[user agent string]]></category>
		<category><![CDATA[user agent switcher]]></category>

		<guid isPermaLink="false">http://alexandre.gaigalas.net/blog/?p=72</guid>
		<description><![CDATA[Rapidinha pra quem é curioso: O Chrome OS do Google abre uma aba com os serviços &#8220;na nuvem&#8221; mais populares que ele julgou ser úteis. Rola até um Hotmail e Yahoo Mail, pois é.
Configuraram a página para que somente um Chrome OS pudesse acessar, mas é facilmente burlável.
Cada navegador, em cada sistema operacional, identifica-se de [...]]]></description>
			<content:encoded><![CDATA[<p>Rapidinha pra quem é curioso: O Chrome OS do Google abre uma aba com os serviços &#8220;na nuvem&#8221; mais populares que ele julgou ser úteis. Rola até um Hotmail e Yahoo Mail, pois é.</p>
<p>Configuraram a página para que somente um Chrome OS pudesse acessar, mas é facilmente burlável.</p>
<p>Cada navegador, em cada sistema operacional, identifica-se de uma maneira ao acessar uma página. Basta <a href="https://addons.mozilla.org/en-US/firefox/addon/59">fazermos o Firefox identificar-se como outro navegador</a>, o Chrome no Chrome OS e voilá, podemos acessar.</p>
<p>A user agent string do Chrome no Chrome OS é:</p>
<blockquote><p>Mozilla/5.0 (X11; U; CrOS i686 9.10.0; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.253.0 Safari/532.5</p></blockquote>
<p>Depois de alterar a user agent string, acesse o endereço da aba: <a href="http://welcome-cros.appspot.com/menu">http://welcome-cros.appspot.com/menu</a></p>
<p>Aqui uma screenshot:</p>
<div id="attachment_73" class="wp-caption aligncenter" style="width: 496px"><img class="size-full wp-image-73  " title="Aba de serviços do Chrome OS no Firefox" src="http://alexandre.gaigalas.net/blog/wp-content/uploads/2009/11/screenshot5.png" alt="Aba de serviços do Chrome OS no Firefox" width="486" height="387" /><p class="wp-caption-text">Aba de serviços do Chrome OS no Firefox</p></div>
<p><strong>UPDATE:</strong> Use isso somente como teste, sites podem não funcionar <strong>violentamente</strong> se você mantiver essa user agent string como padrão <img src='http://alexandre.gaigalas.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://alexandre.gaigalas.net/blog/2009/11/aba-de-servicos-do-chrome-os-no-firefox/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://alexandre.gaigalas.net/blog/2009/11/aba-de-servicos-do-chrome-os-no-firefox/</feedburner:origLink></item>
		<item>
		<title>Chromium OS (Google Chrome OS versão Open Source)</title>
		<link>http://feedproxy.google.com/~r/alganet/~3/SQUq7t2mAOw/</link>
		<comments>http://alexandre.gaigalas.net/blog/2009/11/chromium-os-google-chrome-os-versao-open-source/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 01:50:58 +0000</pubDate>
		<dc:creator>Alexandre Gomes Gaigalas</dc:creator>
				<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://alexandre.gaigalas.net/blog/?p=65</guid>
		<description><![CDATA[Hoje a tarde o Google liberou o código-fonte do Chromium OS, a versão open source do sistema operacional que eles estão desenvolvendo.
Rapidinho fui um dos primeiros a baixar, compilar e distribuir a máquina virtual.
Fiz um vídeo com o Jonny Ken mostrando o funcionamento do sistema operacional e subi um torrent para quem quiser baixá-lo.
O formato [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje a tarde o Google liberou o código-fonte do Chromium OS, a versão open source do sistema operacional que eles estão desenvolvendo.</p>
<p>Rapidinho fui um dos primeiros a baixar, compilar e distribuir a máquina virtual.</p>
<p>Fiz um vídeo com o <a href="http://infopod.com.br">Jonny Ken</a> <a href="http://www.infopod.com.br/review/testamos-o-chromium-os-o-sistema-operacional-do-google">mostrando o funcionamento do sistema operacional</a> e subi <a href="http://torrentz.com/0b6a23ea10e323222a9ad62d28e3639ee2b0980c">um torrent para quem quiser baixá-lo</a>.</p>
<p>O formato é o VMDK, compatível pra rodar em máquinas virtuais VMWare e VirtualBox. Publiquei também um <a href="http://gaigalas.net/Artigos/ChromiumOSVirtualBox.html">tutorial sobre como usar o VirtualBox</a> para rodá-lo.</p>
<p><strong>ATUALIZAÇÃO:</strong> Publiquei um <a href="http://migre.me/cfQF">tutorial pra gravar o Chromium OS em um drive USB</a>.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="445" height="364" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/4yULtEY2Kv0&amp;hl=en_US&amp;fs=1&amp;rel=0&amp;color1=0x234900&amp;color2=0x4e9e00&amp;border=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="445" height="364" src="http://www.youtube.com/v/4yULtEY2Kv0&amp;hl=en_US&amp;fs=1&amp;rel=0&amp;color1=0x234900&amp;color2=0x4e9e00&amp;border=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://alexandre.gaigalas.net/blog/2009/11/chromium-os-google-chrome-os-versao-open-source/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		<feedburner:origLink>http://alexandre.gaigalas.net/blog/2009/11/chromium-os-google-chrome-os-versao-open-source/</feedburner:origLink></item>
		<item>
		<title>Como fazer o PHP continuar após a página carregar</title>
		<link>http://feedproxy.google.com/~r/alganet/~3/TDt6B0sjUDE/</link>
		<comments>http://alexandre.gaigalas.net/blog/2009/10/como-fazer-o-php-continuar-apos-a-pagina-carregar/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 12:00:44 +0000</pubDate>
		<dc:creator>Alexandre Gomes Gaigalas</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[HTTP]]></category>

		<guid isPermaLink="false">http://alexandre.gaigalas.net/blog/?p=41</guid>
		<description><![CDATA[A mágica toda está na função ignore_user_abort(), basta chamá-la com o primeiro parâmetro true e a página continuará processando mesmo após o usuário cancelar o carregamento (botão Stop do navegador, geralmente). Também é possível fazer o PHP parar em um determinado momento o carregamento da página e continuar em background, mas é um pouco mais [...]]]></description>
			<content:encoded><![CDATA[<p>A mágica toda está na função <a title="ignore_user_abort() no php.net" href="http://www.php.net/manual/en/function.ignore-user-abort.php">ignore_user_abort()</a>, basta chamá-la com o primeiro parâmetro <em>true</em> e a página continuará processando mesmo após o usuário cancelar o carregamento (botão Stop do navegador, geralmente). Também é possível fazer o PHP parar em um determinado momento o carregamento da página e continuar em background, mas é um pouco mais engenhoso, em no mínimo oito linhas:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><a href="http://www.php.net/ob_start"><span class="kw3">ob_start</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Pra segurar o buffer de saída</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/ignore_user_abort"><span class="kw3">ignore_user_abort</span></a><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>; <span class="co1">//A mágica</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Minha página&quot;</span>; <span class="co1">//Aqui vai o que será exibido no navegador</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Connection: close&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Pra dizer ao navegador fechar a conexão (ignora o Keep-Alive)</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$len</span> = <a href="http://www.php.net/ob_get_length"><span class="kw3">ob_get_length</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Armazena o tamanho do buffer de saída</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Content-length: $len&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Pra informar ao navegador o tamanho do buffer</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/ob_end_flush"><span class="kw3">ob_end_flush</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;flush<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Pra enviar o buffer de saída de uma vez</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/mail"><span class="kw3">mail</span></a><span class="br0">&#40;</span><span class="st0">&#8216;example@example.com&#8217;</span>, <span class="st0">&#8216;Teste&#8217;</span>, <span class="st0">&#8216;Teste&#8217;</span><span class="br0">&#41;</span>; <span class="co1">//Qualquer processamento em background</span></div>
</li>
</ol>
</div>
<p><a title="PHP.net - Connection Handling" href="http://www.php.net/manual/en/features.connection-handling.php">Mais informações aqui</a> (em inglês).</p>
]]></content:encoded>
			<wfw:commentRss>http://alexandre.gaigalas.net/blog/2009/10/como-fazer-o-php-continuar-apos-a-pagina-carregar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://alexandre.gaigalas.net/blog/2009/10/como-fazer-o-php-continuar-apos-a-pagina-carregar/</feedburner:origLink></item>
		<item>
		<title>Controlar o nível de isolamento de consultas no MySQL</title>
		<link>http://feedproxy.google.com/~r/alganet/~3/dZrrjhUSJ9Y/</link>
		<comments>http://alexandre.gaigalas.net/blog/2009/10/controlar-o-nivel-de-isolamento-de-consultas-no-mysql/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 14:24:32 +0000</pubDate>
		<dc:creator>Alexandre Gomes Gaigalas</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[ACID]]></category>

		<guid isPermaLink="false">http://alexandre.gaigalas.net/blog/?p=43</guid>
		<description><![CDATA[Transações em bancos de dados SQL são ACID:

Atômicas (uma transação não pode ser dividida e tratada em partes)
Consistentes (uma transação interrompida não deixa vestígios)
Isoladas (uma transação nunca interage com outra até terminar)
Duráveis (se algo acontecer errado, o banco saberá voltar as alterações. Persistentes seria melhor, mas ACIP fica estranho).

São características fantásticas do ponto de vista [...]]]></description>
			<content:encoded><![CDATA[<p>Transações em bancos de dados SQL são <strong>ACID</strong>:</p>
<ul>
<li><em>Atômicas</em> (uma transação não pode ser dividida e tratada em partes)</li>
<li><em>Consistentes</em> (uma transação interrompida não deixa vestígios)</li>
<li><em>Isoladas</em> (uma transação nunca interage com outra até terminar)</li>
<li><em>Duráveis</em> (se algo acontecer errado, o banco saberá voltar as alterações. Persistentes seria melhor, mas ACIP fica estranho).</li>
</ul>
<p>São características fantásticas do ponto de vista funcional, mas geram problemas. O isolamento é uma frequente causa de problemas de performance, porque faz com que as tabelas fiquem travadas em determinadas transações. Se uma tabela com atualizações frequentes é também alvo de consultas demoradas e complexas, que cobrem uma grande quantidade de registros, é possível que uma grande fila de processos se acumule.</p>
<p>A maneira simples de evitar isso é controlar o nível de isolamento (e romper o princípio ACID) utilizando o comando <strong>SET TRANSACTION ISOLATION LEVEL</strong>. Quatro variações são possíveis:</p>
<ul>
<li>SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, pra ler dados de quaisquer transações não-completadas</li>
<li>SET TRANSACTION ISOLATION LEVEL READ COMMITTED, pra ler dados somente de transações completas, incluindo comandos internos</li>
<li>SET TRANSACTION ISOLATION LEVEL REPEATABLE READ, pra ler dados somente de transações completas</li>
<li>SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, pra utilizar em conjunto com SELECT&#8230;LOCK IN SHARE MODE</li>
</ul>
<p>A diferença real entre o READ COMMITED e o REPEATABLE READ acontece em transações com mais de um comando. Se você enviar, por exemplo, uma série de consultas e atualizações dentro de uma mesma transação, os dois modos lerão dados de pontos diferentes:</p>
<ul>
<li>READ COMMITED atualizará os dados de leitura a cada comando. Um update em seguida do outro utilizará os dados atualizados, respeitando a transação no qual eles se encontram.</li>
<li>REPEATABLE READ utilizará sempre um único conjunto de dados inicial. Se você efetuar várias atualizações, as leituras serão feitas do mesmo conjunto inicial sempre, relativo ao início da transação. Esse é o modo padrão no MySQL.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://alexandre.gaigalas.net/blog/2009/10/controlar-o-nivel-de-isolamento-de-consultas-no-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://alexandre.gaigalas.net/blog/2009/10/controlar-o-nivel-de-isolamento-de-consultas-no-mysql/</feedburner:origLink></item>
		<item>
		<title>Mantendo a Simplicidade com HTML e CSS – Parte 1</title>
		<link>http://feedproxy.google.com/~r/alganet/~3/jzMph4zrx9k/</link>
		<comments>http://alexandre.gaigalas.net/blog/2009/10/mantendo-a-simplicidade-com-html-e-css-parte-1/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 02:19:28 +0000</pubDate>
		<dc:creator>Alexandre Gomes Gaigalas</dc:creator>
				<category><![CDATA[Simplicidade no HTML e CSS]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Ghiaweb]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HtmlCss.com.br]]></category>
		<category><![CDATA[Semântica]]></category>
		<category><![CDATA[simplicidade]]></category>

		<guid isPermaLink="false">http://alexandre.gaigalas.net/blog/?p=29</guid>
		<description><![CDATA[Projetar coisas simples não deveria ser complicado, e não é. Difícil é projetar coisas complexas de maneira simples, atingir os requisitos do software enquanto mantém a simplicidade do código. Quer complicar mais ainda? Projetar e manter a simplicidade enquanto os requisitos do software mudam.
Refatorar também é importante. É simplificar código sem reduzir a funcionalidade. Você [...]]]></description>
			<content:encoded><![CDATA[<p>Projetar coisas simples não deveria ser complicado, e não é. Difícil é projetar coisas complexas de maneira simples, atingir os requisitos do software <strong>enquanto</strong> mantém a simplicidade do código. Quer complicar mais ainda? Projetar e manter a simplicidade enquanto os requisitos do software <strong>mudam</strong>.</p>
<p>Refatorar também é importante. É simplificar código sem reduzir a funcionalidade. Você pega aquele código yakissoba (PHP+HTML+CSS+JavaScript quem curte?) de 500 linhas e reduz pra meia dúzia de pequenas funções de 10 ou 15 linhas. Ou pega aquele CSS monstro <a title="Semântica no HTML" href="http://www.acordapraweb.com/semantica-no-html-classes-e-ids/">cheio de classes e IDs desnecessários</a> e enxuga ao máximo.</p>
<p>Eu geralmente inicio meus projetos em CSS de maneira bem simples. Uso o mínimo de classes e ids possível, e se uso eu procuro <a title="Padrões de class e id em HTML e CSS" href="http://www.acordapraweb.com/quel-tal-nao-criar-mais-html/">seguir um padrão uniforme</a>. Meu último projeto pessoal, o <a title="HtmlCss.com.br" href="http://htmlcss.com.br/">HtmlCss.com.br</a> tem um código enxutíssimo. Projetei para que um iniciante pudesse abrir o fonte, ler e aprender com o código.</p>
<div id="attachment_30" class="wp-caption aligncenter" style="width: 579px"><img class="size-full wp-image-30" title="Ghiaweb" src="http://alexandre.gaigalas.net/blog/wp-content/uploads/2009/10/screenshot7.png" alt="Framework feito para simplicidade" width="569" height="374" /><p class="wp-caption-text">Ghiaweb: Framework feito para simplicidade</p></div>
<p>Talvez meu melhor exemplo de código enxuto é o <a title="Ghiaweb: Engine CSS para sistemas web" href="http://code.google.com/p/ghiaweb/">Ghiaweb</a>, que é um <em>framework</em> para construir <span style="text-decoration: line-through;">sites</span> sistemas na internet. O <a title="Ghiaweb: Exemplo" href="http://ghiaweb.googlecode.com/svn/trunk/html5.html">exemplo que está no ar</a>, com um formulário consideravelmente complexo e um menu drop-down, não possui nenhum elemento HTML desnecessário, nenhuma classe nem ID. O código HTML é legível e organizado, simples de manter, adicionar novos campos ou seções no formulário sem prévio conhecimento da folha de estilos.</p>
<p>É <strong>muito comum</strong> ver formulários desenhados com várias classes, ids, parágrafos, divs e tudo mais. Muitas vezes, o desenvolvedor adiciona esses elementos para posicionar tudo da maneira que deseja. As classes e ids são pra localizar os elementos, para que as regras CSS possam ser aplicadas. Os elementos extra muitas vezes são somente para que as classes e ids sejam utilizadas (um perigoso círculo vicioso).</p>
<p>Uma série de práticas para manter a simplicidade, e que pretendo explicar nos próximos posts, é:</p>
<ul>
<li><strong>Projetar para o conteúdo</strong>: <a title="Semântica no HTML" href="http://www.acordapraweb.com/semantica-no-html-abolicao-da-escravatura/">Construir o HTML primeiro e não mexer mais nele</a>. Só depois construir o CSS.</li>
<li><strong>Utilização de seletores</strong>: Encontrar <em>exatamente</em> o elemento que você quiser, sem adicionar classes e ids nele.</li>
<li><strong>Semântica dos órfãos do HTML</strong>: Aprender a utilizar um vocabulário de elementos melhor que <em>divs</em> e <em>spans</em>.</li>
<li><strong>Limitações:</strong> Como imagens de fundo, estilos em tabelas e elementos-McGyver.</li>
</ul>
<p>Aguardo comentários <img src='http://alexandre.gaigalas.net/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://alexandre.gaigalas.net/blog/2009/10/mantendo-a-simplicidade-com-html-e-css-parte-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://alexandre.gaigalas.net/blog/2009/10/mantendo-a-simplicidade-com-html-e-css-parte-1/</feedburner:origLink></item>
		<item>
		<title>A Lei de Brooks e Projetos Marcha da Morte</title>
		<link>http://feedproxy.google.com/~r/alganet/~3/507uNkzFhaY/</link>
		<comments>http://alexandre.gaigalas.net/blog/2009/10/a-lei-de-brooks-e-projetos-marcha-da-mort/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 21:09:06 +0000</pubDate>
		<dc:creator>Alexandre Gomes Gaigalas</dc:creator>
				<category><![CDATA[Gerenciamento]]></category>
		<category><![CDATA[Metodologias]]></category>
		<category><![CDATA[Gerenciamento de Projetos]]></category>
		<category><![CDATA[Lei de Brooks]]></category>
		<category><![CDATA[Marcha da Morte]]></category>
		<category><![CDATA[TI]]></category>

		<guid isPermaLink="false">http://alexandre.gaigalas.net/blog/?p=20</guid>
		<description><![CDATA[Provavelmente, os profissionais mais experientes na área já sentiram, bateram a cabeça e assimilaram o que Fred Brooks documentou cerca de 30 anos atrás. Eu não li o Mythical Man-Month, que é um dos livros que presumidamente deu origem a uma nova série de metodologias de desenvolvimento de software. Eu li sobre ele e me [...]]]></description>
			<content:encoded><![CDATA[<p>Provavelmente, os profissionais mais experientes na área já sentiram, bateram a cabeça e assimilaram o que Fred Brooks documentou cerca de 30 anos atrás. Eu não li o Mythical Man-Month, que é um dos livros que presumidamente deu origem a uma nova série de metodologias de desenvolvimento de software. Eu li <em>sobre</em> ele e me identifiquei. A lei é bem simples:</p>
<p><strong>Colocar mais programadores pra trabalhar em um projeto atrasado vai atrasá-lo mais ainda</strong>.</p>
<p>Poxa, contra-intuitivo, né? Se você coloca mais gente pra trabalhar, o projeto deveria andar mais rápido. Não funciona assim pelos seguintes motivos:</p>
<ul>
<li>Um programador recém-introduzido em uma equipe coesa demora para tornar-se produtivo</li>
<li>Programadores recém-introduzidos tendem a interromper e atrasar os membros de longa data do projeto</li>
<li>Quanto mais gente, mais nós a informação tem que trafegar para comunicar. É mais simples &#8220;sincronizar&#8221; com pouca gente experiente do que muita gente inexperiente.</li>
</ul>
<p>Opa, claro que existem as exceções. É possível por exemplo contratar gente pra <em>tirar o entulho do caminho</em>. Programadores pra criar ferramentas ao invés de desenvolver novos recursos, cuidar de compatibilidade, testes de qualidade, unitários e tudo mais. Mesmo assim, a vantagem muitas vezes não compensará o custo desses profissionais.</p>
<div id="attachment_25" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-25" title="Epic Fail" src="http://alexandre.gaigalas.net/blog/wp-content/uploads/2009/10/epic-fail.jpg" alt="Epic Fail: Uma Realidade em 40% dos projetos de TI" width="500" height="421" /><p class="wp-caption-text">Epic Fail: Uma Realidade em 40% dos projetos de TI</p></div>
<p>Brooks não teve um insight do nada, ao tomar uma cerveja e coçar o joelho. Seu livro é resultado das experiências de desenvolvimento do projeto OS/360 da IBM, no qual ele foi gerente. Ao longo do tempo, muitos outros profissionais acabaram experimentando situações compatíveis com as idéias de Brooks.</p>
<p>Essa lei está intimamente ligada com os famigerados <strong>projetos marcha da morte</strong>. Provavelmente você já trabalhou ou conhece alguém que trabalhou em um. Nem precisa ser um projeto de TI, basta ter as seguintes características:</p>
<ul>
<li>A expectativa dos líderes quanto ao lucro, prazo ou sucesso do projeto é otimista demais ou não-realista.</li>
<li>Um grupo diretamente responsável pelo desenvolvimento do projeto não acredita mais no sucesso do mesmo.</li>
<li>O desgaste emocional e físico é crescente. São solicitadas, exigidas ou impostas horas-extra e fins de semana de trabalho.</li>
</ul>
<p>Projetos marcha da morte são projetos destinados a falhar, que fugiram do escopo ou estouraram o prazo. Não há salvação, e todos da equipe sabem disso e continuam apenas porque são obrigado a fazê-lo.</p>
<p>Note que não há nada errado em fazer horas-extra ou adicionar novos membros na equipe, desde que o <em>momento</em> seja adequado. Muitas vezes, profissionais <em>workaholics</em> gostam de trabalhar mais para entregar mais cedo. Projetos saudáveis sempre estão abertos para novos membros que possam adicionar valor à equipe. O difícil é identificar esses momentos, um talento que vai além do bom senso.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexandre.gaigalas.net/blog/2009/10/a-lei-de-brooks-e-projetos-marcha-da-mort/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://alexandre.gaigalas.net/blog/2009/10/a-lei-de-brooks-e-projetos-marcha-da-mort/</feedburner:origLink></item>
		<item>
		<title>OpenID e Oauth: Autenticação e Autorização Descentralizada</title>
		<link>http://feedproxy.google.com/~r/alganet/~3/eGtfnykOUaE/</link>
		<comments>http://alexandre.gaigalas.net/blog/2009/09/openid-oauth-autenticacao-descentralizad/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 04:47:27 +0000</pubDate>
		<dc:creator>Alexandre Gomes Gaigalas</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Autenticação]]></category>
		<category><![CDATA[Autorização]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Google Friend Connect]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[phpMyID]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Windows Live]]></category>

		<guid isPermaLink="false">http://alexandre.gaigalas.net/blog/?p=8</guid>
		<description><![CDATA[
OpenID é o tipo de coisa que você lê, pensa &#8220;poxa que legal&#8221;, fecha o artigo e nunca mais abre na vida. Orientação a Objetos era assim algumas décadas atrás: Todo mundo falava sobre, mas raramente alguém sabia do que estava falando, e quem lia não tinha a mínima idéia da utilidade daquilo.
Pra quem nunca [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">
<div id="attachment_9" class="wp-caption aligncenter" style="width: 310px"><img class="size-full wp-image-9" title="Autenticação" src="http://alexandre.gaigalas.net/blog/wp-content/uploads/2009/09/old_keys.jpg" alt="Chaves: zaz, zaz" width="300" height="200" /><p class="wp-caption-text">Chaves: zaz, zaz</p></div>
<p><strong>OpenID</strong> é o tipo de coisa que você lê, pensa &#8220;poxa que legal&#8221;, fecha o artigo e nunca mais abre na vida. Orientação a Objetos era assim algumas décadas atrás: Todo mundo falava sobre, mas raramente alguém sabia do que estava falando, e quem lia não tinha a mínima idéia da utilidade daquilo.</p>
<p>Pra quem nunca leu, a idéia é simples:</p>
<ul>
<li>Seu login e senha fica em um só servidor (login+senha fica mais bonito se chamarmos de <em>credencial</em>).</li>
<li>O servidor não precisa saber o que você pode ou não acessar (autorização), ele só precisa saber quem você é (autenticação).</li>
<li>Qualquer um pode montar um servidor.</li>
</ul>
<p>O que naturalmente, em 99,78% dos casos, leva as seguintes perguntas:</p>
<ul>
<li>Se qualquer um pode ter um servidor, como é a segurança disso?</li>
<li>Bacana, mas quem usa isso?</li>
</ul>
<p>A segurança não é um problema, realmente. Se você criar um servidor e montar um usuário &#8220;admin&#8221; com uma senha qualquer, isso não significa que você poderá acessar o usuário &#8220;admin&#8221; de outro site. <strong>Um servidor pode autenticar somente credenciais que ele gerencia</strong>. Um exemplo simples e real:</p>
<ol>
<li>Um fulano qualquer entra em um blogger qualquer, o <a title="Google Testing Blog" href="http://googletesting.blogspot.com/">Google Testing Blog</a> por exemplo.</li>
<li>Fulano acha o conteúdo bastante interessante! Lá no canto ele vê um &#8220;Followers&#8221; e como é um cara bem-informado, sabe que o Google Friend Connect usa, entre outros provedores de autenticação, OpenID.</li>
<li>Fulano clica em &#8220;Follow&#8221;, escolhe o ícone do OpenID.</li>
<li>Fulano digita seu OpenID, que é simplesmente http://gaigalas.net (eu mesmo montei um servidorzinho!).</li>
<li>Servidor do Blogger delega autenticação para o servidor do Gaigalas, que pede usuário e senha.</li>
<li>Fulano digita seu usuário e senha (ou não, se já tiver feito isso e estiver salvo na sessão. Igual o &#8220;Lembrar de mim&#8221; do GMail).</li>
<li>Servidor do Gaigalas redireciona de volta para o servidor do Blogger, com um &#8220;OK&#8221;.</li>
<li>Blogger agora sabe que o misterioso visitante identificado por &#8220;http://gaigalas.net&#8221; é Alexandre Gaigalas, e está autenticado!</li>
</ol>
<div id="attachment_14" class="wp-caption aligncenter" style="width: 633px"><img class="size-full wp-image-14" title="OpenID no Blogger" src="http://alexandre.gaigalas.net/blog/wp-content/uploads/2009/09/screenshot3.png" alt="Autenticação via OpenID no Blogger" width="623" height="299" /><p class="wp-caption-text">Autenticação via OpenID no Blogger</p></div>
<p>O Blogger não precisou perguntar pro servidor do Gaigalas quais as permissões de acesso do visitante misterioso. Ele assume, deduz, determina isso da maneira que bem entender. O importante é ele saber que aquele vistante é o Alexandre Gaigalas, identificado por &#8220;http://gaigalas.net&#8221;, e sempre que alguém identificar-se da mesma forma no futuro, esse alguém será o mesmo Alexandre.</p>
<p>Coisas bacanas:</p>
<ul>
<li>A opção &#8220;Lembrar de mim&#8221; funciona globalmente. Você loga só uma vez pro primeiro serviço, depois apenas utiliza a mesma sessão para os demais</li>
<li>Se você mudar sua senha, pode mudar em todos os serviços ao mesmo tempo</li>
<li>Você pode ter várias credenciais, da mesma forma que uma autenticação normal</li>
</ul>
<p>Pra quem se interessou, pode obter um OpenID de várias formas: Uma Google Account ou Windows Live ID por exemplo são também OpenIDs. É possível montar seu próprio servidor usando o <a title="phpMyID" href="http://siege.org/projects/phpMyID/">phpMyID</a>.</p>
<p>Mas, e o <strong>OAuth</strong>?</p>
<p>Se o OpenID era autenticação (quem entra) o OAuth é autorização (onde entra). Cenário simples denovo:</p>
<ul>
<li>Fulano entra na <a title="This Is It: Twitter Poll" href="http://www.thisisitpoll.com">enquete do novo filme do Michael Jackson</a></li>
<li>Fulano escolhe as músicas e clica em &#8220;Save&#8221; para salvar suas escolhas</li>
<li>Site do Michael Jackson conectará ao Twitter no qual o usuário se autenticará (que pode ser com OpenID, vide acima!)</li>
<li>Twitter, após autenticar o usuário como Alexandre, pergunta se deseja que o site do Michael Jackson ganhe permissão para acessar o Twitter do usuário</li>
<li>Alexandre aceita</li>
<li>Twitter redireciona para o site do Michael Jackson com um &#8220;OK&#8221; e chaves de autorização</li>
<li>Site do Michael Jackson agora está livre para utilizar o Twitter em nome de Alexandre</li>
</ul>
<div id="attachment_15" class="wp-caption aligncenter" style="width: 586px"><img class="size-full wp-image-15" title="Enquete do Michael Jackson Solicitando Autorização via OAuth" src="http://alexandre.gaigalas.net/blog/wp-content/uploads/2009/09/screenshot5.png" alt="Enquete do Michael Jackson Solicitando Autorização via OAuth" width="576" height="416" /><p class="wp-caption-text">Enquete do Michael Jackson Solicitando Autorização via OAuth</p></div>
<p>Bacana não? O Twitter é um dos pioneiros em OAuth na internet, e milhares de aplicações no mundo já utilizam o padrão.</p>
<p>OpenID tem bastantes provedores, mas poucos consumidores. É raro encontrar um site que aceite OpenID. <a href="http://www.facebook.com">Facebook</a>, por exemplo, é um deles.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexandre.gaigalas.net/blog/2009/09/openid-oauth-autenticacao-descentralizad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://alexandre.gaigalas.net/blog/2009/09/openid-oauth-autenticacao-descentralizad/</feedburner:origLink></item>
		<item>
		<title>Olá</title>
		<link>http://feedproxy.google.com/~r/alganet/~3/lk7US2SrHp8/</link>
		<comments>http://alexandre.gaigalas.net/blog/2009/09/ola/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 04:14:56 +0000</pubDate>
		<dc:creator>Alexandre Gomes Gaigalas</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://alexandre.gaigalas.net/blog/?p=4</guid>
		<description><![CDATA[Cá estou, com um blog mais simples de atualizar. Depois da experiência com o Metalingua vi que é muito mais fácil manter um Wordpress hoje do que era dois anos atrás!
]]></description>
			<content:encoded><![CDATA[<p>Cá estou, com um blog mais simples de atualizar. Depois da experiência com o <a title="Metalingua" href="http://comcarinho.metalingua.biz">Metalingua</a> vi que é muito mais fácil manter um Wordpress hoje do que era dois anos atrás!</p>
]]></content:encoded>
			<wfw:commentRss>http://alexandre.gaigalas.net/blog/2009/09/ola/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://alexandre.gaigalas.net/blog/2009/09/ola/</feedburner:origLink></item>
	</channel>
</rss>
