<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3558612853123884447</id><updated>2012-02-16T10:35:06.048-02:00</updated><category term='jquery'/><category term='legibilidade'/><category term='rgb'/><category term='plone'/><category term='texto'/><category term='javascript'/><category term='sql'/><category term='js'/><category term='shell'/><category term='python'/><category term='vga'/><category term='html'/><category term='cores'/><category term='hexadecimal'/><category term='software livre'/><category term='conversão'/><category term='code-completion'/><category term='shellscript'/><category term='odt'/><category term='mpis'/><category term='assembly'/><category term='modelagem'/><category term='pdf'/><category term='jws'/><title type='text'>Open Source Coders</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://opensourcecoders.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://opensourcecoders.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ThOR27</name><uri>http://www.blogger.com/profile/06741326148112620321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://www.thor27.blogger.com.br/avatar.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3558612853123884447.post-1030054360266742988</id><published>2011-05-13T14:28:00.005-03:00</published><updated>2011-05-13T14:42:21.405-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jws'/><title type='text'>JWS - Just Wanna Say</title><content type='html'>&lt;div&gt;Acho que todo mundo trabalha ou já trabalhou com aquele colega que passa o dia inteiro ouvindo música pesada num fone de ouvido que o isola completamente do mundo exterior. Diversas técnicas já foram criadas para chamar a atenção desses colegas,  como por exemplo tentar falar muito alto, gesticular freneticamente ou tentar atingi-los com objetos diversos. Entre nós há alguns colegas assim, e também há o colega criativo que gosta de inventar maneiras inusitadas de resolver problemas. E foi nesse contexto que surgiu o &lt;b&gt;jws&lt;/b&gt;, um programinha que lê coisas usando o serviço do Google Translate.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Inicialmente utilizado para sacanear nosso colega do fone de ouvido, o &lt;b&gt;jws&lt;/b&gt; foi evoluindo até se tornar indispensável, com mil-e-uma utilidades e aplicações. Se você tem acesso ao Google Translate, um interpretador Python e por algum motivo precisa que um programa leia coisas, então o &lt;b&gt;jws&lt;/b&gt; é ideal para você.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;É sabido que o &lt;b&gt;jws&lt;/b&gt; funciona bem em nossos sistemas Linux, mas ele deverá rodar tranquilamente em Windows ou Mac. E se por acaso ele não achar um jeito de tocar o áudio em seu sistema, é possível adicionar novos métodos de saída com bastante facilidade.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O &lt;b&gt;jws&lt;/b&gt; é simples e fácil de usar. Experimente, por exemplo, o seguinte:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new'; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;span class="Apple-style-span" style="font-family: 'courier new'; "&gt;$ jws Olá, mundo.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mas também há opções mais avançadas, que permitem escolher o idioma da entrada&lt;/div&gt;&lt;div&gt;e o backend de saída. Para ler um texto em inglês, com o mplayer, por exemplo,&lt;/div&gt;&lt;div&gt;podemos usar o seguinte comando:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;code&gt;$ jws --language=en --backend=external --backend-options=mplayer "Hello world! I'm a fancy little lovely text-to-speech program."&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O código está disponível &lt;a href="https://bitbucket.org/opensourcecoders/jws"&gt;num repositório no bitbucket&lt;/a&gt;, mas você pode baixar um pacote diretamente &lt;a href="https://bitbucket.org/opensourcecoders/jws/get/tip.tar.bz2"&gt;aqui&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3558612853123884447-1030054360266742988?l=opensourcecoders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcecoders.blogspot.com/feeds/1030054360266742988/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://opensourcecoders.blogspot.com/2011/05/jws-just-wanna-say.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/1030054360266742988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/1030054360266742988'/><link rel='alternate' type='text/html' href='http://opensourcecoders.blogspot.com/2011/05/jws-just-wanna-say.html' title='JWS - Just Wanna Say'/><author><name>Dirley Rodrigues</name><uri>https://profiles.google.com/114344350124821677654</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-u4TIxkgCe80/AAAAAAAAAAI/AAAAAAAAAAA/3zD4AZAfB2Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3558612853123884447.post-948981557819872658</id><published>2011-01-21T10:26:00.002-02:00</published><updated>2011-01-21T10:32:08.261-02:00</updated><title type='text'>jQuery Google charts</title><content type='html'>Pra quem precisa criar gráficos (charts) no seu site, fica a dica...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://maxb.net/scripts/jgcharts/include/demo/"&gt;http://maxb.net/scripts/jgcharts/include/demo/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Biblioteca em jQuery que usa o Google Charts para criação de gráficos.&lt;br /&gt;Pode-se criar gráficos tanto em barra quanto em linha, pizza, pizza 3D.&lt;br /&gt;E inclusive gerar gráficos apartir de table html.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Exemplo1:&lt;br /&gt;&lt;b&gt;Basic Bar&lt;/b&gt;&lt;br /&gt;&lt;div class="code javascript"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="js__sl_comment"&gt;//1&amp;nbsp;)&amp;nbsp;api&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="js__statement"&gt;var&lt;/span&gt;&amp;nbsp;api&amp;nbsp;=&amp;nbsp;&lt;span class="js__operator"&gt;new&lt;/span&gt;&amp;nbsp;jGCharts.Api();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="js__sl_comment"&gt;//2)&amp;nbsp;options&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="js__statement"&gt;var&lt;/span&gt;&amp;nbsp;opt&amp;nbsp;=&amp;nbsp;&lt;span class="js__brace"&gt;{&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;:&amp;nbsp;[[&lt;span class="js__num"&gt;153&lt;/span&gt;,&amp;nbsp;&lt;span class="js__num"&gt;60&lt;/span&gt;,&amp;nbsp;&lt;span class="js__num"&gt;52&lt;/span&gt;],&amp;nbsp;[&lt;span class="js__num"&gt;113&lt;/span&gt;,&amp;nbsp;&lt;span class="js__num"&gt;70&lt;/span&gt;,&amp;nbsp;&lt;span class="js__num"&gt;60&lt;/span&gt;],&amp;nbsp;[&lt;span class="js__num"&gt;120&lt;/span&gt;,&amp;nbsp;&lt;span class="js__num"&gt;80&lt;/span&gt;,&amp;nbsp;&lt;span class="js__num"&gt;40&lt;/span&gt;]]&lt;span class="js__sl_comment"&gt;//mandatory&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="js__brace"&gt;}&lt;/span&gt;;&lt;span class="js__sl_comment"&gt;//set&amp;nbsp;options&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="js__sl_comment"&gt;//3)&amp;nbsp;append&amp;nbsp;Img&amp;nbsp;(with&amp;nbsp;jQuery)&lt;/span&gt;&amp;nbsp;&lt;br /&gt;jQuery(&lt;span class="js__string"&gt;'&amp;lt;img&amp;gt;'&lt;/span&gt;)&amp;nbsp;&lt;br /&gt;.attr(&lt;span class="js__string"&gt;'src'&lt;/span&gt;,&amp;nbsp;api.make(opt))&lt;span class="js__sl_comment"&gt;//options&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;.appendTo(&lt;span class="js__string"&gt;"#bar1"&lt;/span&gt;);&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://chart.apis.google.com/chart?cht=bvg&amp;amp;chs=300x200&amp;amp;chbh=20,1&amp;amp;chxt=x,y&amp;amp;chd=s:9tw,Ycg,VYQ&amp;amp;chds=0,153&amp;amp;chxr=0,0,153%7C1,0,153&amp;amp;chxl=0:%7C0%7C1%7C2&amp;amp;chf=&amp;amp;chco=5131C9,FFCC00,DA1B1B&amp;amp;agent=jgcharts" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://chart.apis.google.com/chart?cht=bvg&amp;amp;chs=300x200&amp;amp;chbh=20,1&amp;amp;chxt=x,y&amp;amp;chd=s:9tw,Ycg,VYQ&amp;amp;chds=0,153&amp;amp;chxr=0,0,153%7C1,0,153&amp;amp;chxl=0:%7C0%7C1%7C2&amp;amp;chf=&amp;amp;chco=5131C9,FFCC00,DA1B1B&amp;amp;agent=jgcharts" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;Exemplo2:&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;/table&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Anno&lt;/th&gt;                 &lt;th class="serie"&gt;Data 1&lt;/th&gt;                 &lt;th class="serie"&gt;Data 2&lt;/th&gt;                 &lt;th class="serie"&gt;Data 3&lt;/th&gt;             &lt;/tr&gt;&lt;/thead&gt;           &lt;tbody&gt;&lt;tr&gt;                 &lt;th class="serie"&gt;2001&lt;/th&gt;                 &lt;td&gt;153&lt;/td&gt;                 &lt;td&gt;60&lt;/td&gt;                 &lt;td&gt;52&lt;/td&gt;             &lt;/tr&gt;&lt;tr&gt;                 &lt;th class="serie"&gt;2002&lt;/th&gt;                 &lt;td&gt;113&lt;/td&gt;                 &lt;td&gt;70&lt;/td&gt;                 &lt;td&gt;60&lt;/td&gt;             &lt;/tr&gt;&lt;tr&gt;                 &lt;th class="serie"&gt;2003&lt;/th&gt;                 &lt;td&gt;120&lt;/td&gt;                 &lt;td&gt;80&lt;/td&gt;                 &lt;td&gt;40&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;             &lt;/tr&gt;&lt;/tbody&gt;         &lt;/table&gt;&lt;div class="code javascript"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://chart.apis.google.com/chart?cht=bvg&amp;amp;chs=300x200&amp;amp;chbh=20,1&amp;amp;chxt=x,y&amp;amp;chdl=Data%201%7CData%202%7CData%203&amp;amp;chd=s:9tw,Ycg,VYQ&amp;amp;chds=0,153&amp;amp;chxr=0,0,153%7C1,0,153&amp;amp;chxl=0:%7C2001%7C2002%7C2003&amp;amp;chf=&amp;amp;chco=5131C9,FFCC00,DA1B1B&amp;amp;agent=jgcharts" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://chart.apis.google.com/chart?cht=bvg&amp;amp;chs=300x200&amp;amp;chbh=20,1&amp;amp;chxt=x,y&amp;amp;chdl=Data%201%7CData%202%7CData%203&amp;amp;chd=s:9tw,Ycg,VYQ&amp;amp;chds=0,153&amp;amp;chxr=0,0,153%7C1,0,153&amp;amp;chxl=0:%7C2001%7C2002%7C2003&amp;amp;chf=&amp;amp;chco=5131C9,FFCC00,DA1B1B&amp;amp;agent=jgcharts" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;jQuery(&lt;span class="js__string"&gt;".jgtable"&lt;/span&gt;).jgtable();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="code html"&gt;&lt;pre&gt;&lt;code class="html"&gt;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;div&lt;/span&gt;&amp;nbsp;&lt;span class="html__attr_name"&gt;class&lt;/span&gt;=&lt;span class="html__attr_value"&gt;"jgtable"&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;table&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;thead&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;tr&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;th&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;Anno&lt;span class="html__tag_end"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;th&lt;/span&gt;&amp;nbsp;&lt;span class="html__attr_name"&gt;class&lt;/span&gt;=&lt;span class="html__attr_value"&gt;"serie"&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;Data&amp;nbsp;1&lt;span class="html__tag_end"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;th&lt;/span&gt;&amp;nbsp;&lt;span class="html__attr_name"&gt;class&lt;/span&gt;=&lt;span class="html__attr_value"&gt;"serie"&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;Data&amp;nbsp;2&lt;span class="html__tag_end"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;th&lt;/span&gt;&amp;nbsp;&lt;span class="html__attr_name"&gt;class&lt;/span&gt;=&lt;span class="html__attr_value"&gt;"serie"&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;Data&amp;nbsp;3&lt;span class="html__tag_end"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_end"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_end"&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;tbody&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;tr&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;th&lt;/span&gt;&amp;nbsp;&lt;span class="html__attr_name"&gt;class&lt;/span&gt;=&lt;span class="html__attr_value"&gt;"serie"&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;2001&lt;span class="html__tag_end"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;td&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;153&lt;span class="html__tag_end"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;td&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;60&lt;span class="html__tag_end"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;td&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;52&lt;span class="html__tag_end"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_end"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;tr&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;th&lt;/span&gt;&amp;nbsp;&lt;span class="html__attr_name"&gt;class&lt;/span&gt;=&lt;span class="html__attr_value"&gt;"serie"&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;2002&lt;span class="html__tag_end"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;td&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;113&lt;span class="html__tag_end"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;td&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;70&lt;span class="html__tag_end"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;td&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;60&lt;span class="html__tag_end"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_end"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;tr&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;th&lt;/span&gt;&amp;nbsp;&lt;span class="html__attr_name"&gt;class&lt;/span&gt;=&lt;span class="html__attr_value"&gt;"serie"&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;2003&lt;span class="html__tag_end"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;td&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;120&lt;span class="html__tag_end"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;td&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;80&lt;span class="html__tag_end"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_start"&gt;&amp;lt;td&lt;/span&gt;&lt;span class="html__tag_start"&gt;&amp;gt;&lt;/span&gt;40&lt;span class="html__tag_end"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_end"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_end"&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="html__tag_end"&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="html__tag_end"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code class="javascript"&gt; &lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3558612853123884447-948981557819872658?l=opensourcecoders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcecoders.blogspot.com/feeds/948981557819872658/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://opensourcecoders.blogspot.com/2011/01/jquery-google-charts.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/948981557819872658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/948981557819872658'/><link rel='alternate' type='text/html' href='http://opensourcecoders.blogspot.com/2011/01/jquery-google-charts.html' title='jQuery Google charts'/><author><name>Winston</name><uri>http://www.blogger.com/profile/01816928013779231707</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_byewVRCuEvc/TN2XhFTZ3LI/AAAAAAAAAA4/XMF2xe6nzvY/S220/280px-Tux-linux_logo.svg.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3558612853123884447.post-8589522822130835581</id><published>2011-01-05T12:24:00.003-02:00</published><updated>2011-01-05T13:28:29.679-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mpis'/><category scheme='http://www.blogger.com/atom/ns#' term='vga'/><category scheme='http://www.blogger.com/atom/ns#' term='assembly'/><title type='text'>Implementação da tela VGA em assembly</title><content type='html'>Aproveitando o post anterior do THOR27 sobre a &lt;a href="http://opensourcecoders.blogspot.com/2011/01/as-cores-em-rgb.html"&gt;implementação de cores em sistemas operacionais&lt;/a&gt;, vou postar um pouco sobre como o computador transforma os seus comandos em cores visíveis na tela do computador. A implementação será feita em linguagem &lt;a href="http://en.wikibooks.org/wiki/MIPS_Assembly"&gt;assembly do processador MIPS&lt;/a&gt;, um dos modelos de processador mais usados para ensinar arquiteturas de processadores.&lt;div&gt;&lt;br /&gt;&lt;h2&gt;Introdução&lt;/h2&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Se você não sabe o que é assembly, nada que uma &lt;a href="http://www.google.com.br/search?q=define:+assembly"&gt;boa pesquisa no Google&lt;/a&gt; não resolva, mas acho que vale a pena perder alguns segundos com a definição. Os computadores são baseados num dos princípios mais simples que existem em elétrica ou eletrônica. Se temos um fio que conduz eletricidade, existem duas possibilidades para ele em qualquer tempo: ou passa corrente ou não passa corrente. Se passa corrente, representamos como 1; se não passa, representamos como 0. Somente com essas simples definições é possível construir computadores como os que temos hoje, mas falar sobre isso ia tomar muito tempo, então deixo como pesquisa para quem quiser se inteirar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O coração de todo computador é o processador, que se baseia nos mesmos princípios: ou passa corrente (0) ou não passa (1). Claro que a maior parte dos programadores não fica plugando cabos e conectores para descobrir as funções que podem ser executadas pelo processador, então todo fabricante publica uma especificação de seu código assembly, que basicamente diz todas as funções que podem ser executadas pelo processador.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Há uma grande discussão na indústria se o conjunto de instruções deve ser reduzido (&lt;a href="http://pt.wikipedia.org/wiki/RISC"&gt;RISC&lt;/a&gt;) para facilitar o aprendizado ou deve ser mais completo (&lt;a href="http://pt.wikipedia.org/wiki/CISC"&gt;CISC&lt;/a&gt;) para fornecer mais possibilidades de implementação ao programador. De modo geral podemos dizer que os computadores maiores utilizam CISC (processadores Intel e AMD) e os menores utilizam RISC (ARM e MIPS). Como o objetivo é mostrar uma possibilidade de implementação que seja fácil de entender, o processador que vamos utilizar no exemplo é o MIPS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A principal vantagem do MIPS em relação aos seus competidores é que o conjunto mínimo de instruções contém apenas oito instruções, ou seja, o processador só executa oito diferentes comandos. E muito fácil então a qualquer programador conhecer os comandos que ele executa, ainda que seja difícil implementar algumas funcionalidades com tão poucos comandos. Passa a ser importante então uma outra característica de todo programador: a criatividade.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voltando ao objetivo do post, o que queremos é possibilitar a escrita de alguma coisa na tela de um computador. Via de regra toda tela de computador é representada como uma sequência de pixels, ou o menor ponto que a resolução é capaz de representar. O computador desenha a tela quebrando a imagem em pontos no mesmo princípio que discutimos anteriormente: tem cor (1) ou não tem cor (0). Para facilitar o exemplo vamos trabalhar com a resolução de uma tela VGA que tem 640x480, ou seja, 640 pontos na vertical e 480 na horizontal. Então, sempre que quisermos desenhar o caracter, precisamos passar sua posição na horizontal, na vertical e indicar se o ponto contém luz (1) ou não contém (0).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Você deve estar se imaginando como é possível desenhar, então já vou entregar o maior segredo: &lt;a href="http://www.softwarepublico.gov.br/file/12954092/Representa%c3%a7%c3%a3o_caracteres.pdf"&gt;nesse link&lt;/a&gt; está uma tabela que diz qual o código de cada um dos caracteres na famosa tabela ascii e como ele é representado. Guarde com cuidado, pois foi muito difícil encontrar essa informação. Podemos ver que cada caracter ocupa um espaço de 8x8 pixels, ou seja, 64 bits. São necessários então 64 bits para representar um caracter da tabela ascii numa tela VGA.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold; "&gt;Código Assembly&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Agora que já sabemos do que estamos tratando podemos passar para o código propriamente dito. O objetivo então é escrever um programa que tenha a capacidade de, dado um determinado caracter, escrevê-lo na tela na posição (x,y). Traduzindo para a linguagem assembly, vamos receber em um &lt;a href="http://pt.wikipedia.org/wiki/Registrador_(inform%C3%A1tica)"&gt;registrador&lt;/a&gt; e em outros dois a posição que ele deve ser escrito.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O primeiro passo é carregar na memória o mapa de caracteres VGA fornecido acima como dado para o programa. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; white-space: normal; font-size: 16px; "&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.data&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;char:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.word&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;0x00000041&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Aqui vai o caracter ascii a ser impresso. 41 é A.&lt;/div&gt;&lt;div&gt;min:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.word&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;0x00000021&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Abaixo disso, nenhum caracter será impresso (tudo 0)&lt;/div&gt;&lt;div&gt;max:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.word&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;0x0000007F&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Acima disso, a tela fica preta (todos os caracteres 1)&lt;/div&gt;&lt;div&gt;# Caracteres para a tabela ascii&lt;/div&gt;&lt;div&gt;ini:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.word&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;0x00000021&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# O primeiro caracter da tabela ascii&lt;/div&gt;&lt;div&gt;incr:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.word&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;0x00000001&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Vou utilizar essa word para incremendar o contador&lt;/div&gt;&lt;div&gt;# Não consegui descobrir outra forma que não seja declarar os dados aqui&lt;/div&gt;&lt;div&gt;excla1:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.word&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;0x08080808&lt;/div&gt;&lt;div&gt;excla2:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.word&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;0x00000800&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(...)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;til2:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.word&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;0x4C000000&lt;/div&gt;&lt;div&gt;pr1:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.word&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;0x11111111&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Tudo 1&lt;/div&gt;&lt;div&gt;br1:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;.word&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;0x00000000 # Tudo 0&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Já temos a primeira parte do programa, que é a declaração dos dados e variáveis. Agora passamos ao texto ou ao programa propriamente dito:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;print_char:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a0, char&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# A word representando o ascii que vai ser impresso vai em $a0&lt;/div&gt;&lt;div&gt;# Aqui começa a descrição dos caracteres que serão impressos. Uma verdadeira tabela de símbolos&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t1, max&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# Armazenamos a maior word representável no VGA&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;slt&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, $a0, $t1&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Se a word for menor do que o maior valor representável, $t0 vai pra 1&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;beq&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, $zero, pr&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Se $t0 estiver em 0, significa que a word é maior que o máximo. Imprimos tudo preto.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t1, min&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# Agora $t1 recebe o mínimo&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;slt&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, $t1, $a0&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Agora se $a0 for menor que o mínimo, imprimimos tudo branco&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;beq&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, $zero, br&lt;/div&gt;&lt;div&gt;# Agora fazemos a substituição dos caracteres&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, ini&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# Código ascii&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(...)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;#&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, 0x0000007D # Código ascii&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;add&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, $t0, $t1&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Próximo da fila&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;beq&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a0, $t0, chav2&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Branch para o label de impressão do caracter&lt;/div&gt;&lt;div&gt;#&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, 0x0000007E # Código ascii&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;add&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, $t0, $t1&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Próximo da fila&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;beq&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a0, $t0, til&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Branch para o label de impressão do caracter&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;beq&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a0, $t0, excla&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Branch para o label de impressão do caracter&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t1, incr&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# Armazeno o valor a ser incrementado no registrador $t1&lt;/div&gt;&lt;div&gt;#&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, 0x00000022 # Código ascii&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;add&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, $t0, $t1&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Próximo da fila&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;beq&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a0, $t0, aspas&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# Branch para o label de impressão do caracter&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A lógica da chamada é simples e certamente pode ser melhorada (contribuições são bem vindas). O registrador $a0 possui o caracter que vai ser impresso na tela. O registrador $t1 é incrementado e vai verificando se o valor que possui é o que deve ser impresso. Quando encontra o valor que deve ser impresso, vai para a posição da impressão do caracter, representada abaixo:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;excla:&lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;# Agora é dividir os bits: os primeiros 32 em $a1 e o restantes em $a2&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a1, excla1&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a2, excla2&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;j&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;print&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;# Depois vamos para a impressão&lt;/div&gt;&lt;div&gt;aspas:&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a1, aspas1&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a2, aspas2&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;j&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;print&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;# Depois vamos para a impressão&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(...)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;til:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a1, til1&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a2, til2&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;j&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;print&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;# Depois vamos para a impressão&lt;/div&gt;&lt;div&gt;pr:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a1, pr1&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# Tudo 1&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a2, pr1&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# Tudo 1&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;j print&lt;/div&gt;&lt;div&gt;br:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a1, br1&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# Tudo 0&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;lw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a2, br1&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# Tudo 0&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;j print&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Precisamos agora escrever na tela propriamente dita. A função abaixo representa a impressão:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;# Se chegamos até aqui, hora de imprimir de acordo com a tabela&lt;/div&gt;&lt;div&gt;print:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;la&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$t0, 0x00001001&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# A impressão do caracter começa a partir do endereço 4097. Ponho em $t0.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;sw &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a1, 0($t0) &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# $a1 contém os primeiros 32 bits dos caracteres&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;sw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a2, 4($t0)&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# $a2 contém os próximos 32 dos caracteres&lt;/div&gt;&lt;div&gt;#&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;sw &lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a1, 0($ra) &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;# $a1 contém os primeiros 32 bits dos caracteres&lt;/div&gt;&lt;div&gt;#&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;sw&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;$a2, 4($ra)&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;# $a2 contém os próximos 32 dos caracteres&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;jr $ra&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;# Retorna para quem chamou&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Parabéns! Você acaba de imprimir o seu primeiro caracter numa tela VGA.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como pode ser facilmente percebido, o código não é nenhum pouco eficiente, e precisa ser integrado a outros programas em MIPS para ter alguma utilidade prática. Afinal, o caracter a ser impresso está &lt;i&gt;hard coded&lt;/i&gt; na letra A. O exemplo serve mais para ajudar quem quiser começar a mexer com o assunto, porque quando estava estudando isso foi muito difícil achar exemplos para aprender.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Se tiver alguma sugestão, fique à vontade para apresentá-la. E não se esqueça de postar se conseguir tornar o código mais limpo e eficiente.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Obs.: Você pode baixar o código completo &lt;a href="http://www.softwarepublico.gov.br/file/28076224/print_char.s"&gt;aqui&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3558612853123884447-8589522822130835581?l=opensourcecoders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcecoders.blogspot.com/feeds/8589522822130835581/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://opensourcecoders.blogspot.com/2011/01/implementacao-da-tela-vga-em-assembly.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/8589522822130835581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/8589522822130835581'/><link rel='alternate' type='text/html' href='http://opensourcecoders.blogspot.com/2011/01/implementacao-da-tela-vga-em-assembly.html' title='Implementação da tela VGA em assembly'/><author><name>eduardosan</name><uri>http://www.blogger.com/profile/02823399193605650702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_pgSqw9u1vO4/SBYfIv6tl4I/AAAAAAAAAAM/Adu5Mp6l9yk/S220/eu.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3558612853123884447.post-5670503341060628150</id><published>2011-01-05T09:54:00.008-02:00</published><updated>2011-01-05T14:36:59.237-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rgb'/><category scheme='http://www.blogger.com/atom/ns#' term='shellscript'/><category scheme='http://www.blogger.com/atom/ns#' term='cores'/><category scheme='http://www.blogger.com/atom/ns#' term='hexadecimal'/><title type='text'>As cores em RGB</title><content type='html'>As cores RGB, utilizada para exibição de imagens em monitores, consiste na mistura de 3 cores primárias: O vermelho (Red ou R), o verde (Green ou G) e o azul (Blue ou B).&lt;br /&gt;&lt;br /&gt;Hoje em dia, o número de cores existentes pode ser representado em 24 bits, ou seja, 8 bits para cada cor primária (8 do vermelho, 8 do verde e 8 do azul).&lt;br /&gt;&lt;br /&gt;Existe um sistema operacional por aí que diz que utiliza 32 bits de cores, mas isso é mentira: Na verdade os 8 bits adicionais usado por esse sistema operacional são atalhos para outras cores representadas pelos demais 24 bits, traduzido como um canal alpha (utilizado para fazer "semi transparência"). Apesar do canal alpha ser amplamente utilizado não é necessário que ele esteja representado na paleta de cores, como faz esse sistema operacional popular.&lt;br /&gt;&lt;br /&gt;Com 8 bits é possível representar 2^8 (dois elevado a oitava) tons de uma cor, que é igual a 256 tons, sendo representado de 0 a 255.&lt;br /&gt;&lt;br /&gt;Logo temos a seguinte variação de cores: 256 tons vermelhos que podem se misturar com 256 tons de verde que por sua vez podem se misturar com 256 tons de azul, gerando uma combinação de 256x256x256 = 16.777.216 cores diferentes (os famosos 16 milhões de cores)&lt;br /&gt;&lt;br /&gt;Na computação é muito utilizada a representação hexadecimal que consiste em utilizar a numeração de 0 até F (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) ao invés do popular decimal (0,1,2,3,4,5,6,7,8,9,0).&lt;br /&gt;&lt;br /&gt;Em hexadecimal, 255 é representado como FF. Logo a variação dos tons das cores podem ser representados 0 até FF&lt;br /&gt;&lt;br /&gt;Para inidicar as cores RGB é amplamente utilizado o seguinte formato: #(VERMELHO)(VERDE)(AZUL) aonde o vermelho, o verde e o azul é substituido pelo seu valor em hexadecimal, por exemplo:&lt;br /&gt;&lt;br /&gt;Vermelho = utilizar o tom 103 (67 em hexadecimal)&lt;br /&gt;Verde = utilizar o tom 255 (FF em hexadecimal)&lt;br /&gt;Azul = utilizar o tom 29 (1D em hexadecimal)&lt;br /&gt;&lt;br /&gt;Logo essa cor fica representada como #67FF1D&lt;br /&gt;&lt;br /&gt;Abaixo segue 2 pequenos scripts em shell, capaz de gerar as cores rgb no formato em hexadecimal e o oposto:&lt;br /&gt;&lt;br /&gt;Retorna o valor das cores em decimal do valor informado no formato #RRGGBB:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;achacor(){&lt;br /&gt;    echo "{ibase=16; $1}" | bc&lt;br /&gt;}&lt;br /&gt;NOME_COR=$1&lt;br /&gt;COR1=${NOME_COR:1:2}&lt;br /&gt;COR2=${NOME_COR:3:2}&lt;br /&gt;COR3=${NOME_COR:5:2}&lt;br /&gt;&lt;br /&gt;echo R: `achacor $COR1` G: `achacor $COR2` B: `achacor $COR3` &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Retorna o valor das cores no formato #RRGGBB do valor informado em decimal:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;achacor(){&lt;br /&gt;    echo "{obase=16; $1}" | bc | awk '{printf "%02s\n", $0}'&lt;br /&gt;}&lt;br /&gt;COR1=$1&lt;br /&gt;COR2=$2&lt;br /&gt;COR3=$3&lt;br /&gt;&lt;br /&gt;echo '#'`achacor $COR1``achacor $COR2``achacor $COR3` &lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3558612853123884447-5670503341060628150?l=opensourcecoders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcecoders.blogspot.com/feeds/5670503341060628150/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://opensourcecoders.blogspot.com/2011/01/as-cores-em-rgb.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/5670503341060628150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/5670503341060628150'/><link rel='alternate' type='text/html' href='http://opensourcecoders.blogspot.com/2011/01/as-cores-em-rgb.html' title='As cores em RGB'/><author><name>ThOR27</name><uri>http://www.blogger.com/profile/06741326148112620321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://www.thor27.blogger.com.br/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3558612853123884447.post-5767537708087392196</id><published>2010-12-09T11:41:00.007-02:00</published><updated>2011-01-05T14:38:58.808-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='odt'/><category scheme='http://www.blogger.com/atom/ns#' term='conversão'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='plone'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Exportando HTML para odt, pdf... etc</title><content type='html'>SmartPrintNG&lt;br /&gt;&lt;br /&gt;Ferramenta para exportar plone content para:&lt;br /&gt;&amp;nbsp;- PDF&lt;br /&gt;&amp;nbsp;- RTF&lt;br /&gt;&amp;nbsp;- ODT&lt;br /&gt;- WML&lt;br /&gt;&amp;nbsp;- DOCX&lt;br /&gt;&lt;br /&gt;SmartPrintNG:&lt;br /&gt;O smartprint integra o zopyx.convert com o plone, porém quem faz de fato a conversão é o zopyx.convert &lt;br /&gt;&lt;br /&gt;Plone.org - http://plone.org/products/smartprintng&lt;br /&gt;&lt;a href="http://plone.org/products/smartprintng/releases/smartprintng-1.2.13/Products.SmartPrintNG-1.2.13.tar.gz"&gt;download&lt;/a&gt;&lt;br /&gt;pypi - http://pypi.python.org/pypi/Products.SmartPrintNG&lt;br /&gt;&lt;a href="http://pypi.python.org/packages/source/P/Products.SmartPrintNG/Products.SmartPrintNG-1.2.13.tar.gz#md5=d6a7afa6aaf2e28abd08e32a8bfed8e4"&gt;download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;zopyx.convert&lt;br /&gt;o convert é uma ferramenta que converte HTML para um dos formátos listados.&lt;br /&gt;Ele funciona em qualquer sistema (não somente plone),&amp;nbsp; basta ter instalado o python 2.4+ e o java 1.5+&lt;br /&gt;&lt;br /&gt;pypi - http://pypi.python.org/pypi/zopyx.convert&lt;br /&gt;&lt;a href="http://pypi.python.org/packages/source/z/zopyx.convert/zopyx.convert-1.1.11.tar.gz#md5=41811a6170b3468208d6feb87a520d75"&gt;download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Por estar no pypi, eles podem ser instalado com o python usando o easy_install&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3558612853123884447-5767537708087392196?l=opensourcecoders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcecoders.blogspot.com/feeds/5767537708087392196/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://opensourcecoders.blogspot.com/2010/12/exportando-plone-content-para-odt-pdf.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/5767537708087392196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/5767537708087392196'/><link rel='alternate' type='text/html' href='http://opensourcecoders.blogspot.com/2010/12/exportando-plone-content-para-odt-pdf.html' title='Exportando HTML para odt, pdf... etc'/><author><name>Winston</name><uri>http://www.blogger.com/profile/01816928013779231707</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_byewVRCuEvc/TN2XhFTZ3LI/AAAAAAAAAA4/XMF2xe6nzvY/S220/280px-Tux-linux_logo.svg.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3558612853123884447.post-2138640729004638701</id><published>2010-11-24T21:28:00.006-02:00</published><updated>2011-01-05T14:37:55.869-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='code-completion'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>Colocando code-completion no Python</title><content type='html'>O terminal do python é muito útil para fazer testes, mas além de útil ele pode se tornar ainda mais prático!&lt;br /&gt;&lt;br /&gt;A dica é simples: Copie o código abaixo, e cole no arquivo ~/.pystartup:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;import atexit, os, readline, rlcompleter&lt;br /&gt;&lt;br /&gt;histFile = os.path.expanduser("~/.pyhistory")&lt;br /&gt;&lt;br /&gt;def saveit(hf=histFile):&lt;br /&gt;  readline.write_history_file(hf)&lt;br /&gt;&lt;br /&gt;if os.path.exists(histFile):&lt;br /&gt;  readline.read_history_file(histFile)&lt;br /&gt;&lt;br /&gt;readline.parse_and_bind('tab: complete')&lt;br /&gt;readline.set_history_length(2000)&lt;br /&gt;&lt;br /&gt;atexit.register(saveit)&lt;br /&gt;del os, atexit, rlcompleter, saveit, histFile&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;agora execute o seguinte comando:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;export PYTHONSTARTUP=~/.pystartup&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Coloque esse comando no final do seu arquivo ~/.bashrc para que fique salvo para próximas seções shell.&lt;br /&gt;&lt;br /&gt;Para usar, basta executar o terminal python e utilizar a tecla "tab" para completar os comandos digitados.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3558612853123884447-2138640729004638701?l=opensourcecoders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcecoders.blogspot.com/feeds/2138640729004638701/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://opensourcecoders.blogspot.com/2010/11/colocando-code-completion-no-python.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/2138640729004638701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/2138640729004638701'/><link rel='alternate' type='text/html' href='http://opensourcecoders.blogspot.com/2010/11/colocando-code-completion-no-python.html' title='Colocando code-completion no Python'/><author><name>ThOR27</name><uri>http://www.blogger.com/profile/06741326148112620321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://www.thor27.blogger.com.br/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3558612853123884447.post-6944655512094546196</id><published>2010-11-19T16:50:00.004-02:00</published><updated>2011-01-05T14:40:21.308-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='software livre'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='modelagem'/><title type='text'>WWW SQL Designer</title><content type='html'>Aplicação Web em PHP para modelagem de banco de dados.&lt;br /&gt;&lt;br /&gt;Compatível com:&lt;br /&gt;MySQL&lt;br /&gt;PostgreSQL&lt;br /&gt;SQLite&lt;br /&gt;e outros&lt;br /&gt;&lt;br /&gt;Site oficial:&lt;br /&gt;&lt;a href="http://code.google.com/p/wwwsqldesigner/"&gt;http://code.google.com/p/wwwsqldesigner/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download: &lt;br /&gt;&lt;a href="http://wwwsqldesigner.googlecode.com/files/wwwsqldesigner-2.5.zip"&gt;http://wwwsqldesigner.googlecode.com/files/wwwsqldesigner-2.5.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3558612853123884447-6944655512094546196?l=opensourcecoders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcecoders.blogspot.com/feeds/6944655512094546196/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://opensourcecoders.blogspot.com/2010/11/sql-designer.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/6944655512094546196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/6944655512094546196'/><link rel='alternate' type='text/html' href='http://opensourcecoders.blogspot.com/2010/11/sql-designer.html' title='WWW SQL Designer'/><author><name>Winston</name><uri>http://www.blogger.com/profile/01816928013779231707</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_byewVRCuEvc/TN2XhFTZ3LI/AAAAAAAAAA4/XMF2xe6nzvY/S220/280px-Tux-linux_logo.svg.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3558612853123884447.post-6926538310025398747</id><published>2010-11-17T15:15:00.005-02:00</published><updated>2011-01-05T14:40:50.273-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='texto'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='legibilidade'/><title type='text'>Limita Texto</title><content type='html'>Esse código, em python, é bem interessante pois ele corta textos em um determinado tamanho sem que corte as palavras no meio se isso não deixar o texto menor que metade do texto.&lt;br /&gt;&lt;br /&gt;Exemplo:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&gt;&gt;&gt; from limita_texto import limita_texto&lt;br /&gt;&gt;&gt;&gt; limita_texto('Aqui vem o texto muito maior que o limite',20)&lt;br /&gt;'Aqui vem o texto...'&lt;br /&gt;&gt;&gt;&gt; limita_texto('Aqui vem o texto muito maior que o limite',21)&lt;br /&gt;'Aqui vem o texto...'&lt;br /&gt;&gt;&gt;&gt; limita_texto('Aqui vem o texto muito maior que o limite',22)&lt;br /&gt;'Aqui vem o texto...'&lt;br /&gt;&gt;&gt;&gt; limita_texto('Aqui vem o texto muito maior que o limite',23)&lt;br /&gt;'Aqui vem o texto...'&lt;br /&gt;&gt;&gt;&gt; limita_texto('Aqui vem o texto muito maior que o limite',24)&lt;br /&gt;'Aqui vem o texto...'&lt;br /&gt;&gt;&gt;&gt; limita_texto('Aqui vem o texto muito maior que o limite',25)&lt;br /&gt;'Aqui vem o texto muito...'&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Você pode baixar o código aqui: &lt;a href="https://bitbucket.org/opensourcecoders/python-utils/raw/2dd8a03efa7f/limita_texto.py"&gt;Limita Texto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ou pelo HG to Python Utils:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;hg clone https://opensourcecoders@bitbucket.org/opensourcecoders/python-utils&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3558612853123884447-6926538310025398747?l=opensourcecoders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcecoders.blogspot.com/feeds/6926538310025398747/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://opensourcecoders.blogspot.com/2010/11/limita-texto.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/6926538310025398747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/6926538310025398747'/><link rel='alternate' type='text/html' href='http://opensourcecoders.blogspot.com/2010/11/limita-texto.html' title='Limita Texto'/><author><name>ThOR27</name><uri>http://www.blogger.com/profile/06741326148112620321</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='http://www.thor27.blogger.com.br/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3558612853123884447.post-6263698434690136260</id><published>2010-11-16T14:31:00.004-02:00</published><updated>2010-11-16T15:32:56.379-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='js'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>loading js</title><content type='html'>Ae galera primeiro post!&lt;br /&gt;&lt;br /&gt;JavaScript/JQuery - Spinner para ação de loading&lt;br /&gt;&lt;br /&gt;Já precisei disso várias vezes e acho que é sempre útil esse tipo de coisa, criei um 'plugin' pra jquery 1.4+ (é provável que funcione com versões anteriores).&lt;br /&gt;&lt;br /&gt;Como funciona: (Basicamente ele só exibe e esconde um png)&lt;br /&gt;&amp;nbsp;1 - Vc precisará modificar o caminho pra imagem dentro do loading.js&lt;br /&gt;&amp;nbsp;2 - $.loading.show()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $.loading.hide()&lt;br /&gt;&lt;br /&gt;obs: como é a primeira versão não foi incluído nenhum 'ie fix'&lt;br /&gt;&lt;br /&gt;Download Zip:&lt;br /&gt;&lt;span dir="ltr" id=":34"&gt;&lt;a href="https://bitbucket.org/opensourcecoders/loading_js/get/2e0147f81691.zip"&gt;https://bitbuck&lt;wbr&gt;&lt;/wbr&gt;et.org/opensour&lt;wbr&gt;&lt;/wbr&gt;cecoders/loadin&lt;wbr&gt;&lt;/wbr&gt;g_js/get/2e0147&lt;wbr&gt;&lt;/wbr&gt;f81691.zip&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span dir="ltr" id=":34"&gt;HG:&lt;/span&gt;&lt;br /&gt;&lt;span dir="ltr" id=":34"&gt;https -&lt;/span&gt;&lt;span dir="ltr" id=":34"&gt; &lt;/span&gt;hg clone &lt;a href="https://opensourcecoders@bitbucket.org/opensourcecoders/loading_js"&gt;https://opensourcecoders@bitbucket.org/opensourcecoders/loading_js&lt;/a&gt;&lt;br /&gt;&lt;span dir="ltr" id=":34"&gt;ou&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span dir="ltr" id=":34"&gt;ssh - &lt;/span&gt;hg clone &lt;a href="ssh://hg@bitbucket.org/opensourcecoders/loading_js"&gt;ssh://hg@bitbucket.org/opensourcecoders/loading_js&lt;/a&gt;&lt;br /&gt;&lt;span dir="ltr" id=":34"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3558612853123884447-6263698434690136260?l=opensourcecoders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcecoders.blogspot.com/feeds/6263698434690136260/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://opensourcecoders.blogspot.com/2010/11/ae-galera-primeiro-post-como-precisei.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/6263698434690136260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3558612853123884447/posts/default/6263698434690136260'/><link rel='alternate' type='text/html' href='http://opensourcecoders.blogspot.com/2010/11/ae-galera-primeiro-post-como-precisei.html' title='loading js'/><author><name>Winston</name><uri>http://www.blogger.com/profile/01816928013779231707</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_byewVRCuEvc/TN2XhFTZ3LI/AAAAAAAAAA4/XMF2xe6nzvY/S220/280px-Tux-linux_logo.svg.png'/></author><thr:total>0</thr:total></entry></feed>
