<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>.::Escovando Bits::. &#187; programação</title>
	<atom:link href="http://escovandobits.wordpress.com/category/programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://escovandobits.wordpress.com</link>
	<description>Programação, Linux, tecnologia da informação, dicas, artigos</description>
	<lastBuildDate>Sun, 05 Jul 2009 15:42:47 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='escovandobits.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/ac8d2c79730f1bc1a6ebab006a3670da?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>.::Escovando Bits::. &#187; programação</title>
		<link>http://escovandobits.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://escovandobits.wordpress.com/osd.xml" title=".::Escovando Bits::." />
		<item>
		<title>Conversão de base no Python</title>
		<link>http://escovandobits.wordpress.com/2009/07/05/conversao-de-base-no-python/</link>
		<comments>http://escovandobits.wordpress.com/2009/07/05/conversao-de-base-no-python/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 15:42:46 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=500</guid>
		<description><![CDATA[Lembrete para conversão de base no Python, a primera coluna é o valor de entrada e a primeira linha o valor de saída.
 













Hexadecimal


Binário


Octal


Decimal




Hex:


-


bin(0x&#60;num&#62;)


oct(0x&#60;num&#62;)


int(0x&#60;num&#62;)




Bin:


hex(0b&#60;num&#62;)


-


oct(0b&#60;num&#62;)


int(0b&#60;num&#62;)




Octal:


hex(0o&#60;num&#62;)


bin(0o&#60;num)


-


int(0o&#60;num&#62;)




Dec:


hex(&#60;num&#62;)


bin(&#60;num&#62;)


oct(&#60;num&#62;)


-




Pode-se converter para outras bases entre 2 e 36 utilizando int(&#60;numero&#62;,&#60;base&#62;), exemplo:
&#62;&#62;&#62; print int('g',18)
16

Posted in programação Tagged: python      <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=500&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><span style="color:#141312;">Lembrete para conversão de base no Python, a primera coluna é o valor de entrada e a primeira linha o valor de saída.</span></p>
<p style="padding-left:30px;"><span style="color:#141312;"> </span></p>
<table class="Tabela1" border="0" cellspacing="0" cellpadding="0"></table>
<col width="62"></col>
<col width="191"></col>
<col width="119"></col>
<col width="187"></col>
<col width="184"></col>
<table class="Tabela1" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="Tabela1_A1" style="text-align:left;width:.5604in;">
<p class="Table_20_Contents">
</td>
<td class="Tabela1_B1" style="text-align:left;width:1.7201in;">
<p class="P1" style="text-align:left;">Hexadecimal</p>
</td>
<td class="Tabela1_B1" style="text-align:left;width:1.0743in;">
<p class="P1" style="text-align:left;">Binário</p>
</td>
<td class="Tabela1_B1" style="text-align:left;width:1.6826in;">
<p class="P1" style="text-align:left;">Octal</p>
</td>
<td class="Tabela1_E1" style="text-align:left;width:1.6549in;">
<p class="P1" style="text-align:left;">Decimal</p>
</td>
</tr>
<tr>
<td class="Tabela1_A2" style="text-align:left;width:.5604in;">
<p class="P2">Hex:</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.7201in;">
<p class="P1" style="text-align:center;">-</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.0743in;">
<p class="P1"><strong>bin</strong>(<span style="color:#008000;">0x</span><span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.6826in;">
<p class="P1"><strong>oct</strong>(<span style="color:#008000;">0x</span><span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
<td class="Tabela1_E2" style="text-align:left;width:1.6549in;">
<p class="P1"><strong>int</strong>(<span style="color:#008000;">0x</span><span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
</tr>
<tr>
<td class="Tabela1_A2" style="text-align:left;width:.5604in;">
<p class="P2">Bin:</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.7201in;">
<p class="P1"><strong><span style="color:#000000;">hex</span></strong>(<span style="color:#008000;">0b</span><span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.0743in;">
<p class="P1" style="text-align:center;">-</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.6826in;">
<p class="P1"><strong>oct</strong>(<span style="color:#008000;">0b</span><span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
<td class="Tabela1_E2" style="text-align:left;width:1.6549in;">
<p class="P1"><strong>int</strong>(<span style="color:#008000;">0b</span><span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
</tr>
<tr style="text-align:center;">
<td class="Tabela1_A2" style="text-align:left;width:.5604in;">
<p class="P2">Octal:</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.7201in;">
<p class="P1"><strong>hex</strong>(<span style="color:#008000;">0o</span><span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.0743in;">
<p class="P1"><strong>bin</strong>(<span style="color:#008000;">0o</span><span style="color:#ff0000;">&lt;num</span>)</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.6826in;">
<p class="P1" style="text-align:center;">-</p>
</td>
<td class="Tabela1_E2" style="text-align:left;width:1.6549in;">
<p class="P1"><strong>int</strong>(<span style="color:#008000;">0o</span><span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
</tr>
<tr style="text-align:center;">
<td class="Tabela1_A2" style="text-align:left;width:.5604in;">
<p class="P2">Dec:</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.7201in;">
<p class="P1"><strong>hex</strong>(<span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.0743in;">
<p class="P1"><strong>bin</strong>(<span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
<td class="Tabela1_A2" style="text-align:left;width:1.6826in;">
<p class="P1"><strong>oct</strong>(<span style="color:#ff0000;">&lt;num&gt;</span>)</p>
</td>
<td class="Tabela1_E2" style="text-align:left;width:1.6549in;">
<p class="P1" style="text-align:center;">-</p>
</td>
</tr>
</tbody>
</table>
<p class="Standard">Pode-se converter para outras bases entre 2 e 36 utilizando int(&lt;numero&gt;,&lt;base&gt;), exemplo:</p>
<pre class="Standard" style="padding-left:30px;">&gt;&gt;&gt; print int('g',18)
16</pre>
<p class="Standard">
Posted in programação Tagged: python <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/500/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/500/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/500/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/500/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/500/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/500/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/500/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/500/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/500/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/500/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=500&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2009/07/05/conversao-de-base-no-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
		<item>
		<title>VMWare ESX</title>
		<link>http://escovandobits.wordpress.com/2009/05/23/vmware-esx/</link>
		<comments>http://escovandobits.wordpress.com/2009/05/23/vmware-esx/#comments</comments>
		<pubDate>Sat, 23 May 2009 04:48:43 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[qemu]]></category>
		<category><![CDATA[virtualização]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=483</guid>
		<description><![CDATA[Ainda não testei num hardware apropriado&#8230; mas hoje quando fiz um teste rápido com com o VMware ESXi no QEmu percebi que ele detectou &#8220;aonde&#8221; estava rodando.

Para ver mais screenshots clique aqui.
As CPUs modernas possuem alguns registros especiais dentre os quais há o grupo de instruções: Memory Type Range Registers (MTRRs) que provém um sistema [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=483&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Ainda não testei num <em>hardware</em> apropriado&#8230; mas hoje quando fiz um teste rápido com com o <a href="http://www.vmware.com/products/esxi/" target="_self">VMware ESXi</a> no QEmu percebi que ele detectou &#8220;aonde&#8221; estava rodando.</p>
<p style="text-align:center;"><a title="6. VMware ESX por Tiago Maluta, no Flickr" href="http://www.flickr.com/photos/maluta/3555130309/"><img src="http://farm4.static.flickr.com/3392/3555130309_dc627dc869_o.png" alt="6. VMware ESX" width="437" height="260" /></a></p>
<p style="text-align:center;">Para ver mais <em>screenshots </em>clique <a href="http://www.flickr.com/photos/maluta/sets/72157618654184926/detail/" target="_blank">aqui</a><strong>.</strong></p>
<p style="text-align:justify;"><strong><span id="more-483"></span></strong>As CPUs modernas possuem alguns registros especiais dentre os quais há o grupo de instruções: <em>Memory Type Range Registers</em> (MTRRs) que provém um sistema de como o acesso a faixas de memória são transferidas para a cache. Nesse caso a mensagem [<strong>No variable MTRRS</strong>] indica como o VMware detectou.  [assim que sobrar um tempo irei buscar a fundo o motivo real da virtualização não implementar isso]</p>
<p style="text-align:justify;">Utilizei o seguinte comando para rodar o Qemu:</p>
<pre><strong>./qemu -cpu </strong>coreduo <strong>-m</strong> 1500 \
 -<strong>hda</strong> vm.cow \
 <strong>-cdrom</strong> VMware-VMvisor-InstallerCD-3.5.0_Update_4-153875.i386.iso</pre>
<p><span style="color:#000000;">A título de exemplo,  vejam um programa para detectar se o seu programa está em uma máquina virtual (no caso VMware):</span></p>
<pre style="padding-left:30px;text-align:justify;"><span style="color:#006e28;">#include &lt;stdlib.h&gt;</span>
<span style="color:#006e28;">#include &lt;unistd.h&gt;</span>
<span style="color:#006e28;">#include &lt;signal.h&gt;</span>

<span style="color:#006e28;">#define MAGIC 0x564d5868 </span><span style="color:#888786;"><em>/* "VMXh" */</em></span>
<span style="color:#006e28;">#define PORT 0x5658       </span><span style="color:#888786;"><em>/* "VX" */</em></span>
<span style="color:#006e28;">#define GETVERSION 0x0a</span>

<span style="color:#0057ae;">static</span><span style="color:#141312;"> </span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *versions[] =</span>
<span style="color:#141312;">  {</span><span style="color:#bf0303;">"??"</span><span style="color:#141312;">,</span><span style="color:#bf0303;">"Express"</span><span style="color:#141312;">,</span><span style="color:#bf0303;">"ESX Server"</span><span style="color:#141312;">,</span><span style="color:#bf0303;">"GSX Server"</span><span style="color:#141312;">,</span><span style="color:#bf0303;">"Workstation"</span><span style="color:#141312;"> };</span>

<span style="color:#0057ae;">static</span><span style="color:#141312;"> </span><span style="color:#0057ae;">int</span><span style="color:#141312;"> vlen[] = {</span><span style="color:#b08000;">2</span><span style="color:#141312;">,</span><span style="color:#b08000;">7</span><span style="color:#141312;">,</span><span style="color:#b08000;">10</span><span style="color:#141312;">,</span><span style="color:#b08000;">10</span><span style="color:#141312;">,</span><span style="color:#b08000;">11</span><span style="color:#141312;">};</span>

<span style="color:#0057ae;">static</span><span style="color:#141312;"> </span><span style="color:#0057ae;">void</span><span style="color:#141312;"> segfault(){</span>
<span style="color:#141312;">    write(</span><span style="color:#b08000;">1</span><span style="color:#141312;">,</span><span style="color:#bf0303;">"Not a VMware box.</span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">"</span><span style="color:#141312;">,</span><span style="color:#b08000;">18</span><span style="color:#141312;">);</span>
<span style="color:#141312;">    exit(</span><span style="color:#b08000;">1</span><span style="color:#141312;">);</span>
<span style="color:#141312;">}</span>
<span style="color:#0057ae;">
int</span><span style="color:#141312;"> main(){</span>
<span style="color:#141312;">    </span><span style="color:#0057ae;">unsigned</span><span style="color:#141312;"> </span><span style="color:#0057ae;">int</span><span style="color:#141312;"> ok, ver, magic;</span>

<span style="color:#141312;">    signal(</span><span style="color:#b08000;">11</span><span style="color:#141312;">, segfault);</span>
<span style="color:#141312;">    __asm__ __volatile__ (</span><span style="color:#bf0303;">" \</span>
<span style="color:#bf0303;">         push %%ebx          </span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">\</span>
<span style="color:#bf0303;">         in %%dx, %%eax      </span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">\</span>
<span style="color:#bf0303;">         mov %%ebx, %1       </span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">\</span>
<span style="color:#bf0303;">         pop %%ebx           </span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">\</span>
<span style="color:#bf0303;">       "</span>
<span style="color:#141312;">       : </span><span style="color:#bf0303;">"=a"</span><span style="color:#141312;">(ok), </span><span style="color:#bf0303;">"=m"</span><span style="color:#141312;">(magic), </span><span style="color:#bf0303;">"=c"</span><span style="color:#141312;">(ver)</span>
<span style="color:#141312;">       : </span><span style="color:#bf0303;">"0"</span><span style="color:#141312;"> (MAGIC), </span><span style="color:#bf0303;">"c"</span><span style="color:#141312;"> (GETVERSION), </span><span style="color:#bf0303;">"d"</span><span style="color:#141312;"> (PORT)</span>
<span style="color:#141312;">    );</span>

<span style="color:#141312;">    <strong>if</strong> (magic == MAGIC) {</span>
<span style="color:#141312;">       write(</span><span style="color:#b08000;">1</span><span style="color:#141312;">, </span><span style="color:#bf0303;">"VMware "</span><span style="color:#141312;">, </span><span style="color:#b08000;">7</span><span style="color:#141312;">);</span>
<span style="color:#141312;">       <strong>if</strong> (ok == </span><span style="color:#b08000;">6</span><span style="color:#141312;">) {</span>
<span style="color:#141312;">               write(</span><span style="color:#b08000;">1</span><span style="color:#141312;">, versions[ver], vlen[ver]);</span>
<span style="color:#141312;">               write(</span><span style="color:#b08000;">1</span><span style="color:#141312;">, </span><span style="color:#bf0303;">"</span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">"</span><span style="color:#141312;">, </span><span style="color:#b08000;">1</span><span style="color:#141312;">);</span>
<span style="color:#141312;">       }</span>
<span style="color:#141312;">       <strong>else</strong> write(</span><span style="color:#b08000;">1</span><span style="color:#141312;">, </span><span style="color:#bf0303;">"unknown</span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">"</span><span style="color:#141312;">,</span><span style="color:#b08000;">8</span><span style="color:#141312;">);</span>
<span style="color:#141312;">    }</span>
<span style="color:#141312;">  <strong>  else</strong> write(</span><span style="color:#b08000;">1</span><span style="color:#141312;">, </span><span style="color:#bf0303;">"Not vmware</span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">"</span><span style="color:#141312;">,</span><span style="color:#b08000;">11</span><span style="color:#141312;">);</span>
<span style="color:#141312;">    exit(</span><span style="color:#b08000;">0</span><span style="color:#141312;">);</span>
<span style="color:#141312;">}

</span></pre>
<p style="text-align:justify;"><span style="color:#141312;">Isso foi só um motivacional. Isso é assunto para outros <em>posts</em>, ainda estou aprendendo as metodologias utilizadas em virtualização,  esperem em breve <em>posts</em> com temas interessantíssimos.<br />
</span></p>
Posted in programação Tagged: qemu, virtualização, vmware <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/483/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/483/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/483/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/483/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/483/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/483/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=483&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2009/05/23/vmware-esx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3392/3555130309_dc627dc869_o.png" medium="image">
			<media:title type="html">6. VMware ESX</media:title>
		</media:content>
	</item>
		<item>
		<title>Organizando o processo de compilação</title>
		<link>http://escovandobits.wordpress.com/2009/05/14/organizando-o-processo-de-compilacao/</link>
		<comments>http://escovandobits.wordpress.com/2009/05/14/organizando-o-processo-de-compilacao/#comments</comments>
		<pubDate>Thu, 14 May 2009 05:35:09 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=472</guid>
		<description><![CDATA[Esse post irá mostrar uma pequena dica para quem deseja começar a testar programas de terceiros de uma forma organizada, de modo a preservar os &#8220;originais&#8221; do sistema e permitir isolar as versões.
Na maioria dos casos quando testamos um programa pelo código-fonte, utilizamos a forma definida no autoconf, muito tradicional no sistema GNU, onde:  descompactamos, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=472&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Esse post irá mostrar uma pequena dica para quem deseja começar a testar programas de terceiros de uma forma organizada, de modo a preservar os &#8220;originais&#8221; do sistema e permitir isolar as versões.</p>
<p style="text-align:justify;"><span id="more-472"></span>Na maioria dos casos quando testamos um programa pelo código-fonte, utilizamos a forma definida no <a href="http://www.gnu.org/software/autoconf/" target="_blank">autoconf</a>, muito tradicional no sistema GNU, onde:  descompactamos, verificamos o sistema (<em>configure</em>),  compilamos (<em>make</em>) e copiamos para a pasta correspondente na hieraquia de pastas do sistema (<em>make install</em>).</p>
<pre style="padding-left:30px;"> tar zxvf programa.tar.gz
 cd programa
 ./configure
 make
 make install</pre>
<p style="text-align:justify;">Contudo, se estamos trabalhando com versões de desenvolvimento não queremos copiar os binários gerados para o sistema.  Pode ser que eu tenha uma versão X do software funcionando e a verão Y que desejo testar quebre a compatibildade com algum outro programa do sistema.  Vamos considerar o seguinte exemplo: suponha que você viu no site do projeto <a title="Site do Binutils" href="http://www.gnu.org/software/binutils/" target="_blank">binutils</a> que há um novo linker (<em>A new, faster, ELF only linker, still in beta test.</em>) e deseje compilar esta nova versão para testá-la. Utilizando o processo descrito acima você irá sobreescrever a versão distribuida pelos desenvolvedores da sua distribuição e não queremos que isso ocorra, principalmente quando o software está na versão beta do seu desenvolvimento. Vamos pensar outra maneira:</p>
<pre style="padding-left:30px;"> wget <a href="http://ftp.gnu.org/gnu/binutils/binutils-2.9.tar.gz" target="_blank">http://ftp.gnu.org/gnu/binutils/binutils-2.9.tar.gz</a>
 tar zxvf binutils-2.9.tar.gz
 cd binutils-2.9</pre>
<p style="text-align:justify;">Se olharmos as opções de ajuda (&#8211;help) do script configure vemos que podemos setar o prefixo da instalação:</p>
<pre style="padding-left:30px;"> --prefix=MYDIR          install into MYDIR [/usr/local]</pre>
<p style="text-align:justify;">Então basta escolher o diretório para colocar os executáveis.</p>
<pre style="padding-left:30px;"> ./configure --prefix=../install</pre>
<p style="text-align:justify;">Mas ainda há uma maneira, ao meu ver, mais organizada, principalmente se você está desenvolvendo um software. Depois de descompactar o programa, crie dois diretórios: um chamado <strong>build </strong>que irá conter os arquivos gerados pelo compilador e um <strong>install</strong> que terá apenas os executáveis.</p>
<pre style="padding-left:30px;"> cd ..
 mkdir build install</pre>
<p style="text-align:justify;">No final teremos os diretórios:</p>
<pre style="padding-left:30px;text-align:justify;"> .
 |-- binutils-2.9
 |-- build
 `-- install</pre>
<p style="text-align:justify;">Uma pasta com o código-fonte, outra com os arquivos objeto (resultado da etapa de compilação) e o executáveis.</p>
<pre style="padding-left:30px;"> cd build
 <strong>../binutils-2.9/configure --prefix=$(cd ../install &amp;&amp; pwd)</strong></pre>
<p style="text-align:justify;">Depois disso siga normalmente o processo de <em>make</em> e <em>make install</em> lembrando que os executáveis agora ficarão na pasta install/.  Essa metodologia é simples e muito útil,  principalmente quando estamos trabalhando com algum programa de controle de versão (ex.: git) e desenvolvendo testes em arquiteturas diferentes.</p>
<p style="text-align:justify;"><strong>Caso especial: kernel</strong></p>
<p style="text-align:justify;">O Linux não possui um script de configuração (<em>configure</em>) portanto é preciso especificar no &#8216;make&#8217; no local. Para manter a mesma árvore compilando para diferentes arquiteturas.</p>
<p style="text-align:justify;">
<pre style="padding-left:30px;">alias make-cross= \
"make O=../buildsh ARCH=sh CROSS_COMPILE=sh4-unknown-linux-gnu-"
make-cross menuconfig
make-cross</pre>
<p style="text-align:justify;padding-left:30px;">
<p style="text-align:justify;">
<p style="text-align:justify;"><span style="color:#888888;"><br />
</span></p>
Posted in Linux, programação  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/472/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=472&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2009/05/14/organizando-o-processo-de-compilacao/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
		<item>
		<title>Motorola 6800 &#8211; Divisão Inteira</title>
		<link>http://escovandobits.wordpress.com/2009/04/05/motorola-6800-divisao-inteira/</link>
		<comments>http://escovandobits.wordpress.com/2009/04/05/motorola-6800-divisao-inteira/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 14:25:11 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[6800]]></category>
		<category><![CDATA[efei]]></category>
		<category><![CDATA[microprocessadores]]></category>
		<category><![CDATA[unifei]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=322</guid>
		<description><![CDATA[O Motorola 6800 não possui uma instrução específica para divisão de dois números. Uma solução simples é fazer a divisão através de múltiplas subtrações. Contudo, podemos pensar mecanismos mais eficientes. Uma solução  esta descrita no código-abaixo. Esse algoritmo é mais eficiente na maiora dos casos, pois com apenas 8 deslocamentos efetua a divisão de dois [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=322&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">O <a href="http://en.wikipedia.org/wiki/Motorola_6800" target="_blank">Motorola 6800</a> não possui uma instrução específica para divisão de dois números. Uma solução simples é fazer a divisão através de múltiplas subtrações. Contudo, podemos pensar mecanismos mais eficientes. Uma solução  esta descrita no código-abaixo. Esse algoritmo é mais eficiente na maiora dos casos, pois com apenas 8 deslocamentos efetua a divisão de dois números de 8 bits.</p>
<p style="text-align:justify;"><span id="more-322"></span>O primeiro caso é quando temos números absolutos.</p>
<pre style="text-align:justify;">                <strong>LDAA</strong> Divisor       
<strong>                BEQ</strong> __end       <span style="color:#ff0000;"> ; caso Divisor = 0</span>

               <span style="color:#ff0000;"> ; o contador ira deslocar 8 vezes,
                ; mas como já começo decrementando
                ; carrego com 9.</span>

                <strong>LDAA</strong> #$09      
                <strong>STAA</strong> Contador
                <strong>CLRA</strong>
                <strong>BRA</strong> <span style="color:#0000ff;">loop_div</span>

<span style="color:#0000ff;">empurra_zero:</span>   <strong>ASL</strong> Resposta  

<span style="color:#0000ff;">loop_div:</span>       <strong>DEC</strong> Contador  <span style="color:#ff0000;">; decrementa contador</span>
                <strong>BEQ</strong> <span style="color:#0000ff;">__end</span>

                <strong>ASL</strong> Dividendo <span style="color:#ff0000;">; desloca o dividendo p/ Carry</span>
                <strong>ROLA</strong>          <span style="color:#ff0000;">; desloga do Carry p/ ACCA</span>
                <strong>CMPA</strong> Divisor  <span style="color:#ff0000;">;</span><span style="color:#ff0000;"> Acumulador - Dividor &gt; 0</span>

                <strong>BCS</strong> <span style="color:#0000ff;">empurra_zero</span>

                <strong>SEC</strong>           <span style="color:#ff0000;">; set carry </span>
                <strong>ROL</strong> Resposta  <span style="color:#ff0000;">; empurra '1' na resposta</span>
                <strong>SUBA</strong> Divisor
                <strong>BRA</strong> <span style="color:#0000ff;">loop_div</span>

<span style="color:#0000ff;">__end</span>:          <strong>NOP</strong></pre>
<p style="text-align:justify;">Se os números forem sinalizados precisamos considerar isso na conta, portanto antes de dividir o número devemos verificar seu sinal. O código abaixo utiliza duas posições de memória para o sinal do número.  No final é feito uma OU-Exclusivo para definir qual sinal da resposta.</p>
<pre>            <strong>CLR</strong> Neg_Divisor
            <strong>CLR</strong> Neg_Dividendo               <strong>
            LDAA</strong> Divisor
            <strong>BEQ</strong> __end       <span style="color:#ff0000;"> ; caso Divisor = 0</span>
            <strong>BPL</strong> skip

            <strong>NEG</strong> Divisor
            <strong>DEC</strong> Neg_Divisor  <span style="color:#ff0000;">; Neg_Divisor = 1 (0xff)</span>

<span style="color:#0000ff;">skip:</span>       <strong>LDAA</strong> Dividendo
            <strong>BPL</strong> <span style="color:#0000ff;">__div</span>        <span style="color:#ff0000;">; Neg_Dividendo = 1 (0xff)</span>

            <strong>NEG</strong> Dividendo
            <strong>DEC</strong> Neg_Dividendo

         <span style="color:#ff0000;">   ; o contador ira deslocar 8 vezes, mas
            ; como já começo decrementando
            ; carrego com 9.</span>

<span style="color:#0000ff;">__div:</span>          <strong>LDAA</strong> #$09      
                <strong>STAA</strong> Contador
                <strong>CLRA</strong>
                <strong>BRA</strong> <span style="color:#0000ff;">loop_div</span>

<span style="color:#0000ff;">empurra_zero:</span>   <strong>ASL</strong> Resposta  

<span style="color:#0000ff;">loop_div: </span>      <strong>DEC</strong> Contador  <span style="color:#ff0000;"> ; decrementa contador</span>
                <strong>BEQ</strong> <span style="color:#0000ff;">__end</span>

                <strong>ASLA</strong> Dividendo <span style="color:#ff0000;">; desloca o dividendo p/ Carry</span>
                <strong>ROLA</strong>           <span style="color:#ff0000;">; desloga do Carry p/ ACCA</span>
                <strong>CMPA</strong> Divisor   <span style="color:#ff0000;">; Acumulador - Dividor &gt; 0</span>

                <strong>BCS</strong> <span style="color:#0000ff;">empurra_zero</span>

                <strong>SEC</strong>          <span style="color:#ff0000;"> ; set carry </span>
                <strong>ROL</strong> Resposta  <span style="color:#ff0000;">; empurra '1' na resposta</span>
                <strong>SUB</strong> Divisor
                <strong>BRA</strong> <span style="color:#0000ff;">loop_div</span>

<span style="color:#0000ff;">__end:   </span>       <strong>LDAA</strong> Neg_Divisor
                <strong>EORA</strong> Neg_Dividendo 
              <span style="color:#ff0000;">  ; a lógica da XOR garante o estudo dos sinais</span>
                <strong>BPL</strong> <span style="color:#0000ff;">_end</span> 

                <strong>NEG</strong> Resposta          
<span style="color:#0000ff;">_end: </span>         <strong> NOP    </strong></pre>
Posted in programação Tagged: 6800, efei, microprocessadores, unifei <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/322/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/322/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/322/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/322/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/322/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/322/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=322&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2009/04/05/motorola-6800-divisao-inteira/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
		<item>
		<title>Timer no PyQT</title>
		<link>http://escovandobits.wordpress.com/2009/03/27/timer_pyqt/</link>
		<comments>http://escovandobits.wordpress.com/2009/03/27/timer_pyqt/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 16:48:42 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=305</guid>
		<description><![CDATA[Quem programa em Python provavelmente já precisou fazer alguma coisa com threads. Contudo quando estamos trabalhando com PyQT há alguns incovenientes em utilizar as threads da API do Python, principalmente quando temos interfaces gráficas. Recentemente tive problemas para fazer uma função que executasse determinada ação após um tempo pré-definido em segundos. Pois quando enquanto a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=305&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Quem programa em Python provavelmente já precisou fazer alguma coisa com <a title="Python Threading" href="http://docs.python.org/library/threading.html" target="_blank">threads</a>. Contudo quando estamos trabalhando com PyQT há alguns incovenientes em utilizar as threads da API do Python, principalmente quando temos interfaces gráficas. Recentemente tive problemas para fazer uma função que executasse determinada ação após um tempo pré-definido em segundos. Pois quando enquanto a thread não terminasse sua execução a janela gráfica não aparecia.  Encontrei duas maneiras para solucionar,  a primeira utilizando <a href="http://doc.trolltech.com/4.4/qthread.html" target="_blank">QThread</a> e uma muito mais simples usando <a href="http://doc.trolltech.com/4.4/qtimer.html" target="_blank">QTimer</a>,  fica o registro das duas maneiras:</p>
<p style="text-align:justify;"><span id="more-305"></span></p>
<pre><span style="color:#ff80e0;">from</span><span style="color:#141312;"> PyQt4 </span><span style="color:#ff80e0;">import</span><span style="color:#141312;"> *</span>
<span style="color:#ff80e0;">from</span><span style="color:#141312;"> PyQt4.QtCore </span><span style="color:#ff80e0;">import</span><span style="color:#141312;"> *</span>

<span style="color:#141312;"><strong>class</strong> MyTimer(QThread):</span>
<span style="color:#141312;">	<strong>def</strong> </span><span style="color:#000e52;"><strong>__init__</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">,parent = </span><span style="color:#006e28;">None</span><span style="color:#141312;">):</span>
<span style="color:#141312;">		QThread.</span><span style="color:#000e52;"><strong>__init__</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">,parent)</span>

<span style="color:#141312;">	<strong>def</strong> run(</span><span style="color:#006e28;">self</span><span style="color:#141312;">):</span>
<span style="color:#141312;">		<strong>while</strong> </span><span style="color:#b08000;">1</span><span style="color:#141312;">:</span>
<span style="color:#141312;">		</span><span style="color:#888786;"><em># a cada 'self.tempo' segundos o sinal é emitido e
                  nós tratamos na outra classe. Exemplo</em></span>:
<span style="color:#141312;">			</span><span style="color:#006e28;">self</span><span style="color:#141312;">.<strong>emit</strong>(</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"sinal_atualiza()"</span><span style="color:#141312;">))</span>
<span style="color:#141312;">			</span><span style="color:#006e28;">self</span><span style="color:#141312;">.sleep(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.tempo)</span>

<span style="color:#141312;">	<strong>def</strong> Timer(</span><span style="color:#006e28;">self</span><span style="color:#141312;">,t=</span><span style="color:#b08000;">5</span><span style="color:#141312;">):</span>
<span style="color:#141312;">		</span><span style="color:#006e28;">self</span><span style="color:#141312;">.tempo = t</span>
<span style="color:#141312;">		</span><span style="color:#006e28;">self</span><span style="color:#141312;">.start()

</span></pre>
<p style="text-align:justify;"><span style="color:#141312;">Depois, na sua classe basta que gerencia a interface gráfica, basta instanciar o objeto e tratar os sinais definidos em MyTimer(), você pode definir quantos sinais forem necessários:</span></p>
<pre><span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer = MyTimer()</span>
<span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer.Timer(3)</span> <span style="color:#888786;"><em><em># 3 segundos

</em></em></span><span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.</span><span style="color:#0095ff;"><strong>connect</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer,
                       QtCore.</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"sinal_stualiza()"</span><span style="color:#141312;">),
                       </span><span style="color:#006e28;">self</span><span style="color:#141312;">.atualiza)</span>
<span style="color:#141312;">	  </span><span style="color:#888786;"><em># caso seja necessario executar algo após o termino da
          # therad (não é o caso </em></span><span style="color:#888786;"><em>do exemplo acima que o while
          # "trava" na função run()</em></span>
<span style="color:#141312;">	  </span><span style="color:#006e28;">self</span><span style="color:#141312;">.</span><span style="color:#0095ff;"><strong>connect</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer,
                       QtCore.</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"finished()"</span><span style="color:#141312;">),
                       </span><span style="color:#006e28;">self</span><span style="color:#141312;">.finaliza)</span></pre>
<p>Contudo existe uma maneira <strong>muito</strong> mais fácil de fazer um timer utilizando PyQT, usando a <a href="http://doc.trolltech.com/4.4/qtimer.html" target="_blank">QTimer</a></p>
<pre><span style="color:#141312;">	</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer = QtCore.QTimer()

</span><span style="color:#141312;">	</span><span style="color:#006e28;">self</span><span style="color:#141312;">.</span><span style="color:#0095ff;"><strong>connect</strong></span><span style="color:#141312;">(</span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer,
                     QtCore.</span><span style="color:#0095ff;"><strong>SIGNAL</strong></span><span style="color:#141312;">(</span><span style="color:#bf0303;">"timeout()"</span><span style="color:#141312;">),
                     </span><span style="color:#006e28;">self</span><span style="color:#141312;">.atualiza)</span>

       <span style="color:#141312;"> </span><span style="color:#006e28;">self</span><span style="color:#141312;">.timer.start(</span><span style="color:#b08000;">3000</span><span style="color:#141312;">)</span> <span style="color:#888786;"><em># tempo em milisegundos</em></span></pre>
Posted in programação, pyqt Tagged: pyqt, python, qt, threads <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/305/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=305&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2009/03/27/timer_pyqt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
		<item>
		<title>Exemplos do uso syscalls (x86) do Linux</title>
		<link>http://escovandobits.wordpress.com/2009/01/21/exemplos-do-uso-syscalls-x86-do-linux/</link>
		<comments>http://escovandobits.wordpress.com/2009/01/21/exemplos-do-uso-syscalls-x86-do-linux/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 00:36:35 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[glibc]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[syscalls]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=253</guid>
		<description><![CDATA[Hoje tive uma idéia ao ler um artigo intitulado How Compiling Works no qual o autor descreve em linhas gerais, mas de uma maneira interessante, o processo de compilação de um código escrito em C (abordando  o processo de linkagem com as bibliotecas) tomando como exemplo a função printf. Resolvi fazer uma brincadeira, mostrando como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=253&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Hoje tive uma idéia ao ler um artigo intitulado <a href="http://markuskimius.wikidot.com/programming:explain:compiling" target="_self">How Compiling Works</a> no qual o autor descreve em linhas gerais, mas de uma maneira interessante, o processo de compilação de um código escrito em C (abordando  o processo de <em>linkagem</em> com as bibliotecas) tomando como exemplo a função <a href="http://linux.die.net/man/3/printf" target="_blank">printf</a>. Resolvi fazer uma brincadeira, mostrando como isso pode ser realmente implementado na prática, usando chamadas de sistema (<em>syscalls</em>) do <a href="http://www.kernel.org" target="_blank">Linux</a>, de modo que não seja necessário usar a implementação disponível na <a href="www.gnu.org/software/libc/" target="_blank">glibc</a>.</p>
<p style="text-align:justify;"><span id="more-253"></span></p>
<p style="text-align:justify;">Começando com um exemplo simples, bem parecido com que todo mundo que um dia pensou em programar já viu.  A diferença que a função printf será modificada para receber apenas caracteres (não variáveis) e a quantidade.</p>
<pre><span style="color:#006e28;">#include "stdio.h"</span>
<span style="color:#0057ae;">int</span><span style="color:#141312;"> main() {</span>

<span style="color:#141312;">	printf(</span><span style="color:#bf0303;">"Hello, world!</span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">"</span><span style="color:#141312;">,</span><span style="color:#b08000;">15</span><span style="color:#141312;">);</span>
<span style="color:#141312;">	<strong>return</strong> </span><span style="color:#b08000;">0</span><span style="color:#141312;">;</span>
<span style="color:#141312;">}</span></pre>
<p style="text-align:justify;">Reparem que o cabeçalho está entre aspas, indicando ao compilador que vamos usar uma implementação particular e <strong>não</strong> a implementação da glibc, no meu caso os arquivos</p>
<ul>
<li>/usr/include/stdio.h (protótipo)</li>
<li>/usr/lib/libc.so  (implementação)</li>
</ul>
<p>Serão substituidos pelos arquivos <span style="text-decoration:underline;">stdio.h</span> e <span style="text-decoration:underline;">stdio.c</span> abaixo:</p>
<pre style="text-align:justify;"><span style="color:#006e28;">#ifndef STDIO_H_</span>
<span style="color:#006e28;">#define STDIO_H_</span>

<span style="color:#0057ae;">int</span><span style="color:#141312;"> printf(</span><span style="color:#0057ae;">char</span><span style="color:#141312;">* texto, </span><span style="color:#0057ae;">int</span><span style="color:#141312;"> tam);</span>

<span style="color:#006e28;">#endif </span><span style="color:#888786;"><em>/* STDIO_H_ */</em></span></pre>
<p style="text-align:justify;">Agora que temos o protótipo da função printf() que é diferente da função printf() que conhecemos mas servirá para esse primeiro exemplo:</p>
<pre style="text-align:justify;"><span style="color:#006e28;">#include "stdio.h"</span>

<span style="color:#0057ae;">int</span><span style="color:#141312;"> printf(</span><span style="color:#0057ae;">char</span><span style="color:#141312;">* texto, </span><span style="color:#0057ae;">int</span><span style="color:#141312;"> tam)</span>

<span style="color:#141312;">{</span>
<span style="color:#141312;">__asm__ (</span><span style="color:#bf0303;">"movl $0x4,%%eax; \</span>
<span style="color:#bf0303;">          movl $0x1,%%ebx; \</span>
<span style="color:#bf0303;">          movl %0,%%ecx; \</span>
<span style="color:#bf0303;">          movl %1,%%edx; \</span>
<span style="color:#bf0303;">          int $0x80"</span><span style="color:#141312;">: : </span><span style="color:#bf0303;">"g"</span><span style="color:#141312;"> (texto) , </span><span style="color:#bf0303;">"g"</span><span style="color:#141312;"> (tam) );</span>

<span style="color:#141312;">  <strong>return</strong> </span><span style="color:#b08000;">0</span><span style="color:#141312;">;</span>
<span style="color:#141312;">}</span></pre>
<p style="text-align:justify;">Podemos incrementar um pouco mais do código em <em>assembly</em>, para não precisar estipular o número de caracteres.</p>
<pre><span style="color:#141312;">__asm__ (</span><span style="color:#bf0303;">"      xorl %%edx,%%edx; \</span>
<span style="color:#bf0303;">                xorl %%eax,%%eax; \</span>

<span style="color:#bf0303;">                movl %0,%%ecx; \</span>
<span style="color:#bf0303;">        loop:   movb (%%ecx,%%edx),%%al; \</span>
<span style="color:#bf0303;">                incl %%edx; \</span>
<span style="color:#bf0303;">                test %%al,%%al; \</span>
<span style="color:#bf0303;">                jnz loop; \</span>
<span style="color:#bf0303;">                decl %%edx; \</span>

<span style="color:#bf0303;">                movl $0x4,%%eax; \</span>
<span style="color:#bf0303;">                movl $0x1,%%ebx; \</span>
<span style="color:#bf0303;">                int $0x80"</span><span style="color:#141312;">: : </span><span style="color:#bf0303;">"g"</span><span style="color:#141312;"> (texto));</span></pre>
<p>Para fazer uma função equivalente ao printf() da glibc precisaríamos implementar o suporte a <a href="http://linux.die.net/man/3/va_arg" target="_blank">múltiplos argumentos</a> e mais um monte de coisas <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Fiz um esboço de uma idéia do printf, mas ainda usando funções da glibc apenas implementando a <em>syscall write.<br />
</em></p>
<pre><span style="color:#006e28;">#include &lt;stdlib.h&gt;</span>
<span style="color:#006e28;">#include &lt;stdarg.h&gt;</span>
<span style="color:#006e28;">#include &lt;string.h&gt;</span>

<span style="color:#006e28;">#define _write(texto, d) </span>
<span style="color:#141312;">__asm__ (</span><span style="color:#bf0303;">"movl $0x4,%%eax; \</span>
<span style="color:#bf0303;">	  movl $0x1,%%ebx; \</span>
<span style="color:#bf0303;">	  movl %0,%%ecx; \</span>
<span style="color:#bf0303;">	  movl %1,%%edx; \</span>

<span style="color:#bf0303;">	  int $0x80"</span><span style="color:#141312;">: : </span><span style="color:#bf0303;">"g"</span><span style="color:#141312;"> (texto) , </span><span style="color:#bf0303;">"g"</span><span style="color:#141312;"> (d) );</span>

<span style="color:#0057ae;">int</span><span style="color:#141312;"> write(</span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *fmt, ...);</span>

<span style="color:#0057ae;">int</span><span style="color:#141312;"> main(){</span>

<span style="color:#141312;">	</span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *index=malloc(</span><span style="color:#b08000;">2</span><span style="color:#141312;">);</span>
<span style="color:#141312;">	</span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *nome=malloc(</span><span style="color:#b08000;">20</span><span style="color:#141312;">);</span>

<span style="color:#141312;">	strcpy(index,</span><span style="color:#bf0303;">"19"</span><span style="color:#141312;">);</span>
<span style="color:#141312;">	strcpy(nome,</span><span style="color:#bf0303;">"Escovando Bits !!!"</span><span style="color:#141312;">);</span>

<span style="color:#141312;">	write(</span><span style="color:#bf0303;">"blog: %s </span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">index: %s</span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">"</span><span style="color:#141312;">,nome,index);</span>

<span style="color:#141312;">	<strong>return</strong> </span><span style="color:#b08000;">0</span><span style="color:#141312;">;</span>
<span style="color:#141312;">}</span>

<span style="color:#0057ae;">int</span><span style="color:#141312;"> write(</span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *fmt, ...) {</span>

<span style="color:#141312;">	</span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *s;</span>
<span style="color:#141312;">	va_list ap;</span>
<span style="color:#141312;">	</span><span style="color:#0057ae;">register</span><span style="color:#141312;"> </span><span style="color:#0057ae;">int</span><span style="color:#141312;"> d=</span><span style="color:#b08000;">0</span><span style="color:#141312;">,tam;</span>

<span style="color:#141312;">	</span><span style="color:#0057ae;">int</span><span style="color:#141312;"> size;</span>

<span style="color:#141312;">	va_start(ap, fmt );</span>
<span style="color:#141312;">	tam = strlen(fmt);</span>

<span style="color:#141312;">	<strong>for</strong> (d=</span><span style="color:#b08000;">0</span><span style="color:#141312;">; d&lt;tam; d++, *++fmt) {</span>

<span style="color:#141312;">		<strong>if</strong> (*fmt != </span><span style="color:#ff80e0;">'%'</span><span style="color:#141312;"> ) {</span>

<span style="color:#141312;">		_write(fmt,</span><span style="color:#b08000;">1</span><span style="color:#141312;">);</span>
<span style="color:#141312;">		} <strong>else</strong> {</span>

<span style="color:#141312;">			<strong>switch</strong> (*++fmt) {</span>
<span style="color:#141312;">			<strong>case</strong> </span><span style="color:#ff80e0;">'s'</span><span style="color:#141312;">: {</span>
<span style="color:#141312;">				s = va_arg(ap, </span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *);</span>

<span style="color:#141312;">				size = strlen(s);</span>
<span style="color:#141312;">				_write(s,size);</span>
<span style="color:#141312;">			<strong>break</strong>;</span>
<span style="color:#141312;">			} </span><span style="color:#888786;"><em>// fim case</em></span>
<span style="color:#141312;">			} </span><span style="color:#888786;"><em>// fim switch</em></span>

<span style="color:#141312;">		} </span><span style="color:#888786;"><em>// fim else</em></span>
<span style="color:#141312;">	} </span><span style="color:#888786;"><em>// fim for</em></span>

<span style="color:#141312;">	va_end(ap);</span>
<span style="color:#141312;">	<strong>return</strong>(</span><span style="color:#b08000;">1</span><span style="color:#141312;">);</span>
<span style="color:#141312;">}</span></pre>
<p style="text-align:justify;">Se analisarmos o código-fonte da glibc veremos que sua implementação é completamente diferente da proposta nesse <em>post</em>, por questões de portabilidade de <em>hardware</em>, segurança, elegância, desempenho, etc;  Um <a href="http://www.gnu.org/software/libtool/manual/libc/Printf-Extension-Example.html#Printf-Extension-Example" target="_blank">exemplo</a> é a possiblidade de criar extensões para a função printf.</p>
<p style="text-align:justify;">Bom, essa foi a primeira entrada do ano aqui no <a href="http://escovandobits.wordpress.com" target="_blank">EscovandoBits</a>,  mais novidades para os próximos dias, com a cobertura do Mauro sobre a Campus Party que acontece do dia 19 a 25 de Janeiro.</p>
<p style="text-align:justify;">
Posted in programação Tagged: c, glibc, kernel, Linux, syscalls <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/253/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=253&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2009/01/21/exemplos-do-uso-syscalls-x86-do-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
		<item>
		<title>Convertendo o horário do &#8216;Portal Acadêmico&#8217; da UNIFEI para o Google Calendar</title>
		<link>http://escovandobits.wordpress.com/2008/08/05/convertendo-o-horario-do-portal-academico-da-unifei-para-o-google-calendar/</link>
		<comments>http://escovandobits.wordpress.com/2008/08/05/convertendo-o-horario-do-portal-academico-da-unifei-para-o-google-calendar/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 05:59:49 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[unifei]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=128</guid>
		<description><![CDATA[Na Universidade Federal de Itajubá os alunos de graduação e pós-graduação acessam o regristro acadêmico através do Portal Acadêmico. Dentre as opções, há como acessar o horário em curso. Este post apresenta um pequeno script para converter o horário apresentado na página do Portal Acadêmico no formato utilizado pelo Google Calendar
DOWNLOAD
.Update: A opção de importar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=128&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Na <a title="Site da Universidade Federal de Itajubá." href="http://www.unifei.edu.br" target="_blank">Universidade Federal de Itajubá</a> os alunos de <a title="Site da pró-reitoria de graduaçao da UNIFEI." href="http://www.prg.unifei.edu.br" target="_blank">graduação</a> e <a title="Sita da Pró-Reitoria de Pesquisa e Pós-Graduação da UNIFEI" href="http://www.prppg.unifei.edu.br/" target="_blank">pós-graduação</a> acessam o regristro acadêmico através do <a title="Portal Acadêmico" href="http://www.portalacademico.unifei.edu.b" target="_blank">Portal Acadêmico</a>. Dentre as opções, há como acessar o horário em curso. Este <em>post</em> apresenta um pequeno <em>script</em> para converter o horário apresentado na página do Portal Acadêmico no formato utilizado pelo <a title="Google Calendar" href="http://www.google.com/calendar" target="_blank">Google Calendar</a></p>
<p style="text-align:center;"><strong><a title="Download do Programa para Converter o Horário da UNIFEi (formato tar.gz)" href="http://br.geocities.com/maluta_tiago/blog/escovandobits/pycalendar/horario.tar.gz" target="_blank">DOWNLOAD</a></strong></p>
<p style="text-align:justify;"><span style="color:#ff0000;">.<strong>Update</strong>: A opção de importar do Google Calendar não está disponível já alguns dias, portanto não puder fazer mais testes, embora na última versão do código não tenha tido problemas. Se alguém conseguir, por favor, comente.</span></p>
<p><span id="more-128"></span></p>
<p><strong>Observação</strong></p>
<p style="text-align:justify;">Eu fiz e testei esse programa em uma distribuição GNU/Linux (Ubuntu 8.04.1). Acredito que os usuários do Microsoft Windows não terão problemas em executá-lo, contudo problemas podem acontecer. Se houver algum reportem nos comentários ou por email (dentro do código-fonte há meu endereço).</p>
<p><strong>Instalação</strong></p>
<p style="text-align:justify;">O programa utiliza a linguagem Python na sua versão 2.5. Além disso é preciso instalar alguns pacotes adicionais, se você estiver em alguma distribuição baseada no <a title="Distribuições baseadas no Debian" href="http://www.debian.org/misc/children-distros" target="_blank">Debian</a>, utilize:</p>
<p style="padding-left:30px;"># sudo apt-get install python2.5</p>
<p style="padding-left:30px;"># sudo apt-get install python-html5lib</p>
<p style="padding-left:30px;"># sudo apt-get install python-optcomplete</p>
<p style="text-align:justify;">Faça o download do programa. Para ver as opções utilize o parametro -h.</p>
<p style="padding-left:30px;"># python pycalendar.py -h</p>
<p style="padding-left:30px;">
<pre style="padding-left:30px;">Usage: pycalendar [options] FILE</pre>
<pre style="padding-left:60px;">Converts UNIFEI's grade from 'Portal Academico' to Google Calendar (iCal) or a
simple HTML table.</pre>
<pre style="padding-left:30px;">Options:
  --version   show program's version number and exit
  -h, --help  show this help message and exit
  -t, --html  Convert to a simple tabeled HTML file
  -i, --ical  Convert to iCal (Google Calendar format)
<span style="color:#ffffff;">.</span></pre>
<p>Como o Portal Academico possui um mecanismo de usuário/senha + <a title="About CAPTCHA mecanism" href="http://en.wikipedia.org/wiki/CAPTCHA" target="_blank">CAPTCHA</a> portanto é preciso logar no site através do navegador.</p>
<p><a href="http://escovandobits.files.wordpress.com/2008/08/snapshot1.png"><img class="aligncenter size-medium wp-image-133" src="http://escovandobits.files.wordpress.com/2008/08/snapshot1.png?w=300&#038;h=291" alt="" width="300" height="291" /></a></p>
<p style="text-align:justify;">Após o <em>login</em>, acesse o <strong>MENU -&gt; Registro Acadêmico GRADUAÇÃO -&gt; Matrícula: Verificação/Confirmação</strong>.  Com a grade de horário aparencendo na tela, vá na opção <em>File </em>ou Arquivo no <a title="Get Firefox" href="http://www.getfirefox.com" target="_blank">Firefox</a> e escolha a opção <em>Save Page As&#8230;</em> (Salvar Página Como&#8230;).</p>
<p style="text-align:justify;">
<div class="wp-caption aligncenter" style="width: 206px"><a href="http://escovandobits.files.wordpress.com/2008/08/snapshot2.png"><img class="size-medium wp-image-135" src="http://escovandobits.files.wordpress.com/2008/08/snapshot2.png?w=196&#038;h=300" alt="Salvando a página" width="196" height="300" /></a></dt>
</dl>
</div>
<p>Escolha um nome qualquer (se quiser deixe o padrão index.php.html).</p>
<p><strong>Pronto! </strong></p>
<p>Agora é só executar o programa:</p>
<p>Para gerar uma tabela no formato HTML, a saida será o arquivo chamado: &#8220;<strong>horario.html</strong>&#8220;:</p>
<p style="padding-left:30px;"># python pycalendar.py -t index.php.html</p>
<p>Para gerar uma tabela no formato do Google Calendar, a saida será o arquivo chamado &#8220;<strong>horario.ical&#8221;</strong>:</p>
<p style="padding-left:30px;"># python pycalendar.py -i index.php.html</p>
<p><strong>Google Calendar</strong></p>
<div class="mceTemp mceIEcenter">
<dl class="wp-caption aligncenter">
<dt class="wp-caption-dt"><a href="http://escovandobits.files.wordpress.com/2008/08/snapshot4.png"><img class="size-medium wp-image-136" src="http://escovandobits.files.wordpress.com/2008/08/snapshot4.png?w=243&#038;h=142" alt="Criando uma nova agenda" width="243" height="142" /></a><p class="wp-caption-text">Criando uma nova agenda</p></div>
<p>Preenchar os campos necessários, colocando o <span style="text-decoration:underline;">país</span> e <span style="text-decoration:underline;">fuso horário</span> da agenda:</p>
<div id="attachment_137" class="wp-caption aligncenter" style="width: 310px"><a href="http://escovandobits.files.wordpress.com/2008/08/snapshot3.png"><img class="size-medium wp-image-137" src="http://escovandobits.files.wordpress.com/2008/08/snapshot3.png?w=300&#038;h=237" alt="Preenchendo os dados da nova agenda" width="300" height="237" /></a><p class="wp-caption-text">Preenchendo os dados da nova agenda</p></div>
<p style="text-align:justify;">Nas mesmas opções que você selecionou para criar uma nova agenda, marque agora a opção <strong>Importar Agenda</strong>, na Etapa1 selecione o arquivo <strong>horario.ical</strong>, na Etapa 2 escolha o horário na nova agenda e clique em &#8220;Importar&#8221;.</p>
<div id="attachment_139" class="wp-caption aligncenter" style="width: 310px"><a href="http://escovandobits.files.wordpress.com/2008/08/snapshot5.png"><img class="size-medium wp-image-139" src="http://escovandobits.files.wordpress.com/2008/08/snapshot5.png?w=300&#038;h=113" alt="Importando os dados do pycalendar" width="300" height="113" /></a><p class="wp-caption-text">Importando os dados do pycalendar</p></div>
<p>Agora é só aproveitar o seu horário no Google Calendar <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/escovandobits.wordpress.com/128/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/escovandobits.wordpress.com/128/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/128/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=128&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2008/08/05/convertendo-o-horario-do-portal-academico-da-unifei-para-o-google-calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>

		<media:content url="http://escovandobits.files.wordpress.com/2008/08/snapshot1.png?w=300" medium="image" />

		<media:content url="http://escovandobits.files.wordpress.com/2008/08/snapshot2.png?w=196" medium="image">
			<media:title type="html">Salvando a página</media:title>
		</media:content>

		<media:content url="http://escovandobits.files.wordpress.com/2008/08/snapshot4.png?w=243" medium="image">
			<media:title type="html">Criando uma nova agenda</media:title>
		</media:content>

		<media:content url="http://escovandobits.files.wordpress.com/2008/08/snapshot3.png?w=300" medium="image">
			<media:title type="html">Preenchendo os dados da nova agenda</media:title>
		</media:content>

		<media:content url="http://escovandobits.files.wordpress.com/2008/08/snapshot5.png?w=300" medium="image">
			<media:title type="html">Importando os dados do pycalendar</media:title>
		</media:content>
	</item>
		<item>
		<title>Dicas para economia da bateria em notebooks</title>
		<link>http://escovandobits.wordpress.com/2008/05/04/dicas-para-economia-da-bateria-em-notebooks/</link>
		<comments>http://escovandobits.wordpress.com/2008/05/04/dicas-para-economia-da-bateria-em-notebooks/#comments</comments>
		<pubDate>Sun, 04 May 2008 00:27:19 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[bateria]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[notebook]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=67</guid>
		<description><![CDATA[Conheço casos de amigos com notebooks novos, que depois de pouco tempo de uso (aprox. 1 ano) precisaram efetuar a troca da bateria pois esta não segurava mais carga alguma, dava uma autonomia de cerca de 15 minutos. Portanto recomendo duas medidas de prevenção.

Quando utilizar o computador ligado a rede elétrica, retire a bateria  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=67&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Conheço casos de amigos com <em>notebooks</em> novos, que depois de pouco tempo de uso (aprox. 1 ano) precisaram efetuar a troca da bateria pois esta não segurava mais carga alguma, dava uma autonomia de cerca de 15 minutos. Portanto recomendo duas medidas de prevenção.</p>
<ol>
<li>Quando utilizar o computador ligado a rede elétrica, retire a bateria  do notebook.</li>
<li>Pelo menos uma vez no mês, utilize a bateria até o fim e deixe uma  noite inteira carregando.</li>
</ol>
<p>Você tem alguma dica? Sugira aqui nos comentários.</p>
<p><span id="more-67"></span></p>
<p>Você pode monitorar seu sistema GNU/Linux obtendo as informações contidas na pasta <strong>/proc</strong>, um exemplo seria:<strong><br />
</strong></p>
<p style="padding-left:30px;"># cat /proc/acpi/battery/BAT1/info</p>
<p style="padding-left:30px;">present:			yes<strong><br />
design capacity:		4000 mAh<br />
last full capacity:		<span style="color:#ff0000;">3719 mAh</span></strong><br />
battery technology:		rechargeable<br />
design voltage:			11100 mV<br />
design capacity warning:	300 mAh<br />
design capacity low:		148 mAh<br />
capacity granularity 1:		32 mAh<br />
capacity granularity 2:		32 mAh<br />
model number:			Chapala<br />
serial number:			18850<br />
battery type:			LION<br />
OEM info:			SANYO</p>
<p style="text-align:justify;">Um outro fator interessante é a capacidade de carga da bateria com o passar do tempo, de acordo com um amigo, quando comprou seu <em>notebook</em>, o last full capacity era de <span style="color:#ff0000;"><strong>3908 mAh</strong></span>. Estou fazendo os testes em um notebook LG R400. Para tal, resolvi fazer um pequeno programa em python para verificar a capacidade da bateria, é um programa simples que pega as informações da /proc referente a bateria e salva em um arquivo junto com o tempo atual do sistema. Agendando a execução com o <em>cron</em> pode-se após algum tempo obter um histórico dessa diminuição.</p>
<h2 style="text-align:center;"><a title="Script Battery Analisys" href="http://www.box.net/shared/6qoih5k0gc" target="_blank">download aqui</a></h2>
<p><span style="color:#ffffff;">..</span></p>
<p>A utilização é bem simples, executar sem nenhum parâmetro mostra a diferença entre a capacidade projetada e a última capacidade máxima. As outras opções são:</p>
<pre style="padding-left:30px;">
Usage: battery_analysis [options]</pre>
<pre style="padding-left:30px;">Veritfy the last full capacity of your battery</pre>
<pre style="padding-left:30px;">Options:
    --version     show program's version number and exit
    -h, --help    show this help message and exit
    -a, --all     show all contents of /proc/acpi/battery/&lt;&gt;/info
    -c, --colors  add colors in delta values</pre>
<p style="text-align:justify;padding-left:30px;">
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/escovandobits.wordpress.com/67/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/escovandobits.wordpress.com/67/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/67/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=67&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2008/05/04/dicas-para-economia-da-bateria-em-notebooks/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
		<item>
		<title>Firefox is already running [...]  e meu primeiro Shell Script!</title>
		<link>http://escovandobits.wordpress.com/2008/04/12/firefox-is-already-running-e-meu-primeiro-shell-script/</link>
		<comments>http://escovandobits.wordpress.com/2008/04/12/firefox-is-already-running-e-meu-primeiro-shell-script/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 16:47:59 +0000</pubDate>
		<dc:creator>Mauro Rodrigues</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[shell script]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[firefox is already running]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=61</guid>
		<description><![CDATA[Muitos usuários de sistemas que precisam logar em um servidor para obterem acesso ao localhost e a seus recursos/pastas pessoais provavelmente já se depararam, com a seguinte mensagem ao abrir o Firefox:


Firefox is already running, but is not responding [...]
(Firefox já está funcionando, mas não está respondendo [...])


Ai você pensa: &#8220;Firefox rodando? De forma alguma, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=61&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Muitos usuários de sistemas que precisam logar em um servidor para obterem acesso ao <em>localhost</em> e a seus recursos/pastas pessoais provavelmente já se depararam, com a seguinte mensagem ao abrir o Firefox:</p>
<p style="text-align:center;"><img class="aligncenter size-medium wp-image-62" src="http://escovandobits.files.wordpress.com/2008/04/firefox_already_running.jpg?w=400" alt="firefox_already_running" /></p>
<blockquote>
<h5 style="text-align:center;">Firefox is already running, but is not responding [...]</h5>
<h5 style="text-align:center;">(Firefox já está funcionando, mas não está respondendo [...])</h5>
</blockquote>
<p style="text-align:justify;">
<p style="text-align:justify;">Ai você pensa: &#8220;Firefox rodando? De forma alguma, acabei de me logar!&#8221;</p>
<p style="text-align:justify;">Pois é, quando se é apenas usuário basta chamar alguém para resolver. Mas agora eu estou do lado da administração da rede, e tenho que solucionar esse tipo de imprevisto para os usuários frequentemente. E diga-se de passagem: Ô coisa chata de ser feita viu&#8230;</p>
<p style="text-align:justify;">Bom juntando a necessidade de aprender Shell Script com a situação criei um script para corrigir esse problema do firefox, meu primeiro Script!!! Então leia mais!</p>
<p style="text-align:justify;"><span id="more-61"></span></p>
<p style="text-align:justify;">Geralmente esse problema acontece quando usuários de sistemas que utilizam login em servidores, para disponibilizar as pastas pessoais via <a title="NFS" href="http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/custom-guide/ch-nfs.html" target="_blank">NFS</a>, terminam abruptamente uma seção, devido a uma queda de energia ou <em>reset</em>, finalizando o Firefox de forma inesperada. Pode acontecer também do seu profile ter sido apagado, ou as permissões de acesso setadas equivocadamente; Nesses dois casos certifique-se se sua pasta profile ainda está no local correto e se está com permissões adequadas</p>
<p style="text-align:justify;">Bom para resolver a situação basta remover um arquivo (oculto) do seu <em>profile</em>, chama-se <em>parentlock</em> o dito cujo! Ele serve para dizer que o profile já está em uso, evitando assim que haja uma inconsistência de dados caso o profile esteja sendo usado em modo compartilhado.</p>
<p style="text-align:justify;">A Solução é simples, mas vai dizer para o usuário que ele precisa deletar o arquivo oculto, dentro da pasta oculta mozilla, dentro da <em>home</em> dele&#8230; Só se vê aquelas caras de: &#8220;Hein?! o.Ô&#8221;.</p>
<p style="text-align:justify;">Então resolvi criar o script! Ele faz a remoção desse arquivo e em seguida abre o Firefox sem maiores problemas! O maior desafio nisso estava em chegar até a pasta do profile, pois ela possui nomes aleatórios seguindo o padrão:</p>
<p style="text-align:justify;"><em>XXXXXXXX.default</em> [onde X pode ser qualquer letra, maiúscula ou minúscula, ou número].</p>
<p style="text-align:justify;">Na hora pensei: Expressões regulares! Pois existe um arquivo em <em>~/.mozilla/firefox/ </em>chamado <em>profiles.ini </em>que contém o nome da pasta que guarda o perfil do usuário. Mas pra quem ainda é iniciante, fica complicado&#8230; Não desisti!! Criei tempo, não sei da onde, e li boa parte de um livro de Shell! Aprendi o básico do uso de expressões regulares usando o sed e ed. O resultado você pode baixar clicando aqui: <a title="Ressucita Firefox!" href="http://www.box.net/shared/f5toiim1w0" target="_blank">ressucita_firefox.sh</a></p>
<p style="text-align:justify;">O arquivo está comentado, mas não custa deixar registrado aqui também:</p>
<p style="text-align:justify;"><em><span style="color:#ff00ff;">sed</span> <span style="color:#ff6600;">&#8216;<span style="color:#ff0000;">/Path=/!d&#8217; </span></span><strong><span style="color:#000000;">~/.mozilla/firefox/profiles.ini &gt;temp1</span></strong></em></p>
<p style="text-align:justify;">A expressão acima deleta (d) todas as linhas que não contenham <em>&#8216;Path=&#8217; </em>do arquivo <em>profiles.ini</em> e salva o que sobrar em temp1. Note que o uso da expressão não escreve no arquivo <em>profiles.ini</em>, portanto não se preocupe em fazer um <em>backup</em> prévio dele.</p>
<p style="text-align:justify;"><em><span style="color:#ff00ff;">sed</span> <span style="color:#ff0000;">&#8217;s/Path=//&#8217;</span> <strong>temp1 &gt; temp2</strong></em></p>
<p style="text-align:justify;">A seguir, a expressão substitui (s) a primeira ocorrência de <em>&#8216;Path=&#8217;</em>, em temp1, por nada (//), salvando em temp2, onde teremos apenas o nome da pasta profile! Note também que fiz uso de 2 arquivos temporários (temp1 e temp2) pois uma propriedade do shell é que ao se direcionar o fluxo de dados para um arquivo, este será criado ou destruído, impedindo portanto coisas como:</p>
<p style="text-align:justify;"><em><span style="color:#ff00ff;">sed</span> <span style="color:#ff0000;">&#8217;s/Path=//&#8217;</span> <strong>temp1 &gt; temp1</strong></em></p>
<p style="text-align:justify;">Finalmente a remoção:</p>
<p style="text-align:justify;"><em><span style="color:#ff00ff;">rm</span> <strong>~/.mozilla/firefox/</strong>`<span style="color:#ff00ff;">cat</span> <strong>temp2`/.parentlock</strong></em></p>
<p style="text-align:justify;">Repare que utilizei `<span style="color:#ff00ff;">cat</span> temp2` no meio do arquivo afim de obter o endereço da pasta profile. Os acentos agudos, utilizados como apóstrofos, são imprescindíveis para o bom funcionamento pois indicam que a expressão dentro deles deve ser resolvida antes da expressão em geral (no caso rm). Assim temos na verdade a linha a seguir sendo utilizada:</p>
<p style="text-align:justify;"><em><span style="color:#ff00ff;">rm</span> <strong>~/.mozilla/firefox/XXXXXXXX.default/.parentlock</strong></em></p>
<p style="text-align:justify;">E a remoção dos arquivos temporários criados:</p>
<p style="text-align:justify;"><em><span style="color:#ff00ff;">rm</span> <strong>temp1 temp2</strong></em></p>
<p style="text-align:justify;">Uma mensagem opcional:</p>
<p style="text-align:justify;"><em><span style="color:#800080;">echo</span> <strong>&#8220;O Firefox sera iniciado em 3 segundos&#8230;&#8221;</strong></em></p>
<p style="text-align:justify;">E a execução do Firefox:</p>
<p style="text-align:justify;"><em><span style="color:#800080;">exec</span> <strong>firefox</strong></em></p>
<p style="text-align:justify;">É simples, eu sei, mas muito útil, e poupa tempo! Agora basta disponibilizá-lo com um ícone do Firefox e pronto, o usuário nem notará a diferença! Não se esqueça de permitir a execução utilizando o chmod!</p>
<p style="text-align:justify;">Fico por aqui, e aguardo qualquer tipo de sugestão de melhorias! Abraços!</p>
<p style="text-align:justify;">
<p style="text-align:justify;">
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/escovandobits.wordpress.com/61/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/escovandobits.wordpress.com/61/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/61/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=61&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2008/04/12/firefox-is-already-running-e-meu-primeiro-shell-script/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a25d3fe89c0b28671ec6b0a9d7324102?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mauro Rodrigues</media:title>
		</media:content>

		<media:content url="http://escovandobits.files.wordpress.com/2008/04/firefox_already_running.jpg?w=400" medium="image">
			<media:title type="html">firefox_already_running</media:title>
		</media:content>
	</item>
		<item>
		<title>Análise de performance da linguagem Python em plataformas x86 e ARM</title>
		<link>http://escovandobits.wordpress.com/2008/04/09/analise-de-performance-da-linguagem-python-em-plataformas-x86-e-arm/</link>
		<comments>http://escovandobits.wordpress.com/2008/04/09/analise-de-performance-da-linguagem-python-em-plataformas-x86-e-arm/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 22:53:35 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[bubble sort]]></category>
		<category><![CDATA[E62]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[quick sort]]></category>
		<category><![CDATA[x86]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=57</guid>
		<description><![CDATA[Este post apresenta um artigo, feito para a disciplina de Análise de Algoritmos, onde comparei a performance, utilizando a linguagem Python, de dois algoritmos de ordenação (bubble sort e quick sort) em duas plataformas, em outras palavras, no meu computador Intel Pentium 4 (x86) e no meu smartphone Nokia E62 (ARM). O texto traz os [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=57&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Este <em>post</em> apresenta um artigo, feito para a disciplina de Análise de Algoritmos, onde comparei a performance, utilizando a linguagem Python, de dois algoritmos de ordenação (<em>bubble sort</em> e <em>quick sort</em>) em duas plataformas, em outras palavras, no meu computador Intel Pentium 4 (x86) e no meu smartphone Nokia E62 (ARM). O texto traz os tempos gastos para ordenar vetores preenchidos com números aleatórios, de diferentes tamanhos. Tudo isso com a vantagem de poder utilizar o mesmo código-fonte (sem alteração alguma) para fazer os testes nos dois. É claro que perdi em performance não usando C ou C++, mas ganhei em portabilidade para pode fazer rapidamente esse teste. Se interessou, faça do download do pdf <a href="http://escovandobits.files.wordpress.com/2008/04/arm_vs_x86.pdf">arm_vs_x86.pdf</a></p>
<p style="text-align:justify;">Se você tem interesse em rodar o Python no seu <em>smartphone </em>(em especial os da Série 60 da Nokia) acesse:  <a title="Python S60" href="http://wiki.opensource.nokia.com/projects/PyS60" target="_blank">http://wiki.opensource.nokia.com/projects/PyS60</a></p>
<p style="text-align:justify;">
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/escovandobits.wordpress.com/57/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/escovandobits.wordpress.com/57/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/57/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=57&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2008/04/09/analise-de-performance-da-linguagem-python-em-plataformas-x86-e-arm/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
	</channel>
</rss>