<?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, 22 Jul 2010 18:17:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Optionable Behavior</title>
		<link>http://www.eberfdias.com/blog/optionable-behaviour/327/</link>
		<comments>http://www.eberfdias.com/blog/optionable-behaviour/327/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 22:27:53 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=327</guid>
		<description><![CDATA[The Optionable Behavior is a CakePHP behavior that tries to bring something from schemaless databases to RDBMS databases like MySQL. With it, you can add as much extra fields as you need to a table without touching the DB design / schema. So, how do I use it? Actually, we will store extra data on [...]]]></description>
			<content:encoded><![CDATA[<p>The Optionable Behavior is a CakePHP behavior that tries to bring something from schemaless databases to RDBMS databases like MySQL. With it, you can add as much extra fields as you need to a table without touching the DB design / schema.</p>
<p><span id="more-327"></span></p>
<h3>So, how do I use it?</h3>
<p>Actually, we will store extra data on another table so, first of all, you need to create this auxiliary table:</p>
<pre>
CREATE TABLE IF NOT EXISTS `options` (
  `id` int(11) NOT NULL auto_increment,
  `model` varchar(32) NOT NULL,
  `related_id` int(11) NOT NULL,
  `opt_key` varchar(32) NOT NULL,
  `opt_value` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `opt_key` (`opt_key`)
);
</pre>
<p>If you can&#8217;t have a new table named &#8216;options&#8217;, don&#8217;t worry. Just name it something else. Now you need to create the model file for this table. Something like this should be enough:</p>
<pre>
class Option extends AppModel { }
</pre>
<p>If you are using a different table name, don&#8217;t forget to change the class name to whatever other name you have for it. Now you can download the behavior file <a href="http://gist.github.com/334181">here</a>. Place it under your behaviors folder.</p>
<h3>Now what?</h3>
<p>Let&#8217;s pretend that you have a model named <strong>Blog</strong> which has three columns on it&#8217;s table: id, title and content. Generally, if I want to extend this table, I&#8217;ll have to deal with it&#8217;s schema, but using the Optionable Behavior, things get really easy. Imagine that I want to add my <strong>mood</strong> and the <strong>current weather</strong> to some posts on the blog. I just have to do something like this:</p>
<pre>
public $actsAs = array(
	'Optionable' => array(
		'model' => 'Option',
		'fields' => array('mood', 'weather'),
		'emptyFields' => true
	)
);
</pre>
<p>Now I can just put those extra keys on a form, save some data and that is it. The data will be retrieved from the database just like if they were from the Blog&#8217;s schema itself.</p>
<p>See that we have three configuration keys to the behavior:</p>
<ul>
<li><strong>model</strong>: defaults to &#8216;Option&#8217;. Just define this if you are using a different table name.</li>
<li><strong>fields</strong>: no default. Here you can define every optional field that you want to use in your model.</li>
<li><strong>emptyFields</strong>: defaults to true. If true, even if that option is not registered on the auxiliary table, the key will be present on the data array.</li>
</ul>
<p>This behavior tries it&#8217;s best to make every optional field feels like a native one. This means that you can save, validate and retrieve optional data just like you would with common fields. We are working to make it possible to filter data by optional fields as well.</p>
<p>A great benefit of using this behavior is that you can store different data types on the DB seamlessly. Every data is serialized before getting saved to the table. That means that you can store arrays, objects and other data types not natively supported by RDBMSs without having any trouble converting them as they come and go.</p>
<p>Well, I guess this is it. If you have any idea on how to make this work any better, please, share with us! Here is the code:</p>
<p><script src="http://gist.github.com/334181.js?file=optionable.php"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/optionable-behaviour/327/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New theme for 2010</title>
		<link>http://www.eberfdias.com/blog/new-theme-for-2010/273/</link>
		<comments>http://www.eberfdias.com/blog/new-theme-for-2010/273/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 20:13:08 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[Stuff]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=273</guid>
		<description><![CDATA[A lot of new things are going on in my life right now and I wish I could blog more about them. In fact, I could but I was really discouraged bu my older blog theme [it doesn't makes sense, but whatever]. The old theme was &#8216;too much&#8217; you know? So I decided to create [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of new things are going on in my life right now and I wish I could blog more about them. In fact, I could but I was really discouraged bu my older blog theme [it doesn't makes sense, but whatever]. The old theme was &#8216;too much&#8217; you know?</p>
<p>So I decided to create a brand new theme. I started to design it yesterday and it done already [or mostly]. As you can see, it&#8217;s a very simple theme. Actually, I&#8217;m only using the &#8220;index.php&#8221; file of the theme and nothing else. I know I&#8217;m missing a lot of things, but I plan to add those as we go.</p>
<p><span id="more-273"></span></p>
<p>I&#8217;ve tried to create a very simple theme, with the basics to deliver messages, articles and codes I&#8217;ve been creating. The typeface I&#8217;m using is called <a href="http://www.levien.com/type/myfonts/inconsolata.html">Inconsolata</a> and it is the very same typeface I use on my code editor, so it reflects my new passion in life.</p>
<p>I&#8217;m also using <a href="http://disqus.com/">DISQUS</a> for comments. I can&#8217;t tell how much I hated to create all those comments stuff on WP themes, so using that was a great *great* relieve. I&#8217;ve removed a lot of old and outdated posts or posts I didn&#8217;t consider relevant anymore so the blog is really empty right now. Hopefully, I&#8217;ll start to blog more and more about consistent things.</p>
<p>And finally, I&#8217;ll try to blog in english from now on, so expect a lot of grammar errors and wrong spelling! I&#8217;ve added an authomatic link to translate posts with Google Transaltor so I hope no one misses anything!</p>
<p>I guess that is all. Maybe I&#8217;ll post some new things later, maybe not so, subcribe to the RSS and you won&#8217;t even have to see which theme I&#8217;m using!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/new-theme-for-2010/273/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Easy sorting with CakePHP</title>
		<link>http://www.eberfdias.com/blog/easy-sorting-with-cakephp/265/</link>
		<comments>http://www.eberfdias.com/blog/easy-sorting-with-cakephp/265/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 19:42:26 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=265</guid>
		<description><![CDATA[Hey guys! Here is a simple function that helps me to sort elements in a MySQL database by it&#8217;s ID&#8217;s: If that is usefull to you, let me know!]]></description>
			<content:encoded><![CDATA[<p>Hey guys!</p>
<p>Here is a simple function that helps me to sort elements in a MySQL database by it&#8217;s ID&#8217;s:</p>
<p><script src="http://gist.github.com/249256.js?file=simplesort.php"></script></p>
<p>If that is usefull to you, let me know!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/easy-sorting-with-cakephp/265/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sluggable Behavior</title>
		<link>http://www.eberfdias.com/blog/sluggable-behavior/210/</link>
		<comments>http://www.eberfdias.com/blog/sluggable-behavior/210/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 00:18:58 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=210</guid>
		<description><![CDATA[On the web, &#8220;slug&#8221; is a short text used in a URL to identify and describe a resource. As Mariano Iglesias&#8217; Sluggable Behavior decription says: This is particularly useful to create SEO links out of, for example, a table of articles. Instead of seeing those ugly /articles/view/4 URLs, use the Sluggable Behavior and easily accept [...]]]></description>
			<content:encoded><![CDATA[<p>On the web, &#8220;slug&#8221; is <a href="http://en.wikipedia.org/wiki/Slug_%28typesetting%29#Slug_.28web_publishing.29">a short text used in a URL to identify and describe a resource</a>. As Mariano Iglesias&#8217; Sluggable Behavior decription says:</p>
<blockquote><p>This is particularly useful to create SEO links out of, for example, a table of articles. Instead of seeing those ugly /articles/view/4 URLs, use the Sluggable Behavior and easily accept URLs such as /articles/view/my-seo-friendly-article. It handles the slug creation, slug collision, and allows you to specify different settings such as the separator to use, maximum width of a slug, among other useful parameters.</p></blockquote>
<p>My Sluggable Behavior is a simpler version of <a href="http://cake-syrup.sourceforge.net/ingredients/sluggable-behavior/">Mariano Iglesias&#8217; Sluggable Behavior</a> with a few add-ons. It&#8217;s basically the same thing but instead of implementing all the slug logic on the behavior, it just uses Cake&#8217;s Inflector::slug() method. With CakePHP 1.3, this method is really powerful and <a href="http://book.cakephp.org/view/1579/Library-classes">flexible</a>.</p>
<p><span id="more-210"></span></p>
<p>To use it, just <a href="http://gist.github.com/338096">place the behavior file</a> on the proper place and call it on the model you want to &#8220;slugify&#8221;:</p>
<pre>
var $actsAs = array('Sluggable');
</pre>
<p>By default, this will automatically create slugs from a field named &#8220;title&#8221; and place it under a field named &#8220;slug&#8221;. If you want, you can customize everything. Checkout the configuration keys:</p>
<pre>
var $actsAs = array(
	'Sluggable' => array(
		'fields' => 'title',
		'scope' => false,
		'conditions' => false,
		'slugfield' => 'slug',
		'separator' => '-',
		'overwrite' => false,
		'length' => 256,
		'lower' => true
	)
);
</pre>
<p>Those are all the default values. Let&#8217;s check what they can do, one by one:</p>
<ul>
<li><strong>fields</strong>: as you can see, this is where you define which field will provide the content to the slug. You can inform more than one with an array.</li>
<li><strong>scope</strong>: after generating a slug, the system will check for similar slugs on the database in order to generate a unique slug. By default, it will scan all your registries, but you can define scopes. Example: you want the system to use an already registered slug on a different category. You can define an array like this: &#8216;scope&#8217; => array(&#8216;category_id&#8217;). The system will only check for records where the &#8220;category_id&#8221; is the same from the data being saved.</li>
<li><strong>conditions</strong>: these are extra conditions you can inform. The system will scan for similar slugs previously registered on the database using those conditions as well. They work just like a normal find conditions array.</li>
<li><strong>slugfield</strong>: the name of the field that will store the slug on the database.</li>
<li><strong>separator</strong>: the character that will be used to replace white spaces on the slug.</li>
<li><strong>overwrite</strong>: if true, this will replace the slug from a record on update, otherwise it will be kept untouched on a update.</li>
<li><strong>length</strong>: this defines the length of the slug text.</li>
<li><strong>lower</strong>: if false, the behavior won&#8217;t make the slug all lower case.</li>
</ul>
<p>Once again, this behavior is totally inspired by <a href="http://cake-syrup.sourceforge.net/ingredients/sluggable-behavior/">Mariano Iglesias&#8217; Sluggable Behaviour</a>. If you want to help, please comment! Here is the source code:</p>
<p><script src="http://gist.github.com/338096.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/sluggable-behavior/210/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Fazendo joins on the fly no CakePHP</title>
		<link>http://www.eberfdias.com/blog/fazendo-joins-on-the-fly-no-cakephp/206/</link>
		<comments>http://www.eberfdias.com/blog/fazendo-joins-on-the-fly-no-cakephp/206/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 02:58:13 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[CakePHP]]></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 nem está mais aqui. Muita coisa já mudou. Na verdade, na época a coisa já havia mudado, mas eu não sabia. Foi quando eu encontrei este outro [...]]]></description>
			<content:encoded><![CDATA[<p>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 nem está mais aqui. 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><span id="more-206"></span></p>
<p>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>
$posts = $this->Post->find('all', array(
	'joins' => array(
		array(
			'table'      => 'posts_tags',
			'alias'      => 'PostsTag',
			'type'       => 'INNER',
			'conditions' => array('PostsTag.post_id = Post.id')
		),
		array(
			'table'      => 'tags',
			'alias'      => 'Tag',
			'type'       => 'INNER',
			'conditions' => array(
				'Tag.id = PostsTag.tag_id',
				'Tag.tag LIKE' => '%design%'
			)
		)
	)
));
</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 o método <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>
var $wp = array(
	'driver' => 'mysql',
	'persistent' => false,
	'host' => 'localhost',
	'login' => 'user',
	'password' => 'password',
	'database' => 'qolwp',
	'encoding' => 'utf8'
);
</pre>
<p>Depois, já no meu controller, escrevi a seguinte linha:</p>
<pre>
$this->WpPost = ClassRegistry::init(array(
	'ds' => 'wp',
	'table' => 'wp_posts',
	'class' => 'model',
	'alias' => 'WpPost'
));
</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>
$posts = $this->WpPost->find('all', array(
        'joins' => array(
                array(
                        'table' => 'wp_term_relationships',
                        'alias' => 'WpTermRelationship',
                        'type' => 'INNER',
                        'conditions' => array('WpPost.ID = WpTermRelationship.object_id')
                ),
                array(
                        'table' => 'wp_term_taxonomy',
                        'alias' => 'WpTermTaxonomy',
                        'type' => 'INNER',
                        'conditions' => array('WpTermRelationship.term_taxonomy_id = WpTermTaxonomy.term_taxonomy_id')
                ),
                array(
                        'table' => 'wp_terms',
                        'alias' => 'WpTerm',
                        'type' => 'INNER',
                        'conditions' => array('WpTermTaxonomy.term_id = WpTerm.term_id')
                )
        ),
        'conditions' => array(
                'WpPost.post_type' => 'post',
                'WpPost.post_status' => 'publish',
                'WpTermTaxonomy.taxonomy' => 'category',
                'WpTerm.slug' => 'painel'
        ),
        'fields' => array(
                'WpPost.post_title',
                'WpPost.post_content',
                'WpPost.guid',
                'WpPost.post_date'
        ),
        'group' => 'WpPost.ID',
        'order' => 'WpPost.post_date DESC',
        'limit' => 5
));
</pre>
<p>O SQL que esta função vai criar fica assim:</p>
<pre>
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
</pre>
<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>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/fazendo-joins-on-the-fly-no-cakephp/206/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Quitanda On-Line</title>
		<link>http://www.eberfdias.com/blog/quitanda-on-line/190/</link>
		<comments>http://www.eberfdias.com/blog/quitanda-on-line/190/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 22:05:10 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[Startups]]></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.</p>
<p><span id="more-190"></span></p>
<p><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/quitanda-on-line/190/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Eu no FalaFreela #9</title>
		<link>http://www.eberfdias.com/blog/eu-no-falafreela-9/128/</link>
		<comments>http://www.eberfdias.com/blog/eu-no-falafreela-9/128/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 03:02:07 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[Stuff]]></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 fazer conhecido [...]]]></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/eu-no-falafreela-9/128/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>tu-dus</title>
		<link>http://www.eberfdias.com/blog/tu-dus/45/</link>
		<comments>http://www.eberfdias.com/blog/tu-dus/45/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 14:33:22 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/2008/02/18/tu-dus-organizacao-de-tarefas-feita-a-sua-maneira/</guid>
		<description><![CDATA[Finalmente eu lancei meu primeiro aplicativo online! Foi uma longa jornada pra poder conciliar meu trabalho diário com horas extras pra terminar o tu-dus. Na verdade, eu só fiz o tu-dus pra poder conciliar melhor as coisas na minha vida. tu-dus é um aplicativo on-line que te permite organizar suas tarefas e eu vou explicar [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente eu lancei <a href="http://en.wikipedia.org/wiki/WebApp" target="_blank">meu primeiro aplicativo online</a>!</p>
<p>Foi uma longa jornada pra poder conciliar <a href="http://www.acoruja.com/" target="_blank">meu trabalho diário</a> com horas extras pra terminar o <strong>tu-dus</strong>. Na verdade, eu só fiz o <strong>tu-dus</strong> pra poder conciliar melhor as coisas na minha vida.</p>
<p><a href="http://tu-dus.com">tu-dus</a> é um aplicativo on-line que te permite organizar suas tarefas e eu vou explicar o &#8220;por quê&#8221; de eu ter criado esse treco.</p>
<p><span id="more-45"></span></p>
<p><a href="http://tu-dus.com" class="alignleft" style="margin:0 10px 10px 0;"><img src="http://www.eberfdias.com/blog/wp-content/uploads/2008/02/tudus.gif" border="0" alt="tu-dus" /></a></p>
<p>Depois de ler muito sobre <a href="http://marcogomes.com/blog/2008/produtividade-simplicidade-e-foco/" target="_blank">produtividade</a>, sobre como <a href="http://lifehacker.com/search/procrastination/" target="_blank">vencer a procrastinação</a>, aprendido um pouco de <a href="http://pt.wikipedia.org/wiki/Gtd" target="_blank">GTD</a> e experimentado <a href="http://backpackit.com/" target="_blank">muitos</a> <a href="http://www.tadalist.com/" target="_blank">aplicativos</a> <a href="http://www.rememberthemilk.com/" target="_blank">para</a> <a href="http://todoist.com/" target="_blank">estes</a> <a href="http://www.posttask.com/" target="_blank">fins</a>, percebi que, pra mim, uma folha de papel ou um arquivo de texto eram muito mais eficientes do que alguns estes programas [eu ainda sou fã do Post Task] na hora de organizar minhas tarefas. O problema não eram os programas em si. Todos eles são muito bons, com características muito bacanas mas, enquanto uns tinham opções de mais, outros não tinham aquelas opções legais que eu gostaria de ter à mão pra aplicar de uma forma bem eficaz os conceitos e processos de produtividade que eu havia aprendido. Ainda assim eu gostaria de ter alguma ferramenta que fosse mais fácil de usar que um bloco de notas, sem ter que ficar digitando e identando minhas tarefas, foi então que surgiu a idéia de fazer o <strong>tu-dus</strong>. Ele é um aplicativo que fiz pra suprir minhas próprias necessidades de organização e espero que outras pessoas possam se identificar com o ele.</p>
<h3>E o que ele tem de diferente?</h3>
<p>Bem, o <strong>tu-dus</strong> é um aplicativo muito simples. Basicamente, ele é um app pra guardar suas tarefas e notas [caso você precise colocar um texto maior pra consultas e etc]. O grande barato é que ele funciona mais ou menos como as pastas de um sistema operacional. Dentro de cada ítem da sua lista, você pode criar uma nova lista com outros itens e notas e assim infinitamente.</p>
<h3>Por que isso?</h3>
<p>Esta característica, apesar de simples, é muito poderosa, pois expande a abrangência do <strong>tu-dus</strong> pra além de suas tarefas. Ele é uma ferramenta que te permite criar listas sobre qualquer coisa sem que tudo vire uma banguça, deixando as informações sempre à mão pra quando for necessário. Ele também facilita a aplicação dos principais conceitos de produtividade espalhados por aí.</p>
<p>Você vai perceber que não existe nada no <strong>tu-dus</strong> além de ferramentas pra adicionar itens e notas. A gente fez o <strong>tu-dus</strong> da forma mais simples possível pra que ele seja também o mais flexível. Algumas características que seriam facilmente encontradas na maioria dos &#8220;task managers&#8221; como agendamentos, prioridades e etc., você não vai encontrar no <strong>tu-dus</strong>, isto porque a idéia é que você organize suas tarefas da maneira que achar melhor e não da maneira que nós permitimos. Pelo fato de ser possivel criar listas dentro de listas, fica fácil criar um item para um determinado dia, ou organizar suas tarefas dentro de um item que determina uma certa prioridade e assim por diante&#8230;</p>
<h3>E como você fez isso?</h3>
<p>Bom, eu não sou nenhum expert em programação. Como sempre digo, sou um eterno noob neste mundo, mas ando dando os meus pitacos. Então desde que aprendi a usar <a href="http://cakephp.org/" target="_blank">CakePHP</a>, tenho podido pensar além das minhas limitações como programador, visto que o framework me ajuda bastante na hora de realizar tarefas que, sozinho, eu penaria muito pra fazer. Foi com ele que eu criei a parte server-side do <strong>tu-dus</strong>.</p>
<p>Para a parte client-side eu usei o charmoso <a href="http://jquery.com/" target="_blank">jQuery</a>. Ele me ajudou muito na hora de criar um código limpo, sem eventos no meio do HTML nem nada. Suas capacidades de seleção são muito poderosas e bacanas. Aposto que existem outros frameworks de JS tão legais quanto (estou de olho no <a href="http://dojotoolkit.org/" target="_blank">Dojo</a>) mas o jQuey respondeu muito bem às minhas expectativas e foi ótimo aprender a utilizá-lo.</p>
<p>Bom, é isso! Se você leu este artigo e quer experimentar o <strong>tu-dus</strong>, fique à vontade! Ele é <strong>totalmente gratuito</strong>, o cadastro demora menos de 30 segundos e é só alegria. Espero que gostem e qualquer coisa, mande um comentário aí com sugestão ou pergunta ou crítica, ou mande email pra contato@tu-dus.com.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/tu-dus/45/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>CruciForum</title>
		<link>http://www.eberfdias.com/blog/cruciforum/27/</link>
		<comments>http://www.eberfdias.com/blog/cruciforum/27/#comments</comments>
		<pubDate>Thu, 08 Nov 2007 23:52:25 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=27</guid>
		<description><![CDATA[Tá, pode até parecer um exagero, afinal, não é a toa que temos por aí sistemas conceituados como phpBB, vBadvanced e, mais ultimamente, o Vanilla, que são fóruns muito legais. Mas eu adoro coisas simples, fáceis, sem enrolação, abstratas e totalmente extensíveis, por isso adorei o CruciForum. Ele tem este nome porque diz ser um [...]]]></description>
			<content:encoded><![CDATA[<p>Tá, pode até parecer um exagero, afinal, não é a toa que temos por aí sistemas conceituados como <a href="http://www.phpbb.com/" target="_blank">phpBB</a>, <a href="http://www.vbadvanced.com/" target="_blank">vBadvanced</a> e, mais ultimamente, o <a href="http://getvanilla.com/" target="_blank">Vanilla</a>, que são fóruns muito legais. Mas eu adoro coisas simples, fáceis, sem enrolação, abstratas e totalmente extensíveis, por isso adorei o <a href="http://www.kryogenix.org/code/cruciforum/" target="_blank">CruciForum</a>.</p>
<p>Ele tem este nome porque diz ser um <em><strong>&#8220;Fórum Crucial&#8221;</strong></em>, ou seja, só possui aquilo que é extremamente básico pra um fórum funcionar. No caso do CruciForum isto quer dizer que qualquer um pode adicionar e responder tópicos livremente, sem cadastros chatos nem nada! Imagine que o CruciForum é como se fosse um blog muito básico, onde qualquer um coloca seus posts e qualquer outra pessoa pode comentar!</p>
<p><span id="more-27"></span></p>
<p>E apesar desta idéia parecer estranha numa época em que spams são vastamente propagados por aí, o CruciForum tem suporte ao sistema <a href="http://akismet.com/" target="_blank"><strong>Askimet</strong></a> de prevenção contra spams! Quem usa <a href="http://www.wordpress.com/" target="_blank">WordPress</a> já conhece o Askimet. É um software desenvolvido pela mesma empresa criadora do WordPress que reconhece e marca mensagens que sejam spams. Deste jeito, ninguém vai poder adicionar conteúdos duvidosos no seu fórum.</p>
<p>Outra grande característica do CruciForum e que acabou me levando a um outro grande sistema on-line foi a utilização do sistema <strong><a href="http://site.gravatar.com/" target="_blank">Gravatars</a></strong> para exibir imagens dos autores. Gravatars é um acrônimo para &#8220;Globally Recognized Avatars&#8221; ou &#8220;Avatares Globalmente Reconhecidos&#8221;. É um site onde você pode anexar seu email a diferentes imagens, que podem ser resgatadas por sites que utilizam códigos especiais pra reconhecer estas imagens simplismente pela informação do seu endereço de email, ou seja, você não precisa de nenhum registro para colocar um avatar bonito de até 80&#215;80 pixels nos posts do seu fórum.</p>
<p>A instalação do fórum é a coisa mais ridícula do mundo e um dos motivos pra isto é que ele não utiliza nenhum banco de dados. Você baixa um único arquivo php, executa ele no servidor, numa pasta com CHMOD 777 e pronto! Ele gera uma série de arquivos e o fórum já está pronto pra rodar. Aí vão uns screenshots:</p>
<ol>
<li><a href="http://i92.photobucket.com/albums/l4/eberfreitas/01.jpg" target="_blank">Tela da primeira vez que o script é executado&#8230;<br />
</a></li>
<li><a href="http://i92.photobucket.com/albums/l4/eberfreitas/02.jpg" target="_blank">Tela seguinte, logo após a instalação estar completa e o fórum pronto pra uso&#8230;</a></li>
<li><a href="http://i92.photobucket.com/albums/l4/eberfreitas/03.jpg" target="_blank">Tela principal do fórum, com a listagem de posts&#8230;</a></li>
<li><a href="http://i92.photobucket.com/albums/l4/eberfreitas/04.jpg" target="_blank">Onde acontece o envio dos posts!</a></li>
</ol>
<p>Os arquivos gerados são muito simples, então fica fácil criar um tema personalizado, adiconar funções javascript, um css diferenciado e tudo mais, enfim, ele é totalmente extensível, &#8220;o fórum dos sonhos&#8221;! Claro que não vai servir pra qualquer tipo de site, mas no geral, acho que é totalmente suficiente e eficaz.</p>
<p>Você pode ver um <a href="http://www.kryogenix.org/code/cruciforum/forum" target="_blank">&#8220;demo&#8221; do fórum aqui</a>! Muito fácil de usar. Ainda existem algumas pendências como a ineficiência do cookie que guarda suas informações pessoais [pra evitar você de ter que digitar os mesmos dados sempre], mas <a href="http://www.kryogenix.org/days/" target="_blank">Stuart Langridge</a>, criador do CruciForum e figurinha carimbada do mundo do desenvolvimento pra web, parece estar sempre mexendo aqui e ali no sistema, então novas versões aprimoradas estão sempre aparecendo por aí. <strong>Nota 10</strong> [apesar dos bugzinhos]!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/cruciforum/27/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Braintest</title>
		<link>http://www.eberfdias.com/blog/braintest/22/</link>
		<comments>http://www.eberfdias.com/blog/braintest/22/#comments</comments>
		<pubDate>Sun, 21 Oct 2007 14:40:20 +0000</pubDate>
		<dc:creator>Éber</dc:creator>
				<category><![CDATA[Stuff]]></category>

		<guid isPermaLink="false">http://www.eberfdias.com/blog/?p=22</guid>
		<description><![CDATA[Vi este teste no blog do Anderson e resolvi fazer. Olha o meu resultado: Eber, you are somewhat left-hemisphere dominant and show a preference for visual learning, although not extreme in either characteristic. You probably tend to do most things in moderation, but not always. Your left-hemisphere dominance implies that your learning style is organized [...]]]></description>
			<content:encoded><![CDATA[<p>Vi <a href="http://mindmedia.com/braintest.html" target="_blank">este teste</a> no blog do <a href="http://www.amorislove.com/" target="_blank">Anderson</a> e resolvi fazer. Olha o meu resultado:</p>
<p><span id="more-22"></span></p>
<blockquote><p>Eber, you are somewhat left-hemisphere dominant and show a preference for visual learning, although not extreme in either characteristic. You probably tend to do most things in moderation, but not always.</p>
<p>Your left-hemisphere dominance implies that your learning style is organized and structured, detail oriented and logical. Your visual preference, though, has you seeking stimulation and multiple data. Such an outlook can overwhelm structure and logic and create an almost continuous state of uncertainty and agitation. You may well suffer a feeling of continually trying to &#8220;catch up&#8221; with yourself.</p>
<p>Your tendency to be organized and logical and attend to details is reasonably well-established which should afford you success regardless of your chosen field of endeavor. You can &#8220;size up&#8221; situations and take in information rapidly. However, you must then subject that data to being classified and organized which causes you to &#8220;lose touch&#8221; with the immediacy of the problem.</p>
<p>Your logical and methodical nature hamper you in this regard though in the long run it may work to your advantage since you &#8220;learn from experience&#8221; and can go through the process more rapidly on subsequent occasions.</p>
<p>You remain predominantly functional in your orientation and practical. Abstraction and theory are secondary to application. In keeping with this, you focus on details until they manifest themselves in a unique pattern and only then work with the &#8220;larger whole.&#8221;</p>
<p>With regards to your career choices, you have a mentality that would be good as a scientist, coach, athlete, design consultant, or an engineering technician. You can &#8220;see where you want to go&#8221; and even be able to &#8220;tell yourself,&#8221; but find that you are &#8220;fighting yourself&#8221; at the darndest times.</p></blockquote>
<p>As porcentagens foram as seguintes:</p>
<blockquote><p>Auditory : 27%<br />
Visual : 72%<br />
Left : 68%<br />
Right : 31%</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.eberfdias.com/blog/braintest/22/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
