<?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>Vítor Baptista &#187; Artigos</title>
	<atom:link href="http://vitorbaptista.com/category/artigos/feed/" rel="self" type="application/rss+xml" />
	<link>http://vitorbaptista.com</link>
	<description>&#34;Você deve ser a mudança que deseja ver no mundo.&#34; Gandhi</description>
	<lastBuildDate>Thu, 17 May 2012 02:04:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Continuous Integration for Android apps with Jenkins and Maven3</title>
		<link>http://vitorbaptista.com/continuous-integration-for-android-apps-with-jenkins-and-maven3/</link>
		<comments>http://vitorbaptista.com/continuous-integration-for-android-apps-with-jenkins-and-maven3/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 17:36:06 +0000</pubDate>
		<dc:creator>Vítor Baptista</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[jenkins]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://vitorbaptista.com/?p=5600</guid>
		<description><![CDATA[Pre-requisites Ubuntu (I&#8217;m using 11.04) Jenkins (I&#8217;m using v1.4.21) Android SDK (I&#8217;m using r12) Git Installing Xvnc We need to run Android&#8217;s emulator to test the interface. For such, we need a X server running on the machine. The easier way to do so on a headless box is using Xvnc. To install it, do: [...]]]></description>
			<content:encoded><![CDATA[<h3>Pre-requisites</h3>
<p><a href="http://www.ubuntu.com" title="Ubuntu" target="_blank">Ubuntu</a> (I&#8217;m using 11.04)<br />
<a href="https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu" title="Installing Jenkins on Ubuntu" target="_blank">Jenkins</a> (I&#8217;m using v1.4.21)<br />
<a href="http://developer.android.com/sdk/installing.html" title="Installing Android SDK" target="_blank">Android SDK</a> (I&#8217;m using r12)<br />
<a href="http://git-scm.com" target="_blank">Git</a></p>
<h3>Installing Xvnc</h3>
<p>We need to run Android&#8217;s emulator to test the interface. For such, we need a X server running on the machine. The easier way to do so on a headless box is using Xvnc. To install it, do:</p>
<pre>$ sudo apt-get install vnc4server</pre>
<p>If you don&#8217;t have a window manager (GNOME, KDE, etc.), install fluxbox, a lightweight WM:</p>
<pre>$ sudo apt-get install fluxbox</pre>
<p>After this, we have to set a password for the vncserver.</p>
<pre>$ sudo su jenkins
$ vncserver

You will require a password to access your desktops.

Password:
Verify:

New 'luna:1 (jenkins)' desktop is luna:1

Creating default startup script /var/lib/jenkins/.vnc/xstartup
Starting applications specified in /var/lib/jenkins/.vnc/xstartup
Log file is /var/lib/jenkins/.vnc/luna:1.log</pre>
<h3>Configuring git</h3>
<p>We need to configure Jenkins&#8217; user git name and e-mail. To do so, open a terminal and do:</p>
<pre>$ sudo su jenkins
$ git config --global user.name "Jenkins"
$ git config --global user.email "jenkins@no-email.com"</pre>
<h3>Configuring Jenkins</h3>
<p>If you haven&#8217;t changed Jenkins&#8217; configurations, it&#8217;s server is listening at <a href="http://localhost:8080" target="_blank">http://localhost:8080</a>. Open it and click into <em>Manage Jenkins</em> -> <em>Configure System</em>. Scroll down to the <em>Android</em> subsection, and write your Android SDK path into the text input. Then, find the <em>Maven</em> subsection, click into Add Maven and set the values as:<br />
<center><img src="http://vitorbaptista.com/wp-content/uploads/2011/07/03-install-maven3-using-jenkins.png" alt="Install Maven3 using Jenkins" title="Install Maven3 using Jenkins" width="493" height="212" class="aligncenter size-full wp-image-5610" /></center></p>
<p>Also, go to Jenkins&#8217; main page then <em>Manage Jenkins</em> -> <em>Manage Plugins</em> and, at the <em>Available</em> tab, look for the plugins <em>Hudson Xvnc</em>, <em>Jenkins Zentimestamp</em>, <em>Android Emulator</em> and <em>Jenkins GIT</em>. Check every one of them and click <em>Install</em>. At the following screen, check <em>Restart Jenkins when installation is complete and no jobs are running</em>.</p>
<p><center><a href="http://vitorbaptista.com/wp-content/uploads/2011/07/plugins.png"><img src="http://vitorbaptista.com/wp-content/uploads/2011/07/plugins-300x87.png" alt="Jenkins Plugins" title="Jenkins Plugins" width="300" height="87" class="aligncenter size-medium wp-image-5638" /></a></center></p>
<h3>Adding a project to Jenkis</h3>
<p>We&#8217;re going to add the <em>morseflash</em> example from <a href="http://code.google.com/p/maven-android-plugin/" title="maven-android-plugin" target="_blank">maven-android-plugin</a> samples to our Jenkis, to check if everything is configured properly.</p>
<ul>
<li>Download the samples from <a href="https://github.com/jayway/maven-android-plugin-samples/tarball/alpha" title="maven-android-plugin-samples" target="_blank">https://github.com/jayway/maven-android-plugin-samples/tarball/alpha</a>;</li>
<li>Extract into /tmp (or any other folder) and rename jayway-maven-android-plugin-samples-3fe4aed to samples (just to make it easier);</li>
<li>Create a git repository inside the <em>morseflash</em> subfolder using:
<pre>$ git init
$ git add *
$ git commit -a -m "Initial commit."
</pre>
</li>
<li>Edit the line 16 in <em>pom.xml</em>, changing from <em>${maven.build.timestamp}</em> to <em>${BUILD_ID}</em>;
<li>Open <a href="http://localhost:8080">http://localhost:8080</a> and click in <em>New Job</em>;</li>
<li>Write &#8220;morseflash&#8221; in <em>Job name</em>, select <em>Build a maven2/3 project</em> and click <em>OK</em>;</li>
<li>Configure it like the following image and click <em>Save</em>:<br />
<center><a href="http://vitorbaptista.com/wp-content/uploads/2011/07/morseflash.png"><img src="http://vitorbaptista.com/wp-content/uploads/2011/07/morseflash-355x1024.png" alt="morseflash jenkins configuration" title="morseflash jenkins configuration" width="355" height="1024" class="aligncenter size-large wp-image-5622" /></a></center></li>
</ul>
<p>After this, you can wait a little bit and Jenkins will automatically build the first version, or you can click in <em>Build Now</em>. Either way, a new build will appear at the <em>Build History</em> block in the bottom left of the page:<br />
<center><img src="http://vitorbaptista.com/wp-content/uploads/2011/07/buildhistory.png" alt="Build History" title="Build History" width="271" height="77" class="aligncenter size-full wp-image-5626" /></center></p>
<p>Click on its link, then click in <em>Console Output</em>. You should see a lot of messages passing by and, in the end, you should see something like:</p>
<pre>[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] MorseFlash Parent ................................. SUCCESS [1.319s]
[INFO] MorseFlash - Library .............................. SUCCESS [5.048s]
[INFO] MorseFlash - App .................................. SUCCESS [4.028s]
[INFO] MorseFlash - Instrumentation Test ................. SUCCESS [12.702s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 25.714s
[INFO] Finished at: Thu Jul 21 14:05:31 BRT 2011
[INFO] Final Memory: 19M/197M
[INFO] ------------------------------------------------------------------------
channel stopped
[android] Stopping Android emulator
[android] Archiving emulator log
Terminating xvnc.
$ vncserver -kill :10
Killing Xvnc4 process ID 25580
Finished: SUCCESS</pre>
<p>Bingo! You now have a Continuous Integration infrastructure for Android apps. Every minute Jenkins pools git and, if it finds something new, rebuilds everything. If something goes wrong, check if you did all the steps of the tutorial. If you can&#8217;t figure it out, ask a question in the comments section and I&#8217;ll try to help.</p>
<h3>References</h3>
<ul>
<li><a href="http://developer.android.com/sdk/installing.html" target="_blank">Installing the Android SDK</a></li>
<li><a href="https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu" target="_blank">Installing Jenkins on Ubuntu</a></li>
<li><a href="http://code.google.com/p/maven-android-plugin/" target="_blank">Maven Android Plugin</a></li>
<li><a href="http://blog.dahanne.net/2011/07/18/run-ui-tests-on-a-headless-jenkins-hudson-continuous-integration-server-running-ubuntu" target="_blank">Run UI tests on a headless Jenkins / Hudson Continuous Integration server running Ubuntu</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://vitorbaptista.com/continuous-integration-for-android-apps-with-jenkins-and-maven3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bingo do Zé &#8211; Parte 1</title>
		<link>http://vitorbaptista.com/bingo-do-ze-parte-1/</link>
		<comments>http://vitorbaptista.com/bingo-do-ze-parte-1/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 01:34:33 +0000</pubDate>
		<dc:creator>Vítor Baptista</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[bingo do ze]]></category>
		<category><![CDATA[computação]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[projetos]]></category>

		<guid isPermaLink="false">http://vitorbaptista.com/?p=5089</guid>
		<description><![CDATA[Agora que as eleições passaram (e Ricardo Coutinho venceu), resolvi parar um pouco e escrever sobre o Bingo do Zé. Como tudo começou O @pizzariaze @alexandrend lançou no dia 17 15 de outubro uma cartela com algumas pérolas do candidato Zé Maranhão. A ideia era que você imprimisse e fosse marcando ao assistir aos debates. [...]]]></description>
			<content:encoded><![CDATA[<p>Agora que as eleições passaram (e Ricardo Coutinho venceu), resolvi parar um pouco e escrever sobre o <a href="http://labs.vitorbaptista.com/bingodoze/">Bingo do Zé</a>.</p>
<h3>Como tudo começou</h3>
<p>O <del datetime="2010-11-06T15:33:39+00:00"><a href="http://twitter.com/pizzariaze">@pizzariaze</a></del> <a href="http://twitter.com/alexandrend">@alexandrend</a> lançou no dia <del datetime="2010-11-06T15:33:39+00:00">17</del> 15 de outubro uma cartela com algumas pérolas do candidato Zé Maranhão. A ideia era que você imprimisse e fosse marcando ao assistir aos debates.</p>
<p><center><a href="http://pizzariadoze.blogspot.com/2010/10/bingo-do-ze-maranhao-para-acompanhar.html"><img src="http://vitorbaptista.com/wp-content/uploads/2010/11/bingo_do_ze-207x300.jpg" alt="Bingo Do Zé" title="Bingo Do Zé" width="207" height="300" class="aligncenter size-medium wp-image-5092" /></a></center></p>
<p>Achei genial. Teve uma boa repercussão no Twitter e, no dia seguinte, <a href="http://kelon.org">Alan Kelon</a>, um professor da UFPB e amigo, lançou um desafio na lista de estudantes de Computação da federal: fazer uma aplicação web com a ideia do bingo. Fiquei com isto na cabeça.</p>
<p>Naquele dia estava com insônia. Já eram mais de 2 da manhã e não tinha sono algum. Então <a href="http://twitter.com/sam_guimaraes">Samara</a>, minha namorada, me liga. Também estava lesando no computador. Contei pra ela sobre o bingo e, depois de rirmos bastante, veio a proposta: bora fazer agora? <img src='http://vitorbaptista.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Ela disse sim <img src='http://vitorbaptista.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<h3>Primeira versão</h3>
<p>Três horas da manhã de uma terça-feira, estávamos eu e ela com o notebook na cama e um modem 3G. Primeiro passo: procurar algo já pronto. Rapidamente encontrei <a href="http://threadbarecanvas.com/jquery/bingo-card-javascript-and-jquery/">este post</a> que mostrava como fazer um bingo &#8220;padrão&#8221; com JavaScript, JQuery e CSS. </p>
<p><center><a href="http://threadbarecanvas.com/wp-content/uploads/2009/10/index.html"><img src="http://vitorbaptista.com/wp-content/uploads/2010/11/bingo-original-300x282.png" alt="" title="Bingo" width="300" height="282" class="aligncenter size-medium wp-image-5096" /></a></center></p>
<p>Perfeito! Só precisaria modificar pra usar frases ao invés de números e estilizá-lo. Depois de pouco mais de uma hora chegamos a isso:<br />
<center><a href="http://vitorbaptista.com/wp-content/uploads/2010/11/bingodoze-antigo.png"><img src="http://vitorbaptista.com/wp-content/uploads/2010/11/bingodoze-antigo-300x289.png" alt="" title="Bingo Do Zé" width="300" height="289" class="aligncenter size-medium wp-image-5098" /></a></center></p>
<h3>Alguns detalhes técnicos</h3>
<p>Houve duas sacadas que acho interessante falar. Se você não for de computação ou não estiver interessado em saber como funciona o bingo, aguarde pela parte 2 deste post.</p>
<h4>Gerando uma URL única para cada cartela</h4>
<p>Fiz algumas funções pra compartilhar o bingo no twitter. Uma delas é que, quando você fecha uma linha ou coluna (exceto a central) ou a cartela toda, você pode enviar uma mensagem do tipo &#8220;Fiz 2 colunas no #BingoDoZe!&#8221;. Mas, pra ficar mais interessante, queria adicionar o link da sua cartela nesse tweet. Mas como?</p>
<p>O sistema é feito todo só com JavaScript. Não consigo (facilmente) usar um banco de dados. Primeiro pensei em reescrevê-lo em Ruby ou PHP, mas fiquei com preguiça. Pensei mais um pouco, fiquei olhando o código para ver se surgia alguma ideia, então me veio a luz. Antes de tudo, deixe-me explicar como funciona o código.</p>
<p>Eu tenho um array com as pérolas. Para gerar a cartela, eu o embaralho e coloco os 25 primeiros termos e nos campos do bingo. A solução que encontrei para gerar sempre a mesma é adicionar uma semente ao algoritmo do <em>Math.random()</em>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> fillCards<span style="color: #009900;">&#40;</span>seed<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    Math.<span style="color: #660066;">seedrandom</span><span style="color: #009900;">&#40;</span>seed<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> shuffle <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #CC0000;">0.5</span> <span style="color: #339933;">-</span> Math.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> termos_shuffled <span style="color: #339933;">=</span> termos.<span style="color: #660066;">sort</span><span style="color: #009900;">&#40;</span>shuffle<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> <span style="color: #CC0000;">24</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// Pula a imagem de Maranhão</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">==</span> <span style="color: #CC0000;">12</span><span style="color: #009900;">&#41;</span>
            <span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#cell'</span><span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span>termos_shuffled<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Uma linguagem de programação gera números (pseudo-)aleatórios a partir de diversos cálculos em cima de um valor inicial. Se você puder definir qual é esse valor, então a função sempre retornará os mesmos resultados. O que faz isso é a linha 2, <em>Math.seedrandom(seed)</em>.</p>
<p>Infelizmente, não tem como fazer isso nativamente em JavaScript. Mas basta adicionar o <a href="http://davidbau.com/encode/seedrandom.js">seedrandom.js</a>, criado pelo David Bau e disponibilizado no <a href="http://davidbau.com/archives/2010/01/30/random_seeds_coded_hints_and_quintillions.html">seu blog</a>. Funcionou perfeitamente.</p>
<p>Como seed usei um hash na URL, na forma <a href="http://labs.vitorbaptista.com/bingodoze/#367660">http://labs.vitorbaptista.com/bingodoze/#367660</a> (neste caso, o seed é #367660). Ao entrar em <a href="http://labs.vitorbaptista.com/bingodoze">http://labs.vitorbaptista.com/bingodoze</a>, se já houver um hash, usa ele como seed. Caso contrário, gera um aleatoriamente.</p>
<h4>Salvando que campos foram marcados</h4>
<p>Depois do passo anterior os jogadores conseguem compartilhar suas cartelas. Mas quem acessar meu link vai encontrá-la vazia. Como persistir os campos marcados?</p>
<p>Seguindo a ideia de adicionar os dados à URL, tive a ideia de codificar o que foi marcado em um inteiro. Bem simples: tenho um número com 25 bits, cada um representando uma célula. Os que estiverem em 1, estão ativos; em 0, desativos.</p>
<p>Para isso, há duas funções principais: cartelaToMask() e maskToCartela(mask). A primeira retorna um inteiro que representa a cartela, e a segunda faz o caminho inverso, recebendo um inteiro e preenchendo a cartela. Vejamos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> cartelaToMask<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> mask <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> <span style="color: #CC0000;">24</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#cell'</span><span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hasClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ativo'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
            mask <span style="color: #339933;">|=</span> masks<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">return</span> mask<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Bem simples. Há o inteiro mask inicializado com 0 e, para cada célula, checo se ela tem a classe CSS &#8220;ativo&#8221;. Se sim, eu coloco o bit correspondente em 1. No final, retorno o mask.</p>
<p>O array masks usado no algoritmo possui as potências de 2 já calculadas. Ou seja, masks[0] == 1, masks[1] == 2, masks[2] == 4, e por aí vai. É uma solução muito deselegante. O ideal seria gerar esses valores provavelmente usando bit shifting.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> maskToCartela<span style="color: #009900;">&#40;</span>mask<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> <span style="color: #CC0000;">24</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>mask <span style="color: #339933;">&amp;</span> masks<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
            $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#cell'</span><span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ativo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>O caminho contrário é bem parecido. Eu faço um laço de 0 até 24 pegando o bit correspondente (mask &#038; masks[i]). Se ele estiver ativo, adiciono a classe &#8220;ativo&#8221; à célula. Pronto.</p>
<p>Esse inteiro é codificado em hexadecimal e adicionado a URL. Assim temos algo como <a href="http://labs.vitorbaptista.com/bingodoze/#367660-1d50170">http://labs.vitorbaptista.com/bingodoze/#367660-1d50170</a>, onde #367660 é a semente e 1d50170 é a máscara.</p>
<p>Se você faz computação e teve problemas em entender a lógica dos operadores bit-a-bit usados nesse código, dê uma lida <a href="http://www.htmlstaff.org/ver.php?id=4333">aqui</a>. É simples e pode ser bem útil.</p>
<p>Eu pretendia só falar das estatísticas do Bingo do Zé, mas acabei me empolgando e falando demais. Vou deixá-las para a parte 2 deste post. Se você estiver curioso, pode ir vendo as estatísticas de tweets em <a href="http://summarizr.labs.eduserv.org.uk/?keyword=bingodoze">http://summarizr.labs.eduserv.org.uk/?keyword=bingodoze</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vitorbaptista.com/bingo-do-ze-parte-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Descobrindo qual é a operadora de um telefone</title>
		<link>http://vitorbaptista.com/descobrindo-qual-e-a-operadora-de-um-telefone/</link>
		<comments>http://vitorbaptista.com/descobrindo-qual-e-a-operadora-de-um-telefone/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 22:28:50 +0000</pubDate>
		<dc:creator>Vítor Baptista</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[mashup]]></category>
		<category><![CDATA[operadora]]></category>
		<category><![CDATA[portabilidade]]></category>

		<guid isPermaLink="false">http://vitorbaptista.com/?p=2020</guid>
		<description><![CDATA[24/09/2011 &#8211; Há alguns meses a ABR Telecom trocou o captcha por outro bem mais forte. Logo, o site não funciona mais. Se alguém precisar dessa funcionalidade, basta comprar o acesso por meros R$ 4.372,21 mensais Desde março de 2009, há no Brasil a portabilidade numérica para telefones fixos e celulares. Isto quer dizer que [...]]]></description>
			<content:encoded><![CDATA[<p><strong>24/09/2011</strong> &#8211; <em>Há alguns meses a ABR Telecom trocou o captcha por outro bem mais forte. Logo, o site não funciona mais. Se alguém precisar dessa funcionalidade, basta comprar o acesso por meros <a href="http://vitorbaptista.com/wp-content/uploads/2010/10/GOP_CP_Apresentação-Solução-BDT-para-TCR_20110413_v1.4.pdf">R$ 4.372,21 mensais</a> <img src='http://vitorbaptista.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </em></p>
<p>Desde março de 2009, há no Brasil a portabilidade numérica para telefones fixos e celulares. Isto quer dizer que podemos trocar de operadora de telefonia sem trocar de número. Assim, se outra empresa oferecer um plano mais vantajoso, podemos migrar para ela sem precisar avisar a todos nossos contatos que trocamos de número.</p>
<p>Mas isso também gera um problema: antes, cada operadora tinha uma faixa de números. Na Paraíba, a gente sabia que um celular era da <a href="http://www.oi.com.br" target="_blank">Oi</a> se começasse com 88, da <a href="http://www.claro.com.br" target="_blank">Claro</a> se fosse com 93, etc. Com a portabilidade não dá mais pra saber assim, é preciso consultar o número no site da <a href="consultanumero.abr.net.br:8080/consultanumero" target="_blank">ABR Telecom</a>.</p>
<p>Até aí tudo bem. Mas eu tenho quase 500 contatos no meu celular, toda vez que eu quiser saber se posso ligar para um número sem ter que pagar minutos extra (tenho bônus pra Oi), vou ter que consultar nessa página? Preciso de uma maneira melhor.</p>
<p>Eu tenho um celular com <a href="http://www.android.com">Android</a>, o <a href="http://pt.wikipedia.org/wiki/Nexus_One" target="_blank">Nexus One</a>. De cara, pensei em fazer um aplicativo que consultasse os dados da ABR Telecom e me mostrasse qual é a operadora de cada contato, quem sabe com um ícone ao lado da foto. Não deve ser muito complexo. Mas, quando fui ver, me deparei com o primeiro problema: o <a href="http://pt.wikipedia.org/wiki/Captcha" target="_blank">CAPTCHA</a>.</p>
<p><center><a href="http://consultanumero.abr.net.br:8080/consultanumero/"><img src="http://vitorbaptista.com/wp-content/uploads/2010/10/captcha-abr.png" alt="CAPTCHA da ABR Telecom" title="CAPTCHA da ABR Telecom" width="350" height="101" class="aligncenter size-full wp-image-2031" /></a></center></p>
<p>CAPTCHA são aquelas letras distorcidas que a gente tem que digitar em alguns sites. Ele serve para evitar que uma pessoa automatize uma determinada tarefa, como tentar logar em um site, criar contas no orkut. Desta forma, ele evita que alguém crie um programa para testar todas as possibilidades de sua senha no GMail, por exemplo. Idealmente, as letras são muito difíceis de um computador detectar, mas fáceis para um humano.</p>
<p>O site da ABR Telecom tem um CAPTCHA. Do jeito que ele está, eu não consigo fazer um programa para checar a operadora dos meus 500 contatos. A não ser que eu consiga quebrar esse CAPTCHA. Hum&#8230;</p>
<p><center><a href="http://qualeaoperadora.de/6132160000"><img src="http://vitorbaptista.com/wp-content/uploads/2010/10/qualeaoperadora-300x141.png" alt="qualeaoperadora.de" title="qualeaoperadora.de" width="300" height="141" class="aligncenter size-medium wp-image-2028" /></a></center></p>
<p>Foi isso que eu fiz (explico em outro post). Não foi difícil, eles usam um CAPTCHA muito simples. Daí nasceu o <a href="http://qualeaoperadora.de" target="_blank">http://qualeaoperadora.de</a>, um site que tem a mesma funcionalidade que o ABR Telecom (inclusive usa ele por baixo dos panos), mas sem o CAPTCHA. Assim, você pode criar novos softwares e sites usando as informações do meu. Isto está bem na moda, e se chama <a href="http://pt.wikipedia.org/wiki/Mashup" target="_blank">mashup</a>.</p>
<p>Eu não parei por aí. Além de você poder acessar as informações digitando no site, ou adicionando diretamente o telefone na URL (como em <a href="http://qualeaoperadora.de/6132160000" target="_blank">http://qualeaoperadora.de/6132160000</a>), você também pode pegar em dois formatos diferentes: YAML e JSONP. Para o primeiro, basta adicionar .yml ao final (<a href="http://qualeaoperadora.de/6132160000.yml" target="_blank">http://qualeaoperadora.de/6132160000.yml</a>); para o segundo, adicione .json (<a href="http://qualeaoperadora.de/6132160000.json" target="_blank">http://qualeaoperadora.de/6132160000.json</a>). Se quiser especificar a função pra callback, também pode fazer <a href="http://qualeaoperadora.de/6132160000.json?callback=minhaFuncao" target="_blank">http://qualeaoperadora.de/6132160000.json?callback=minhaFuncao</a>. Em JSONP, eu também retorno uma URL para o logotipo da operadora e a UF do Estado.</p>
<p>Ainda não fiz o software para buscar isso no meu Android, nem sei se vou fazer. Mas, com esse site, você mesmo pode fazê-lo. Esteja à vontade, mashups são divertidas. Se fizer algo, não deixe de me avisar <img src='http://vitorbaptista.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ah! Se você quiser dar uma olhada no código do <a href="http://qualeaoperadora.de" target="_blank">http://qualeaoperadora.de</a>, ele é livre e está disponível em <a href="http://www.gitorious.com/vitorbaptista/qualeaoperadora-de" target="_blank">http://www.gitorious.com/vitorbaptista/qualeaoperadora-de</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vitorbaptista.com/descobrindo-qual-e-a-operadora-de-um-telefone/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Transferindo o áudio do microfone via SSH</title>
		<link>http://vitorbaptista.com/transferindo-o-audio-do-microfone-via-ssh/</link>
		<comments>http://vitorbaptista.com/transferindo-o-audio-do-microfone-via-ssh/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 03:30:37 +0000</pubDate>
		<dc:creator>Vítor Baptista</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[dd]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://vitorbaptista.com/?p=335</guid>
		<description><![CDATA[Estamos a 2 dias do III ENSOL. Na palestra do Richard Stallman haverá tradução e transmissão simultânea. Com a tradução eu não preciso me preocupar, pois contratamos uma empresa para isto. Já a transmissão é um pouco mais complicada. O LAViD está nos apoiando nisto. Vamos ter uma câmera HD para gravar algumas palestras e [...]]]></description>
			<content:encoded><![CDATA[<p>Estamos a 2 dias do <a href="http://www.ensol.org.br" target="_blank">III ENSOL</a>. Na palestra do Richard Stallman haverá tradução e transmissão simultânea. Com a tradução eu não preciso me preocupar, pois contratamos uma empresa para isto. Já a transmissão é um pouco mais complicada.</p>
<p>O <a href="http://www.lavid.ufpb.br" target="_blank">LAViD</a> está nos apoiando nisto. Vamos ter uma câmera HD para gravar algumas palestras e transmitir a do RMS para as outras 2 salas. Só que, pensando com o pessoal, decidimos que o áudio a ser transmitido não vai ser o do Stallman, mas o do tradutor. Aí vem o problema: como transmitir o áudio da cabine de trasmissão para as outras duas salas? Lembrava que dava pra fazer isso com o SSH, então fui testar.</p>
<p>Fazer localmente é fácil. Basta executar:</p>
<blockquote><p>dd if=/dev/dsp of=/dev/dsp</p></blockquote>
<p>O que isto faz? Simples. Lembre-se que nos sistemas POSIX tudo é um arquivo. E <em>/dev/dsp</em> é o arquivo que representa a placa de som. Numa linguagem natural, o comando acima quer dizer &#8220;Copie o que tem em <em>/dev/dsp</em> para <em>/dev/dsp</em>.&#8221;</p>
<p>Como assim? Se eu copiar um arquivo para ele mesmo, o resultado não deveria ser&#8230; o mesmo arquivo? Depende. Neste caso, por exemplo, ler da placa de som (<em>/dev/dsp</em>) significa &#8220;capturar o audio que vem do microfone.&#8221; E escrever significa &#8220;tocar.&#8221; Juntando, você está &#8220;capturando o audio que vem do microfone e tocando.&#8221;</p>
<p>Fácil. Agora, como fazer isso em dois computadores diferentes? Eu sei que vou ter que ler do <em>/dev/dsp</em> de um computador e escrever no <em>/dev/dsp</em> do outro, mas como?</p>
<p>Vamos por partes. Primeiro, para ler o <em>/dev/dsp</em>, usamos:</p>
<blockquote><p>dd if=/dev/dsp</p></blockquote>
<p>O dd vai ler o arquivo e escrever na saída padrão. Neste caso, a tela. Então, precisamos redirecionar isso para o outro computador. É aí que entra o SSH. Se fizermos:</p>
<blockquote><p>ssh [destino]</p></blockquote>
<p>Ele vai abrir um shell no destino. Não é o que queremos. Temos a opção de usar:</p>
<blockquote><p>ssh [destino] dd of=/dev/dsp</p></blockquote>
<p>Ao invés de abrir um shell, o SSH vai executar o comando que passamos (dd of=/dev/dsp). Neste caso, o dd escreve tudo que receber da entrada padrão (teclado) para o arquivo <em>/dev/dsp</em>. Se você escrever algumas coisas aleatórias, vai ouvir uns barulhos na caixa de som. Ele está interpretando o que você está escrevendo como som. Ótimo! Estamos chegando perto. Agora só precisamos ligar a saída do primeiro comando, que lê do <em>/dev/dsp</em> de uma máquina, a entrada do ssh. Como? Usando pipes, é claro!</p>
<blockquote><p>dd if=/dev/dsp | ssh [destino] dd of=/dev/dsp</p></blockquote>
<p>O que essa barrinha discreta aí faz é conectar a saída padrão do comando a esquerda com a entrada padrão do da direita. Pronto! Executando isso, já conectamos o microfone de um PC com a caixa de som de outro. Para melhorar um pouco, podemos pedir pro SSH comprimir o tráfego, adicionando a opção -C.</p>
<blockquote><p>dd if=/dev/dsp | ssh -C [destino] dd of=/dev/dsp</p></blockquote>
<p>Mesmo assim, ainda não fica muito bom. Aqui, apesar dele usar só 5 KB/s de banda e as máquinas estarem na mesma rede wifi, fica uma latência muito grande. Talvez seja culpa do SSH ou do dd, e não da velocidade da conexão. Não sei.</p>
<p>Mas pode dizer. Muito foda, não é? <img src='http://vitorbaptista.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://vitorbaptista.com/transferindo-o-audio-do-microfone-via-ssh/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PDI ao resgate!</title>
		<link>http://vitorbaptista.com/pdi-ao-resgate/</link>
		<comments>http://vitorbaptista.com/pdi-ao-resgate/#comments</comments>
		<pubDate>Thu, 21 May 2009 20:26:44 +0000</pubDate>
		<dc:creator>Vítor Baptista</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[magentinizator]]></category>
		<category><![CDATA[octave]]></category>
		<category><![CDATA[pdi]]></category>

		<guid isPermaLink="false">http://vitorbaptista.com/?p=320</guid>
		<description><![CDATA[Hoje tive um problema com uma imagem. Estou organizando junto com alguns amigos o III ENSOL, e a UEPB nos apoiou pagando 75 inscrições para seus alunos. Então, precisei encontrar o logo deles para colocar no site do evento. A melhor que encontrei foi esta: Como dá pra ver, ela não tem o fundo branco. [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje tive um problema com uma imagem. Estou organizando junto com alguns amigos o <a href="http://www.ensol.org.br" target="_blank">III ENSOL</a>, e a <a href="http://www.uepb.edu.br" target="_blank">UEPB</a> nos apoiou pagando 75 inscrições para seus alunos. Então, precisei encontrar o logo deles para colocar no site do evento. A melhor que encontrei foi esta:<br />
<a href="http://vitorbaptista.com/wp-content/uploads/2009/05/uepb.png"><img src="http://vitorbaptista.com/wp-content/uploads/2009/05/uepb.png" alt="uepb" title="uepb" width="156" height="200" class="aligncenter size-full wp-image-323" /></a><br />
Como dá pra ver, ela não tem o fundo branco. O do site do ENSOL é laranja. E agora?</p>
<p>Tentei usar o <a href="http://pt.wikipedia.org/wiki/GIMP" target="_blank">GIMP</a> para resolver, usando a Magic Wand, mas ele não consegue pegar tudo, pois parte do fundo não é 100% branco. Colocando sobre um fundo preto, ficou assim:<br />
<a href="http://vitorbaptista.com/wp-content/uploads/2009/05/uepb-fundopreto.png"><img src="http://vitorbaptista.com/wp-content/uploads/2009/05/uepb-fundopreto.png" alt="uepb-fundopreto" title="uepb-fundopreto" width="156" height="200" class="aligncenter size-full wp-image-325" /></a></p>
<p>Como resolver? Sei que, se eu diminuísse a precisão da Magic Wand, fazendo ela pegar não só 100% branco, mas entre 90% e 100%, por exemplo, melhoraria. Quiçá, resolvesse. Mas, como? Não encontrei essa configuração. Sei que poderia criar um plugin em Python pro GIMP que resolveria, mas como nunca fiz isso, iria demorar.</p>
<p>Então eu vi a luz.</p>
<p>Relembrando as aulas de PDI &#8211; Processamento Digital de Imagens -, que paguei semestre passado. Uma das cadeiras mais interessantes até agora, uma pena que, por uma <a href="http://www.ensol.org.br" target="_blank">razão qualquer</a>, não aproveitei tanto. Mas aprendi a programar usando o <a href="http://pt.wikipedia.org/wiki/Octave" target="_blank">Octave</a>.</p>
<p>O GNU Octave é uma linguagem para fazer cálculos matemáticos, muito parecida com o MatLab. Nela a gente consegue trabalhar com matrizes sem problema algum. Por exemplo, se você tiver uma matriz 3&#215;3 e quer somar com uma outra de mesmo tamanho o que faz? Um for por cada elemento da matriz somando um com o outro? Não! Simplesmente matrizA + matrizB. E o que são imagens que não grandes matrizes de pixels?</p>
<p>A idéia é: passar por cada pixel da imagem e, se ele for mais claro que um determinado valor, transformo ele em <font color="#ff00ff">magenta</font>. Daí nasceu o <font color="#ff00ff">Magentinizator</font>!</p>
<p>Fazer isto em Octave é trivial. O código comentado é:</p>
<p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Magentinizator v 0.42 - 2009</span>
<span style="color:#008000; font-style:italic;"># ----------------------------------------------------------------------------</span>
<span style="color:#008000; font-style:italic;"># &quot;THE BEER-WARE LICENSE&quot; (Revisão 42):</span>
<span style="color:#008000; font-style:italic;"># &lt;vitor@vitorbaptista.com&gt; escreveu este arquivo. Contanto que mantenha este </span>
<span style="color:#008000; font-style:italic;"># texto, você pode fazer o que quiser com esse software. Se nos conhecermos</span>
<span style="color:#008000; font-style:italic;"># algum dia, e você achar que esse programa vale, você pode me pagar uma cerveja</span>
<span style="color:#008000; font-style:italic;"># em troca.</span>
<span style="color:#008000; font-style:italic;">#                                                               Vitor Baptista</span>
<span style="color:#008000; font-style:italic;"># ----------------------------------------------------------------------------</span>
&nbsp;
path = <span style="color:#996600;">&quot;uepb.png&quot;</span>;                <span style="color:#008000; font-style:italic;"># Caminho para a imagem</span>
threshold = 0xB4;                 <span style="color:#008000; font-style:italic;"># Pixels com cor maior que 0xB4B4B4</span>
                                  <span style="color:#008000; font-style:italic;"># se tornarão 0xFF00FF</span>
&nbsp;
im = imread<span style="color:#006600; font-weight:bold;">&#40;</span>path<span style="color:#006600; font-weight:bold;">&#41;</span>;                <span style="color:#008000; font-style:italic;"># Lê a imagem. im agora tem uma matriz</span>
                                  <span style="color:#008000; font-style:italic;"># Largura x Altura x 3 (RGB)</span>
&nbsp;
tam = size<span style="color:#006600; font-weight:bold;">&#40;</span>im<span style="color:#006600; font-weight:bold;">&#41;</span>;                   <span style="color:#008000; font-style:italic;"># Pega o tamanho da imagem</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">for</span> i = <span style="color:#006666;">1</span>:tam<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>                  <span style="color:#008000; font-style:italic;"># De 1 até a largura</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> j = <span style="color:#006666;">1</span>:tam<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span>                <span style="color:#008000; font-style:italic;"># De 1 até a altura</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>im<span style="color:#006600; font-weight:bold;">&#40;</span>i, j, <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&gt;</span> threshold   <span style="color:#008000; font-style:italic;"># Se o R for maior que o threshold, e</span>
        <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> im<span style="color:#006600; font-weight:bold;">&#40;</span>i,j,<span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&gt;</span> threshold  <span style="color:#008000; font-style:italic;"># se o G for maior, e</span>
        <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> im<span style="color:#006600; font-weight:bold;">&#40;</span>i,j,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&gt;</span> threshold<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># se o B for maior.</span>
&nbsp;
      im<span style="color:#006600; font-weight:bold;">&#40;</span>i,j,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span> = <span style="color:#006666;">255</span>;            <span style="color:#008000; font-style:italic;"># Torna aquele pixel</span>
      im<span style="color:#006600; font-weight:bold;">&#40;</span>i,j,<span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span> = <span style="color:#006666;">0</span>;              <span style="color:#008000; font-style:italic;"># em</span>
      im<span style="color:#006600; font-weight:bold;">&#40;</span>i,j,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span> = <span style="color:#006666;">255</span>;            <span style="color:#008000; font-style:italic;"># magenta!</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
imwrite<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span>path, <span style="color:#996600;">&quot;.magentinized&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#008000; font-style:italic;"># Concatena strings</span>
        im<span style="color:#006600; font-weight:bold;">&#40;</span>:,:,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>,               <span style="color:#008000; font-style:italic;"># R</span>
        im<span style="color:#006600; font-weight:bold;">&#40;</span>:,:,<span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span>,               <span style="color:#008000; font-style:italic;"># G</span>
        im<span style="color:#006600; font-weight:bold;">&#40;</span>:,:,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;              <span style="color:#008000; font-style:italic;"># B</span></pre></td></tr></table></div>

</p>
<p>O resultado ficou ótimo. Não perfeito, mas bem melhor que usando o GIMP e mais que o suficiente pro site do ENSOL.<br />
<a href="http://vitorbaptista.com/wp-content/uploads/2009/05/uepbmagentinized.png"><img src="http://vitorbaptista.com/wp-content/uploads/2009/05/uepbmagentinized.png" alt="UEPB Magentinized" title="UEPB Magentinized" width="156" height="200" class="aligncenter size-full wp-image-327" /></a><br />
Se precisar tirar mais o branco, só diminuir o threshold. Lembrando que vai chegar um momento que vai tornar outras partes da imagem também magenta.</p>
<p>Você pode baixar o <font color="#ff00ff">Magentinizator</font> <a href="http://vitorbaptista.com/wp-content/uploads/2009/05/magentinizator.m">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://vitorbaptista.com/pdi-ao-resgate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Análises Estruturada e Essencial</title>
		<link>http://vitorbaptista.com/analises-estruturada-e-essencial/</link>
		<comments>http://vitorbaptista.com/analises-estruturada-e-essencial/#comments</comments>
		<pubDate>Mon, 04 May 2009 03:36:22 +0000</pubDate>
		<dc:creator>Vítor Baptista</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[aps1]]></category>
		<category><![CDATA[ufpb]]></category>

		<guid isPermaLink="false">http://vitorbaptista.com/?p=279</guid>
		<description><![CDATA[Na faculdade estou pagando Especificação de Requisitos de Software e, como avaliação, devo escrever alguns textos sobre o assunto. O primeiro é uma (breve) apresentação sobre Análise Estruturada e Análise Essencial. O que é análise? &#8220;É o estudo das características que o sistema deverá ter para atender às necessidades e expectativas do cliente.&#8221; [1] Usualmente [...]]]></description>
			<content:encoded><![CDATA[<p>Na <a href="http://www.di.ufpb.br" target="_blank">faculdade</a> estou pagando <strong>Especificação de Requisitos de Software</strong> e, como avaliação, devo escrever alguns textos sobre o assunto. O primeiro é uma (breve) apresentação sobre <strong>Análise Estruturada</strong> e <strong>Análise Essencial</strong>.</p>
<h2>O que é análise?</h2>
<p>&#8220;É o estudo das características que o sistema deverá ter para atender às necessidades e expectativas do cliente.&#8221; [1] Usualmente são usados modelos para <strong>representar graficamente</strong> os <strong>componentes</strong> do sistema e as <strong>relações</strong> entre si e com o ambiente.</p>
<h2>Pra que serve?</h2>
<p>Antes de codificarmos, é importante entendermos <strong>o que queremos fazer</strong>. Para isto, análise nos dá uma <strong>visão geral</strong> do sistema e dos relacionamentos de seus componentes entre si e com os usuários. Com isto, conseguimos <strong>estimar</strong> melhor a <strong>complexidade</strong>, <strong>custos</strong> (de tempo e dinheiro), e <strong>detectar erros</strong>, além de <strong>gerar um documento</strong> com o qual podemos comparar as funcionalidades finais do sistema com as propostas, para determinar se ele cumpre ou não com seu objetivo.</p>
<h2>Análise Estruturada</h2>
<p>Nela construímos o sistema de forma <strong>top-down</strong> (do geral para o particular) criando um <a href="http://pt.wikipedia.org/wiki/Diagrama_de_Fluxos_de_Dados" target="_blank">Diagrama de Fluxo de Dados</a> (DFD) e refinando-o sucessivamente. Inicialmente obtemos uma visão geral do sistema, então decompomos cada módulo detalhando suas funcionalidades. Com isto, começamos a ter pistas sobre os <strong>processos</strong> e as <strong>entidades</strong>, os quais, estruturaremos usando o <a href="http://pt.wikipedia.org/wiki/Diagrama_entidade_relacionamento" target="_blank">Diagrama Entidade Relacionamento</a> (DER).</p>
<div id="attachment_286" class="wp-caption aligncenter" style="width: 503px"><img src="http://vitorbaptista.com/wp-content/uploads/2009/05/aes-fluxograma.jpg" alt="Desenvolvimento de software pelo método da Análise Estruturada" title="Análise Estruturada" width="493" height="158" class="size-full wp-image-286" /><p class="wp-caption-text">Desenvolvimento de software pelo método da Análise Estruturada</p></div>
<p>Uma técnica comumente usada é, na descrição dos requisitos, separar os <strong>verbos</strong> e os <strong>substantivos</strong>, como candidatos para tornarem-se <strong>processos</strong> e <strong>entidades</strong>, respectivamente. A conexão entre eles se dá através de um <a href="http://pt.wikipedia.org/wiki/Fluxo_de_dados" target="_blank">fluxo dos dados</a>.</p>
<table>
<tr>
<th><strong>Etapa</strong></th>
<th><strong>Questão-chave</strong></th>
<th><strong>Atividades Principais</strong></th>
</tr>
<tr>
<td>Concepção do software</td>
<td>Quais são os problemas?</td>
<td>Especificação da delimitação e objetivos. Identificação de mais de uma alternativa.</td>
</tr>
<tr>
<td>Estudo de viabilidade</td>
<td>Há uma solução viável?</td>
<td>Análise geral do custo/benefício das alternativas</td>
</tr>
<tr>
<td>Projeto lógico</td>
<td>Em geral, como os problemas devem ser resolvidos?</td>
<td>DFD, DER, Especificação dos processos</td>
</tr>
<tr>
<td>Projeto físico</td>
<td>Especificamente, como o projeto deve ser implementado?</td>
<td>Codificação e testes</td>
</tr>
<tr>
<td>Implantação</td>
<td>Os usuários e a organização estão prontos para utilizar o sistema?</td>
<td>Treinamento e acompanhamento</td>
</tr>
<tr>
<td>Manutenção</td>
<td>Existem alterações requeridas?</td>
<td>Modificar o sistema conforme necessário. Ajudar documentação. Apoio ao usuário.</td>
</tr>
</table>
<p><be /></p>
<h2>Análise Essencial</h2>
<p>É um <strong>melhoramento</strong> da análise estruturada. Nela, o problema é inicialmente estudado concentrando-se na identificação das <strong>funcionalidades lógicas</strong>, sem se preocupar com as <strong>exigências físicas</strong> de como o sistema será implementado. Para isso, definimos o <strong>modelo essencial</strong>, que é subdividido em <strong>ambiental</strong>, que vai definir a fronteira entre ele e o ambiente; <strong>comportamental</strong>, que descreve as partes internas necessárias para interagir com o ambiente, e; <strong>de informação</strong>, que nos dá os dados necessários as atividades do sistema. Assim, tem-se a solução ideal do problema, a qual desejaríamos se não tivéssemos limites de custos, velocidade, armazenamento, etc..</p>
<p>Depois, definimos o <strong>modelo de implementação</strong>, que é quem vai trazer o modelo essencial para dentro de nossas limitações e requisitos físicos. É nele que definimos o modelo lógico de dados, a interface homem-máquina, a plataforma de execução, a linguagem, etc.. Enfim, tudo que diga respeito a implementação de nosso sistema.</p>
<h2>Referências</h2>
<p>1. <a href="http://pt.wikipedia.org/wiki/An%C3%A1lise_de_requisitos" target="_blank">http://pt.wikipedia.org/wiki/Análise_de_requisitos</a><br />
2. <a href="http://www.creupiapostilas.hpg.ig.com.br/analise_estruturada.doc" target="_blank">http://www.creupiapostilas.hpg.ig.com.br/analise_estruturada.doc</a><br />
3. <a href="http://www.noginfo.com.br/arquivos/AES_Aula_05.pdf" target="_blank">http://www.noginfo.com.br/arquivos/AES_Aula_05.pdf</a><br />
4. <a href="http://www.creupiapostilas.hpg.ig.com.br/AnaliseEssencial.doc" target="_blank">http://www.creupiapostilas.hpg.ig.com.br/AnaliseEssencial.doc</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vitorbaptista.com/analises-estruturada-e-essencial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FLISOL 2009 &#8211; Brincando com Ruby</title>
		<link>http://vitorbaptista.com/flisol-2009-brincando-com-ruby/</link>
		<comments>http://vitorbaptista.com/flisol-2009-brincando-com-ruby/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 07:32:29 +0000</pubDate>
		<dc:creator>Vítor Baptista</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[brincando com ruby]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[flisol]]></category>
		<category><![CDATA[flisol2009]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://vitorbaptista.com/?p=229</guid>
		<description><![CDATA[Neste último sábado, dia 25, houve o FLISOL em João Pessoa lá no IESP, onde ministrei duas turmas de um minicurso, Brincando com Ruby, cuja descrição é: Ruby é uma linguagem dinamicamente tipada de altíssimo nível, semelhante a Python. Apesar de seu uso ter se popularizado pelo framework web Rails, ela não se limita a [...]]]></description>
			<content:encoded><![CDATA[<p>Neste último sábado, dia 25, houve o <a href="http://flisol2009.jpa.com.br" target="_blank">FLISOL</a> em João Pessoa lá no <a href="http://www.iesp.edu.br" target="_blank">IESP</a>, onde ministrei duas turmas de um minicurso, <strong>Brincando com Ruby</strong>, cuja descrição é:</p>


<blockquote>Ruby é uma linguagem dinamicamente tipada de altíssimo nível, semelhante a Python. Apesar de seu uso ter se popularizado pelo framework web Rails, ela não se limita a isso. Neste minicurso você aprenderá um pouco de Ruby e vai utilizá-la em uma das partes mais divertidas da computação: o desenvolvimento de jogos.</blockquote>


<p>
  <div id='brincando-com-ruby' style='text-align:center;'>
  <a href='/wp-content/uploads/2009/04/brincando-com-ruby.pdf'>
    <img src='/wp-content/uploads/2009/04/brincando-com-ruby/000.jpg'/><br/>
      Download PDF
    </a>
  </div>

  <script type="text/javascript">(
    function() { 
      var elem = document.getElementById('brincando-com-ruby'), 
        cur=0, 
        max=72, 
        d='/wp-content/uploads/2009/04/brincando-com-ruby'; 
      elem.innerHTML+="        <br/>        <a href='#brincando-com-ruby' style='visibility:hidden;'>&laquo; Anterior</a>        <span>1/72</span>        <a href='#brincando-com-ruby'>Pr&oacute;ximo &raquo;</a>";
      function pad(){ 
        return cur < 10 ? '00' + cur : cur < 100 ? '0' + cur : '' + cur;
      }
      var a = elem.getElementsByTagName('a');
      for(var i=1;i<3;i++){
        a[i].onclick=function(e){
          e = e || window.event; 
          var dir = this.innerHTML.indexOf('Próximo') >= 0 ? 1 : -1; 
          cur += dir;
          a[1].style.visibility=(cur == 0 ? 'hidden' : 'visible'); 
          a[2].style.visibility=(cur == max-1 ? 'hidden' : 'visible');
          elem.getElementsByTagName('img')[0].src = d + '/' + pad() + '.jpg';
          elem.getElementsByTagName('span')[0].innerHTML = (cur+1) + '/' + max;
          if (e.preventDefault) 
            e.preventDefault(); 
          e.returnValue = false;
        };
      }
    })();
  </script>

</p>

<p></p>

<p>Pela manhã estava com a <strong>sala lotada</strong>, ~40 pessoas, e pela tarde tinham ~10. <strong>Muito obrigado</strong> a todos que se inscreveram e participaram do minicurso, foi uma <strong>ótima</strong> experiência, a minha primeira. Espero que tenha dado para aprender um pouco de <a href="http://www.ruby-lang.org" target="_blank">Ruby</a> e desenvolvimento de jogos com o <a href="http://code.google.com/p/gosu/" target="_blank">Gosu</a>. Os slides estão aí em cima e o jogo desenvolvido foi o do tutorial oficial do <a href="http://code.google.com/p/gosu/" target="_blank">Gosu</a>, só pegar em <a href="http://code.google.com/p/gosu/wiki/RubyTutorial" target="_blank">http://code.google.com/p/gosu/wiki/RubyTutorial</a>.</p>

<p><strong>Parabéns aos organizadores do evento!</strong> Em especial, pois é o que eu conheço mais, é meu amigo, e foi quem eu aperriei para fazer o <a href="http://flisol2009.jpa.com.br" target="_blank">FLISOL</a>, o <a href="http://jrmendes.com" target="_blank">Joseph</a>.</p>

<p>Se alguém tiver alguma sugestão em como melhorá-lo, <strong>adoraria ler</strong>. A primeira parte da palestra, que é apresentando Ruby, achei meio chatinha, já que quase não há prática, é só uma palestra normal. Mas, quando começa o desenvolvimento do jogo, fica bem legal. Depois dos minicursos pensei que pudesse ser melhor que o jogo fosse sendo construído intercalando com o aprendizado da linguagem, sem ter essa divisão parte 1/parte 2. Difícil, mas vou tentar <img src='http://vitorbaptista.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>]]></content:encoded>
			<wfw:commentRss>http://vitorbaptista.com/flisol-2009-brincando-com-ruby/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Como funciona um emulador?</title>
		<link>http://vitorbaptista.com/como-funciona-um-emulador/</link>
		<comments>http://vitorbaptista.com/como-funciona-um-emulador/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 10:07:54 +0000</pubDate>
		<dc:creator>Vítor Baptista</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Emuladores]]></category>
		<category><![CDATA[chip-8]]></category>
		<category><![CDATA[jogos]]></category>

		<guid isPermaLink="false">http://vitorbaptista.com/?p=88</guid>
		<description><![CDATA[Sempre achei muito interessante a idéia de emular jogos antigos, de video-games da minha infância, acho que todo mundo que joga e programa também acha, e, com as aulas de Arquitetura de Computadores que venho tendo na faculdade, o interesse voltou. Pesquisando sobre o assunto, descobri que criar um emulador de um console dos mais [...]]]></description>
			<content:encoded><![CDATA[Sempre achei muito interessante a idéia de emular jogos antigos, de video-games da minha infância, acho que todo mundo que joga e programa também acha, e, com as aulas de Arquitetura de Computadores que venho tendo na faculdade, o interesse voltou. Pesquisando sobre o assunto, descobri que criar um emulador de um console dos mais antigos não é nada de outro mundo, como sempre imaginei, então resolvi tentar. Aproveitando o embalo, pretendo escrever uma série de artigos explicando passo a passo como criar um emulador de <a href="http://en.wikipedia.org/wiki/CHIP-8">Chip-8</a>, que é um dos mais simples que você pode criar.

<h2 class="title">Certo, mas o que é um emulador mesmo?</h2>
É um programa que simula o funcionamento de algum sistema. Nele vão existir partes que simulam uma CPU, a memória, os periféricos de entrada, o vídeo. Enfim, todo o hardware que se deseja simular. Além do sistema, você precisará de uma <a href="http://pt.wikipedia.org/wiki/Imagem_ROM">ROM</a>, que é uma cópia exata do conteúdo do cartucho do video-game. É nela que está o jogo.

<h2 class="title">E como eu faço isso?</h2>
Primeiro, você precisa conhecer muito bem o sistema que quer emular. Depois você precisa identificar e interpretar todos os comandos do sistema, os <a href="http://pt.wikipedia.org/wiki/Opcode">opcodes</a> (operation codes). Por exemplo, um comum a diversas máquinas é:
<blockquote>ADD x,n</blockquote>
que significa:
<blockquote>x = x + n</blockquote>.
Então, onde você encontrar esse opcode, deve executar este comando. Fazendo isso com todos, você terminará com um emulador completo. Simples, não?

No próximo post vou falar sobre o Chip-8.]]></content:encoded>
			<wfw:commentRss>http://vitorbaptista.com/como-funciona-um-emulador/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TTYShare</title>
		<link>http://vitorbaptista.com/ttyshare/</link>
		<comments>http://vitorbaptista.com/ttyshare/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 20:00:54 +0000</pubDate>
		<dc:creator>Vítor Baptista</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[ttyshare]]></category>
		<category><![CDATA[vídeo]]></category>

		<guid isPermaLink="false">http://vitorbaptista.com/?p=49</guid>
		<description><![CDATA[Sempre quis aprender a jogar NetHack direitinho. Como faço quase tudo no shell, seria interessante ter um jogo na boa e velha tela preta. Então, pensando sobre isso nesses dias, tive uma idéia: e se existisse um site onde você pudesse jogar NetHack pelo browser? Gostei e comecei a pensar "É, eu posso fazer usando [...]]]></description>
			<content:encoded><![CDATA[Sempre quis aprender a jogar <a href="http://pt.wikipedia.org/wiki/NetHack" target="_blank">NetHack</a> direitinho. Como faço quase tudo no shell, seria interessante ter um jogo na boa e velha tela preta. Então, pensando sobre isso nesses dias, tive uma idéia: e se existisse um site onde você pudesse jogar NetHack pelo browser? Gostei e comecei a pensar "É, eu posso fazer usando um applet Java. Mas eu não gosto de Java. Ah! Posso tentar usar o JRuby! Massa. Existe <a href="http://www.alt.org/nethack" target="_blank">um servidor de NetHack</a> que você só precisa se conectar a ele por telnet e já joga, também deve existir um pacote pra Java que se conecte por telnet, tem tudo pra Java. É, deve ser simples de fazer. Legal, vamos começar."

Fui para o notebook e pesquisei um pouco sobre o assunto antes, então encontrei o <a href="http://www.ttyshare.com" target="_blank">TTYShare</a>, que é tipo um Youtube do shell. Existe um programa, o ttyrec, que salva o que você faz no console. Então você envia para o site e ele cria o vídeo como os do Youtube. Além disso, eles também tem a função de você jogar NetHack pelo browser. "Droga! Fizeram melhor do que tinha pensado..."

Para enviar um vídeo é bem simples, basta instalar o ttyrec, no Ubuntu/Debian simplesmente faça:
<blockquote>sudo aptitude install ttyrec</blockquote>

Depois abra um shell e execute:
<blockquote>stty columns 80 rows 24
ttyrec -e nethack</blockquote>

O terminal deve ter o tamanho 80x24 se não dá problema com o TTYShare. Troque o nethack por o programa que você quer rodar. Pronto, ele vai estar salvo em ~/ttyrecord (/home/seu-usuário/ttyrecord), só enviar para o site e pronto. Se quiser ver como ficou o vídeo, ttyplay ~/ttyrecord.

Um exemplo de um jogador de NetHack só para ver como é o resultado.
<center><embed type="application/x-shockwave-flash" src="http://www.ttyshare.com/t/212bee752577d1e8b72b7f9bd86e2bc077f603d2" width="480" height="288"/></center>]]></content:encoded>
			<wfw:commentRss>http://vitorbaptista.com/ttyshare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exemplo da SDL_gfx</title>
		<link>http://vitorbaptista.com/exemplo-da-sdl_gfx/</link>
		<comments>http://vitorbaptista.com/exemplo-da-sdl_gfx/#comments</comments>
		<pubDate>Fri, 06 Jul 2007 02:52:17 +0000</pubDate>
		<dc:creator>Vítor Baptista</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[SDL]]></category>

		<guid isPermaLink="false">http://blog.vitorbaptista.com/2007/07/05/sdl_gfx-sdl-programacao-c-programacao-jogos/</guid>
		<description><![CDATA[Depois de configurarmos a SDL_gfx, vamos usá-la! 1 #include &#34;SDL/SDL_gfxPrimitives.h&#34; Incluímos as headers da SDL_gfx que iremos usar. No main, temos diversos métodos para desenhar. Cada um abaixo acompanha a descrição de seus parâmetros. 2 3 //Desenha uma linha com anti-aliasing, para aumentar a qualidade aalineRGBA&#40;tela, 500, 20, 550, 150, 0, 0, 0, 255&#41;; int [...]]]></description>
			<content:encoded><![CDATA[Depois de configurarmos a <a href="http://www.ferzkopp.net/joomla/content/view/19/14/" target="_blank">SDL_gfx</a>, vamos usá-la!
<div style="text-align: center"><img src='http://vitorbaptista.com/wp-content/uploads/2007/07/exemplosdlgfx.png' alt='Exemplo SDL_gfx' /></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;SDL/SDL_gfxPrimitives.h&quot;</span></pre></td></tr></table></div>



Incluímos as headers da <a href="http://www.ferzkopp.net/joomla/content/view/19/14/" target="_blank">SDL_gfx</a> que iremos usar.

No main, temos diversos métodos para desenhar. Cada um abaixo acompanha a descrição de seus parâmetros.


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>2
3
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//Desenha uma linha com anti-aliasing, para aumentar a qualidade</span>
aalineRGBA<span style="color: #008000;">&#40;</span>tela, <span style="color: #0000dd;">500</span>, <span style="color: #0000dd;">20</span>, <span style="color: #0000dd;">550</span>, <span style="color: #0000dd;">150</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">255</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>



int aalineRGBA(SDL_Surface * destino, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>4
5
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//Desenha um círculo</span>
filledCircleRGBA<span style="color: #008000;">&#40;</span>tela, <span style="color: #0000dd;">50</span>, <span style="color: #0000dd;">50</span>, <span style="color: #0000dd;">30</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">255</span>, <span style="color: #0000dd;">255</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>



int filledCircleRGBA(SDL_Surface * destino, Sint16 x, Sint16 y, Sint16 raio, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>6
7
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//Desenha uma elipse</span>
filledEllipseRGBA<span style="color: #008000;">&#40;</span>tela, <span style="color: #0000dd;">200</span>, <span style="color: #0000dd;">300</span>, <span style="color: #0000dd;">100</span>, <span style="color: #0000dd;">50</span>, <span style="color: #0000dd;">125</span>, <span style="color: #0000dd;">125</span>, <span style="color: #0000dd;">255</span>, <span style="color: #0000dd;">255</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>



int filledEllipseRGBA(SDL_Surface * destino, Sint16 x, Sint16 y, Sint16 raiox, Sint16 raioy, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>8
9
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//Desenha um retângulo</span>
boxRGBA<span style="color: #008000;">&#40;</span>tela, <span style="color: #0000dd;">400</span>, <span style="color: #0000dd;">300</span>, <span style="color: #0000dd;">600</span>, <span style="color: #0000dd;">350</span>, <span style="color: #0000dd;">255</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">255</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>



int boxRGBA(SDL_Surface * destino, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>10
11
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//Desenha um triângulo</span>
filledTrigonRGBA<span style="color: #008000;">&#40;</span>tela, <span style="color: #0000dd;">200</span>, <span style="color: #0000dd;">20</span>, <span style="color: #0000dd;">300</span>, <span style="color: #0000dd;">20</span>, <span style="color: #0000dd;">240</span>, <span style="color: #0000dd;">90</span>, <span style="color: #0000dd;">255</span>, <span style="color: #0000dd;">255</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">255</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>



int filledTrigonRGBA(SDL_Surface * destino, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>12
13
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//Desenha uma string</span>
stringRGBA<span style="color: #008000;">&#40;</span>tela, <span style="color: #0000dd;">100</span>, <span style="color: #0000dd;">400</span>, <span style="color: #FF0000;">&quot;www.vitorbaptista.com&quot;</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">255</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>



int stringRGBA(SDL_Surface * destino, Sint16 x, Sint16 y, char *string, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);


Agora já temos quase todo o conhecimento necessário para começar a desenvolver nosso Pong.
No próximo artigo irei mostrar uma forma de detecção de colisões bem básica, mas que irá servir bem para o que queremos.


<blockquote>Baixe os fontes deste exemplo <a href='http://vitorbaptista.com/wp-content/uploads/2007/07/03_sdl_gfx.zip'>aqui</a>.</blockquote>]]></content:encoded>
			<wfw:commentRss>http://vitorbaptista.com/exemplo-da-sdl_gfx/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

