<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Programador Prático</title>
	
	<link>http://www.auriumsoft.com.br/programadorpratico</link>
	<description>A jornada de aprendizado Ruby e Ruby on Rails, por um programador PHP.</description>
	<lastBuildDate>Sat, 08 May 2010 16:55:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ProgramadorPratico" /><feedburner:info uri="programadorpratico" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>ProgramadorPratico</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>C – Ponteiros e operações com string</title>
		<link>http://feedproxy.google.com/~r/ProgramadorPratico/~3/Z2rTfD3yRy8/</link>
		<comments>http://www.auriumsoft.com.br/programadorpratico/2010/05/c-ponteiros-e-operacoes-com-string/#comments</comments>
		<pubDate>Sat, 08 May 2010 16:55:40 +0000</pubDate>
		<dc:creator>Alfred Reinold Baudisch</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[ponteiros]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://www.auriumsoft.com.br/programadorpratico/?p=83</guid>
		<description><![CDATA[De modo geral (mas com várias contradições), uma string em C é basicamente um array de chars, ou especificamente um char *. Por essa razão é possível operar em strings apenas utilizando ponteiros. Um exemplo bem legal é a função strlen da biblioteca padrão. O código comenta tudo sobre o assunto, então vamos direto ao [...]]]></description>
			<content:encoded><![CDATA[<p>De modo geral (mas com várias contradições), uma string em C é basicamente um array de chars, ou especificamente um <code>char *</code>. Por essa razão é possível operar em strings apenas utilizando ponteiros. Um exemplo bem legal é a função <code>strlen</code> da biblioteca padrão. O código comenta tudo sobre o assunto, então vamos direto ao ponto.</p>
<pre class="brush: cpp">int strlen(char *s)
{
    char *p = s;

    //
    // *++p primeiro incrementa, depois retorna valor
    //
    // Ele chega até o NULL, pois:
    //
    // Exemplo:
    // Assumir a string "Hello World", ela tem 11 caracteres + \0
    // +-------+----------+  +-------+----------+
    // | Letra | Endereço |  | Letra | Endereço |
    // +-------+----------+  +-------+----------+
    // |   H   |   28     |  |   W   |   2E     |
    // |   e   |   29     |  |   o   |   2F     |
    // |   l   |   2A     |  |   r   |   30     |
    // |   l   |   2B     |  |   l   |   31     |
    // |   o   |   2C     |  |   d   |   32     |
    // |       |   2D     |  |  \0   |   33     |
    // +-------+----------+  +-------+----------+
    //
    // Ao chegar em \0, o loop termina. Mas, p estará apontando
    // para o endereço 33, ou seja, \0.
    // No final, a diferença p-s fará 33 - 28 (início da string, para onde s aponta)
    // totalizando 11.
    //
    // Para verificar isso, como exemplo, usar 28+12 = 40.
    // Mas, entre de 28 até 40 são 13 números que existem, mesmo caso acima e por
    // isso que NULL não é contado, mesmo que p fique apontando para \0 no final.
    //
    while(*++p);

    return (int)(p-s);
}
</pre>
<p>Observação: Talvez nunca nem eu nem você tenhamos que nos preocupar com operações do gênero, de tão baixo nível, ainda mais que como eu mesmo disse, isso é uma função da biblioteca padrão (ou como no caso de C++ que abole as strings de C com a classe <code>string</code>). Mas, estudar nunca é demais, isso ajuda a clarear ainda mais sobre ponteiros.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.auriumsoft.com.br/programadorpratico/2010/05/c-ponteiros-e-operacoes-com-string/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.auriumsoft.com.br/programadorpratico/2010/05/c-ponteiros-e-operacoes-com-string/</feedburner:origLink></item>
		<item>
		<title>C – Ponteiros constantes e não constantes</title>
		<link>http://feedproxy.google.com/~r/ProgramadorPratico/~3/eDFandID1Hk/</link>
		<comments>http://www.auriumsoft.com.br/programadorpratico/2010/05/c-ponteiros-constantes-e-nao-constantes/#comments</comments>
		<pubDate>Sun, 02 May 2010 23:35:29 +0000</pubDate>
		<dc:creator>Alfred Reinold Baudisch</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[const]]></category>
		<category><![CDATA[constante]]></category>
		<category><![CDATA[ponteiros]]></category>

		<guid isPermaLink="false">http://www.auriumsoft.com.br/programadorpratico/?p=76</guid>
		<description><![CDATA[Ponteiros de C e C++ possuem várias características avançadas e até mesmo alguns detalhes irritantes, que confundem qualquer um. Procurarei em 2 ou 3 tutoriais cobrir detalhes obscuros de ponteiros.
Nesse artigo, vou cobrir a relação ponteiro vs. constantes:

Ponteiro:
tipo *nome;

Ponteiro não constante para dados constantes:
const tipo *nome;

Ponteiro constante para dados não constantes:
tipo *const nome;

Ponteiro e dados [...]]]></description>
			<content:encoded><![CDATA[<p>Ponteiros de C e C++ possuem várias características avançadas e até mesmo alguns detalhes irritantes, que confundem qualquer um. Procurarei em 2 ou 3 tutoriais cobrir detalhes obscuros de ponteiros.</p>
<p>Nesse artigo, vou cobrir a relação <strong>ponteiro vs. constantes</strong>:</p>
<ol>
<li>Ponteiro:
<pre class="brush: cpp">tipo *nome;</pre>
</li>
<li>Ponteiro não constante para dados constantes:
<pre class="brush: cpp">const tipo *nome;</pre>
</li>
<li>Ponteiro constante para dados não constantes:
<pre class="brush: cpp">tipo *const nome;</pre>
</li>
<li>Ponteiro e dados constantes:
<pre class="brush: cpp">const tipo *const nome;</pre>
</li>
</ol>
<p>A idéia é que se o operador <code>*</code> vem depois de <code>const</code> são assumidos os dados bases (assim, é um ponteiro para dados constantes). Se o operador vem antes de <code>const</code>, então é um ponteiro constante.</p>
<p>Isso pode ser facilmente identificado quando é feita <strong>uma leitura da direita para a esquerda:</strong></p>
<pre class="brush: cpp">// Leitura de declarações &lt;-
int *x;             // x é um ponteiro para int
const int *y;       // y é um ponteiro não constante para um int constante
const int *const p; // p é um ponteiro constante para um int constante
int *const w;       // w é um ponteiro constante para um int não constante</pre>
<h3>Exemplo completo</h3>
<pre class="brush: cpp">    // +--------------------------------------------------------------------+
    // | Ponteiro não constante para dados não constantes                   |
    // +--------------------------------------------------------------------+
    char *p, a, b;

    p  = &amp;a;  // Recebe endereço de a
    *p = 'A'; // Altera conteúdo de a
    p  = &amp;b;  // Recebe endereço de b

    // +--------------------------------------------------------------------+
    // | Ponteiro não constante para dados constantes                       |
    // +--------------------------------------------------------------------+
    const int *p;
    int i = 25, z;

    // p aponta para i, o qual não pode ser alterado.
    p = &amp;i;

    // Mas, p pode apontar para outra variável
    p = &amp;z;
    // Esse comando gera falha, porque p vai tentar alterar
    // o conteúdo de z, mas não pode pois foi declarado para
    // apontar para dados constantes
    // *p = 35;

    // Comando válido, por não se referenciar ao ponteiro, e sim,
    // diretamente na variável
    i = 45;

    // +--------------------------------------------------------------------+
    // | Ponteiro constante para dados não constantes                       |
    // +--------------------------------------------------------------------+
    int i = 25, z;

    // Como é ponteiro constante, atribuição de endereço deve ser feito
    // na definição.
    int *const p = &amp;i;

    // Comando inválido, não se pode alterar para onde p aponta
    // p = &amp;i;

    // Comando válido, por se tratar de dados não constantes
    *p = 45;

    // +--------------------------------------------------------------------+
    // | Ponteiro constante para dados constantes                           |
    // +--------------------------------------------------------------------+
    int i = 25, z;

    // Como é ponteiro constante, atribuição de endereço deve ser feito
    // na definição.
    const int *const p = &amp;i;

    // Comando inválido, não se pode alterar para onde p aponta
    // p = &amp;i;

    // Comando inválido, por se tratar de dados constantes
    // *p = 45;

    // Comando válido, por não se referenciar ao ponteiro, e sim,
    // diretamente na variável
    i = 45;
</pre>
<h3>Mapa mental</h3>
<div id="attachment_79" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.auriumsoft.com.br/programadorpratico/media/2010/05/c-ponteiros-constantes.gif" rel="lightbox[76]"><img class="size-medium wp-image-79" title="C - Ponteiros constantes e não constantes" src="http://www.auriumsoft.com.br/programadorpratico/media/2010/05/c-ponteiros-constantes-300x85.gif" alt="C - Ponteiros constantes e não constantes" width="300" height="85" /></a><p class="wp-caption-text">C - Ponteiros constantes e não constantes</p></div>
<p style="text-align: center;">
]]></content:encoded>
			<wfw:commentRss>http://www.auriumsoft.com.br/programadorpratico/2010/05/c-ponteiros-constantes-e-nao-constantes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.auriumsoft.com.br/programadorpratico/2010/05/c-ponteiros-constantes-e-nao-constantes/</feedburner:origLink></item>
		<item>
		<title>Desenvolvimento de jogos para iPhone: passos iniciais</title>
		<link>http://feedproxy.google.com/~r/ProgramadorPratico/~3/dy1M63cgT-s/</link>
		<comments>http://www.auriumsoft.com.br/programadorpratico/2010/04/desenvolvimento-de-jogos-para-iphone-passos-iniciais/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 03:06:10 +0000</pubDate>
		<dc:creator>Alfred Reinold Baudisch</dc:creator>
				<category><![CDATA[Desenvolvimento de Jogos]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[objective c]]></category>

		<guid isPermaLink="false">http://www.auriumsoft.com.br/programadorpratico/?p=67</guid>
		<description><![CDATA[Reflexão pessoal
Sempre tive um sonho em desenvolver jogos, tanto que comecei a programar porque eu queria criar jogos. Mas, uns acertos aqui, acertos ali, e sempre me deixei levar pelas oportunidades de desenvolvimento Web que surgiram, e desde então toda minha vida de programador foi voltada a Web. Porém, agora que decidi mudar os passos [...]]]></description>
			<content:encoded><![CDATA[<h3>Reflexão pessoal</h3>
<div id="attachment_68" class="wp-caption alignleft" style="width: 310px"><a href="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/iPhone.jpg" rel="lightbox[67]"><img class="size-medium wp-image-68 " title="iPhone, a solução dos desenvolvedores de games?" src="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/iPhone-300x168.jpg" alt="iPhone" width="300" height="168" /></a><p class="wp-caption-text">iPhone, a solução dos desenvolvedores de games?</p></div>
<p>Sempre tive um sonho em desenvolver jogos, tanto que <a href="http://www.auriumsoft.com.br/blog/sobre-o-autor/" target="_blank">comecei a programar</a> porque eu queria criar jogos. Mas, uns acertos aqui, acertos ali, e sempre me deixei levar pelas oportunidades de desenvolvimento Web que surgiram, e desde então toda minha vida de programador foi voltada a Web. Porém, agora que decidi <a href="http://www.auriumsoft.com.br/programadorpratico/2010/04/do-php-para-ruby-e-ruby-on-rails/">mudar os passos</a> do que faço, é hora de voltar a percorrer o sonho inicial (e creio que o sonho de quase todo programador): <strong>programar jogos</strong>!</p>
<p>Ainda mais nos dias atuais, em que distribuir e desenvolver os jogos é algo relativamente fácil e barato comparado com as limitações do passado: as fabricantes de consoles apenas distribuíam os kits de desenvolvimento sob pesadíssimas taxas, licenças e restrições. Ou seja, você precisaria de alguns milhares de dólares antes mesmo de pensar em criar um jogo profissional. Hoje, temos o excepcional mercado Mobile, principalmente em termos de iPhone + App Store e Android e seu respectivo Market.</p>
<p>Não vou entrar em detalhes, mas escolhi o iPhone para que eu possa me aprofundar no desenvolvimento de jogos, além de tentar finalmente desenvolver um jogo comercial, mesmo que eu sempre tenha o título de &#8220;indie&#8221;. A idéia é criar um aprofundamento nos principais conceitos, e assim, partir para algo viável. E ao criar algo bom, o preço que a Apple cobra é incrivelmente baixo, e terei um mercado com milhões de consumidores sedentos por novidades a alguns cliques (só não podendo esquecer das pesadas políticas de aprovação de aplicações na AppStore).</p>
<h3>Por onde começar?</h3>
<p>Após, mais uma vez, <a href="http://www.google.com.br/search?hl=pt-BR&amp;rlz=1B7GGLL_pt-BRBR372BR372&amp;q=iphone+gamedev+books&amp;meta=&amp;aq=f&amp;aqi=&amp;aql=&amp;oq=&amp;gs_rfai=" target="_blank">usar</a> <a href="http://www.google.com.br/search?hl=pt-BR&amp;rlz=1B7GGLL_pt-BRBR372BR372&amp;q=iphone+game+dev+books&amp;meta=&amp;aq=f&amp;aqi=&amp;aql=&amp;oq=&amp;gs_rfai=" target="_blank">exaustivamente</a> o <a href="http://www.google.com.br/search?hl=&amp;q=iphone+game+dev&amp;sourceid=navclient-ff&amp;rlz=1B7GGLL_pt-BRBR372BR372&amp;ie=UTF-8" target="_blank">Oráculo</a>, achei vários tutoriais, comunidades e bibliotecas. Resolvi começar por uma série de tutoriais sobre <a href="http://icodeblog.com/category/iphone-game-programming/" target="_blank">desenvolvimento de jogos</a> no <a href="http://icodeblog.com/" target="_blank">iCodeBlog</a>. Mas, já de imediato (o que era de se esperar), o tutorial mostra código em Objective C.</p>
<p>Eu, que apenas recentemente comprei um Mac, nunca toquei em Objective C, muito menos no XCode. Então é hora de aprender Objective C.</p>
<p>Como já estudei C e C++, posso partir direto para o Objective C, mas deixarei registrado aqui o passo a passo para quem está começando do zero, incluindo em termos de linguagem de programação.</p>
<h3>Tutoriais Iniciais</h3>
<ol>
<li><strong>Introdução à C</strong>, de modo claro e rápido: <a href="http://cocoadevcentral.com/articles/000081.php">http://cocoadevcentral.com/articles/000081.php</a></li>
<li><strong>Arrays e memória em C</strong>: <a href="http://theocacao.com/document.page/231">http://theocacao.com/document.page/231</a></li>
<li><strong>Ponteiros e memória dinâmica em C</strong>: <a href="http://theocacao.com/document.page/234">http://theocacao.com/document.page/234</a></li>
<li><strong>Tutorial de Objective C</strong>: <a href="http://cocoadevcentral.com/d/learn_objectivec/">http://cocoadevcentral.com/d/learn_objectivec/</a> Creio que esse tutorial seja o mais rápido e conciso.</li>
<li><strong>Outro tutorial rápido de Objective C</strong>: <a href="http://mobileappmastery.com/objective-c-tutorial/">http://mobileappmastery.com/objective-c-tutorial/</a></li>
<li>E o tutorial definitivo e completo, <strong>oficial da Apple</strong>: <a href="http://bit.ly/aKn7xC">http://bit.ly/aKn7xC</a></li>
</ol>
<p>Os 5 primeiros levam no máximo 1 hora para serem lidos, se você &#8220;pegar no tranco&#8221;. Já o da Apple pode tomar um tempo.</p>
<p>Isso é o suficiente para começar, estou &#8220;preso&#8221; no tutorial da Apple. Assim que terminar, continuo com os próximos passos (que nem eu ainda sei quais são!)</p>
<p><strong>Referências:</strong></p>
<ul>
<li><a href="http://images.google.com/imgres?imgurl=http://extacyempire.com/wp-content/uploads/2010/03/479-1.jpg&amp;imgrefurl=http://extacyempire.com/%3Fpaged%3D49&amp;usg=__Ckx45hWdqObIQjvLxMpB_N7JIBg=&amp;h=360&amp;w=640&amp;sz=48&amp;hl=en&amp;start=2&amp;sig2=QGsS5LouxKVIrGXccqUiBQ&amp;um=1&amp;itbs=1&amp;tbnid=4hbDQyerPvs5BM:&amp;tbnh=77&amp;tbnw=137&amp;prev=/images%3Fq%3Diphone%2Bgame%2Bdev%26um%3D1%26hl%3Den%26tbs%3Disch:1&amp;ei=Xa7TS5avCMX6lwf6gI3ODw" target="_blank">Créditos da Imagem</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.auriumsoft.com.br/programadorpratico/2010/04/desenvolvimento-de-jogos-para-iphone-passos-iniciais/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.auriumsoft.com.br/programadorpratico/2010/04/desenvolvimento-de-jogos-para-iphone-passos-iniciais/</feedburner:origLink></item>
		<item>
		<title>Teoria dos Operadores Lógicos</title>
		<link>http://feedproxy.google.com/~r/ProgramadorPratico/~3/ynezQwOeX4w/</link>
		<comments>http://www.auriumsoft.com.br/programadorpratico/2010/04/teoria-dos-operadores-logicos/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 17:49:45 +0000</pubDate>
		<dc:creator>Alfred Reinold Baudisch</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[and]]></category>
		<category><![CDATA[boolean]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[operadores lógicos]]></category>
		<category><![CDATA[or]]></category>
		<category><![CDATA[teoria]]></category>

		<guid isPermaLink="false">http://www.auriumsoft.com.br/programadorpratico/?p=59</guid>
		<description><![CDATA[Sou programador há mais de 10 anos e como aprendi tudo por conta, algumas teorias passaram em branco, já que sempre procurei aprender apenas aquilo que precisei. Como é o caso do meu entendimento de operadores lógicos, caindo direto ao ponto:

OR: a expressão será verdadeira se qualquer um dos operandos forem verdadeiros, e falsa caso [...]]]></description>
			<content:encoded><![CDATA[<p>Sou programador há mais de 10 anos e como aprendi tudo por conta, algumas teorias passaram em branco, já que sempre procurei aprender apenas aquilo que precisei. Como é o caso do meu entendimento de operadores lógicos, caindo direto ao ponto:</p>
<ul>
<li>OR: a expressão será verdadeira se qualquer um dos operandos forem verdadeiros, e falsa caso os dois operandos sejam falsos.</li>
<li>AND: a expressão será verdadeira se e somente se os dois operandos forem verdadeiros, caso contrário será falsa.</li>
</ul>
<p>Com a leitura do <a href="http://www.amazon.com/gp/product/0596516177?ie=UTF8&amp;tag=alfrreinbaud-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596516177" target="_blank">Ruby by Matz</a> entendi o porquê de tal lógica (o livro explica em detalhes toda a teoria). Vamos assumir as seguintes expressões:</p>
<pre class="brush: ruby">a || b                 # "a or b"
a &amp;&amp; b                 # "a and b"</pre>
<ul>
<li>OR: Se <code>a</code> for verdadeiro, a expressão imediatamente retorna <code>a</code> e ignora o <code>b</code>. Se <code>a</code> for falsa, retorna <code>b</code>.</li>
<li>AND: Se <code>a</code> for verdadeiro, a expressão imediatamente retorna <code>b</code> e ignora <code>a</code>. Se <code>a</code> for falsa, a expressão imediatamente retorna <code>a</code> e ignora <code>b</code>.</li>
</ul>
<h3>Exemplos</h3>
<p>O seguinte código explora todas as possíveis opções seguindo a teoria.</p>
<pre class="brush: ruby"># OR
a = true
b = true

# Se a for verdadeiro, a expressão imediatamente retorna a e ignora o b.
a || b         # =&gt; a, true

# Se a for falsa, retorna b.
a = false
a || b         # =&gt; b, true

# Se a for falsa, retorna b, que também possui um resultado falso.
b = false
a || b         # =&gt; b, false

# AND
a = true
b = true

# Se a for verdadeiro, a expressão imediatamente retorna b e ignora a.
a &amp;&amp; b         # =&gt; b, true

# Se a for verdadeiro, a expressão imediatamente retorna b (que possui um resultado falso) e ignora a.
a = true
b = false
a &amp;&amp; b         # =&gt; b, false

# Se a for falsa, a expressão imediatamente retorna a e ignora b.
a = false
b = true
a &amp;&amp; b         # =&gt; a, false

# Se a for falsa, a expressão imediatamente retorna a e ignora b.
a = false
b = false
a &amp;&amp; b         # =&gt; a, false</pre>
<h3>Mapa mental</h3>
<div id="attachment_60" class="wp-caption alignnone" style="width: 310px"><a href="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/TeoriaOperadoresLogicos.png" rel="lightbox[59]"><img class="size-medium wp-image-60 " title="Teoria dos Operadores Lógicos" src="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/TeoriaOperadoresLogicos-300x119.png" alt="Teoria dos Operadores Lógicos" width="300" height="119" /></a><p class="wp-caption-text">Clique para ampliar</p></div>
<p>Espero que também tenha lhe sido claro.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.auriumsoft.com.br/programadorpratico/2010/04/teoria-dos-operadores-logicos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.auriumsoft.com.br/programadorpratico/2010/04/teoria-dos-operadores-logicos/</feedburner:origLink></item>
		<item>
		<title>Expressões Flip-Flop de Ruby</title>
		<link>http://feedproxy.google.com/~r/ProgramadorPratico/~3/7WYiMUdXiq8/</link>
		<comments>http://www.auriumsoft.com.br/programadorpratico/2010/04/expressoes-flip-flop-de-ruby/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 16:24:31 +0000</pubDate>
		<dc:creator>Alfred Reinold Baudisch</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[expressão]]></category>
		<category><![CDATA[flip-flop]]></category>
		<category><![CDATA[range]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.auriumsoft.com.br/programadorpratico/?p=47</guid>
		<description><![CDATA[Quando os operadores .. e ... são usados em condicionais eles não criam objetos Range, mas sim, criam um tipo especial de expressão Boolean: flip-flop. Tanto o operador da esquerda, quanto o da direita devem ser expressões Boolean. Como é de se esperar um flip-flop retorna true ou false, mas esse valor depende da iteração [...]]]></description>
			<content:encoded><![CDATA[<p>Quando os operadores <code>..</code> e<code> ... </code>são usados em condicionais eles não criam objetos <code>Range</code>, mas sim, criam um tipo especial de expressão Boolean: flip-flop. <strong>Tanto o operador da esquerda, quanto o da direita devem ser expressões Boolean.</strong> Como é de se esperar um flip-flop retorna<code> true </code>ou <code>false</code>, mas esse valor depende da iteração anterior, assim, <strong>uma expressão flip-flop armazena um estado</strong>.</p>
<h3>Funcionamento de uma expressão flip-flop</h3>
<p>Vamos a um exemplo:</p>
<pre class="brush: ruby">(1..10).each {|x| print x if x==3..x==5 }</pre>
<p>Aqui, a flip-flop consiste nas duas condições (<code>x==3 </code>e <code>x==5</code>) ligadas pelo operador <code>..</code> na condicional <code>if</code> no final.</p>
<p>A expressão é <code>false</code> até que a expressão da esquerda se torne <code>true</code>, então a expressão dá um &#8220;flip&#8221; e mantém o estado <code>true</code>. Ela se mantém <code>true</code> (e retorna sempre<code> true</code>) até que a expressão da direita se torne <code>true</code>, assim a expressão dá um &#8220;flop&#8221; para um estado <code>false</code> até que a esquerda se torne <code>true</code> novamente e sucessivamente.</p>
<p>Com isso em mente, o exemplo acima imprime: 345</p>
<p>Uma flip-flop pode ser escrito tanto com <code>.. </code>quanto com<code> ...</code>: quando uma flip-flop<code> ..</code> torna-se <code>true</code>, ele retorna <code>true</code> e também testa logo em seguida a expressão da direita para ver se deve mudar o estado para<code> false</code>. Já uma flip-flop <code>...</code> espera pela próxima iteração antes de testar a expressão da direita.<br />
Exemplo:</p>
<pre class="brush: ruby"># Imprime "3". Flip e flop de volta quando x==3
(1..10).each {|x| print x if x==3..x&gt;=3 }
# Imprime "34". Flip quando x == 3 e flop quando x==4
(1..10).each {|x| print x if x==3...x&gt;=3 } # Imprime "34"</pre>
<h3>Mapa mental</h3>
<div id="attachment_48" class="wp-caption alignnone" style="width: 310px"><a href="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/Ruby-FlipFlops-PPrat.png" rel="lightbox[47]"><img class="size-medium wp-image-48" title="Ruby Flip-Flops" src="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/Ruby-FlipFlops-PPrat-300x133.png" alt="Ruby Flip-Flops" width="300" height="133" /></a><p class="wp-caption-text">Clique para ampliar</p></div>
<h3>Exemplo prático</h3>
<p>O próprio Matz desencoraja o uso de flip-flops (Matz, p. 110), porém podem ser úteis em alguns casos de leitura de arquivos e sources, como o exemplo a seguir (<a href="http://vision-media.ca/resources/ruby/ruby-flip-flop-or-range-operators" target="_blank">fonte</a>):</p>
<pre class="brush: ruby">code = &lt;&lt;-CODE
  /**
   * Some comments
   * longer comments here that we can parse.
   *
   * Wahoo
   */
   function subroutine() {

   }

   /* some more comments */

   /**
    * Another comment.
    */
    function something() {

    }
CODE

comments = code.collect { |line| line if (line =~ /^[\s]*\/\*/)..(line =~ /^[\s]*\*\//) }.join
puts comments

# Retorna
  /**
   * Some comments
   * longer comments here that we can parse.
   *
   * Wahoo
   */

   /* some more comments */

   /**
    * Another comment.
    */</pre>
<h4>Referências</h4>
<ul>
<li>MATSUMOTO, Yukihiro; FLANAGAM, David. <a href="http://www.amazon.com/gp/product/0596516177?ie=UTF8&amp;tag=alfrreinbaud-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596516177" target="_blank">The Ruby Programming Language</a>. 1st ed., p. 109-111, 2008.</li>
<li><a href="http://vision-media.ca/resources/ruby/ruby-flip-flop-or-range-operators" target="_blank">Ruby Flip Flop or Range Operators</a></li>
<li><a href="http://stackoverflow.com/questions/1111286/when-would-a-ruby-flip-flop-be-useful" target="_blank">http://stackoverflow.com/questions/1111286/when-would-a-ruby-flip-flop-be-useful</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.auriumsoft.com.br/programadorpratico/2010/04/expressoes-flip-flop-de-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.auriumsoft.com.br/programadorpratico/2010/04/expressoes-flip-flop-de-ruby/</feedburner:origLink></item>
		<item>
		<title>Livros Ruby e Rails para o bom aprendizado</title>
		<link>http://feedproxy.google.com/~r/ProgramadorPratico/~3/8qUcjcD3css/</link>
		<comments>http://www.auriumsoft.com.br/programadorpratico/2010/04/livros-ruby-e-rails-para-o-bom-aprendizado/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 18:51:50 +0000</pubDate>
		<dc:creator>Alfred Reinold Baudisch</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[livros]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://www.auriumsoft.com.br/programadorpratico/?p=32</guid>
		<description><![CDATA[Todo começo é dificil. Por onde começar?, é a pergunta que sempre surge. Ainda mais em se tratando de linguagens de programação em que os recursos disponíveis são quase ilimitados.
Para mim, o caminho de aprendizado de uma linguagem de programação envolve a leitura de um ou mais livros chaves, acompanhamento constante de fóruns, além do [...]]]></description>
			<content:encoded><![CDATA[<p>Todo começo é dificil. <em>Por onde começar?</em>, é a pergunta que sempre surge. Ainda mais em se tratando de linguagens de programação em que os recursos disponíveis são quase ilimitados.</p>
<p>Para mim, o caminho de aprendizado de uma linguagem de programação envolve a leitura de um ou mais livros chaves, acompanhamento constante de fóruns, além do estudo dos sources de projetos open source.</p>
<h2>Os livros</h2>
<ul>
<li style="clear: both;"><img class="size-full wp-image-4 alignleft" title="ruby-by-matz" src="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/ruby-by-matz.png" alt="" width="100" height="131" /><a href="http://www.amazon.com/gp/product/0596516177?ie=UTF8&amp;tag=alfrreinbaud-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596516177" target="_blank"><strong>The Ruby Programming Language</strong></a> (<a href="http://www.submarino.com.br/produto/1/21499198/linguagem+de+programacao+ruby,+a-+10+volumes?franq=141694" target="_blank">versão em português</a>), de autoria do criador da Ruby, conhecido como Matz, assim chamarei esse livro de &#8220;<strong>Ruby by Matz</strong>&#8220;. No momento da escrita desse artigo, estou na página 130~ e posso dizer que o livro é bem conciso e vai direto ao ponto. Não fica criando histórias ao redor do código. É código atrás de código, com todo o detalhamento necessário, além de comparações de diferenças Ruby 1.8 x 1.9. Enfim, um livro em que você não perde tempo e espero em breve criar uma resenha completa. Só um detalhe: por ele ir &#8220;direto ao ponto&#8221;, este é um livro<strong> avançado</strong>, para quem já é programador e está querendo partir para Ruby.</li>
<li style="clear: both;"><img class="size-full wp-image-5 alignleft" title="rubypickaxe" src="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/rubypickaxe.png" alt="" width="100" height="128" /><br />
<strong><a href="http://www.amazon.com/gp/product/1934356085?ie=UTF8&amp;tag=alfrreinbaud-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1934356085" target="_blank">Programming Ruby 1.9</a></strong>, o tradicional &#8220;pickaxe&#8221;. O livro é um tijolo. Li os 3 primeiros capítulos, e comparando com o Ruby by Matz, é um livro com bem mais exemplos e linguagem mais direta e &#8220;light&#8221;. Recomendado para quem nunca programou e também para quem já tem experiência em qualquer outra linguagem. O bom dele também é toda a referência da linguagem nos capítulos finais (incluindo um capítulo sobre escrever extensões C para manipular dados de Ruby).</li>
<li style="clear: both;"><img class="size-full wp-image-3 alignleft" title="agilerails" src="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/agilerails.png" alt="" width="100" height="119" /><br />
<a href="http://www.amazon.com/gp/product/1934356166?ie=UTF8&amp;tag=alfrreinbaud-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1934356166" target="_blank"><strong>Agile Web Development with Rails</strong></a>, terceira edição, do criador da Ruby on Rails. O livro obviamente é uma das principais referências. Ê uma pena que não esperei um pouco mais, pois está saindo a versão 4 para Rails 3.</li>
</ul>
<p>Gastei R$ 240,00 pelos livros mais o frete expresso, comprando-os pela Amazon. Custou barato. Por quê? Só o frete saiu por R$ 102,00, logo o preço dos livros (<strong>R$ 138,00 por 3 livros!</strong>) foi irrisório comparado com os preços dos livros no mercado nacional (entre R$ 60 a 120 um livro de programação). Um investimento que valeu a pena!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.auriumsoft.com.br/programadorpratico/2010/04/livros-ruby-e-rails-para-o-bom-aprendizado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.auriumsoft.com.br/programadorpratico/2010/04/livros-ruby-e-rails-para-o-bom-aprendizado/</feedburner:origLink></item>
		<item>
		<title>Do PHP para Ruby e Ruby on Rails</title>
		<link>http://feedproxy.google.com/~r/ProgramadorPratico/~3/SSVa3E24lng/</link>
		<comments>http://www.auriumsoft.com.br/programadorpratico/2010/04/do-php-para-ruby-e-ruby-on-rails/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 02:15:26 +0000</pubDate>
		<dc:creator>Alfred Reinold Baudisch</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://www.auriumsoft.com.br/programadorpratico/?p=8</guid>
		<description><![CDATA[Sou programador PHP há quase 12 anos. Já fiz de tudo que você possa imaginar em termos de &#8220;sites&#8221; e &#8220;sistemas Web&#8221;, e de todos os portes.  Quase todo o dinheiro que ganhei nesses últimos anos veio dos trabalhos com PHP. Não tenho o que reclamar.
Mas, cansei. PHP tornou-se cansativo e enjoativo, não sei [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/phpisugly.png" rel="lightbox[8]"><img class="alignleft size-full wp-image-12" title="phpisugly" src="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/phpisugly.png" alt="" width="228" height="76" /></a>Sou programador <a href="http://www.php.net" target="_blank">PHP</a> há quase 12 anos. Já fiz de tudo que você possa imaginar em termos de &#8220;sites&#8221; e &#8220;sistemas Web&#8221;, e de todos os portes.  Quase todo o dinheiro que ganhei nesses últimos anos veio dos trabalhos com PHP. Não tenho o que reclamar.</p>
<p>Mas, cansei. PHP tornou-se cansativo e enjoativo, não sei dizer exatamente por quê. Talvez porque se popularizou demais, e não existe um padrão de qualidade e eu gosto de fazer sempre o melhor. Qualquer servicinho feito &#8220;meia boca&#8221; já é abraçado e aceito. Claro que se eu executar sempre algo bom, o resultado vem logo em seguida, independente se outros o fazem de qualquer jeito.</p>
<p>Só que a dita &#8220;gigantesca comunidade PHP&#8221; se tornou relaxada, no sentido de estar suja. E consequentemente, o PHP é algo relaxado e bagunçado. Decidi então que era hora de mudar.</p>
<p>Some ao fato que muitas vezes precisei desenvolver aplicativos, e não somente web, web e web. PHP-GTK? Sem comentários!</p>
<h2>Que caminho escolher?</h2>
<p><a href="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/rubyrailssexy.png" rel="lightbox[8]"><img class="alignright size-full wp-image-13" title="rubyrailssexy" src="http://www.auriumsoft.com.br/programadorpratico/media/2010/04/rubyrailssexy.png" alt="" width="207" height="170" /></a>Entre as opções, fiquei vagando entre Python e Django ou Ruby e Ruby on Rails. Tanto Python quanto Ruby são eficazes e poderosas em termos de software. Django e Rails são monstros para a Web. Agora, bastava chegar a aquela que mais me agradaria no todo, seja em linguagem, comunidade, funcionalidades, ou pelo menos, &#8220;amor a primeira vista&#8221;.</p>
<p>Pesquisei, pesquisei e pesquisei no <a href="http://www.google.com.br/search?q=php+rails+django&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:pt-BR:official&amp;client=firefox-a" target="_blank">oráculo</a>, até me sentir confortável e decidido com a dupla <a href="http://www.ruby-lang.org" target="_blank">Ruby</a> e <a href="http://www.rubyonrails.org" target="_blank">Ruby on Rails</a>:</p>
<ul>
<li>Tanto a comunidade de Ruby, mas principalmente a de Rails é extremamente caprichosa e padronizada. Até mesmo os sites/aplicações feitos em Rails ou sites relacionados (empresas que usam Rails, etc) são caprichados em todos os detalhes. É até &#8220;gostoso&#8221; de acompanhá-los, aquela sensação de que você está num hotel 5 estrelas, bem servido.</li>
<li>Ruby é, como o próprio nome sugere, uma jóia. Amei a complexidade e ao mesmo tempo extrema simplicidade da linguagem, unida <a href="http://mislav.uniqpath.com/poignant-guide/book/chapter-3.html" target="_blank">a beleza de programar</a>:</li>
</ul>
<pre class="brush: ruby">['toast', 'cheese', 'wine'].each { |food| print food.capitalize }
</pre>
<p>Python também é excepcional e acho que um dia talvez estude-a para me divertir com programação de pequenos jogos, mas simplesmente me apaixonei por Ruby e por Rails.</p>
<h3>Caminho do aprendizado</h3>
<p>Já estou estudando Ruby, e possuo alguns livros e outros acompanhamentos, mas isso é assunto para o próximo artigo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.auriumsoft.com.br/programadorpratico/2010/04/do-php-para-ruby-e-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.auriumsoft.com.br/programadorpratico/2010/04/do-php-para-ruby-e-ruby-on-rails/</feedburner:origLink></item>
	</channel>
</rss>

