<?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>Cor Cinza</title>
	<atom:link href="http://www.eberfdias.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.eberfdias.com/blog</link>
	<description>Textos sobre coisas por Éber F. Dias</description>
	<lastBuildDate>Thu, 08 Oct 2009 16:50:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Sluggable Behaviour</title>
		<link>http://www.eberfdias.com/blog/2009/10/06/sluggable-behaviour/</link>
		<comments>http://www.eberfdias.com/blog/2009/10/06/sluggable-behaviour/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 00:18:58 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[behaviour]]></category>
		<category><![CDATA[slug]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=210</guid>
		<description><![CDATA[Read this post in english here
Nossa, faz tempo que não escrevo nada por aqui né? Bom, hoje eu fiz um pouquinho de código que fiquei com vontade de compartilhar.
No mundo da web, um(a) slug é a representação de um título ou conteúdo que pode ser adicionado à URL de uma página. Nos últimos tempos, o(a) [...]]]></description>
			<content:encoded><![CDATA[<p><em>Read this post in english <a href="http://translate.google.com/translate?prev=hp&#038;hl=pt-BR&#038;js=y&#038;u=http%3A%2F%2Fwww.eberfdias.com%2Fblog%2F2009%2F10%2F06%2Fsluggable-behaviour%2F&#038;sl=pt&#038;tl=en&#038;history_state0=">here</a></em></p>
<p>Nossa, faz tempo que não escrevo nada por aqui né? Bom, hoje eu fiz um pouquinho de código que fiquei com vontade de compartilhar.</p>
<p>No mundo da web, um(a) slug é a representação de um título ou conteúdo que pode ser adicionado à URL de uma página. Nos últimos tempos, o(a) slug tem recebido maior atenção por ser um ótimo fator na hora de otimizar o seu site para buscadores (<a href="http://pt.wikipedia.org/wiki/SEO">SEO</a>), por ele(ela) está sempre presente nos principais CMS&#8217;s por aí como, por exemplo, o Wordpress.</p>
<p><span id="more-210"></span></p>
<p>Eu estava fazendo um sisteminha simples de e-commerce em <a href="http://www.cakephp.org/">CakePHP</a> e precisava criar slugs para as categorias e produtos da loja. Eu já havia escrito um código que fazia isso pra mim, mas estava solto no app_model.php. Eu sabia que já existia um <a href="http://book.cakephp.org/view/88/Behaviors">behaviour</a> que fazia exatamente isto. Era o <a href="http://bakery.cakephp.org/articles/view/sluggable-behavior">Sluggable Behaviour</a>, escrito pelo <a href="http://www.marianoiglesias.com.ar/">Mariano Iglesias</a>, um grande desenvolvedor que trabalha com Cake.</p>
<p>Apesar de ser um behaviour muito bem escrito e flexivel, eu fiquei com vontade de tentar fazer minha própria versão dele. Algumas coisas, com a própria geração do(a) slug poderiam ficar por conta da função <a href="http://api.cakephp.org/class/inflector#method-Inflectorslug">Inflector::slug()</a> por exemplo, dentre outras pequenas mudanças que eu gostaria de ver no código. Por isso eu fui lá e tentei fazer meu próprio behaviour. Na verdade, eu usei o código do Mariano como base e fui trabalhando em cima, o que me ajudou muito a entender como behaviours funcionam e devem ser escritos. Se você comparar os códigos, vai ver muitas coisas similares.</p>
<p>Eu não tenho a mínima pretenção de dizer que o que eu fiz é melhor que o original, porque tenho quase certeza que não é, mas é uma solução mais simples e mais leve, então alguma vantagem tem. Se quiser usar, crie um arquivo com o nome &#8220;sluggable.php&#8221; dentro da pasta <em>/app/models/behaviours</em> e coloque o conteúdo <a href="http://pastie.org/644648.txt">deste link</a> lá.</p>
<p>Exemplo: Digamos que você tem um model chamado &#8220;Post&#8221;, e nesta tabela você possui um campo chamado &#8220;title&#8221; e outro &#8220;slug&#8221;. Para usar o meu Sluggable Behaviour, basta adicionar a seguinte linha no seu <em>/app/modesl/post.php</em></p>
<pre class="brush: php">
var $actsAs = array(&#039;Sluggable&#039;);
</pre>
<p>Pronto! Isto basta para que, toda vez que você salvar um novo post, um(a) slug seja criada a partir to campo title inserido. Se os campos no seu banco tem outros nomes, fica fácil configurar o behaviour para que ele responda a essas diferenças. Exemplo:</p>
<pre class="brush: php">
var $actsAs = array(&#039;Sluggable&#039; =&gt; array(
    &#039;fields&#039;    =&gt; &#039;titulo&#039;,
    &#039;slugfield&#039; =&gt; &#039;url&#039;
));
</pre>
<p>Se você quiser concatenar as informações de mais de um campo para gerar a slug, basta indicar a chave &#8216;fields&#8217; como uma array, assim:</p>
<pre class="brush: php">
var $actsAs = array(&#039;Sluggable&#039; =&gt; array(
    &#039;fields&#039;    =&gt; array(&#039;titulo&#039;, &#039;codigo&#039;),
    &#039;slugfield&#039; =&gt; &#039;url&#039;
));
</pre>
<p>Por padrão, se você escrever um título como &#8220;Este é meu título&#8221; o(a) slug vai ficar assim: este-e-meu-titulo. Se você quiser, pode modificar o separador das palavras:</p>
<pre class="brush: php">
var $actsAs = array(&#039;Sluggable&#039; =&gt; array(
    &#039;fields&#039;    =&gt; array(&#039;titulo&#039;, &#039;codigo&#039;),
    &#039;slugfield&#039; =&gt; &#039;url&#039;,
    &#039;separator&#039; =&gt; &#039;_&#039;
));
</pre>
<p>Dentre outras opções, você ainda pode configurar as seguintes chaves:</p>
<pre class="brush: php">
var $actsAs = array(&#039;Sluggable&#039; =&gt; array(
    &#039;fields&#039;    =&gt; array(&#039;titulo&#039;, &#039;codigo&#039;),
    &#039;slugfield&#039; =&gt; &#039;url&#039;,
    &#039;separator&#039; =&gt; &#039;_&#039;,
    &#039;length&#039;    =&gt; 256,    //define um tamanho padrão para o(a) slug - o padrão é &quot;256&quot;

    &#039;overwrite&#039; =&gt; true,   //se verdadeiro, modifica o(a) slug na hora da edição
                           //caso contrário, mesmo editando, o(a) slug permanecerá
                           //igual ao da adição - o padrão é &quot;false&quot;

    &#039;lower&#039;     =&gt; false   //se verdadeiro, transforma todo(a) slug em caixa baixa - o padrão é &quot;true&quot;
));
</pre>
<p>É isso! Gostaria de deixar claro, mais uma vez, que este behaviour é <em>totalmente inspirado</em> pelo behaviour do Mariano. Mantive o mesmo nome não porque eu ache que o meu possa substituir o dele, mas simplesmente porque eu queria que este fosse o nome do behaviour no meu projeto, deixando o código mais bonito e coerente.</p>
<p>Tenho certeza que pode ter alguns erros e outras coisas podem ser melhoradas, por isso, sinta-se à vontade para sugerir, criticar ou elogiar! Se houver alguma dúvida também, é só comentar! Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/2009/10/06/sluggable-behaviour/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Fazendo joins e instanciando models on the fly no CakePHP</title>
		<link>http://www.eberfdias.com/blog/2009/07/17/fazendo-joins-e-instanciando-models-on-the-fly-no-cakephp/</link>
		<comments>http://www.eberfdias.com/blog/2009/07/17/fazendo-joins-e-instanciando-models-on-the-fly-no-cakephp/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 02:58:13 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[modesl]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=206</guid>
		<description><![CDATA[A um tempo atras escrevi este artigo que falava sobre como filtrar uma consulta com associações HABTM no CakePHP. O artigo já tem mais de um ano e muita coisa já mudou.
Na verdade, na época a coisa já havia mudado, mas eu não sabia. Foi quando eu encontrei este outro artigo aqui. O artigo ensina [...]]]></description>
			<content:encoded><![CDATA[<p>A um tempo atras escrevi este artigo que falava sobre <a href="http://www.eberfdias.com/blog/2008/05/17/filtrando-uma-consulta-com-associacoes-hasandbelongstomany-cakephp/">como filtrar uma consulta com associações HABTM no CakePHP</a>. O artigo já tem mais de um ano e muita coisa já mudou.</p>
<p>Na verdade, na época a coisa já havia mudado, mas eu não sabia. Foi quando eu encontrei este <a href="http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find">outro artigo aqui</a>. O artigo ensina como fazer joins em casos específicos utilizando o Model::find().</p>
<p>Vou tentar parafrasear o artigo utilizando a motivação daquele meu artigo anterior.<br />
<span id="more-206"></span><br />
Então imagine que temos duas tabelas, uma de Posts e outra de Tags e exista uma relação HABTM entre elas. Eu quero encontrar todos os posts com a Tag &#8220;design&#8221;, como fazer?</p>
<p>Uma vez dentro do controller dos posts eu posso escrever o seguinte código:</p>
<p><em>Obs.: Este código não foi testado e seu objetivo é apenas o de ilustrar as possibilidades aqui apresentadas.</em></p>
<pre class="brush: php">
$posts = $this-&gt;Post-&gt;find(&#039;all&#039;, array(
	&#039;joins&#039; =&gt; array(
		array(
			&#039;table&#039;      =&gt; &#039;posts_tags&#039;,
			&#039;alias&#039;      =&gt; &#039;PostsTag&#039;,
			&#039;type&#039;       =&gt; &#039;INNER&#039;,
			&#039;conditions&#039; =&gt; array(&#039;PostsTag.post_id = Post.id&#039;)
		),
		array(
			&#039;table&#039;      =&gt; &#039;tags&#039;,
			&#039;alias&#039;      =&gt; &#039;Tag&#039;,
			&#039;type&#039;       =&gt; &#039;INNER&#039;,
			&#039;conditions&#039; =&gt; array(
				&#039;Tag.id = PostsTag.tag_id&#039;,
				&#039;Tag.tag LIKE&#039; =&gt; &#039;%design%&#039;
			)
		)
	)
));
</pre>
<p>Trazendo um caso da vida real, na <a href="http://www.aquitanda.com/">Quitanda</a> eu queria mostrar os últimos posts de uma <a href="http://www.aquitanda.com/blog/categoria/painel/">determinada categoria</a> dentro do painel dos usuários com lojas. O nosso blog é feito com <a href="http://www.wordpress.org/">Wordpress</a>. Eu teria que criar um arquivo model para a tabela de posts do WP para poder fazer isso, mas fiquei com preguiça já que este seria o único lugar onde isto aconteceria, então ao invés de criar um arquivo de modelo, eu criei ele dentro do próprio controller utilizando a classe <a href="http://api.cakephp.org/class/class-registry">ClassRegistry</a> e a função <a href="http://api.cakephp.org/class/class-registry#method-ClassRegistryinit">init</a>.</p>
<p>Como minha tabela do Wordpress era diferente da utilizada pela aplicação, primeiro eu defini um novo vetor de configurações no meu arquivo config/database.php. Veja:</p>
<pre class="brush: php">
var $wp = array(
	&#039;driver&#039;     =&gt; &#039;mysql&#039;,
	&#039;persistent&#039; =&gt; false,
	&#039;host&#039;       =&gt; &#039;localhost&#039;,
	&#039;login&#039;      =&gt; &#039;root&#039;,
	&#039;password&#039;   =&gt; &#039;max7max7&#039;,
	&#039;database&#039;   =&gt; &#039;qolwp&#039;,
	&#039;encoding&#039;   =&gt; &#039;utf8&#039;
);
</pre>
<p>Depois, já no meu controller, escrevi a seguinte linha:</p>
<pre class="brush: php">
$this-&gt;WpPost = ClassRegistry::init(array(
	&#039;ds&#039;    =&gt; &#039;wp&#039;,
	&#039;table&#039; =&gt; &#039;wp_posts&#039;,
	&#039;class&#039; =&gt; &#039;model&#039;,
	&#039;alias&#039; =&gt; &#039;WpPost&#039;
));
</pre>
<p>Os parâmetros praticamente se auto explicam mas, a chave &#8216;ds&#8217; guarda a variável de configuração do banco que vai ser utilizada, no caso &#8216;wp&#8217;, como definido anteriormente. Depois dizemos qual é a tabela a ser utilizada, o tipo de classe a ser registrada e o &#8216;alias&#8217; para ser utilizado nas consultas.</p>
<p>Depois eu fiz a consulta. Ela ficou meio extensa e é claro que escrevendo isto direto no SQL seria muito mais simples, mas fica aqui a titulo de exemplo. Eu fiz isso mais para experimentar as possibilidades e ver o que acontecia. Olha só:</p>
<pre class="brush: php">
$posts = $this-&gt;WpPost-&gt;find(&#039;all&#039;, array(
        &#039;joins&#039; =&gt; array(
                array(
                        &#039;table&#039;      =&gt; &#039;wp_term_relationships&#039;,
                        &#039;alias&#039;      =&gt; &#039;WpTermRelationship&#039;,
                        &#039;type&#039;       =&gt; &#039;INNER&#039;,
                        &#039;conditions&#039; =&gt; array(&#039;WpPost.ID = WpTermRelationship.object_id&#039;)
                ),
                array(
                        &#039;table&#039;      =&gt; &#039;wp_term_taxonomy&#039;,
                        &#039;alias&#039;      =&gt; &#039;WpTermTaxonomy&#039;,
                        &#039;type&#039;       =&gt; &#039;INNER&#039;,
                        &#039;conditions&#039; =&gt; array(&#039;WpTermRelationship.term_taxonomy_id = WpTermTaxonomy.term_taxonomy_id&#039;)
                ),
                array(
                        &#039;table&#039;      =&gt; &#039;wp_terms&#039;,
                        &#039;alias&#039;      =&gt; &#039;WpTerm&#039;,
                        &#039;type&#039;       =&gt; &#039;INNER&#039;,
                        &#039;conditions&#039; =&gt; array(&#039;WpTermTaxonomy.term_id = WpTerm.term_id&#039;)
                )
        ),
        &#039;conditions&#039; =&gt; array(
                &#039;WpPost.post_type&#039;        =&gt; &#039;post&#039;,
                &#039;WpPost.post_status&#039;      =&gt; &#039;publish&#039;,
                &#039;WpTermTaxonomy.taxonomy&#039; =&gt; &#039;category&#039;,
                &#039;WpTerm.slug&#039;             =&gt; &#039;painel&#039;
        ),
        &#039;fields&#039; =&gt; array(
                &#039;WpPost.post_title&#039;,
                &#039;WpPost.post_content&#039;,
                &#039;WpPost.guid&#039;,
                &#039;WpPost.post_date&#039;
        ),
        &#039;group&#039; =&gt; &#039;WpPost.ID&#039;,
        &#039;order&#039; =&gt; &#039;WpPost.post_date DESC&#039;,
        &#039;limit&#039; =&gt; 5
));
</pre>
<p>O SQL que esta função vai criar fica assim:</p>
<p><code>SELECT `WpPost`.`post_title`, `WpPost`.`post_content`, `WpPost`.`guid`, `WpPost`.`post_date` FROM `wp_posts` AS `WpPost` INNER JOIN wp_term_relationships AS `WpTermRelationship` ON (`WpPost`.`ID` = `WpTermRelationship`.`object_id`) INNER JOIN wp_term_taxonomy AS `WpTermTaxonomy` ON (`WpTermRelationship`.`term_taxonomy_id` = `WpTermTaxonomy`.`term_taxonomy_id`) INNER JOIN wp_terms AS `WpTerm` ON (`WpTermTaxonomy`.`term_id` = `WpTerm`.`term_id`) WHERE `WpPost`.`post_type` = 'post' AND `WpPost`.`post_status` = 'publish' AND `WpTermTaxonomy`.`taxonomy` = 'category' AND `WpTerm`.`slug` = 'painel' GROUP BY `WpPost`.`ID` ORDER BY `WpPost`.`post_date` DESC LIMIT 5</code></p>
<p>Com isto você já pode ver que existem muitas possibilidades. Por exemplo, você pode fazer consultas com <strong>LEFT JOIN</strong> ao invés de <strong>INNER JOIN</strong> simplesmente trocando a chave &#8216;type&#8217;. Veja também que nas condições gerais da minha consulta eu pude colocar filtros diretamente relacionados às tabelas que eu dei join. No <a href="http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find">artigo original</a> existe uma chave &#8216;foreignKey&#8217; com valor false, mas analisando a API, não achei nenhuma referência a este valor em nenhum dos adaptadores de bancos de dados, então me parece ser algo totalmente dispensavel e a função funciona sem que ela seja declarada.</p>
<p>Acho que é isso. Duvidas, sugestões e agradecimentos são sempre bem vindos! Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/2009/07/17/fazendo-joins-e-instanciando-models-on-the-fly-no-cakephp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Enviando emails através do PHP no Windows</title>
		<link>http://www.eberfdias.com/blog/2009/04/08/enviando-emails-atraves-do-php-no-windows/</link>
		<comments>http://www.eberfdias.com/blog/2009/04/08/enviando-emails-atraves-do-php-no-windows/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 05:19:49 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[google apps]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=197</guid>
		<description><![CDATA[Eu sempre sofri muito com isso. Sempre quis testar o envio de emails dos meus aplicativos mas nunca achei uma solução realmente legal pra isso. No Linux é muito fácil configurar o msmtp para utilizar o Google Apps no envio de emails, por isso coloquei no Google hoje algo como &#8220;mail php google windows&#8221; e [...]]]></description>
			<content:encoded><![CDATA[<p>Eu sempre sofri muito com isso. Sempre quis testar o envio de emails dos meus aplicativos mas nunca achei uma solução realmente legal pra isso. No Linux é <a href="http://nanotux.com/blog/the-ultimate-server/4/#l-mail">muito fácil configurar</a> o <a href="http://msmtp.sourceforge.net/">msmtp</a> para utilizar o <a href="http://www.google.com/intl/pt-BR/apps/business/index.html">Google Apps</a> no envio de emails, por isso coloquei no Google hoje algo como &#8220;mail php google windows&#8221; e dei de cara com <a href="http://digiex.net/guides-tutorials/544-configuring-php-under-windows-use-gmail-external-smtp-server-ssl.html">este artigo</a>. <strong>PERFEITO</strong>!<br />
<span id="more-197"></span><br />
O esquema é baixar este programinha aqui (<a href="http://digiex.net/attachments/guides-tutorials/632d1224257427-configuring-php-under-windows-use-gmail-external-smtp-server-ssl-sendmail.zip">versão modificada</a> pronta para este guia ou <a href="http://www.glob.com.au/sendmail/sendmail.zip">versão original</a> &#8211; eu estou usando a versão modificada), chamado &#8220;<a href="http://glob.com.au/sendmail/">fake sendmail</a>&#8220;. Ele vai fazer a ponte e enviar os emails através dos servidores do Google. É importante notar que, para estas instruções, você precisa ter uma conta no <a href="http://www.google.com/intl/pt-BR/apps/business/index.html">Google Apps</a> com um domínio registrado e configurado.</p>
<p>Para fazer a coisa funcionar, basta extrair os arquivos do .zip numa pasta qualquer (eu coloquei em C:\sendmail\) e editar o arquivo &#8220;sendmail.ini&#8221; nas seguintes linhas:</p>
<p><code>default_domain=<strong>domain.com</strong></code></p>
<p><code>auth_username=<strong>webmaster@domain.com</strong><br />
auth_password=<strong>password</strong></code></p>
<p><code>force_sender=<strong>webmaster@domain.com</strong></code></p>
<p>Pronto, modifique as áreas em negrito para corresponder às suas configurações e depois é só configurar o PHP para utilizar o novo servidorzinho. Abra o arquivo php.ini (o local deste arquivo varia muito de instalação p/ instalação&#8230; você deve saber onde o seu está) e procure as seguintes linhas:</p>
<p><code>; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").<br />
; sendmail_path</code></p>
<p>Modifique para que fique assim:</p>
<p><code>; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").<br />
sendmail_path = C:\sendmail\sendmail.exe -f</code></p>
<p>Reinicie o servidor e teste! O <a href="http://digiex.net/guides-tutorials/544-configuring-php-under-windows-use-gmail-external-smtp-server-ssl.html">post original</a> é bem mais esclarecedor e, se algo der errado, dê uma olhada nas dicas que o cara coloca por lá. Espero que ajude! Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/2009/04/08/enviando-emails-atraves-do-php-no-windows/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Quitanda On-Line</title>
		<link>http://www.eberfdias.com/blog/2009/04/06/quitanda-on-line/</link>
		<comments>http://www.eberfdias.com/blog/2009/04/06/quitanda-on-line/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 22:05:10 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Lighttpd]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[quitanda]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=190</guid>
		<description><![CDATA[Eu e o Gustaf (meu cunhado) a muito tempo atras, criamos uma &#8220;loja virtual&#8221; de cd&#8217;s onde nós trazíamos cd&#8217;s do exterior por um preço mais camarada, baixando bem a nossa margem de lucro pra que pessoas pudessem comprar os cd&#8217;s que sempre quiseram. A loja funcionava de forma precária, tudo acontecendo através de trocas [...]]]></description>
			<content:encoded><![CDATA[<p>Eu e o Gustaf (meu cunhado) a muito tempo atras, criamos uma &#8220;loja virtual&#8221; de cd&#8217;s onde nós trazíamos cd&#8217;s do exterior por um preço mais camarada, baixando bem a nossa margem de lucro pra que pessoas pudessem comprar os cd&#8217;s que sempre quiseram. A loja funcionava de forma precária, tudo acontecendo através de trocas de emails e sites mal feitos.<br />
<span id="more-190"></span><br />
<img class="alignleft size-full wp-image-191" title="quitanda" src="http://www.eberfdias.com/blog/wp-content/uploads/2009/04/quitanda.png" alt="quitanda" width="261" height="137" style="float:left; margin:0 10px 10px 0;" /> Um tempo depois criamos vergonha na cara e resolvemos utilizar uma plataforma de e-commerce de verdade para montar nossa lojinha. Utilizamos o <a href="http://www.oscommerce.com/">osCommerce</a> naquela época, foi uma revolução pra gente! Tudo estava funcionando de um jeito bem legal mas acho que por falta de tempo ou qualquer coisa assim, a loja acabou não indo mais pra frente. O site morreu, mas o Gustaf ainda fazia o esquema de trazer cd&#8217;s de fora pra galera aqui. Foi aí que surgiu a idéia, a semente do que viria ser a <a href="http://www.aquitanda.com/">Quitanda On-Line</a> que chega à existência no dia de hoje! Pra mim é um sonho realizado, algo que eu idealizei a bem uns 4 ou 5 anos atras.</p>
<p>A <a href="http://www.aquitanda.com/">Quitanda</a> pretende ser um site onde qualquer pessoa possa criar uma pequena loja virtual com tudo o que é necessário para realizar transações pela internet, com controle de estoque, imagens, lista de clientes e tudo mais. Cada lojista é independente e tem seu próprio cantinho, podendo personalizar sua loja e tudo mais. E adivinha. O <a href="http://sofanews.aquitanda.com/">SofaNews</a> já está por lá <img src='http://www.eberfdias.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Eu estou muito feliz e espero que este projeto possa render muitos frutos. No mínimo, tem sido muito legal e proveitoso trabalhar neste projeto. Um grande aprendizado!</p>
<p>Na parte técnica, estamos rodando o site na <a href="http://www.slicehost.com/">SliceHost</a> num slice de 256Mb de RAM, 10Gb de espaço e 100Gb de banda (espero que esta configuração precise ser mudada em breve). O servidor que escolhemos foi o <a href="http://www.lighttpd.net/">lighttpd</a> rodando php em fast-cgi. Estamos trabalhando o cache com <a href="http://br.php.net/apc">APC</a> por enquanto, e tem sido muito bom! Também estamos utilizando o <a href="http://aws.amazon.com/s3/">Amazon S3</a> para guardar as imagens, o que reduz bastante o impacto no nosso servidor.</p>
<p>[edit]<br />
Em tempo, o <a href="http://www.ilusorium.net/">Edu Duccigne</a> escreveu um post super legal sobre a gente no blog dele! Veja <a href="http://www.blogdoedu.com/2009/04/06/quitanda/">aqui</a>!<br />
[/edit]</p>
<p>Eu queria agradecer muito à minha namorada que sempre acreditou em mim e neste meu sonho. Ela é maluca de ficar comigo nesse pensamento louco. Sem ela, acho que não conseguiria! Também queria agradecer a Natália que comprou a idéia e mergulhou de cabeça junto comigo nessa empreitada! Seu toque feminino é muito importante neste projeto! Também queria agradecer ao meu pai, à minha mãe, que sempre me estimularam a seguir os meus sonhos sem desistir e me ensinaram que sem trabalho não se vai a lugar algum. Queria agradecer muito ao <a href="http://www.lastfm.com.br/user/agacinco">Rafa</a> pelo nome genial que ele escolheu pra gente <img src='http://www.eberfdias.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  E por fim, mas não menos importante, meus agradecimentos ao Gustaf, papy Helmuth e mamy Shirley, por todo o apoio!</p>
<p>E agora vamo que vamo <img src='http://www.eberfdias.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/2009/04/06/quitanda-on-line/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>EasyGD versão 1</title>
		<link>http://www.eberfdias.com/blog/2009/04/06/easygd-versao-1/</link>
		<comments>http://www.eberfdias.com/blog/2009/04/06/easygd-versao-1/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 21:31:43 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sites]]></category>
		<category><![CDATA[gd]]></category>
		<category><![CDATA[imagens]]></category>
		<category><![CDATA[jpeg]]></category>
		<category><![CDATA[png]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=187</guid>
		<description><![CDATA[Logo no início do ano eu lancei uma primeira versão da classe EasyGD. Pra quem não viu ainda, o EasyGD é uma classe pra você manipular imagens JPEG e PNG com mais facilidade. Coisas simples como redimensionar, salvar, mostar no browser e coisinhas assim.

A estrutura anterior estava muito amarrada então eu resolvi re-escrever a classe. [...]]]></description>
			<content:encoded><![CDATA[<p>Logo no início do ano eu lancei <a href="http://www.eberfdias.com/blog/2009/01/11/2009-e-easygd/">uma primeira versão da classe EasyGD</a>. Pra quem não viu ainda, o EasyGD é uma classe pra você <strong>manipular imagens JPEG e PNG com mais facilidade</strong>. Coisas simples como redimensionar, salvar, mostar no browser e coisinhas assim.<br />
<span id="more-187"></span><br />
A estrutura anterior estava muito amarrada então eu resolvi re-escrever a classe. Se alguém chegou a usar a classe anterior, não atualize porque eu quebrei toda a API. Tá, não toda, mas muitos atributos mudaram de nome (acho que todos) e algumas funções também.</p>
<p>Agora a classe está mais enxuta e desta vez ela foi feita <strong>apenas para PHP 5</strong>. Esqueça a classe antiga porque esta agora está muito melhor.</p>
<p>Uma coisa bacana que eu coloquei é que agora ela retorna o próprio objeto quando as funções são chamadas, então você pode chamar diversas funções uma atras da outra como é possível, por exemplo, no jQuery. Olha um exemplo:</p>
<p><code>$image = new EasyGD();<br />
$image->startFromFile('image.jpg')->crop(100, 50)->save();</code></p>
<p>Enfim, foram diversas melhorias mas eu ainda estou trabalhando bastante nela, por isso não foi liberado nenhum download dela ainda mas você pode baixar a fonte <a href="http://code.google.com/p/easygd/source/browse/trunk/v1/easygd.php">aqui</a> ou <a href="http://easygd.googlecode.com/svn/trunk/v1/easygd.php">aqui</a>. Você também pode <a href="http://code.google.com/p/easygd/source/checkout">acompanhar o respositório</a>.</p>
<p>Ainda preciso melhorar a forma como eu lido com erros, por isso, qualquer sugestão e colaboração é muuuito bem vinda <img src='http://www.eberfdias.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Se você quiser participar do projeto, entre em contato comigo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/2009/04/06/easygd-versao-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Precisamos mesmo de uma web sem&#226;ntica?</title>
		<link>http://www.eberfdias.com/blog/2009/02/04/precisamos-mesmo-de-uma-web-semntica/</link>
		<comments>http://www.eberfdias.com/blog/2009/02/04/precisamos-mesmo-de-uma-web-semntica/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 13:32:30 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[Webstandards]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[semântica]]></category>
		<category><![CDATA[tabelas]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/2009/02/04/precisamos-mesmo-de-uma-web-semntica/</guid>
		<description><![CDATA[Pipocou na web [e eu vi aqui] um artigo de Ron Garret com o título &#34;Why CSS should not be used for layout&#34; [Por que CSS não deve ser usado para layout]. Você já pode imaginar a reação da galera doida querendo comer o homem vivo. O que Ron alega é que o CSS não [...]]]></description>
			<content:encoded><![CDATA[<p>Pipocou na web [e eu vi <a href="http://www.pinceladasdaweb.com.br/blog/2009/02/04/css-nao-serve-para-desenvolver-layouts/" target="_blank">aqui</a>] um artigo de <a href="http://www.flownet.com/ron/" target="_blank">Ron Garret</a> com o título &quot;<a href="http://www.flownet.com/ron/css-rant.html" target="_blank">Why CSS should not be used for layout</a>&quot; [Por que CSS não deve ser usado para layout]. Você já pode imaginar a reação da galera doida querendo <a href="http://rondam.blogspot.com/2009/02/why-css-should-not-be-used-for-layout.html#comments" target="_blank">comer o homem vivo</a>. O que Ron alega é que o CSS não cumpre um bom papel quando você quer construir um layout que simplesmente funcione em qualquer browser sem demandar horas de testes e tweaks no código para que tudo funcione como desejado, sendo que fazer o mesmo com tabelas é super simples, rápido e indolor [leia o artigo para ter a idéia completa].</p>
<p> <span id="more-175"></span>
<p>E quem pode dizer o contrário? Os exemplos de Ron são bem categóricos e quase nos convencem de que tabela é o melhor caminho para se criar um layout. Muitas pessoas vieram apontar o site <a href="http://www.csszengarden.com/?cssfile=/211/211.css&amp;page=0" target="_blank">CSS Zen Garden</a> como exemplo máximo de que CSS é a resposta para layouts, mas Ron teve um bom argumento para rebater: Fica fácil criar layouts para sites onde o conteúdo é fixo e você não tem que se preocupar com o que pode acontecer se as coisas saírem de controle. Tables win again.</p>
<p>Ron também diz que, assim como o significado das palavras pode mudar pelo uso, o significado das tags também muda, de forma que, por mais que a tag &quot;table&quot; deva ser usada para dados tabulares, seu uso extensivo em layouts mudou seu significado. Faz sentido, mas pra mim existe um problema aí. Nós nunca poderemos tirar vantagem dos padrões se eles não forem seguidos. Se as pessoas começarem a colocar parágrafos dentro da tag &quot;address&quot;, criar um motor de busca de endereços será muito mais difícil. O Google faz uso extensivo da catalogação de termos através da utilização de tags &quot;dd&quot;, &quot;dt&quot; e &quot;dl&quot; (é só usar o &quot;<a href="http://www.google.com.br/search?q=define:+css&amp;hl=pt-BR&amp;client=firefox-a&amp;rls=org.mozilla:pt-BR:official&amp;hs=nih&amp;oi=definel&amp;defl=en" target="_blank">define: css</a>&quot; para ver isto em ação), ou seja, não é legal usar esses elementos para criar formulários mais bonitos, eles servem para definições! O fato é que as coisas vão ficar mais fáceis se não utilizarmos padrões, e usar CSS é uma forma de manter estes padrões disponíveis.</p>
<p>Agora, existe o outro lado da história. Os fãs mais aficionados de CSS devem prestar atenção porque nem sempre tudo numa marcação é estritamente semântico. No próprio CSS Zen Garden existem algumas tags extras e vazias para propósitos puramente visuais. Qual o significado delas? Se é puramente visual, estamos deturpando a tag div assim como a tag table é deturpada. Aliás, a tag &quot;span&quot;, de acordo com a <a href="http://www.w3schools.com/TAGS/tag_span.asp" target="_blank">w3school</a> serve apenas para modificações visuais, e então temos coisas como “&lt;h1&gt;&lt;span&gt;Meu header&lt;/span&gt;&lt;/h1&gt;”, o que não é exatamente semântico, mas é necessário que eu quiser fazer um &quot;<a href="http://www.google.com.br/search?q=image+replacement&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:pt-BR:official&amp;client=firefox-a" target="_blank">image replacement</a>&quot; no meu header.</p>
<p>Ah! Mas existe uma nova técnica ótima de image replacement onde eu não preciso da tag &quot;span&quot;. Basta definir o &quot;text-indent&quot; do elemento para algo como &quot;-9999px&quot; no seu CSS e pronto! Todos sabem que esta é uma gambiarra, assim como é o uso de tabelas! Afinal, desde quando &quot;text-indent&quot; foi feito para sumir com um texto? Este não é o &quot;propósito semântico&quot; da propriedade. Poderia existir uma nova propriedade chamada &quot;text-visibility&quot; que seria semanticamente correta neste caso.</p>
<p>Eu acredito que sempre iremos esbarrar em algum problema semântico, querendo ou não. Mas não podemos ser extremistas, nem de um lado, nem do outro. O que devemos fazer é trabalhar para que a web seja um lugar melhor. Que a indexação de conteúdo seja feita corretamente. Que organizar e encontrar aquilo que se procura seja simples. E embora o CSS tenha suas limitações, elas servem para nos ensinar que a web é uma plataforma diferente da mídia impressa ou da televisão e deve possuir sua própria linguagem visual e forma de organização. Como já dizia McLuhan &quot;o meio é a mensagem&quot;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/2009/02/04/precisamos-mesmo-de-uma-web-semntica/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Lighttpd (Lighty) + CakePHP</title>
		<link>http://www.eberfdias.com/blog/2009/01/12/lighttpd-lighty-cakephp/</link>
		<comments>http://www.eberfdias.com/blog/2009/01/12/lighttpd-lighty-cakephp/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 19:00:40 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Lighttpd]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sites]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=166</guid>
		<description><![CDATA[Lá na Dejamps nós usamos o Dreamhost para hospedar nossos sites. Ele tem sido totalmente suficiente até agora, mas por causa de alguns detalhes, precisaremos de um VPS. É bem capaz que utilizemos o Slicehost para isso.
No Slicehost, o pessoal te dá acesso a uma máquina totalmente limpa, apenas com o sistema operacional, onde você [...]]]></description>
			<content:encoded><![CDATA[<p>Lá na <a href="http://www.dejamps.net/">Dejamps</a> nós usamos o <a href="https://dreamhost.com/">Dreamhost</a> para hospedar nossos sites. Ele tem sido totalmente suficiente até agora, mas por causa de alguns detalhes, precisaremos de um <a href="http://pt.wikipedia.org/wiki/VPS">VPS</a>. É bem capaz que utilizemos o <a href="http://www.slicehost.com/">Slicehost</a> para isso.</p>
<p>No Slicehost, o pessoal te dá acesso a uma máquina totalmente limpa, apenas com o sistema operacional, onde você tem que instalar e configurar tudo via SSH. Eu não sou nenhum expert em Linux, muito pelo contrário, estou aprendendo agora, mas para treinar, resolvi fazer alguns experimentos no meu Ubuntu virtualizado aqui comVirtualBox.</p>
<p><span id="more-166"></span></p>
<p>Até hoje, minha experiência com servidores se limitou à utilização do Apache (e no windows), mas o Felix do <a href="http://debuggable.com/">Debuggable</a> me mostrou algumas coisas realmente interessantes no <a href="http://www.lighttpd.net/">Lighttpd</a> (também conhecido como Lighty), um servidor que diz ser muito levinho e simples de utilizar. Como eu vou ter uma quota limitada de memória no VPS, quanto mais eu puder economizar nisto, melhor, por isso comecei a considerar a utilização real do Lighty. Instalá-lo no Ubuntu foi muito fácil, via apt-get e, pela primeira vez, instalei o PHP direto da fonte, selecionando todas as opções que queria e etc. Foi muito divertido!</p>
<p>Não vou falar aqui sobre a instalação destes carinhas, nem da configuração, <a href="http://redmine.lighttpd.net/wiki/lighttpd">porque isso você pode aprender em outros lugares muito melhores do que aqui</a>.</p>
<p>O fato é que eu consegui instalar e configurar tudo direitinho pra rodar o Lighty processando PHP com FastCGI e etc e tal. Em comparação com a instalação do Apache e tudo mais, achei a configuração do Lighty muito mais simples. Em questão de minutos tudo já estava funcionando da forma que devia sem maiores problemas. A minha duvida era, será que oLighty executa bem meus aplicativos escritos com CakePHP? Inicialmente, se o PHP está sendo executado, não deveria existir nenhum impedimento, mas existe uma característica do Cake que recai sobre o servidor, que é a construção das URL&#8217;s com o mod_rewrite. O Lighty possui um <a href="http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModRewrite">mod_rewrite</a>, mas em comparação com o Apache, ele é muito inferior.</p>
<p>Pesquisando um pouco mais no grupo de discussão do Cake, descobri que é possível emular o mod_rewrite do Apache de forma específica para o Cake. A primeira coisa que você tem que fazer é habilitar o <a href="http://redmine.lighttpd.net/wiki/1/Docs:ModMagnet">mod_magnet</a> na configuração do seu Lighty (geralmente fica em /etc/lighttpd/lighttpd.conf), deixe a configuração de lado um pouquinho e salve (geralmente com o nome de &#8220;cleanurl-v6.lua&#8221;) em algum lugar o seguinte script: <a href="http://bin.cakephp.org/view/1811010000">http://bin.cakephp.org/view/1811010000</a>. Este é um script feito em <a href="http://www.lua.org/">Lua</a> e o mod_magnet faz exatamente isso, utiliza scripts escritos em Lua para modificar ou adicionar comportamentos ao seu servidor, bacana não? Bom, depois que você fez isso, fica fácil. Basta voltar ao seu arquivo de configuração e adicionar a seguinte linha:</p>
<p><code>magnet.attract-physical-path-to = ( "%s" )</code></p>
<p>Substitua o &#8220;%s&#8221; pelo caminho onde você salvou o script lua para realizar a substituição e pronto! Testando inicialmente, tudo funcionou muito bem e fiquei super feliz, mas o designUp utiliza &#8220;query strings&#8221; em algumas URL&#8217;s, precisando interpretar coisas como &#8220;designup.pro.br/controller/action/?variavel=parametro&#8221;. Quando testei este cenário, o script falhou! Ele só conseguia interpretar algo se eu adicionasse mais de uma variável, tipo &#8220;designup.pro.br/controller/action/?variavel=parametro&#038;outra=coisa&#8221;. Lendo o script entendi que o problema estava na interpretação do caracter &#8220;?&#8221;, então fiz uma pequena modificação para que tudo ocorresse corretamente. No link acima a modificação já está feita, mas é importante lembrar que este script não é de minha autoria! Se eu descobrir quem foi o autor dele, coloco os devidos créditos aqui.</p>
<p>É isso. Qualquer duvida, se eu puder responder, é só comentar aí! Um abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/2009/01/12/lighttpd-lighty-cakephp/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>2009 e EasyGD!</title>
		<link>http://www.eberfdias.com/blog/2009/01/11/2009-e-easygd/</link>
		<comments>http://www.eberfdias.com/blog/2009/01/11/2009-e-easygd/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 04:35:57 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[Lifehacks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[2009]]></category>
		<category><![CDATA[gd]]></category>
		<category><![CDATA[jpg]]></category>
		<category><![CDATA[png]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=162</guid>
		<description><![CDATA[Pessoal! Meu primeiro post de 2009! Que emoção&#8230; NOT!
Bom, queria compartilhar com vocês algumas das minhas idéias e objetivos pra 2009:


Blogar mais &#8211; Não só aqui, mas no blog do designUp, no Pensamentos Cativos e, quem sabe, recomeçar o Web Junky!
Estabelecer o sono polifásico &#8211; Por causa de algumas alergias, não tenho conseguido continuar com [...]]]></description>
			<content:encoded><![CDATA[<p>Pessoal! Meu primeiro post de 2009! Que emoção&#8230; NOT!</p>
<p>Bom, queria compartilhar com vocês algumas das minhas idéias e objetivos pra 2009:</p>
<p><span id="more-162"></span></p>
<ul>
<li><strong>Blogar mais</strong> &#8211; Não só aqui, mas no blog do <a href="http://www.designup.pro.br/blog">designUp</a>, no <a href="http://pensamentoscativos.blogspot.com/">Pensamentos Cativos</a> e, quem sabe, recomeçar o <a href="http://web-junky.blogspot.com/">Web Junky</a>!</li>
<li><strong>Estabelecer o sono polifásico</strong> &#8211; Por causa de algumas alergias, não tenho conseguido continuar com o experimento do sono polifásico. Vou fazer uns exames, tomar as devidas providências e voltar ao experimento!</li>
<li><strong>Aprender Python e ActionScript</strong> &#8211; Aí estão as duas linguagens que eu vivo lendo a respeito mas que nunca desenvolvi nada nem aprendi tão a fundo. Realmente quero aprendere essas linguagens este ano.</li>
<li><strong>Colocar quatro novos projetos no ar</strong> &#8211; <a href="http://www.aquitanda.com/">Já estamos trabalhando nisto</a>! Por enquanto é um só, mas espero colocar até quatro projetos on-line este ano.</li>
<li><strong>Me dedicar mais à vinda de freelancer</strong> &#8211; É, apesar de querer colocar todos estes projetos na rede, eu preciso ter um plano backup. Quero me estabelecer melhor como freelancer e ter onde me apoiar caso tudo dê errado. Na melhor das hipóteses, é dinheirinho extra na certa <img src='http://www.eberfdias.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><strong>Ganhar dinheiro</strong> &#8211; SIM! Até hoje eu só estava ensaiando. Agora eu quero ganhar dinheiro de verdade, pra casar e tudo mais. Chega de brincadeira!</li>
</ul>
<p>Espero que realmente consiga atingir estes objetivos. Todos eles são muito importantes para mim! Quero re-fazer este blog, quero <strong>dar continuidade aos screencasts</strong> (não pensem que eu esqueci). Enfim! 2009 é &#8220;o&#8221; ano para definir as coisas e tudo isto será fruto de muito, mas muito trabalho, então tá na hora de eu parar de ficar no Twitter e realmente trabalhar um pouco, rsrs&#8230;</p>
<p>Para mostrar que não estou de brincadeira, já comecei este ano lançando mais um projetinho Open Source. Se trada do <a href="http://code.google.com/p/easygd">EasyGD</a>, uma classe que criei para manipular imagens (jpg e png) com facilidade. Fiz uma página no <a href="http://code.google.com/p/easygd/">Google Code</a>, coloquei tudo lá, bonitinho, inclusive a <a href="http://code.google.com/p/easygd/wiki/Usage">documentação</a>!</p>
<p>Talvez eu escreva ela toda de novo em português aqui no blog mesmo né? Se você chegar a utilizar, não esqueça de me avisar, ok? Será um prazer saber q tem alguém realmente usando esta classe!</p>
<p>Bom, acho que é isso por hoje! Tentarei postar aqui com mais frequencia (sem trema), por isso aguardem mais posts legais (ou não) por aí! Abraço!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/2009/01/11/2009-e-easygd/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Melhorando um tema</title>
		<link>http://www.eberfdias.com/blog/2008/12/18/melhorando-um-tema/</link>
		<comments>http://www.eberfdias.com/blog/2008/12/18/melhorando-um-tema/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 18:46:00 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Webstandards]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=158</guid>
		<description><![CDATA[Estou criando um novo site que vai ter um painel administrativo. Painéis administrativos para usuários são um saco de fazer, por isso resolvi comprar um (na verdade eu ganhei um, mas digamos que eu comprei) lá no ThemeForest.net. O tema é muito bonito, mas quando eu comecei a mexer nele, descobri umas coisas meio estranhas.

As [...]]]></description>
			<content:encoded><![CDATA[<p>Estou criando um novo site que vai ter um painel administrativo. Painéis administrativos para usuários são um saco de fazer, por isso resolvi <a href="http://themeforest.net/item/element-backend-admin-template/22314">comprar um</a> (na verdade eu ganhei um, mas digamos que eu comprei) lá no <a href="http://themeforest.net?ref=eberfreitas">ThemeForest.net</a>. O tema é muito bonito, mas quando eu comecei a mexer nele, descobri umas coisas meio estranhas.</p>
<p><span id="more-158"></span></p>
<p>As mensagens de alerta do tema possuiam a seguinte marcação:</p>
<pre class="brush: html">
&lt;p class=&quot;alert&quot;&gt;&lt;span class=&quot;success&quot;&gt;&lt;/span&gt;&lt;span class=&quot;success_text&quot;&gt;Success! Your item has successfully been added.&lt;/span&gt;&lt;/p&gt;
</pre>
<p>Para produzir um resultado como este:</p>
<p><img src="http://www.eberfdias.com/blog/wp-content/uploads/2008/12/alerts1.jpg" alt="alerts1" title="alerts1" width="685" height="120" class="alignnone size-full wp-image-159" /></p>
<p>Até aí, visualmente, nada de demais. Mas olhando a marcação, existem algumas tags desnecessárias ali. O que é aquele &#8220;span&#8221; vazio com a classe &#8220;success&#8221; e por que o texto está dentro de um outro &#8220;span&#8221;? Pra responder a estas perguntinhas, basta uma olhadinha rápida nos estilos destes elementos:</p>
<pre class="brush: css">
p.alert {
	width: 652px;
	height: 39px;
	background: url(&quot;images/alert_bg.png&quot;) no-repeat;
}

.success {
	width: 24px;
	height: 24px;
	padding: 10px 0px 0px 15px;
	margin: 6px 0px 0px 15px;
	background: url(&quot;images/success.png&quot;) no-repeat;
	float: left;
}

.success_text {
	margin: 11px 0px 0px 5px;
	float: left;
	color: #73ae0b;
}
</pre>
<p>O resultado é bonito? Sim! Mas a lambança também é bem bonita! Como você pode ver o ícone que indica sucesso ou erro esta contido dentro do &#8220;span&#8221; vazio, e possui um float. Já o texto está num outro &#8220;span&#8221; que possui um outro float para ficar ao lado do ícone! Que bangunça, isso é realmente necessário? Eu creio que não!</p>
<p>Utilizar uma marcação destas é péssima pois não oferece nenhuma flexibilidade. A altura e a largura dos elementos estão definidas e qualquer texto que extrapole estas definições não ficará bem no elemento. Sentindo o cheiro de problema no ar, resolvi tentar consertar esta marcação e os estilos. Veja como ficou o html depois do tapinha:</p>
<pre class="brush: html">
&lt;p class=&quot;alert success&quot;&gt;Success! Your item has successfully been added.&lt;/p&gt;
</pre>
<p>Uh! Bem mais simples não? Olha o resultado visual disso:</p>
<p><img src="http://www.eberfdias.com/blog/wp-content/uploads/2008/12/alerts2.jpg" alt="alerts2" title="alerts2" width="685" height="120" class="alignnone size-full wp-image-160" /></p>
<p>E como ficou o css? Dá só uma olhada aí:</p>
<pre class="brush: css">
p.alert {
	-webkit-border-radius: 10px;
	-khtml-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
	background-color:#EEEEEE;
	padding: 10px 10px 10px 40px;
}

.success {
	background: url(&#039;../../img/adm/success.png&#039;) no-repeat 8px;
	color: #73ae0b;
}
</pre>
<p>O que foi feito? Primeiro eu retirei as limitações de tamanho do elemento. Assim eles podem expandir e se reduzir de acordo com o conteúdo do elemento. Depois removi a imagem de background que dava as bordas arredondadas ao elemento. <a href="http://www.google.com.br/search?hl=pt-BR&#038;q=rounded+border+javascript&#038;btnG=Pesquisar&#038;meta=">Existem muitas maneiras de se conseguir bordas arredondadas sem imagens no seu layout, mas a maioria é com javascript</a>. A galera do blog <a href="http://perishablepress.com/">Perishable Press</a> criou um artigo recentemente mostrando como é possível conseguir <a href="http://perishablepress.com/press/2008/11/24/perfect-rounded-corners-with-css/">bordas arredondadas apenas com css</a>! E foi isso que eu fiz. Você pode dizer &#8220;Ah, mas isso não é suportado em todos os browsers, apenas nos mais recentes&#8221;, daí eu te respondo com este link <a href="http://dowebsitesneedtolookexactlythesameineverybrowser.com/">AQUI</a>! O importante é ter consciência das formas que este elemento vai tomar em browsers que não suportam estes comandos ainda.</p>
<p>Coloquei como cor de fundo a cor da imagem e defini alguns paddings. Depois ficou fácil, foi só colocar a imagem de background na classe &#8220;success&#8221; e posicioná-la a 8 pixels das bordas do elemento, definir uma cor para a fonte e pronto! Não ficou tudo mais lindo e flexivel e sem tags desnecessárias?</p>
<p>Com um pouco mais de raciocínio, a gente consegue fazer coisas muito boas com css, é só experimentar!</p>
<p>O próximo desafio será utilizar a técnica de &#8220;<a href="http://www.alistapart.com/articles/slidingdoors/">sliding</a> <a href="http://www.alistapart.com/articles/slidingdoors2/">doors</a>&#8221; para os botões de submit, que também possuem um background fixo! Quando eu fizer isto, posto aqui como foi que fiz <img src='http://www.eberfdias.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/2008/12/18/melhorando-um-tema/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Eu no FalaFreela #9</title>
		<link>http://www.eberfdias.com/blog/2008/10/27/eu-no-falafreela-9/</link>
		<comments>http://www.eberfdias.com/blog/2008/10/27/eu-no-falafreela-9/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 03:02:07 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[freelance]]></category>
		<category><![CDATA[podcast]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=128</guid>
		<description><![CDATA[Passando por aqui rapidinho só pra dizer que no episódio de #9 saiu um email de voz que mandei pro pessoal do FalaFreela! No episódio #8 eles citaram o tu-dus e eu enviei a mensagem pra agradecer   Este episódio de #9 fala sobre &#8220;Como colocar seu bloco na rua&#8221; ou, traduzindo, como se [...]]]></description>
			<content:encoded><![CDATA[<p>Passando por aqui rapidinho só pra dizer que no <a href="http://falafreela.com.br/episodios/falafreela9-chegou-a-hora-de-colocar-seu-bloco-na-rua/" target="_blank">episódio de #9</a> saiu um email de voz que mandei pro pessoal do <a href="http://falafreela.com.br" target="_blank">FalaFreela</a>! No <a href="http://falafreela.com.br/episodios/falafreela8-tempo-tempo-mano-velho-falta-um-pouco-ainda-eu-sei/" target="_blank">episódio #8</a> eles citaram o <a href="http://tu-dus.com" target="_blank">tu-dus</a> e eu enviei a mensagem pra agradecer <img src='http://www.eberfdias.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Este episódio de #9 fala sobre &#8220;Como colocar seu bloco na rua&#8221; ou, traduzindo, como se fazer conhecido para as outras pessoas. São diversas dicas bacanas! Só faltou mesmo o pessoal falar do <a href="http://www.designup.pro.br/">designUp</a>, que também te deixa <a href="http://www.designup.pro.br/portfolio/eberfreitas">fazer portfolios profissionais de forma simples e bonita</a>, além de te fazer conhecer <a href="http://www.designup.pro.br/profissionais" target="_blank">centenas de designers interessantes e bacanudos</a>! Fica aí a dica extra <img src='http://www.eberfdias.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>FalaFreela vai ao ar toda segunda-feira (eu acho) e conta com a participação do Mauro Amaral (<a href="http://www.contemconteudo.org/" target="_blank">aqui</a> e <a href="http://carreirasolo.org/" target="_blank">aqui</a>) Humberto Oliveira (<a href="http://www.holiveira.com" target="_blank">aqui</a>) e Carol Vigna-Maru (<a href="http://www.vignamaru.com.br/" target="_blank">aqui</a> e <a href="http://www.lagartixa.org/" target="_blank">aqui</a>). Se eu fosse você, assinava o <a href="http://feedproxy.google.com/FalaFreela" target="_blank">feed</a> e ouvia toda semana <img src='http://www.eberfdias.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/2008/10/27/eu-no-falafreela-9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
