<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-16507626</atom:id><lastBuildDate>Thu, 16 Jul 2009 14:53:13 +0000</lastBuildDate><title>Marcio Andrey Oliveira</title><description>This blog was created as a talk to myself, as a pastime.

I will write about things I care about or whatever is in my mind when I get some time/spirit to write.

I invite you to spend some time reading my articles.</description><link>http://marcioandreyoliveira.blogspot.com/</link><managingEditor>noreply@blogger.com (Marcio Andrey Oliveira)</managingEditor><generator>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/MarcioAndreyOliveira" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-1215072467048768606</guid><pubDate>Fri, 10 Jul 2009 03:05:00 +0000</pubDate><atom:updated>2009-07-10T00:08:18.382-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">books</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>Some software related books I've read</title><description>&lt;div id="ShelfariWidget102477"&gt;&lt;a href='http://www.shelfari.com/'&gt;Shelfari: Book reviews on your book blog&lt;/a&gt;&lt;script src="http://www.shelfari.com/ws/102477/widget.js" type="text/javascript" language="javascript"&gt;&lt;/script&gt;&lt;noscript&gt;&lt;p&gt;Find new &lt;a href="http://www.shelfari.com/books"&gt;books&lt;/a&gt; and literate friends with Shelfari, the online &lt;a href="http://www.shelfari.com/"&gt;book club&lt;/a&gt;.&lt;/p&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-1215072467048768606?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IQcqNM34RxdI2ICup8f7pIb9d48/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IQcqNM34RxdI2ICup8f7pIb9d48/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IQcqNM34RxdI2ICup8f7pIb9d48/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IQcqNM34RxdI2ICup8f7pIb9d48/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/_tZitN8wvio" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/_tZitN8wvio/some-software-related-books-ive-read.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/07/some-software-related-books-ive-read.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-1667800274617388841</guid><pubDate>Tue, 23 Jun 2009 20:29:00 +0000</pubDate><atom:updated>2009-06-23T18:31:15.084-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>Do you really know C</title><description>I don't like to write about &lt;a type="amzn" search="C" category="books"&gt;C&lt;/a&gt; because &lt;a href="http://www.caloni.com.br/blog/"&gt;Wanderley&lt;/a&gt;, a friend of mine, is much more able to talk about it, but I think I must report what happened to me these days.&lt;br /&gt;&lt;br /&gt;After some time developing with a programming language we get so used to it that we start thinking we are the master on it.&lt;br /&gt;&lt;br /&gt;But usually the opposite happens: we forget some basic and subtle aspects of the language.&lt;br /&gt;&lt;br /&gt;A couple of days ago I wrote the &lt;a type="amzn" search="C" category="books"&gt;C&lt;/a&gt; command bellow:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;printf("x position = %d (again??)", 7);&lt;/pre&gt;and to my surprise it was printed&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;x position = 7 (again ]&lt;/pre&gt;Why didn't the application printed&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;x position = 7 (again ??)&lt;/pre&gt;I thought "&lt;a type="amzn" search="visual studio" category="books"&gt;Visual Studio&lt;/a&gt; (2005) is a crap!".&lt;br /&gt;&lt;br /&gt;Some taboo words latter and I realized what the problem was.&lt;br /&gt;&lt;br /&gt;I remembered C has a feature named trigraph. In other words, &lt;a type="amzn" search="C" category="books"&gt;C&lt;/a&gt; replaces all  special sequences of three characters by their single-character equivalent.&lt;br /&gt;&lt;br /&gt;The following are the nine trigraph sequences that &lt;a type="amzn" search="C" category="books"&gt;C&lt;/a&gt; recognizes.&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;Trigraph    Equivalent&lt;br /&gt;??=         #&lt;br /&gt;??/         \&lt;br /&gt;??'         ^&lt;br /&gt;??(         [&lt;br /&gt;??)         ]&lt;br /&gt;??!         |&lt;br /&gt;??&lt;         {&lt;br /&gt;??&gt;         }&lt;br /&gt;??-         ~&lt;/pre&gt;Why do &lt;a type="amzn" search="C" category="books"&gt;C&lt;/a&gt; has trigraphs? To let us for writing source code when the keyboard being used does not support any of these nine characters.&lt;br /&gt;&lt;br /&gt;I compiled the program using &lt;a type="amzn" search="gcc" category="books"&gt;gcc&lt;/a&gt; and it gives me the following warning&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;warning: trigraph ??) ignored, use -trigraphs to enable&lt;/pre&gt;This means that on &lt;a type="amzn" search="gcc" category="books"&gt;gcc&lt;/a&gt; we must explicitly request to it to enable trigraphs. The output presented after running the program was&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;x position = 7 (again ??)&lt;/pre&gt;Since 1994 the C standard (C99), supplies digraphs as more readable alternatives to six of the trigraphs. They are:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;Digraph     Equivalent&lt;br /&gt;&lt;:      [&lt;br /&gt;:&gt;      ]&lt;br /&gt;&lt;%      {&lt;br /&gt;%&gt;      }&lt;br /&gt;%:      #&lt;br /&gt;%:%:    ##&lt;br /&gt;&lt;/pre&gt;I must not be so proud of myself because eventually something (like this) remembers me that I am already a newbie and a wanna-be.&lt;br /&gt;&lt;br /&gt;Oh, and at this time &lt;a type="amzn" search="visual studio" category="books"&gt;Visual Studio&lt;/a&gt; was unfairly blamed. Sorry ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-1667800274617388841?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EvGj3OmQ4bP6QDpqdByLvgSr-rk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EvGj3OmQ4bP6QDpqdByLvgSr-rk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EvGj3OmQ4bP6QDpqdByLvgSr-rk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EvGj3OmQ4bP6QDpqdByLvgSr-rk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/9zCzq-e0-DE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/9zCzq-e0-DE/do-you-really-know-c.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/06/do-you-really-know-c.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-3641239927532942307</guid><pubDate>Tue, 23 Jun 2009 17:26:00 +0000</pubDate><atom:updated>2009-06-23T18:30:40.057-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">português</category><category domain="http://www.blogger.com/atom/ns#">c</category><title>Você conhece mesmo o C</title><description>Eu não gosto de escrever sobre &lt;a href="http://www.submarino.com.br/busca/giro?q=kernighan&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;C&lt;/a&gt;, porque o meu amigo &lt;a href="http://www.caloni.com.br/blog/"&gt;Wanderley&lt;/a&gt; é muito mais abilitado para falar sobre o assunto (além de escrever de um modo bem divertido), mas eu acho que eu devo falar sobre o que aconteceu comigo estes dias.&lt;br /&gt;&lt;br /&gt;Após algum tempo desenvolvendo com uma linguagem de programação nós nos acostumamos a ela e começamos a achar que a dominamos.&lt;br /&gt;&lt;br /&gt;Mas, geralmente, o que ocorre é o contrário: nós esquecemos alguns aspectos mais básicos e sutis da linguagem.&lt;br /&gt;&lt;br /&gt;Alguns dias atrás eu escrevi o seguinte trecho de código em &lt;a href="http://www.submarino.com.br/busca/giro?q=kernighan&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;C&lt;/a&gt;:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;printf("x position = %d (again??)", 7);&lt;/pre&gt;e, para minha surpresa, foi impresso&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;x position = 7 (again ]&lt;/pre&gt;Por que o programa não imprimiu&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;x position = 7 (again ??)&lt;/pre&gt;Eu pensei "esse &lt;a href="http://www.submarino.com.br/busca/giro?q=visual+studio&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;Visual Studio&lt;/a&gt; é uma merda!". Alguns palavrões depois e eu percebi qual era o problema.&lt;br /&gt;&lt;br /&gt;Eu lembrei que o &lt;a href="http://www.submarino.com.br/busca/giro?q=kernighan&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;C&lt;/a&gt; tem um recurso chamado trígrafo. Em outras palavras, o &lt;a href="http://www.submarino.com.br/busca/giro?q=kernighan&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;C&lt;/a&gt; substitui todas as ocorrências de sequências especiais de três caracteres por seus equivalentes de caracter único.&lt;br /&gt;&lt;br /&gt;A seguir temos as nove sequências de trígrafos que o &lt;a href="http://www.submarino.com.br/busca/giro?q=kernighan&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;C&lt;/a&gt; reconhece.&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;Trigraph     Equivalent&lt;br /&gt;??=          #&lt;br /&gt;??/          \&lt;br /&gt;??'          ^&lt;br /&gt;??(          [&lt;br /&gt;??)          ]&lt;br /&gt;??!          |&lt;br /&gt;??&lt;          {&lt;br /&gt;??&gt;          }&lt;br /&gt;??-          ~&lt;/pre&gt;&lt;/div&gt;E por que o &lt;a href="http://www.submarino.com.br/busca/giro?q=kernighan&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;C&lt;/a&gt; suporta trígrafos? Para nos permitir escrever códigos fonte quando o teclado que estiver sendo usado não possuir suporte aos nove caracteres acima.&lt;br /&gt;&lt;br /&gt;Eu compilei o programa usando o &lt;a href="http://www.submarino.com.br/busca/giro?q=gcc&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;gcc&lt;/a&gt; e obtive o seguinte warning&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;warning: trigraph ??) ignored, use -trigraphs to enable&lt;/pre&gt;Ou seja, eu devo explicitamente habilitar o uso de trígrafos no &lt;a href="http://www.submarino.com.br/busca/giro?q=gcc&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;gcc&lt;/a&gt;. A saída do programa após executá-lo foi&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;x position = 7 (again ??)&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;Desde 1994 o padrão do &lt;a href="http://www.submarino.com.br/busca/giro?q=kernighan&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;C&lt;/a&gt; (C99) fornece suporte a dígrafos como uma alternativa mais legível a seis dos nove trígrafos. São eles:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;Digraph  Equivalent&lt;br /&gt;&lt;span style="font-family:Georgia,serif;"&gt;&lt;:                    [&lt;br /&gt;:&gt;&lt;/span&gt;&lt;span style="font-family:Georgia,serif;"&gt;                    &lt;/span&gt;&lt;span style="font-family:Georgia,serif;"&gt;]&lt;br /&gt;&lt;%                  {&lt;br /&gt;%&gt;                  }&lt;br /&gt;%:                   #&lt;br /&gt;%:%:              ##&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Eu não devo me sentir tão orgulhoso de mim, porque sempre termina acontecendo algo desse tipo para me lembrar que eu ainda tenho muito para aprender.&lt;br /&gt;&lt;br /&gt;Ah, e dessa vez o &lt;a href="http://www.submarino.com.br/busca/giro?q=visual+studio&amp;amp;dep=+&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;Visual Studio&lt;/a&gt; foi xingado injustamente. Desculpem-me ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-3641239927532942307?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WxdqE5G95lQ0RTxB4BvviHUutUQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WxdqE5G95lQ0RTxB4BvviHUutUQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WxdqE5G95lQ0RTxB4BvviHUutUQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WxdqE5G95lQ0RTxB4BvviHUutUQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/L8RVlVrXX3Y" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/L8RVlVrXX3Y/voce-conhece-mesmo-o-c.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/06/voce-conhece-mesmo-o-c.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-7152135477240815912</guid><pubDate>Tue, 26 May 2009 18:24:00 +0000</pubDate><atom:updated>2009-05-26T15:36:48.584-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">english</category><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><title>How to boot Ubuntu in console mode (no X)</title><description>Despite the fact that graphical user interface is easier to daily work, I really prefer command line interface.&lt;br /&gt;&lt;br /&gt;I tried to disable graphical startup on &lt;a type="amzn" search="ubuntu linux" category="books"&gt;Ubuntu&lt;/a&gt; by editing inittab file, but what a surprise when I did not find it.&lt;br /&gt;&lt;br /&gt;Where is it? After some googling I found out that to always boot in console mode you must execute this command:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;sudo update-rc.d -f gdm remove&lt;/pre&gt;Every time you wish you can invoke Gnome from command line by typing&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;startx &amp;lt;ENTER&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-7152135477240815912?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iww-Gfs4GUObNo0vMrvvQD4DZKM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iww-Gfs4GUObNo0vMrvvQD4DZKM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iww-Gfs4GUObNo0vMrvvQD4DZKM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iww-Gfs4GUObNo0vMrvvQD4DZKM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/iXWkXa1I40g" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/iXWkXa1I40g/how-to-boot-ubuntu-in-console-mode-no-x.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/05/how-to-boot-ubuntu-in-console-mode-no-x.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-7453967775553532784</guid><pubDate>Fri, 22 May 2009 01:49:00 +0000</pubDate><atom:updated>2009-05-22T00:33:48.414-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>How to declare 64 bits in Visual Studio 6</title><description>Did you ever needed to declare a 64 bits integer using &lt;a type="amzn" search="Visual Studio" category="books"&gt;Visual Studio&lt;/a&gt; &lt;span style="font-weight: bold;"&gt;6&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;On newer versions of &lt;a type="amzn" search="Visual Studio" category="books"&gt;Visual Studio&lt;/a&gt; and on &lt;a type="amzn" search="gcc" category="books"&gt;gcc&lt;/a&gt;&lt;a&gt; you can use the &lt;span style="font-style: italic;"&gt;ll&lt;/span&gt; to tell the compiler that the value is 64 bits wide. But &lt;/a&gt;&lt;a type="amzn" search="Visual Studio" category="books"&gt;Visual Studio&lt;/a&gt; 6 does not understand it.&lt;br /&gt;&lt;br /&gt;How do you do? You must use the keyword  &lt;pre class="prettyprint" style="overflow: auto;"&gt;__int64.&lt;/pre&gt;&lt;br /&gt;I discovered it because a project I wrote using &lt;a type="amzn" search="Visual Studio" category="books"&gt;Visual Studio&lt;/a&gt; 2005 that must be compiled using &lt;a type="amzn" search="Visual Studio" category="books"&gt;Visual Studio&lt;/a&gt; 6.&lt;br /&gt;&lt;br /&gt;Below you can see a sample code that compiles both in &lt;a type="amzn" search="Visual Studio" category="books"&gt;VS&lt;/a&gt; 6 and 2005.&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;&lt;br /&gt;#include &lt;windows.h&gt;&lt;br /&gt;#include "stdafx.h"&lt;br /&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;  __int64 i = 0;&lt;br /&gt;&lt;br /&gt;  printf("Hello World! %08x %08x\n", i);&lt;br /&gt;&lt;br /&gt;  #ifdef _MSC_VER&lt;br /&gt;      #if _MSC_VER &lt;= 1200&lt;br /&gt;         // Visual Studio 6 or lower do not accept ll as 64 bits constants.&lt;br /&gt;         #define __IGNORE_LL_MODIFIER_MS         &lt;br /&gt;         #endif // _MSC_VER     &lt;br /&gt;      #endif // _MSC_VER&lt;br /&gt;&lt;br /&gt;  #ifdef __IGNORE_LL_MODIFIER_MS&lt;br /&gt;      i = ((__int64)0x1234567890123456);&lt;br /&gt;  #else&lt;br /&gt;      i = 0x1234567890123456ll;&lt;br /&gt;  #endif&lt;br /&gt;&lt;br /&gt;  printf("Hello World! %08x %08x\n", i);&lt;br /&gt;  getchar();&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;/pre&gt;I really hope this piece of information will be helpful to someone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-7453967775553532784?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uc3YEqqcgvuqU1MWaI_RmppwzmU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uc3YEqqcgvuqU1MWaI_RmppwzmU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uc3YEqqcgvuqU1MWaI_RmppwzmU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uc3YEqqcgvuqU1MWaI_RmppwzmU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/fNUFwIMgDdo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/fNUFwIMgDdo/how-to-declare-64-bits-in-visual-studio.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/05/how-to-declare-64-bits-in-visual-studio.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-4175998845749707200</guid><pubDate>Mon, 18 May 2009 16:58:00 +0000</pubDate><atom:updated>2009-05-18T16:22:19.183-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bzr</category><category domain="http://www.blogger.com/atom/ns#">mercurial</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>Get your own bazaar hosting service for free</title><description>I was looking for a free bazaar hosting service that let me use it with my private projects. Unfortunately I was not able to find anyone.&lt;br /&gt;&lt;br /&gt;This week I came across &lt;a href="https://www.getdropbox.com/referrals/NTExMjM4NTc5"&gt;DropBox&lt;/a&gt;. &lt;a href="https://www.getdropbox.com/referrals/NTExMjM4NTc5"&gt;DropBox&lt;/a&gt; is a site that let you share files between computers (and between people if you wish to). The basic plan give you 2GB for free!&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.getdropbox.com/referrals/NTExMjM4NTc5"&gt;DropBox&lt;/a&gt; interface is pretty easy to use. One folder (usually named &lt;a href="https://www.getdropbox.com/referrals/NTExMjM4NTc5"&gt;DropBox&lt;/a&gt;) will be used to share your files.&lt;br /&gt;&lt;br /&gt;You put a file into the folder and it will be available into any computer you log in. have you changed the file? &lt;a href="https://www.getdropbox.com/referrals/NTExMjM4NTc5"&gt;DropBox&lt;/a&gt; will update it.&lt;br /&gt;&lt;br /&gt;Don't you want the file anymore? Delete it from your &lt;a href="https://www.getdropbox.com/referrals/NTExMjM4NTc5"&gt;Dropbox&lt;/a&gt; folder and it will be delete from other computers too (as soon as you get logged into them). &lt;a href="https://www.getdropbox.com/referrals/NTExMjM4NTc5"&gt;DropBox&lt;/a&gt; will keep your files synchronized. You don't have to worry about it.&lt;br /&gt;&lt;br /&gt;So, I decided to use it as a bazaar repository. I created a folder named bzr.d under &lt;a href="https://www.getdropbox.com/referrals/NTExMjM4NTc5"&gt;DropBox&lt;/a&gt;. All files I want to keep under source control are inside this folder.&lt;br /&gt;&lt;br /&gt;Now I have my own bazaar hosting for free. And know what? You can share your bazaar repository (bzr.d in my case) with some friends and all of you will be able to develop the same project.&lt;br /&gt;&lt;br /&gt;You can even have many repositories at the same time (since they don't occupy more than 2GB).&lt;br /&gt;&lt;br /&gt;Do you need more space? &lt;a href="https://www.getdropbox.com/referrals/NTExMjM4NTc5"&gt;DropBox&lt;/a&gt; has two paid plans (50GB and 100GB).&lt;br /&gt;&lt;br /&gt;And you can use it as a hosting for git and mercurial too.&lt;em&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I think it's worth a try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-4175998845749707200?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LWkFosWRm0BQf5eSki_2znKMYrc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LWkFosWRm0BQf5eSki_2znKMYrc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LWkFosWRm0BQf5eSki_2znKMYrc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LWkFosWRm0BQf5eSki_2znKMYrc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/-rTI_8k1DBc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/-rTI_8k1DBc/get-your-own-bazaar-hosting-service-for.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/05/get-your-own-bazaar-hosting-service-for.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-1948495284433190348</guid><pubDate>Thu, 14 May 2009 02:11:00 +0000</pubDate><atom:updated>2009-05-13T23:54:12.198-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GMouseTool</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>GMouseTool on the fourth annualSourceForge.net Community Choice Awards</title><description>I've nominated my &lt;a href="http://gmousetool.sourceforge.net/"&gt;project&lt;/a&gt; for the fourth &lt;span style="font-style: italic;"&gt;SourceForge.net Community Choice Awards&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;It is the election of the best programs of the year that have been choosed by users.&lt;br /&gt;&lt;br /&gt;I am not under any illusion that I will win. &lt;a href="http://gmousetool.sourceforge.net/"&gt;GMouseTool&lt;/a&gt; is a very tiny project. And, as far as I know, there are only two &lt;a href="http://gmousetool.sourceforge.net/"&gt;GMouseTool&lt;/a&gt; users: me and another person named Ryan Reif.&lt;br /&gt;&lt;br /&gt;It it is just for fun. You can vote for &lt;a href="http://gmousetool.sourceforge.net/"&gt;GMouseTool&lt;/a&gt;. Click into the image below. You must supply a valid e-mail. Then you confirm your nomination using the link Sourceforge will provide.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gmousetool.sourceforge.net/"&gt;GMouseTool&lt;/a&gt; already have a vote. Now I need you vote for it ;)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://sourceforge.net/community/cca09/nominate/?project_name=GMouseTool&amp;amp;project_url=http://gmousetool.sourceforge.net/"&gt;&lt;img src="http://sourceforge.net/images/cca/cca_nominate.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-1948495284433190348?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FaF2HEbwLsYDdVBmeRS8aM0kFzg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FaF2HEbwLsYDdVBmeRS8aM0kFzg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FaF2HEbwLsYDdVBmeRS8aM0kFzg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FaF2HEbwLsYDdVBmeRS8aM0kFzg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/csvJC9enRvc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/csvJC9enRvc/gmousetool-fourth-annualsourceforgenet.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/05/gmousetool-fourth-annualsourceforgenet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-1435669756543635003</guid><pubDate>Thu, 14 May 2009 01:45:00 +0000</pubDate><atom:updated>2009-05-13T23:10:05.898-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">português</category><category domain="http://www.blogger.com/atom/ns#">GMouseTool</category><title>GMouseTool no quarto SourceForge.net Community Choice Awards</title><description>Acabei de inscrever o meu &lt;a href="http://gmousetool.sourceforge.net/"&gt;projeto&lt;/a&gt; no quarto &lt;span style="font-style: italic;"&gt;SourceForge.net Community Choice Awards&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;É a eleição dos melhores programas do ano feita por voto direto dos usuários.&lt;br /&gt;&lt;br /&gt;Não tenho a menor ilusão que vou ganhar alguma coisa. Além do &lt;a href="http://gmousetool.sourceforge.net/"&gt;GMouseTool&lt;/a&gt; ser um projeto muito pequeno, até onde eu sei, ele só tem dois usuário: eu e outra pessoa chamada Ryan Reif.&lt;br /&gt;&lt;br /&gt;Mas vale a diversão. Se quiseres votar no &lt;a href="http://gmousetool.sourceforge.net/"&gt;GMouseTool&lt;/a&gt;, é só clicar na imagem abaixo e fornecer um e-mail válido. Aí o Source&lt;span style="text-decoration: underline;"&gt;F&lt;/span&gt;orge vai te enviar um link que tu clicas para confirmar o voto.&lt;br /&gt;&lt;br /&gt;Um voto o &lt;a href="http://gmousetool.sourceforge.net/"&gt;GMouseTool&lt;/a&gt; já tem. Agora só falta o teu voto. ;)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://sourceforge.net/community/cca09/nominate/?project_name=GMouseTool&amp;amp;project_url=http://gmousetool.sourceforge.net/"&gt;&lt;img src="http://sourceforge.net/images/cca/cca_nominate.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-1435669756543635003?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DcXmKThYA47LeHm5CPwGHya35AI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DcXmKThYA47LeHm5CPwGHya35AI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DcXmKThYA47LeHm5CPwGHya35AI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DcXmKThYA47LeHm5CPwGHya35AI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/RLQLKwbx8JA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/RLQLKwbx8JA/gmousetool-no-quarto-sourceforgenet.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/05/gmousetool-no-quarto-sourceforgenet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-8053189769444733757</guid><pubDate>Tue, 05 May 2009 20:15:00 +0000</pubDate><atom:updated>2009-05-05T17:38:44.860-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">português</category><category domain="http://www.blogger.com/atom/ns#">vim</category><title>Vim usando o corretor ortográfico Vero</title><description>O pessoal do &lt;a href="http://www.submarino.com.br/busca?q=broffice&amp;amp;dep=1&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;BrOffice&lt;/a&gt; tem um verificador ortográfico chamado Vero, que já está adaptado ao &lt;a href="http://www.submarino.com.br/produto/1/21489236/pre-venda:+vocabulario+ortografico+da+lingua+portuguesa+%28volp%29?franq=276355"&gt;novo acordo ortográfico&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Neste artigo vou mostrar como fazer o Vim utilizar o dicionário implementado no Vero.&lt;br /&gt;&lt;br /&gt;1 - Baixe o corretor ortográfico no site do &lt;a href="http://www.submarino.com.br/busca?q=broffice&amp;amp;dep=1&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;BrOffice&lt;/a&gt;: &lt;a href="http://www.broffice.org/verortografico/baixar"&gt;http://www.broffice.org/verortografico/baixar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Eu baixei o arquivo &lt;span style="font-style: italic;"&gt;Vero_pt_BR_V204AOC.oxt&lt;/span&gt; (a última versão no momento em que escrevo este artigo).&lt;br /&gt;&lt;br /&gt;2 - Descompacte o arquivo (apesar da extensão .oxt, ele não passa de um arquivo zip). Será criada uma estrutura de diretórios semelhante a mostrada na figura 1.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_f3tH_0i5uB0/SgCh4PszpqI/AAAAAAAAEck/OMteW3d1wDo/s1600-h/vim_vero_folders.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 298px;" src="http://2.bp.blogspot.com/_f3tH_0i5uB0/SgCh4PszpqI/AAAAAAAAEck/OMteW3d1wDo/s320/vim_vero_folders.png" alt="" id="BLOGGER_PHOTO_ID_5332439946465879714" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;Figura 1 - Estrutura de diretórios criada após descompactação&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;3 - Entre na pasta Dictionaries (ver figura 2), abra o Vim (ou o GVim) e, no modo de comando, digite:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;:mkspell pt pt_BR &amp;lt;ENTER&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_f3tH_0i5uB0/SgCiRtg8V-I/AAAAAAAAEcs/Qnh1L22VsGQ/s1600-h/vim_vero_dict.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 222px;" src="http://1.bp.blogspot.com/_f3tH_0i5uB0/SgCiRtg8V-I/AAAAAAAAEcs/Qnh1L22VsGQ/s320/vim_vero_dict.png" alt="" id="BLOGGER_PHOTO_ID_5332440383965911010" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;Figura 2 - Diretório de onde deve-se executar os comandos&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;O Vim irá processar os arquivos &lt;span style="font-style: italic;"&gt;pt_BR.aff&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;pt_BR.dic&lt;/span&gt; e irá gerar um terceiro arquivo chamado pt.utf-8.spl.&lt;br /&gt;&lt;br /&gt;4 - Crie a pasta &lt;span style="font-style: italic;"&gt;~/.vim/spell&lt;/span&gt;, se a mesma ainda não existir.&lt;br /&gt;&lt;br /&gt;5 - Copie o arquivo &lt;span style="font-style: italic;"&gt;pt.utf-8.spl&lt;/span&gt; para &lt;span style="font-style: italic;"&gt;~/.vim/spell&lt;/span&gt; ou &lt;span style="font-style: italic;"&gt;$VIMRUNTIME/spell&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Agora Tu tens duas opções para utilizar a verificação ortográfica:&lt;br /&gt;&lt;br /&gt;1. tu podes habilitá-la quando necessário, digitando no modo de comando:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;:set spell &amp;lt;ENTER&amp;gt;&lt;br /&gt;:set spelllang=pt &amp;lt;ENTER&amp;gt;&lt;/pre&gt;2. Tu configuras o arquivo &lt;span style="font-style: italic;"&gt;.vimrc&lt;/span&gt; para que a correção esteja habilitada o tempo todo, acrescentando as linhas abaixo&lt;br /&gt;&lt;br /&gt;e a desabilita quando não quiseres utilizá-la, digitando no modo de comando&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;:set nospell&lt;/pre&gt;Para reabilitar a verificação ortográfica, basta digitar no modo de comando&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;:set spell &amp;lt;ENTER&amp;gt;&lt;/pre&gt;Pronto. O Vim já está apto a usar o dicionário com a nova ortografia que emprestamos do Vero / &lt;a href="http://www.submarino.com.br/busca?q=broffice&amp;amp;dep=1&amp;amp;x=0&amp;amp;y=0?franq=276355"&gt;BrOffice&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Outra coisa que podes fazer é utilizar o dicionário como fonte das palavras sugeridas no autocompletar.&lt;br /&gt;&lt;br /&gt;Podes digitar no modo de comando&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;set complete+=kspell &amp;lt;ENTER&amp;gt;&lt;/pre&gt;ou incluí-la no &lt;span style="font-style: italic;"&gt;.vimrc&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-8053189769444733757?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/myQeOABKoFZdeQI5jeqx6ytbCz8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/myQeOABKoFZdeQI5jeqx6ytbCz8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/myQeOABKoFZdeQI5jeqx6ytbCz8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/myQeOABKoFZdeQI5jeqx6ytbCz8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/ffqy5XBCopo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/ffqy5XBCopo/vim-usando-o-corretor-ortografico-vero.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_f3tH_0i5uB0/SgCh4PszpqI/AAAAAAAAEck/OMteW3d1wDo/s72-c/vim_vero_folders.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/05/vim-usando-o-corretor-ortografico-vero.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-9147438635335991256</guid><pubDate>Wed, 15 Apr 2009 17:29:00 +0000</pubDate><atom:updated>2009-04-16T23:12:35.180-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">português</category><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>13 passos simples para termos o Django no Google App Engineprot</title><description>Este sensacional tutorial é uma tradução do artigo &lt;a href="http://thomas.broxrost.com/2008/04/08/django-on-google-app-engine/"&gt;Django on Google App Engine in 13 simple steps&lt;/a&gt;, escrito por &lt;a href="http://thomas.broxrost.com/"&gt;Thomas Brox Røst&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Neste tutorial eu mostrarei como ter uma aplicação simples com acesso a banco de dados usando &lt;a href="http://compare.buscape.com.br/categoria?id=3482&amp;amp;lkout=1&amp;amp;kw=django&amp;amp;site_origem=1292979"&gt;Django&lt;/a&gt; e rodando no &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;. Assumirei que você tem alguma familiaridade com o &lt;a href="http://compare.buscape.com.br/categoria?id=3482&amp;amp;lkout=1&amp;amp;kw=django&amp;amp;site_origem=1292979"&gt;Django&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Passo 1&lt;/span&gt;: Registre um nome de aplicativo e instale o kit de desenvolvimento seguindo as&lt;a href="http://code.google.com/appengine/docs/python/gettingstarted/devenvironment.html"&gt; instruções do site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Passo 2&lt;/span&gt;: Crie um diretório para o seu aplicativo - Para este tutorial meu aplicativo chama-se mashname:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;tmp$ mkdir mashname&lt;br /&gt;tmp$ cd mashname&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-style: italic;"&gt;Passo 3&lt;/span&gt;: Adicione um arquivo chamado main.py no seu novo diretório:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;# main.py&lt;br /&gt;&lt;br /&gt;import os, sys&lt;br /&gt;os.environ["DJANGO_SETTINGS_MODULE"] = "mashname.settings"&lt;br /&gt;sys.path.append("/home/brox/tmp/mashname")&lt;br /&gt;&lt;br /&gt;# Google App Engine imports.&lt;br /&gt;from google.appengine.ext.webapp import util&lt;br /&gt;&lt;br /&gt;# Force Django to reload its settings.&lt;br /&gt;from django.conf import settings&lt;br /&gt;settings._target = None&lt;br /&gt;&lt;br /&gt;import django.core.handlers.wsgi&lt;br /&gt;import django.core.signals&lt;br /&gt;import django.db&lt;br /&gt;import django.dispatch.dispatcher&lt;br /&gt;&lt;br /&gt;# Log errors.&lt;br /&gt;#django.dispatch.dispatcher.connect(&lt;br /&gt;#   log_exception, django.core.signals.got_request_exception)&lt;br /&gt;&lt;br /&gt;# Unregister the rollback event handler.&lt;br /&gt;django.dispatch.dispatcher.disconnect(&lt;br /&gt;django.db._rollback_on_exception,&lt;br /&gt;django.core.signals.got_request_exception)&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt; # Create a Django application for WSGI.&lt;br /&gt; application = django.core.handlers.wsgi.WSGIHandler()&lt;br /&gt;&lt;br /&gt; # Run the WSGI CGI handler with that application.&lt;br /&gt; util.run_wsgi_app(application)&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;main()&lt;br /&gt;&lt;/pre&gt;Este é basicamente o mesmo arquivo sugerido, exceto pelo caminho do &lt;a href="http://compare.buscape.com.br/categoria?id=3482&amp;amp;lkout=1&amp;amp;kw=python&amp;amp;site_origem=1292979"&gt;Python&lt;/a&gt; que eu tive que configurar para poder fazer os testes localmente. Eu também tive que configurar a variável &lt;span style="font-weight: bold;"&gt;DJANGO_SETTINGS_MODULE&lt;/span&gt; - pode ser que este passo seja desnecessário quando o aplicativo estiver executando no App Engine. Eu tive que desabilitar o log de erros, os quais eu não consegui fazer funcionar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Passo 4&lt;/span&gt;: Adicione um arquivo chamado app.yaml ao mesmo diretório com o conteúdo abaixo:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;application: mashname&lt;br /&gt;version: 1&lt;br /&gt;runtime: python&lt;br /&gt;api_version: 1&lt;br /&gt;&lt;br /&gt;handlers:&lt;br /&gt;- url: /.*&lt;br /&gt;script: main.py&lt;br /&gt;&lt;/pre&gt;Assegure-se de usar o nome correto do aplicativo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Passo 5&lt;/span&gt;: Do seu diretório mashname, crie um novo projeto do &lt;a href="http://compare.buscape.com.br/categoria?id=3482&amp;amp;lkout=1&amp;amp;kw=django&amp;amp;site_origem=1292979"&gt;Django&lt;/a&gt;:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;tmp/mashname$ django-admin.py startproject mashname&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(Estou assumindo que o seu diretório do &lt;a href="http://compare.buscape.com.br/categoria?id=3482&amp;amp;lkout=1&amp;amp;kw=django&amp;amp;site_origem=1292979"&gt;Django&lt;/a&gt; está configurado e funcionando como deveria.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Passo 6&lt;/span&gt;: Agora você deveria poder testar seu aplicativo:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;tmp/mashname$ cd ..&lt;br /&gt;tmp$ dev_appserver.py mashname&lt;br /&gt;INFO     2008-04-08 19:08:10,023 appcfg.py] Checking for updates to the SDK.&lt;br /&gt;INFO     2008-04-08 19:08:10,384 appcfg.py] The SDK is up to date.&lt;br /&gt;INFO     2008-04-08 19:08:10,404 dev_appserver_main.py] Running application mash&lt;br /&gt;name on port 8080: http://localhost:8080&lt;br /&gt;&lt;/pre&gt;Aponte o seu browser para o endereço http://127.0.0.1:8080/ e você deverá ver a mensagem padrão do &lt;a href="http://compare.buscape.com.br/categoria?id=3482&amp;amp;lkout=1&amp;amp;kw=django&amp;amp;site_origem=1292979"&gt;Django&lt;/a&gt; "&lt;span style="font-style: italic;"&gt;It worked!&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Passo 7&lt;/span&gt;: Crie um aplicativo &lt;a href="http://compare.buscape.com.br/categoria?id=3482&amp;amp;lkout=1&amp;amp;kw=django&amp;amp;site_origem=1292979"&gt;Django&lt;/a&gt; dentro do projeto:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;tmp$ cd mashname&lt;br /&gt;tmp/mashname$ python mashname/manage.py startapp main&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-style: italic;"&gt;Passo 8&lt;/span&gt;: Agora é hora de adicionarmos um modelo. Nós criaremos um aplicativo simples que loga todos os visitantes em uma base de dados e exibe seus endereços IP. Edite o arquivo ~/mashname/mashname/main/models.py para que ele se pareça com isso:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;# models.py&lt;br /&gt;&lt;br /&gt;from google.appengine.ext import db&lt;br /&gt;&lt;br /&gt;class Visitor(db.Model):&lt;br /&gt;  ip = db.StringProperty()&lt;br /&gt;  added_on = db.DateTimeProperty(auto_now_add=True)&lt;br /&gt;&lt;/pre&gt;Não há necessidade de sincronizarmos o banco de dados uma vez que não estaremos usando os modelos do próprio &lt;a href="http://compare.buscape.com.br/categoria?id=3482&amp;amp;lkout=1&amp;amp;kw=django&amp;amp;site_origem=1292979"&gt;Django&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Passo 9&lt;/span&gt;: Agora nós criaremos uma view que é responsável tanto por adicionar os dados ao modelo Visitor quanto por mostrar os visitantes anteriores. Edite o arquivo views.py (no mesmo diretório em que está o arquivo models.py) de modo que ele faça o que queremos:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;# views.py&lt;br /&gt;&lt;br /&gt;from django.http import HttpResponse&lt;br /&gt;&lt;br /&gt;from mashname.main.models import Visitor&lt;br /&gt;&lt;br /&gt;def main(request):&lt;br /&gt;  visitor = Visitor()&lt;br /&gt;  visitor.ip = request.META["REMOTE_ADDR"]&lt;br /&gt;  visitor.put()&lt;br /&gt;&lt;br /&gt;  result = ""&lt;br /&gt;  visitors = Visitor.all()&lt;br /&gt;  visitors.order("-added_on")&lt;br /&gt;&lt;br /&gt;  for visitor in visitors.fetch(limit=40):&lt;br /&gt;      result += visitor.ip + u" visited on " + unicode(visitor.added_on) + u""&lt;br /&gt;&lt;br /&gt;  return HttpResponse(result)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Passo 10&lt;/span&gt;: Finalmente, faça com que o seu arquivo urls.py aponte para a view:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;# urls.py&lt;br /&gt;&lt;br /&gt;from django.conf.urls.defaults import *&lt;br /&gt;&lt;br /&gt;urlpatterns = patterns("",&lt;br /&gt;  (r"^$", "mashname.main.views.main"),&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-style: italic;"&gt;Passo 11&lt;/span&gt;: Teste o seu aplicativo (do mesmo modo que foi feito no passo 6) e tudo deveria funcionar perfeitamente. A cada vez que a página for recarregada uma nova entrada será adicionada ao modelo Visitor model e será exibido na view.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Passo 12&lt;/span&gt;: Faça o upload do seu aplicativo para o Google App Engine:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;tmp$ appcfg.py update mashname&lt;br /&gt;&lt;/pre&gt;Na primeira vez em que o upload for feito, você terá que informar seu e-mail e sua senha do google.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Passo 13&lt;/span&gt;: Divirta-se! Para ver o resultado final, vá para &lt;a href="http://mashname.appspot.com/"&gt;http://mashname.appspot.com/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-9147438635335991256?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6QSpz8ewEQINdu57rvtkIViHEeQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6QSpz8ewEQINdu57rvtkIViHEeQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6QSpz8ewEQINdu57rvtkIViHEeQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6QSpz8ewEQINdu57rvtkIViHEeQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/c41mqRAtA5Y" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/c41mqRAtA5Y/13-passos-simples-para-termos-o-django.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/04/13-passos-simples-para-termos-o-django.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-9197410476718269457</guid><pubDate>Wed, 15 Apr 2009 01:54:00 +0000</pubDate><atom:updated>2009-04-14T23:55:04.318-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">português</category><category domain="http://www.blogger.com/atom/ns#">mysql</category><title>Resolvendo erro de conexao no MySQL</title><description>Um caso muito comum para quem vai usar o mysql é: criar o banco de dados, criar o usuário que terá acesso aos objetos desta base e por fim dar as permissões de acesso ao mesmo.&lt;br /&gt;&lt;br /&gt;Aí, ao tentarmos conectar na base não conseguimos e o mysql exibe o erro&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;ERROR 1045 (28000): Access denied for user 'dbuser'@'localhost' (using password: YES)&lt;br /&gt;&lt;/pre&gt;ou&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;ERROR 1045 (28000): Access denied for user 'dbuser'@'localhost' (using password: NO)&lt;br /&gt;&lt;/pre&gt;dependendo de termos fornecido ou não uma senha para o usuário.&lt;br /&gt;&lt;br /&gt;Com o resolver isso?&lt;br /&gt;&lt;br /&gt;Supondo que a base seja a &lt;span style="font-style: italic;"&gt;dbtest&lt;/span&gt; e que o usuário do banco se chame &lt;span style="font-style: italic;"&gt;dbuser&lt;/span&gt;. Provavelmente tu o criaste assim:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;&lt;br /&gt;SET PASSWORD FOR dbuser = PASSWORD("dbpassword");&lt;br /&gt;&lt;/pre&gt;E aí tu deste os direitos de acesso à base desse jeito:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;GRANT ALL PRIVILEGES ON dbtest.* TO dbuser IDENTIFIED BY 'dbpassword';&lt;br /&gt;&lt;/pre&gt;O problema é que para que o usuário se conecte a partir do um host qualquer, tu deves explicitamente fornecer permissões à ele.&lt;br /&gt;&lt;br /&gt;Ou seja, as permissões de acesso devem ser dadas por host. Todos os acessos a partir de endereços que não tenham sido explicitamente permitidos serão negados.&lt;br /&gt;&lt;br /&gt;Assim, para permitir que o usuário dbuser se conecte ao banco a partir do computador local (localhost), o comando a ser dado é:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;GRANT ALL PRIVILEGES ON dbtest.* to dbuser@&lt;span style="font-weight: bold;"&gt;localhost&lt;/span&gt; identified by "dbpassword";&lt;br /&gt;&lt;/pre&gt;ou&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;GRANT ALL PRIVILEGES ON dbtest.* to dbuser@&lt;span style="font-weight: bold;"&gt;localhost&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;dependendo do fato do usuário ter senha ou não.&lt;br /&gt;&lt;br /&gt;Tu podes obter mais informações sobre como usar o mysql com qualquer um destes &lt;a href="http://www.submarino.com.br/busca?q=mysql&amp;amp;dep=1&amp;amp;x=0&amp;amp;y=0/?franq=276355"&gt;livros aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Agora, se for para comprar apenas um livro, o que vai responder a &lt;span style="font-weight: bold;"&gt;TODAS&lt;/span&gt; as tuas dúvidas, recomendo o &lt;a href="http://www.submarino.com.br/produto/1/176387/mysql:+a+biblia/?franq=276355"&gt;&lt;span style="font-weight: bold;"&gt;MySQL: a Bíblia&lt;/span&gt;, do Steve Suehring&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Espero que este artigo te ajude.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-9197410476718269457?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pHzH7e9NLcH3jycmAVNFPhDvUjk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pHzH7e9NLcH3jycmAVNFPhDvUjk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pHzH7e9NLcH3jycmAVNFPhDvUjk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pHzH7e9NLcH3jycmAVNFPhDvUjk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/2JH3eMtWuQg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/2JH3eMtWuQg/resolvendo-erro-de-conexao-no-mysql.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/04/resolvendo-erro-de-conexao-no-mysql.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-7395827800911348213</guid><pubDate>Tue, 14 Apr 2009 14:06:00 +0000</pubDate><atom:updated>2009-04-14T12:02:08.278-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mutt</category><category domain="http://www.blogger.com/atom/ns#">português</category><title>Usando Mutt com GMail</title><description>&lt;a type="amzn" search="Gmail" category="books"&gt;O Gmail&lt;/a&gt; é o melhor serviço de e-mail e o Firefox é o melhor browser. Mas, se tu mantiveres a página do Gmail aberta por um longo período, o &lt;a type="amzn" search="firefox" category="books"&gt;Firefox&lt;/a&gt; consumirá muita memória do teu computador.&lt;br /&gt;&lt;br /&gt;Se tu tens uma máquina antiga como a minha, tu sabes que cada byte é importante. Assim, eu decidi voltar a usar meu antigo cliente de e-mail: &lt;a type="amzn" search="mutt email client" category="books"&gt;mutt&lt;/a&gt; (&lt;a href="http://www.mutt.org/"&gt;http://www.mutt.org/&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Aqui eu mostro os passos que tu precisas fazer para que o mutt possa acessar o &lt;a type="amzn" search="Gmail" category="books"&gt;Gmail&lt;/a&gt; usando o protocolo &lt;a type="amzn" search="imap" category="books"&gt;IMAP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Eu estou usando o &lt;a type="amzn" search="ubuntu" category="books"&gt;Ubuntu&lt;/a&gt; 7.04 com o &lt;a type="amzn" search="mutt email client" category="books"&gt;mutt&lt;/a&gt; 1.5.13, mas o que for dito aqui deve funcionar com qualquer distribuição.&lt;br /&gt;&lt;br /&gt;Tu deves substituir &lt;span style="font-style: italic; font-weight: bold;"&gt;meu_email@gmail.com&lt;/span&gt; e &lt;span style="font-style: italic; font-weight: bold;"&gt;minha_senha&lt;/span&gt; com o teu e-mail e senha do GMail.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Primeiro tu tens que habilitar o acesso via &lt;a type="amzn" search="imap" category="books"&gt;IMAP &lt;/a&gt;para a tua conta do &lt;a type="amzn" search="gmail" category="books"&gt;Gmail&lt;/a&gt;. Para habilitar o IMAP faça assim:&lt;br /&gt;1.1. &lt;span style="font-style: italic;"&gt;Logue&lt;/span&gt; na tua conta do &lt;a type="amzn" search="gmail" category="books"&gt;Gmail&lt;/a&gt;.&lt;br /&gt;1.2. Clique em &lt;span style="font-style: italic;"&gt;Configurações&lt;/span&gt; no topo da página do Gmail.&lt;br /&gt;1.3. Clique &lt;span style="font-style: italic;"&gt;Encaminhamento &lt;/span&gt;&lt;a style="font-style: italic;" type="amzn" search="pop3" category="books"&gt;POP&lt;/a&gt;&lt;span style="font-style: italic;"&gt;/&lt;/span&gt;&lt;a style="font-style: italic;" type="amzn" search="imap" category="books"&gt;IMAP&lt;/a&gt;.&lt;br /&gt;1.4. Selecione &lt;span style="font-style: italic;"&gt;Ativar &lt;/span&gt;&lt;a style="font-style: italic;" type="amzn" search="imap" category="books"&gt;IMAP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Instale o &lt;a type="amzn" search="mutt email client" category="books"&gt;mutt&lt;/a&gt;,  o msmtp and o ssl. Não vou mostrar como fazer isso porque este passo é diferente para cada distribuição.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Crie o arquivo de configuração do msmtp (~/.msmtprc) como mostrado abaixo:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;account default&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;host smtp.gmail.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;port 587&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;from &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;meu_email@gmail.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;tls on&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;tls_starttls on&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;auth on&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;user &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;meu_email@gmail.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;password &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;minha_senha&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;logfile ~/.msmtp.log&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create &lt;a type="amzn" search="mutt email client" category="books"&gt;mutt&lt;/a&gt; configuration file (~/.muttrc) as shown:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set imap_user = "&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;meu_email@gmail.com&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set imap_pass = "&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;minha_senha&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set from = "&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;meu_email@gmail.com&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set realname = "Teu Nome verdadeiro"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set folder = "imaps://imap.gmail.com:993"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set spoolfile = imaps://imap.gmail.com:993/INBOX&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set record=""&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set postponed="imaps://imap.gmail.com/[Gmail]/Drafts"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set header_cache="~/.mutt/cache/headers"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set message_cachedir="~/.mutt/cache/bodies"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set certificate_file=~/.mutt/certificates&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set move = no&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set imap_check_subscribed="yes"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set imap_list_subscribed="yes"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set mbox="imaps://imap.gmail.com/[Gmail]/All Mail"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# esta linha instrui o mutt a fazer o &lt;span style="font-style: italic;"&gt;refresh&lt;/span&gt; da minha caixa de entrada a cada 60 segundos&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set mail_check=60&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#Estou usando o &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;character&lt;/span&gt; &lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;^&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;  para dizer para o mutt atualizar imediatamente a lista de e-mails.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bind index "^" imap-fetch-mail&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Isso é tudo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-7395827800911348213?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-qqx3fFdy8HXMUAcZqPlK8KnZOA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-qqx3fFdy8HXMUAcZqPlK8KnZOA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-qqx3fFdy8HXMUAcZqPlK8KnZOA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-qqx3fFdy8HXMUAcZqPlK8KnZOA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/VYPWebP9aFs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/VYPWebP9aFs/usando-mutt-com-gmail.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/04/usando-mutt-com-gmail.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-4667020071808404926</guid><pubDate>Mon, 06 Apr 2009 13:19:00 +0000</pubDate><atom:updated>2009-04-06T13:24:17.025-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">português</category><category domain="http://www.blogger.com/atom/ns#">engenharia</category><category domain="http://www.blogger.com/atom/ns#">matlab</category><title>Organize os seus modelos no Simulink</title><description>No post &lt;a href="http://marcioandreyoliveira.blogspot.com/2009/03/como-gerar-diagramas-de-bode-sem-contas.html"&gt;Como gerar Diagramas de Bode sem fazer contas no MATLAB&lt;/a&gt; eu mostrei uma das inúmeras facilidades que esta ferramenta nos fornece. Neste, vou mostrar como podes tornar teu modelo mais organizado com o uso de blocos.&lt;br /&gt;&lt;br /&gt;Não fui claro? Então deixe-me explicar melhor.&lt;br /&gt;&lt;br /&gt;Durante o desenvolvimento dos nossos modelos no Simulink, junto com o progresso da modelagem ocorre o progresso na bagunça.&lt;br /&gt;&lt;br /&gt;Por exemplo, a figura 1 ilustra um modelo de tanque com medidor de volume desperdiçado (líquido que vazou).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_f3tH_0i5uB0/SdoNSbwr1gI/AAAAAAAAEa0/bJAKRVTHhvo/s1600-h/organizaBlocos_01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 224px;" src="http://1.bp.blogspot.com/_f3tH_0i5uB0/SdoNSbwr1gI/AAAAAAAAEa0/bJAKRVTHhvo/s320/organizaBlocos_01.png" alt="" id="BLOGGER_PHOTO_ID_5321580520032425474" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 1 - Diagrama com múltiplos blocos&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Este diagrama, apesar de pequeno, mostra vários blocos (8, para ser mais exato). Como poderíamos tornar este modelo mais legível?&lt;br /&gt;&lt;br /&gt;Simples. Vamos agrupar os blocos que correspondem a uma única função em uma única caixa.&lt;br /&gt;&lt;br /&gt;No exemplo acima, os blocos &lt;span style="font-style: italic;"&gt;Integrador&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;somador&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Volume Total do Tanque&lt;/span&gt; e o &lt;span style="font-style: italic;"&gt;bloco limitador&lt;/span&gt; formam, na realidade, um &lt;span style="font-style: italic;"&gt;totalizador de vazão&lt;/span&gt;. Então, nada mais  natural que representá-los como um único equipamento.&lt;br /&gt;&lt;br /&gt;Para fazer isso, deves proceder assim:&lt;br /&gt;&lt;br /&gt;1 - selecione os blocos que queres transformar um uma única caixa&lt;br /&gt;2 - clique com o botão direito do mouse sobre qualquer um dos componentes selecionados. Abrirá um popup com várias ações.&lt;br /&gt;3 - Selecione a opção Create Subsystem (ver figura 2).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_f3tH_0i5uB0/SdoSusqzGjI/AAAAAAAAEa8/Ci8H214eJ20/s1600-h/organizaBlocos_02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 226px;" src="http://2.bp.blogspot.com/_f3tH_0i5uB0/SdoSusqzGjI/AAAAAAAAEa8/Ci8H214eJ20/s320/organizaBlocos_02.png" alt="" id="BLOGGER_PHOTO_ID_5321586503165614642" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 2 - Selecionando objetos para gerar o bloco equivalente.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;No lugar de todos aqueles blocos selecionados aparecerá um único, conforme mostrado na figura 3.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_f3tH_0i5uB0/SdoS_pn0jzI/AAAAAAAAEbE/W8vfvIzOQEY/s1600-h/organizaBlocos_03.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 224px;" src="http://3.bp.blogspot.com/_f3tH_0i5uB0/SdoS_pn0jzI/AAAAAAAAEbE/W8vfvIzOQEY/s320/organizaBlocos_03.png" alt="" id="BLOGGER_PHOTO_ID_5321586794405596978" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figura 3 - Bloco equivalente após a criação do subsistema.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Na figura 3 podemos ver que a  entrada e a saída do bloco chamam-se, respectivamente, In1 e Out1 (se houvesse mais de uma entrada e/ou saída, teríamos In2, In3,... e Out2, Out3, ...).&lt;br /&gt;&lt;br /&gt;Ok. Para tornar mais intuitivo o que este bloco equivalente representa, vamos fazer mais algumas modificações no modelo:&lt;br /&gt;&lt;br /&gt;1 - renomearemos o bloco de Subsystem para algo que represente melhor o que ele faz. Para isso, clique sobre o texto Subsystem e o substitua por &lt;span style="font-style: italic;"&gt;Totalizador de Vazão&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;2 - In1 e Out1 não dizem muita coisa. Vamos renomeá-los para algo que tenha algum significado para nós.  Dê um duplo clique sobre o bloco que acabamos de criar. Abrirá uma janela mostrando seu &lt;span style="font-style: italic;"&gt;interior&lt;/span&gt;, ou seja, os blocos que o constituem. A figura 4 ilustra o que acabei de dizer.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_f3tH_0i5uB0/SdoUDuZKhTI/AAAAAAAAEbM/UO1oG42HuYU/s1600-h/organizaBlocos_04.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 186px;" src="http://1.bp.blogspot.com/_f3tH_0i5uB0/SdoUDuZKhTI/AAAAAAAAEbM/UO1oG42HuYU/s320/organizaBlocos_04.png" alt="" id="BLOGGER_PHOTO_ID_5321587963917403442" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 4 - Vista explodida do bloco Totalizador de Vazão.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Agora é só clicar sobre os textos In1 e Out1 e substituí-los por outro texto do teu interesse. Eu vou renomear In1 para &lt;span style="font-style: italic;"&gt;Qe&lt;/span&gt; (vazão de entrada) e Out1 para &lt;span style="font-style: italic;"&gt;Volume_Vazamento&lt;/span&gt;.  A figura 5 mostra o resultado final.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_f3tH_0i5uB0/SdoXXiwYo4I/AAAAAAAAEbU/YCZTYNoGPP8/s1600-h/organizaBlocos_05.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 224px;" src="http://3.bp.blogspot.com/_f3tH_0i5uB0/SdoXXiwYo4I/AAAAAAAAEbU/YCZTYNoGPP8/s320/organizaBlocos_05.png" alt="" id="BLOGGER_PHOTO_ID_5321591602925839234" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 5 - Modelo simplificado&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Para um projeto pequeno como o demostrado neste artigo, o trabalho parece não valer a pena. mas acredite, conforme tu fores melhorando teu modelo, mais e mais blocos surgirão. Aí sim verás a necessidade e a utilidade desta técnica.&lt;br /&gt;&lt;br /&gt;O melhor de tudo é que podes continuar com este processo indefinidamente, fazendo com que os blocos gerados sejam agrupados em outros blocos, reduzindo ainda mais o circuito.&lt;br /&gt;&lt;br /&gt;Do mesmo modo que no post &lt;a href="http://marcioandreyoliveira.blogspot.com/2009/03/como-gerar-diagramas-de-bode-sem-contas.html"&gt;Como gerar Diagramas de Bode sem fazer contas no MATLAB&lt;/a&gt;, recomendo que leias pelo menos um dos livros abaixo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.submarino.com.br/produto/1/202518/programacao+em+matlab+para+engenheiros/?franq=276355"&gt;Programação em Matlab para Engenheiros - Stephen J. Chapman&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.submarino.com.br/produto/1/1519599/matlab+com+aplicacoes+em+engenharia/?franq=276355"&gt;Matlab com Aplicações em Engenharia - Amos Gilat&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.submarino.com.br/produto/1/253138/matlab+7:+fundamentos/?franq=276355"&gt;Matlab 7: Fundamentos - Elia Yathie Matsumoto&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-4667020071808404926?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wZaU9jAnqNOvEgTYFE2E4Hbzy-0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wZaU9jAnqNOvEgTYFE2E4Hbzy-0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wZaU9jAnqNOvEgTYFE2E4Hbzy-0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wZaU9jAnqNOvEgTYFE2E4Hbzy-0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/4G62hxY8fNg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/4G62hxY8fNg/organize-os-seus-modelos-no-simulink.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_f3tH_0i5uB0/SdoNSbwr1gI/AAAAAAAAEa0/bJAKRVTHhvo/s72-c/organizaBlocos_01.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/04/organize-os-seus-modelos-no-simulink.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-3404931744681229569</guid><pubDate>Thu, 26 Mar 2009 16:48:00 +0000</pubDate><atom:updated>2009-03-29T21:27:38.124-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">português</category><category domain="http://www.blogger.com/atom/ns#">j2me</category><title>Tamanho das janelas no MIDP1 e MIDP2</title><description>Na empresa que trabalho nós fizemos um software que deveria rodar em celulares. Havia duas restrições:&lt;br /&gt;&lt;br /&gt;- uma delas é que o código deveria rodar em celulares com MIDP1 e MIDP2. A outra é que o código deveria ser único para ambas as especificações.&lt;br /&gt;&lt;br /&gt;No desenvolvimento do programa nós usamos Canvas para criar as nossas próprias telas, pois isso nos dá mais flexibilidade quanto ao layout do aplicativo.&lt;br /&gt;&lt;br /&gt;Para que os componentes sempre sejam desenhados proporcionalmente ao tamanho da tela do celular (que varia muito de modelo para modelo), nós usamos duas funções da API para obtermos a largura e a altura da tela: &lt;span style="font-style: italic;"&gt;getWidth()&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;GetHeight()&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ok. Testamos em vários aparelhos e nos aparelhos MIDP1 o aplicativo gerava a exceção&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;No such method getWidth() &lt;/span&gt;(e pode gerar, dependendo de quem é chamado primeiro, o erro &lt;span style="font-style: italic;"&gt;No such method getHeight()&lt;/span&gt;) e &lt;span style="font-style: italic;"&gt;morria:&lt;/span&gt; Os métodos getWidth() e getHeight() não existiam.&lt;br /&gt;&lt;br /&gt;Como não? Estes métodos estão nas duas especificações. Fui examinar as APIs e descobri que, apesar de existirem, elas ficavam em hierarquias diferentes, dependendo da especificação.&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;java.lang.Object&lt;br /&gt;extended by javax.microedition.lcdui.Displayable&lt;br /&gt;extended by javax.microedition.lcdui.Canvas&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 1 - Hierarquia das classes Displayable e Canvas&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;No MIDP1, os métodos estão na classe Canvas e no MIDP2 estão em em Displayable.&lt;br /&gt;&lt;br /&gt;Quando compilas usando as bibliotecas do MIDP2, o compilador automaticamente chama os métodos getWidth() e getHeight() de Displayable. Daí, ao rodarmos o aplicativo no celular com MIDP1, a JVM procura pelos métodos em Canvas, não os encontra e o aplicativo morre.&lt;br /&gt;&lt;br /&gt;Agora a dúvida: como resolver isso?&lt;br /&gt;&lt;br /&gt;Nossa classe base de desenho de telas (herda de Canvas) chama-se FormBase. Nela nós criamos  os métodos&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;&lt;br /&gt;public int getWidth()  {&lt;br /&gt;return super.getWidth();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int getHeight()  {&lt;br /&gt;return super.getWidth();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Isso obriga o compilador a chamar o método Canvas.getWidth() e Canvas.getHeight().&lt;br /&gt;&lt;br /&gt;E como isto resolve o problema?&lt;br /&gt;&lt;br /&gt;Quando estiver executando o aplicativo em um celular MIDP1, Canvas&lt;span style="font-weight: bold;"&gt; &lt;span style="font-style: italic;"&gt;possui&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;rá&lt;/span&gt; os métodos acima. Quando o aplicativo estiver executando  em um celular MIDP2, Canvas &lt;span style="font-weight: bold; font-style: italic;"&gt;não&lt;/span&gt; os possuirá. Aí serão chamados os métodos públicos herdados de Displayable.&lt;br /&gt;&lt;br /&gt;Voilà! Resolvido o nosso problema de compatibilidade.&lt;br /&gt;&lt;br /&gt;A hierarquia de classes do nosso programa é o mostrada na figura 2.&lt;br /&gt;&lt;br /&gt;Eu recomendo que tu leias pelo menos um destes dois livros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.submarino.com.br/produto/1/233177/core+j2me:+tecnologia+e+midp/?franq=276355"&gt;&lt;span style="font-weight: bold;"&gt;Core J2ME: Tecnologia e MIDP&lt;/span&gt; - J. W. Muchow&lt;/a&gt; (português)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.submarino.com.br/produto/9/447978/enterprise+j2me/?franq=276355"&gt;&lt;b&gt;Enterprise J2ME&lt;/b&gt; - Yuan, Michael Juntao&lt;/a&gt; (inglês)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Espero que ajude.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_f3tH_0i5uB0/Scvwty5x7PI/AAAAAAAAEZc/cCWJs2CLZ0M/s1600-h/getWidthmidp1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 241px; height: 320px;" src="http://2.bp.blogspot.com/_f3tH_0i5uB0/Scvwty5x7PI/AAAAAAAAEZc/cCWJs2CLZ0M/s320/getWidthmidp1.png" alt="" id="BLOGGER_PHOTO_ID_5317608454589902066" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 2 - Hierarquia do programa para rodar em MIDP1 e MIDP2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;iframe src="http://www.google.com/search?lookitup&amp;amp;q=define:da%20tela&amp;amp;css=div#guser,body%3Ecenter%7Bdisplay:none%7D&amp;amp;xremove=/html/body/table%5Bposition%28%29%3C=3%5D" style="border: 1px solid black; width: 460px; height: 100%; top: 0px; right: 0px; padding-left: 0px; position: fixed; background-color: white; z-index: 1000; display: none;" id="ResultBox5"&gt;&lt;/iframe&gt;&lt;iframe src="http://www.thefreedictionary.com/dict.asp?Word=temos#lookitup%21xcrop=#MainTxt%7C#TDTotalBrowser" style="border: 1px solid black; width: 460px; height: 100%; top: 0px; right: 0px; padding-left: 0px; position: fixed; background-color: white; z-index: 1000; display: none;" id="ResultBox6"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-3404931744681229569?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BKN8-yf6ftwuqzaoP3ubRrH0QXU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BKN8-yf6ftwuqzaoP3ubRrH0QXU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BKN8-yf6ftwuqzaoP3ubRrH0QXU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BKN8-yf6ftwuqzaoP3ubRrH0QXU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/GqEtnsTV4zw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/GqEtnsTV4zw/tamanho-das-janelas-no-midp1-e-midp2.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_f3tH_0i5uB0/Scvwty5x7PI/AAAAAAAAEZc/cCWJs2CLZ0M/s72-c/getWidthmidp1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/03/tamanho-das-janelas-no-midp1-e-midp2.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-288882965886340248</guid><pubDate>Wed, 25 Mar 2009 22:06:00 +0000</pubDate><atom:updated>2009-03-29T21:49:57.222-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">português</category><category domain="http://www.blogger.com/atom/ns#">engenharia</category><category domain="http://www.blogger.com/atom/ns#">matlab</category><title>Como gerar Diagramas de Bode sem fazer contas no MATLAB.</title><description>Suponha que você precise gerar os Diagramas de Bode para uma função qualquer.  Traça-los na mão é muito trabalhoso, chato e sujeito a erros. Existe um modo mais fácil de fazer isso?&lt;br /&gt;&lt;br /&gt;Claro que existe. Tu podes usar o Matlab. O Matlab possui algumas funções que traçam os diagramas de margem e fase. Tu só tens que fornecer a função de transferência.&lt;br /&gt;&lt;br /&gt;Por exemplo, se a tua função de transferência for&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_f3tH_0i5uB0/ScrqtS8vvOI/AAAAAAAAEXM/nINGFChZUd4/s1600-h/ex01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 95px; height: 47px;" src="http://1.bp.blogspot.com/_f3tH_0i5uB0/ScrqtS8vvOI/AAAAAAAAEXM/nINGFChZUd4/s400/ex01.png" alt="" id="BLOGGER_PHOTO_ID_5317320373965929698" border="0" /&gt;&lt;/a&gt;tu podes usar a função Margin(), igual mostrado na figura 1 abaixo.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_f3tH_0i5uB0/ScrsurjELoI/AAAAAAAAEXc/ue5QlH9fetg/s1600-h/margin.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 240px;" src="http://3.bp.blogspot.com/_f3tH_0i5uB0/ScrsurjELoI/AAAAAAAAEXc/ue5QlH9fetg/s400/margin.png" alt="" id="BLOGGER_PHOTO_ID_5317322596772228738" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Figura 1 - Executando a função Margin&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;O Matlab vai gerar o gráfico mostrado na figura 2.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_f3tH_0i5uB0/Scrtnd8MbNI/AAAAAAAAEXk/ABRv4VApPII/s1600-h/grafico_margin.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 279px;" src="http://2.bp.blogspot.com/_f3tH_0i5uB0/Scrtnd8MbNI/AAAAAAAAEXk/ABRv4VApPII/s320/grafico_margin.png" alt="" id="BLOGGER_PHOTO_ID_5317323572372073682" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 2 - Resultado da função Margin&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Legal, não é? Mas e se a função de transferência for mais complexa? Se ela for composta por duas ou mais funções? Por exemplo a mostrada na figura 3?&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_f3tH_0i5uB0/ScruozXGkiI/AAAAAAAAEXs/uW9ttfpXivM/s1600-h/tf01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 169px;" src="http://2.bp.blogspot.com/_f3tH_0i5uB0/ScruozXGkiI/AAAAAAAAEXs/uW9ttfpXivM/s400/tf01.png" alt="" id="BLOGGER_PHOTO_ID_5317324694813577762" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 3 - Função mais complexa para a qual se deseja traçar o Diagrama de Bode&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Simples. Tu podes achar a função equivalente, conforme mostrado na figura 4. Daí nós simplesmente chamamos a função Margin passando a função equivalente, igual fizemos no primeiro exemplo.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_f3tH_0i5uB0/ScrvFPFr4HI/AAAAAAAAEX0/45QiQ2dQSIk/s1600-h/tf02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 169px;" src="http://4.bp.blogspot.com/_f3tH_0i5uB0/ScrvFPFr4HI/AAAAAAAAEX0/45QiQ2dQSIk/s400/tf02.png" alt="" id="BLOGGER_PHOTO_ID_5317325183293055090" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 4 - Função equivalente para a qual se deseja traçar o Diagrama de Bode&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;E se a função for mais complexa ainda. Por exemplo, igual a mostrada na figura 5?&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_f3tH_0i5uB0/ScrwZ4hpWdI/AAAAAAAAEX8/h3L-VZLqKss/s1600-h/tf03.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 155px;" src="http://1.bp.blogspot.com/_f3tH_0i5uB0/ScrwZ4hpWdI/AAAAAAAAEX8/h3L-VZLqKss/s400/tf03.png" alt="" id="BLOGGER_PHOTO_ID_5317326637525195218" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 5 - Exemplo de função mais complexa&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Simples. Podemos achar a função equivalente dela, igual fizemos no exemplo anterior.&lt;br /&gt;&lt;br /&gt;O problema com essa abordagem é que, além de trabalhosa, demorada e sujeita a erros, nem sempre é viável acharmos a função equivalente "na unha".&lt;br /&gt;&lt;br /&gt;Devemos deixar o Matlab trabalhar para nós. Como? Simples (irritante esse negócio de ficar &lt;span&gt;falando &lt;/span&gt;&lt;span style="font-style: italic;"&gt;simples&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;toda hora, não é?). Usaremos a ferramenta do Matlab chamada Simulink.&lt;br /&gt;&lt;br /&gt;Os passos são sempre os mesmos, não importa a complexidade do circuito.&lt;br /&gt;&lt;br /&gt;Suponha que queremos traçar o Diagrama de Bode para o circuito mostrado na figura 5.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;No command Window do Matlab, digite Simulink e tecle ENTER.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Desenhar o circuito / planta para o qual se deseja traçar o Diagrama de Bode (conforme fizemos na figura 5).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Clique com o botão direito do mouse sobre a entrada do sistema e selecione &lt;span style="font-style: italic;"&gt;Linearization Points -&gt; Input Point&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_f3tH_0i5uB0/Scr11nQ2yEI/AAAAAAAAEYE/ZgfcgvaTK5A/s1600-h/input_point.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 379px; height: 400px;" src="http://1.bp.blogspot.com/_f3tH_0i5uB0/Scr11nQ2yEI/AAAAAAAAEYE/ZgfcgvaTK5A/s400/input_point.png" alt="" id="BLOGGER_PHOTO_ID_5317332611485845570" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:85%;"&gt;Figura 6 - Selecionando o ponto de entrada do circuito&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;Aparecerá uma bolinha com uma setinha entrando nela em cima da linha de entrada do sistema. A figura 7 mostra o que estou falando.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_f3tH_0i5uB0/Scr28wQJexI/AAAAAAAAEYU/ZgFwFFkUq7k/s1600-h/entrada_selecionada.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 158px;" src="http://1.bp.blogspot.com/_f3tH_0i5uB0/Scr28wQJexI/AAAAAAAAEYU/ZgFwFFkUq7k/s400/entrada_selecionada.png" alt="" id="BLOGGER_PHOTO_ID_5317333833669507858" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 7 - Seta vermelha mostra a entrada selecionada&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Clique com o botão direito do mouse sobre a saída do sistema e selecione &lt;span style="font-style: italic;"&gt;Linearization Points -&gt; Output Point&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_f3tH_0i5uB0/Scr5FzkiwcI/AAAAAAAAEYs/1xnCFIvSKGc/s1600-h/output_point.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 303px;" src="http://2.bp.blogspot.com/_f3tH_0i5uB0/Scr5FzkiwcI/AAAAAAAAEYs/1xnCFIvSKGc/s400/output_point.png" alt="" id="BLOGGER_PHOTO_ID_5317336188202435010" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 8 - Selecionando o ponto de saída do circuito&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Aparecerá uma bolinha com uma setinha saindo dela em cima da linha de saída do sistema. Veja a figura 9.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_f3tH_0i5uB0/Scr6gY0yo7I/AAAAAAAAEY0/BFskj7owR30/s1600-h/saida_selecionada.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 157px;" src="http://4.bp.blogspot.com/_f3tH_0i5uB0/Scr6gY0yo7I/AAAAAAAAEY0/BFskj7owR30/s400/saida_selecionada.png" alt="" id="BLOGGER_PHOTO_ID_5317337744390923186" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 9 - Seta vermelha mostra a saída selecionada&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Selecione &lt;span style="font-style: italic;"&gt;Tools -&gt; Control Design - Linear Analysis&lt;/span&gt; (veja a figura 10).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_f3tH_0i5uB0/Scr70a5zOiI/AAAAAAAAEY8/FvGNgljOJB4/s1600-h/analise_linear.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 391px; height: 400px;" src="http://1.bp.blogspot.com/_f3tH_0i5uB0/Scr70a5zOiI/AAAAAAAAEY8/FvGNgljOJB4/s400/analise_linear.png" alt="" id="BLOGGER_PHOTO_ID_5317339188057815586" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 10 - Selecionando a análise linear.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Na janela que abrirá, selecione &lt;span style="font-style: italic;"&gt;Bode Response &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Plot&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;no combo box (figura 11).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_f3tH_0i5uB0/Scr9zSOYIII/AAAAAAAAEZE/ttKuocWFKe4/s1600-h/bode_plot_selecionado.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 299px;" src="http://2.bp.blogspot.com/_f3tH_0i5uB0/Scr9zSOYIII/AAAAAAAAEZE/ttKuocWFKe4/s400/bode_plot_selecionado.png" alt="" id="BLOGGER_PHOTO_ID_5317341367571587202" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 11 - Selecionada a análise Bode Response Plot&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Clique no botão Linearize Mode (figura 12).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_f3tH_0i5uB0/Scr_HpKKo5I/AAAAAAAAEZM/K3Bm1JHbzxk/s1600-h/execute_analise.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_f3tH_0i5uB0/Scr_HpKKo5I/AAAAAAAAEZM/K3Bm1JHbzxk/s400/execute_analise.png" alt="" id="BLOGGER_PHOTO_ID_5317342816836952978" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 12 - Selecionar o botão de execução da análise linear.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;Pronto. O Matlab irá gerar o Diagrama de Bode para ti. A figura 13 mostra o resultado.&lt;br /&gt;&lt;br /&gt;A partir de agora, tu nunca mais vais precisar resolver &lt;span style="font-style: italic;"&gt;na mão&lt;/span&gt; as equações. Este método é útil para outros tipos de análise, como o Diagrama de Nyquist, por exemplo.&lt;br /&gt;&lt;br /&gt;O Matlab é uma excelente ferramenta. E, como toda ferramenta, para que possamos aproveitá-la ao máximo, devemos conhecê-la bem.&lt;br /&gt;&lt;br /&gt;Recomendo os três livros a seguir:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.submarino.com.br/produto/1/202518/programacao+em+matlab+para+engenheiros/?franq=276355"&gt;Programação em Matlab para Engenheiros - Stephen J. Chapman&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.submarino.com.br/produto/1/1519599/matlab+com+aplicacoes+em+engenharia/?franq=276355"&gt;Matlab com Aplicações em Engenharia - Amos Gilat&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.submarino.com.br/produto/1/253138/matlab+7:+fundamentos/?franq=276355"&gt;Matlab 7: Fundamentos - Elia Yathie Matsumoto&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Não se impressione com as palavras Engenheiros / Engenharia nos títulos. Tu não precisas ser nem engenheiro nem estudante de engenharia para usá-lo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tudo&lt;/span&gt; que eles ensinam servem &lt;span style="font-weight: bold;"&gt;para todos&lt;/span&gt; que precisem usar o Matlab. Escolha quantos quiser, compre-os e estude-os com afinco. Valerá a pena.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_f3tH_0i5uB0/ScsCrABTDdI/AAAAAAAAEZU/VvIu3EZQm_c/s1600-h/bode_plot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 347px;" src="http://1.bp.blogspot.com/_f3tH_0i5uB0/ScsCrABTDdI/AAAAAAAAEZU/VvIu3EZQm_c/s400/bode_plot.png" alt="" id="BLOGGER_PHOTO_ID_5317346722804075986" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 13 - Diagramas de Bode de Margem e Fase&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-288882965886340248?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rTtrTLTU6xQ_jRWfXgYO213LZ1w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rTtrTLTU6xQ_jRWfXgYO213LZ1w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rTtrTLTU6xQ_jRWfXgYO213LZ1w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rTtrTLTU6xQ_jRWfXgYO213LZ1w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/WIwohCPLgdA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/WIwohCPLgdA/como-gerar-diagramas-de-bode-sem-contas.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_f3tH_0i5uB0/ScrqtS8vvOI/AAAAAAAAEXM/nINGFChZUd4/s72-c/ex01.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/03/como-gerar-diagramas-de-bode-sem-contas.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-1373204516164091325</guid><pubDate>Thu, 29 Jan 2009 01:31:00 +0000</pubDate><atom:updated>2009-03-29T21:50:09.839-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>Wasting time for nothing</title><description>Today I was developing a new project using &lt;a type="amzn" search="django python" category="books"&gt;Django&lt;/a&gt; when I got the following error message:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;File "/home/marcio/prj/py/ProjectManager/partlist/models.py", line 29&lt;br /&gt;  friends = models.ManyToManyField("self", related_name='component_friends', symmetrical=False)&lt;br /&gt;                                                                                              ^&lt;br /&gt;IndentationError: unindent does not match any outer indentation level&lt;br /&gt;marcio@mr02:~/prj/py/ProjectManager$&lt;br /&gt;&lt;/pre&gt;That error was caused by me because I unintentionally mixed tabs and spaces. I know I can't mix them but I did it and I wasted some precious time trying to figure out what was happening.&lt;br /&gt;&lt;br /&gt;So if you see this error you will already know the solution. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-1373204516164091325?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sPIMK-dirYxqeWmJSbuiHDSfXN4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sPIMK-dirYxqeWmJSbuiHDSfXN4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sPIMK-dirYxqeWmJSbuiHDSfXN4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sPIMK-dirYxqeWmJSbuiHDSfXN4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/A_WvsRBKHtM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/A_WvsRBKHtM/wasting-time-for-nothing.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/01/wasting-time-for-nothing.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-5637310819173248202</guid><pubDate>Tue, 20 Jan 2009 18:31:00 +0000</pubDate><atom:updated>2009-03-29T21:50:20.157-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">electronics</category><category domain="http://www.blogger.com/atom/ns#">pic</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>Free magazine about PIC and electronics</title><description>Do you like &lt;a type="amzn" search="electronic circuits" category="books"&gt;electronics&lt;/a&gt;? And what about &lt;a type="amzn" search="pic" category="books"&gt;PIC&lt;/a&gt; microcontrollers?&lt;br /&gt;&lt;br /&gt;Today I am writing to share the URL of an amazing site named &lt;a href="http://www.micropic.es/"&gt;MicroPIC&lt;/a&gt;. This site has many projects and tutorials. There is even a e-magazine named uControl they release for free.&lt;br /&gt;&lt;br /&gt;If you can read Spanish go to &lt;a href="http://www.micropic.es/"&gt;http://www.micropic.es&lt;/a&gt; and enjoy this site. I am pretty sure you will find many interesting things there.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Correction:&lt;/span&gt; I made a mistake when I wrote this post. uControl is not edited by MicroPIC but by a site named &lt;a href="http://www.ucontrol.com.ar/wiki/index.php/Portada"&gt;uControl&lt;/a&gt; (it is written in Spanish too).&lt;br /&gt;&lt;br /&gt;You will see references to the &lt;a href="http://www.ucontrol.com.ar/wiki/index.php/Revista_ucontrol"&gt;e-magazine&lt;/a&gt; on &lt;a href="http://www.micropic.es/"&gt;MicroPIC&lt;/a&gt; but they never claimed to be the authors.&lt;br /&gt;&lt;br /&gt;That said I restate that &lt;a href="http://www.micropic.es/"&gt;MicroPIC&lt;/a&gt; is an amazing site. Moreover, &lt;a href="http://www.ucontrol.com.ar/wiki/index.php/Portada"&gt;uControl&lt;/a&gt; is amazing too.&lt;iframe src="http://en.wikipedia.org/w/index.php?lookitup&amp;amp;title=said%20that%20the%20e-magazine%20named%20belongs&amp;amp;printable=yes&amp;amp;css=div#footer,h3#siteSub,div#contentSub%7Bdisplay:none%7Dh1%7Bfont-size:16px%7Da%7Bcolor:blue%21important%7D&amp;amp;xremove=//div%5B@class=%27infobox%20sisterproject%27%5D" style="border: 1px solid black; width: 460px; height: 100%; top: 0px; right: 0px; padding-left: 0px; position: fixed; background-color: white; z-index: 1000; display: none;" id="ResultBox0"&gt;&lt;/iframe&gt;&lt;iframe src="http://www.urbandictionary.com/define.php?lookitup&amp;amp;term=MicroPIC&amp;amp;xcrop=//div#content&amp;amp;css=div#subnav1,div#footer%7Bdisplay:none%7D" style="border: 1px solid black; width: 672px; height: 100%; top: 0px; right: 0px; padding-left: 0px; position: fixed; background-color: white; z-index: 1000; display: none;" id="ResultBox1"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-5637310819173248202?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xnB832jDIQ1ufCR5ngF9y9mHCJk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xnB832jDIQ1ufCR5ngF9y9mHCJk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xnB832jDIQ1ufCR5ngF9y9mHCJk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xnB832jDIQ1ufCR5ngF9y9mHCJk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/3rVv35wBhrg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/3rVv35wBhrg/free-magazine-about-pic-and-electronics.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/01/free-magazine-about-pic-and-electronics.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-2779703125104200420</guid><pubDate>Tue, 06 Jan 2009 14:52:00 +0000</pubDate><atom:updated>2009-03-29T21:49:36.196-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">vim</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>Vim as the default source code viewer</title><description>I don't like the default source viewer presented by &lt;a type="amzn" search="firefox" category="books"&gt;Firefox&lt;/a&gt;, so I decide to use a good text editor (in fact, I'm using the best one ;).&lt;br /&gt;&lt;br /&gt;First, type &lt;span style="font-style: italic;"&gt;about:config&lt;/span&gt; in the address bar and hit &lt;span style="font-style: italic;"&gt;ENTER&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Next, type &lt;span style="font-style: italic;"&gt;editor&lt;/span&gt; in the filter bar. It will show you only entries with the word &lt;span style="font-style: italic;"&gt;editor&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A double-click on &lt;span style="font-style: italic;"&gt;view_source.editor.path&lt;/span&gt; will open a pop-up window where you must type the full address to your preferred editor: &lt;span style="font-style: italic;"&gt;/usr/bin/gvim&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Then a double-click on &lt;span style="font-style: italic;"&gt;view_source.editor.external&lt;/span&gt; will change its value to true.&lt;br /&gt;&lt;br /&gt;From now on, &lt;a type="amzn" search="Vim" category="books"&gt;GVim&lt;/a&gt; will be used by &lt;a type="amzn" search="firefox" category="books"&gt;Firefox&lt;/a&gt; to show you the page source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-2779703125104200420?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8wesK25bl8dqEPCuuBREJhQgDHs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8wesK25bl8dqEPCuuBREJhQgDHs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8wesK25bl8dqEPCuuBREJhQgDHs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8wesK25bl8dqEPCuuBREJhQgDHs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/BB3v6ZxJjdI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/BB3v6ZxJjdI/vim-as-default-source-code-viewer.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2009/01/vim-as-default-source-code-viewer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-9026503835772170364</guid><pubDate>Tue, 23 Dec 2008 13:57:00 +0000</pubDate><atom:updated>2009-03-29T21:49:23.576-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">shell_script</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>Merry Christmas with Bash</title><description>Hi.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.softwarelivre.org/bin/view/TWikiBar/WebHome"&gt;Júlio Neves&lt;/a&gt; wrote a shell script that draws a Christmas Tree decorated with Christmas lights.&lt;br /&gt;&lt;br /&gt;He wishes "&lt;span style="font-style: italic;"&gt;muito su&lt;span style="font-weight: bold;"&gt;SHELL&lt;/span&gt;so em 2009&lt;/span&gt;" that means in a free translation "&lt;span style="font-style: italic;"&gt;much suc&lt;span style="font-weight: bold;"&gt;SHELL&lt;/span&gt;cess in 2009&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;It is very funny. I hope you like it.&lt;br /&gt;&lt;br /&gt;You can see the source code here: &lt;a href="http://www.dicas-l.com.br/cantinhodoshell/cantinhodoshell_20081222.php"&gt;http://www.dicas-l.com.br/cantinhodoshell/cantinhodoshell_20081222.php&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Merry Christmas to Everyone.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Note&lt;/span&gt;: The site is written in Brazilian Portuguese, but you can just pick the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-9026503835772170364?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pW4kq2qW0bGkrYwMsesEbepalac/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pW4kq2qW0bGkrYwMsesEbepalac/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pW4kq2qW0bGkrYwMsesEbepalac/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pW4kq2qW0bGkrYwMsesEbepalac/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/BUJ9ZQLUrZE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/BUJ9ZQLUrZE/merry-christmas-with-bash.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2008/12/merry-christmas-with-bash.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-5002540420289071076</guid><pubDate>Thu, 04 Dec 2008 23:21:00 +0000</pubDate><atom:updated>2009-03-29T21:49:13.403-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">unittest</category><category domain="http://www.blogger.com/atom/ns#">tdd</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>I am not afraid anymore</title><description>Have you ever been afraid of changing some code? Even one that you've developed?&lt;br /&gt;&lt;br /&gt;I have. Many times. Why this happened to me? Well, that is because I could not be 100% confident that my changes would not break any other part of the program.&lt;br /&gt;&lt;br /&gt;My life changed when I learned the &lt;a style="font-weight: bold; font-style: italic;" type="amzn" search="Test Driven Development" category="books"&gt;Test Driven Development&lt;/a&gt; methodology (aka &lt;a style="font-weight: bold; font-style: italic;" type="amzn" search="Test Driven Development" category="books"&gt;TDD&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The idea behind &lt;a style="font-weight: bold; font-style: italic;" type="amzn" search="Test Driven Development" category="books"&gt;TDD&lt;/a&gt; is that you must write automated tests before writing your code. This &lt;span style=";font-family:&amp;quot;;" &gt;&lt;span style="font-size:100%;"&gt;methodology&lt;/span&gt;&lt;/span&gt; will not only help you design better software by catching bugs at the same time you are coding, but (IMHO) it is also a great way to assure your code will keep working after maintenances.&lt;br /&gt;&lt;br /&gt;Managers love to say they want you to deliver fully tested software. They even say that &lt;a style="font-weight: bold; font-style: italic;" type="amzn" search="Test Driven Development" category="books"&gt;TDD&lt;/a&gt; is a wonderful idea. But things change when you need to fix a bug or insert new features into a product that do not have automated tests. At this moment, managers complain that there is no time to let you write a test suite to cover the entire software.&lt;br /&gt;&lt;br /&gt;To be totally honest we need to agree that being able to fix problems and / or insert new features into your company's products in a timely manner is essential in the global market competition.&lt;br /&gt;&lt;br /&gt;- I can not write an entire test suite to the program, and take the risk to not deliver it in a time it must be delivered. And if I do not write tests how can I assure that everything will keep working after I put my hands in it?&lt;br /&gt;&lt;br /&gt;In this case I write tests to the part of the software that I will alter. Moreover, whenever I have a bug to fix I write tests to fully cover that part I'm working on.&lt;br /&gt;&lt;br /&gt;Yes, I know that to be considered effective, tests must cover 100% of the program, but you must have a fresh view about it:&lt;br /&gt;&lt;br /&gt;This approach significantly reduces the number of tests I should write to be able to check if my changes did not affect anything else. So, it will take  less time and effort than the ideal situation (which my manager probably would not allow let me to do).&lt;br /&gt;&lt;br /&gt;I will be able to write them little by little, during my development activities. The product did not have any test at all so if I write a little number of tests each time that I am working on it is better than nothing.&lt;br /&gt;&lt;br /&gt;What you think? Is my approach good? I would like to listen to your opinion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-5002540420289071076?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BHmFtVWVsSaeR0ADdPPVF_D2Kz0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BHmFtVWVsSaeR0ADdPPVF_D2Kz0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BHmFtVWVsSaeR0ADdPPVF_D2Kz0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BHmFtVWVsSaeR0ADdPPVF_D2Kz0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/zp3cABKX7ec" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/zp3cABKX7ec/i-am-not-afraid-anymore.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2008/12/i-am-not-afraid-anymore.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-2321466663281835373</guid><pubDate>Mon, 20 Oct 2008 15:09:00 +0000</pubDate><atom:updated>2009-03-29T21:49:01.811-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">people</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>Blind Programmer</title><description>I used to complain almost every day about my tendonitis.&lt;br /&gt;&lt;br /&gt;Today I was reading a post named &lt;a href="http://aurelio.wordpress.com/2008/10/17/programador-cego/"&gt;Programador Cego&lt;/a&gt; (Blind Programmer) at &lt;a href="http://aurelio.wordpress.com/"&gt;Aurélio's&lt;/a&gt; blog (It is written in Brazilian Portuguese).&lt;br /&gt;&lt;br /&gt;This post talks aboit Ângelo Beck. He is 27 years old and he is completely &lt;span style="font-weight: bold;"&gt;blind&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ângelo uses a screen reader and a method he developed to help him &lt;span style="font-style: italic;"&gt;see&lt;/span&gt; the source code. So he is able to develop in PHP.&lt;br /&gt;&lt;br /&gt;Ângelo proved that a blind person can do almost anything and changed my mind. He is a hero!&lt;br /&gt;&lt;br /&gt;From now on I will never complain about my tendonitis again.&lt;br /&gt;&lt;iframe src="http://www.google.com/search?lookitup&amp;amp;q=define:programmer&amp;amp;css=div#guser,body%3Ecenter%7Bdisplay:none%7D&amp;amp;xremove=/html/body/table%5Bposition%28%29%3C=3%5D" style="border: 1px solid black; width: 460px; height: 100%; top: 0px; right: 0px; padding-left: 0px; position: fixed; background-color: white; z-index: 1000; display: none;" id="ResultBox5"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-2321466663281835373?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3anTDBt-Bwy1GbcnBcShrmCqPZc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3anTDBt-Bwy1GbcnBcShrmCqPZc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3anTDBt-Bwy1GbcnBcShrmCqPZc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3anTDBt-Bwy1GbcnBcShrmCqPZc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/ZMuig8Fe5uU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/ZMuig8Fe5uU/blind-programmer.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2008/10/blind-programmer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-4476922327388072160</guid><pubDate>Mon, 17 Mar 2008 14:49:00 +0000</pubDate><atom:updated>2009-03-29T21:48:50.352-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debug</category><category domain="http://www.blogger.com/atom/ns#">gdb</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>How to load debug symbols with GDB - Another Approach</title><description>I wrote in the post  &lt;a href="http://marcioandreyoliveira.blogspot.com/2008/03/how-to-debug-striped-programs-with-gdb.html"&gt;How to load debug symbols with &lt;/a&gt;&lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt; one way do debug a stripped version of an application with full access to debug symbols.&lt;br /&gt;&lt;br /&gt;In this post I will explain another way you can do it.&lt;br /&gt;&lt;br /&gt;We are going to load debuging information from a file that was generated by our executable just before it was stripped off..&lt;br /&gt;&lt;br /&gt;I am going to use the same source and environment settings that I used in my earlier &lt;a href="http://marcioandreyoliveira.blogspot.com/2008/03/how-to-debug-striped-programs-with-gdb.html"&gt;post&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;released.c: source code of the program we wish to debug (listing 1).&lt;/li&gt;&lt;li&gt;~/estudo/: Source code of our program will be put here.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;~/local/bin: The stripped off version of binary program will stay here.&lt;/li&gt;&lt;li&gt;~/local/symbols: In this place are all files that contain debuging information.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int division(int a, int b);&lt;br /&gt;&lt;br /&gt;int m;&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt; int i;&lt;br /&gt; int j;&lt;br /&gt;&lt;br /&gt; printf("vou setar i\n");&lt;br /&gt; i = 10;&lt;br /&gt;&lt;br /&gt; printf("vou setar j\n");&lt;br /&gt; j = 1;&lt;br /&gt;&lt;br /&gt; printf ("i = %d, j = %d\n", i, j);&lt;br /&gt; m = division(i, j);&lt;br /&gt;&lt;br /&gt; printf("m = %d / %d = %d\n", i, j, m);&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;&lt;br /&gt;int division(int a, int b)&lt;br /&gt;{&lt;br /&gt; return a / b;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Listing 1 - sample program source code&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Let's start:&lt;br /&gt;&lt;br /&gt;1 - Create your program with debug information. In our sample:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;gcc -g -o &lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;release &lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;release.c &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;2 - Now we will generate a file that will contain only debug informations. You generate this file by issuing this command:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;objcopy --only-keep-debug &lt;executable_file&gt; &lt;symbol_file&gt; &lt;object_file&gt; &lt;symbol_file&gt; &amp;lt;ENTER&amp;gt;&lt;/symbol_file&gt;&lt;/object_file&gt;&lt;/symbol_file&gt;&lt;/executable_file&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;In our sample:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;objcopy --only-keep-debug &lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;release release.sym &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;&lt;br /&gt;&lt;/span&gt;The  choice of  &lt;span style="font-style: italic;"&gt;.sym&lt;/span&gt; as an extension for the debug info file is totally arbitrary. You can use whatever you wish to.&lt;br /&gt;&lt;br /&gt;3 - You remove debugging information:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;strip -s release &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;4 - Move file &lt;span style="font-style: italic;"&gt;release&lt;/span&gt; to ~/local/bin/:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;mv release ~/local/bin &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;5 - Move file &lt;span style="font-style: italic;"&gt;released.sym&lt;/span&gt; to ~/local/symbols/&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;mv release.sym ~/local/symbols &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;6 - Go to directory ~/local/bin&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;cd ~/local/bin &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;7 - Run &lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt;:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;gdb ./release &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;8 - Try &lt;span style="font-style: italic;"&gt;list&lt;/span&gt; command to see that &lt;span style="font-style: italic;"&gt;release&lt;/span&gt; executable file &lt;span style="font-weight: bold;"&gt;doesn't&lt;/span&gt; have symbols in it.&lt;br /&gt;&lt;br /&gt;Figure 1 shows us what I said.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_f3tH_0i5uB0/R9lrbhmRJkI/AAAAAAAAC6o/pOVOks2fMH0/s1600-h/nosym_metodo2_fig1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_f3tH_0i5uB0/R9lrbhmRJkI/AAAAAAAAC6o/pOVOks2fMH0/s400/nosym_metodo2_fig1.png" alt="" id="BLOGGER_PHOTO_ID_5177287367258613314" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Figure 1 - &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;executable file named release is loaded by GDB.&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;9 - Let &lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt; to load symbols from symbols file named &lt;span style="font-style: italic;"&gt;release.sym&lt;/span&gt;. This file has all symbols that we need to debug. You achieve this by issuing the following command:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;add-symbol-file ~/local/symbols/release.sym &lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;&amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;From now on you can debug your program as usual.&lt;br /&gt;&lt;br /&gt;Figure 2 shows us that debuging symbols where imported successfully and that now the &lt;span style="font-style: italic;"&gt;list&lt;/span&gt; command  shows us the program source code.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_f3tH_0i5uB0/R9lz3hmRJlI/AAAAAAAAC6w/7n49IqBbVfA/s1600-h/nosym_metodo2_fig2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_f3tH_0i5uB0/R9lz3hmRJlI/AAAAAAAAC6w/7n49IqBbVfA/s400/nosym_metodo2_fig2.png" alt="" id="BLOGGER_PHOTO_ID_5177296644387972690" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Figure 2 - now our GDB session has debuging symbols&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;As you can see in figure 3, I set a break point at line 17 and I ran the program that stopped there. Then I printed &lt;span style="font-style: italic;"&gt;i&lt;/span&gt; variable. It is possible just because symbols were loaded.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_f3tH_0i5uB0/R9l3vxmRJmI/AAAAAAAAC64/iV3xx-0AN4Q/s1600-h/nosym_metodo2_fig3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_f3tH_0i5uB0/R9l3vxmRJmI/AAAAAAAAC64/iV3xx-0AN4Q/s400/nosym_metodo2_fig3.png" alt="" id="BLOGGER_PHOTO_ID_5177300909290497634" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Figure 3 - debugging session.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;You can see that this method to load debug symbols is easier than the previous one presented in the post &lt;a href="http://marcioandreyoliveira.blogspot.com/2008/03/how-to-debug-striped-programs-with-gdb.html"&gt;How to load debug symbols with &lt;/a&gt;&lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My friend &lt;a href="http://jumpi.wordpress.com/"&gt;Jumpi&lt;/a&gt; complained that it is not the &lt;span style="font-style: italic;"&gt;unix way&lt;/span&gt; to debug applications that just don't have debug information by loading a separated file. We have core files to help us to debug the application in our host.&lt;br /&gt;&lt;br /&gt;I agree with him that it is unusual to debug this way, but it may be useful.&lt;br /&gt;&lt;br /&gt;The idea behind this method (and behind the previous one) is similar to that used by MS with .pdb files.&lt;br /&gt;&lt;br /&gt;It will allow you to save disk space on your host because you can keep only stripped versions of your applications and libraries in it. It is especially important to embedded systems.&lt;br /&gt;&lt;br /&gt;At the same time it let you have a colection of symbol files stored at some place (say, a DVD disc or another server). When (and if) you need to do a debug session&lt;br /&gt;&lt;br /&gt;I hope this post will make your life easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-4476922327388072160?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lPp-9U6fMkb9KUoxwoiuWpX0CNk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lPp-9U6fMkb9KUoxwoiuWpX0CNk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lPp-9U6fMkb9KUoxwoiuWpX0CNk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lPp-9U6fMkb9KUoxwoiuWpX0CNk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/MNJAB20xa4s" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/MNJAB20xa4s/how-to-load-debug-symbols-with-gdb.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp2.blogger.com/_f3tH_0i5uB0/R9lrbhmRJkI/AAAAAAAAC6o/pOVOks2fMH0/s72-c/nosym_metodo2_fig1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2008/03/how-to-load-debug-symbols-with-gdb.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-2713499497065097330</guid><pubDate>Mon, 17 Mar 2008 02:38:00 +0000</pubDate><atom:updated>2009-03-29T21:48:31.685-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">electronics</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>Precision Resistors</title><description>A lot of hobbyists want to make their own circuits but they face a problem: &lt;a type="amzn" search="precision resistors" category="books"&gt;precision resistors&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are many projects where the ratio between resistances is more important than the actual values. In these case we can measure our resistors to select the most appropriated.&lt;br /&gt;&lt;br /&gt;Let me show an example. Suppose we have an &lt;a type="amzn" search="operational amplifiers" category="books"&gt;inverter amplifier&lt;/a&gt; as shown in figure 1.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_f3tH_0i5uB0/RpZZp5FrsRI/AAAAAAAAABY/_4ovzGWT-Mc/s1600-h/inversor.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_f3tH_0i5uB0/RpZZp5FrsRI/AAAAAAAAABY/_4ovzGWT-Mc/s320/inversor.PNG" alt="" id="BLOGGER_PHOTO_ID_5086351405395718418" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;Figure 1 - Inverter Amplifier&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Gain is determined by equation&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_f3tH_0i5uB0/RpbfqpFrsUI/AAAAAAAAAB4/PO_ueCJbDsc/s1600-h/ganhoDoInversor.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_f3tH_0i5uB0/RpbfqpFrsUI/AAAAAAAAAB4/PO_ueCJbDsc/s320/ganhoDoInversor.png" alt="" id="BLOGGER_PHOTO_ID_5086498752838742338" border="0" /&gt;&lt;/a&gt;We can see that &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;the circuit's gain is determined by the ratio between R&lt;span style="font-size:85%;"&gt;f&lt;/span&gt; and Ri&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Suppose we want a gain of X.&lt;br /&gt;&lt;br /&gt;If R&lt;span style="font-size:85%;"&gt;f&lt;/span&gt; = 10,000 ohms and R&lt;span style="font-size:85%;"&gt;i&lt;/span&gt; = 5,000 ohms the gain is -2.&lt;br /&gt;&lt;br /&gt;If R&lt;span style="font-size:85%;"&gt;f&lt;/span&gt; = 20,000 ohms and R&lt;span style="font-size:85%;"&gt;i&lt;/span&gt; = 10,000 ohms the gain is -2 too.&lt;br /&gt;&lt;br /&gt;If we use resistors with tolerance (precision) of 5% the gain could vary between -1.81and -2.21 depending on real values of resistors R&lt;span style="font-size:85%;"&gt;f&lt;/span&gt; and R&lt;span style="font-size:85%;"&gt;i&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;If we use resistors with tolerance (precision) of 2% the gain could vary between  -1.92 e -2.08 what is much better.&lt;br /&gt;&lt;br /&gt;What if we don't have &lt;a type="amzn" search="precision resistors" category="books"&gt;precision resistors&lt;/a&gt;? What can we do?&lt;br /&gt;&lt;br /&gt;We can use our ordinary resistors (tolerance of 5%). Take a bunch of them and measure each one until you find two resistors with a resistance ratio as near as possible of the value we wish (It is 2 in our sample).&lt;br /&gt;&lt;br /&gt;Let me illustrate with an example. Say we take a bunch of resistors of 20K and 10K ohms (nominal values) to measure.&lt;br /&gt;&lt;br /&gt;Suppose we found some resistors of 20,900 and 10,400 ohms. So we could do R&lt;span style="font-size:85%;"&gt;f&lt;/span&gt; = 20,900 ohms and R&lt;span style="font-size:85%;"&gt;i&lt;/span&gt; = 10,400. With these values, the gain would be -2.01 that is a better result than estimated with 2% tolerance resistors.&lt;br /&gt;&lt;br /&gt;If we found R&lt;span style="font-size:85%;"&gt;f&lt;/span&gt; = 21,000 and R&lt;span style="font-size:85%;"&gt;i&lt;/span&gt; = 10,500 than the gain would be exactly 2.&lt;br /&gt;&lt;br /&gt;The method, presented in this post, to use ordinary resistors instead of &lt;a type="amzn" search="precision resistors" category="books"&gt;precision resistors&lt;/a&gt; is suitable only in prototype development. In commercial scale it is not feasible and the use of &lt;a type="amzn" search="precision resistors" category="books"&gt;precision resistors&lt;/a&gt; is mandatory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Note: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;As Maurício de Oliveira wrote in his answer to the &lt;a href="http://marcioandreyoliveira.blogspot.com/2007/07/resistores-de-preciso.html"&gt;brazilian portuguese version of this article&lt;/a&gt;, &lt;a type="amzn" search="precision resistors" category="books"&gt;precision resistors&lt;/a&gt; &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;are&lt;/span&gt;&lt;/span&gt; manufactured in a way that they take in account changes in their resistance by changes in temperature and manufacturers to their best to minimize it.&lt;br /&gt;&lt;br /&gt;So, &lt;span style="font-weight: bold;"&gt;there are&lt;/span&gt; differences between &lt;a type="amzn" search="precision resistors" category="books"&gt;precision resistors&lt;/a&gt; and &lt;a type="amzn" search="resistors" category="books"&gt;ordinary resistors&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In this article (that I wrote to &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;hobbyists&lt;/span&gt;), I am &lt;span style="font-weight: bold; font-style: italic;"&gt;not&lt;/span&gt; &lt;span&gt;&lt;span&gt;taken this in account because &lt;/span&gt;&lt;/span&gt;hobbyists don't design professional circuits and then it will not cause too much trouble&lt;span&gt;&lt;span&gt;. Then it is a valid approuch for a experimental circuit.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-2713499497065097330?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vtgMAiyRa9zZZk5suvT7KQnqgxQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vtgMAiyRa9zZZk5suvT7KQnqgxQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vtgMAiyRa9zZZk5suvT7KQnqgxQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vtgMAiyRa9zZZk5suvT7KQnqgxQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/bFyhmmt2IHE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/bFyhmmt2IHE/precision-resistors.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp2.blogger.com/_f3tH_0i5uB0/RpZZp5FrsRI/AAAAAAAAABY/_4ovzGWT-Mc/s72-c/inversor.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2008/03/precision-resistors.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-77737566740962371</guid><pubDate>Sat, 08 Mar 2008 04:07:00 +0000</pubDate><atom:updated>2009-03-29T20:32:10.645-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debug</category><category domain="http://www.blogger.com/atom/ns#">gdb</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>How to load debug symbols with GDB</title><description>My friend &lt;a href="http://www.caloni.com.br/blog"&gt;Wanderley&lt;/a&gt; asked me if it is possible to tell &lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt; to load debuging symbols from some file and use it to help debuging a program that doesn't have them.&lt;br /&gt;&lt;br /&gt;Yes. It is.&lt;br /&gt;&lt;br /&gt;There are two solutions to this question.&lt;br /&gt;&lt;br /&gt;I going to explain the first solution in this post. The other solution I will explain in the next post.&lt;br /&gt;&lt;br /&gt;You can load debuging information from an debug enabled version of executable file.&lt;br /&gt;&lt;br /&gt;In order to better explain the first solution, I will setup my sample enviroment as follows:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;released.c: source code of the program we wish to debug (listing 1).&lt;/li&gt;&lt;li&gt;~/estudo/: Source code of our program will be put here.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;~/local/bin: The stripped off version of binary program will stay here.&lt;/li&gt;&lt;li&gt;~/local/symbols: In this place are all files that contain debuging information.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int division(int a, int b);&lt;br /&gt;&lt;br /&gt;int m;&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt; int i;&lt;br /&gt; int j;&lt;br /&gt;&lt;br /&gt; printf("vou setar i\n");&lt;br /&gt; i = 10;&lt;br /&gt;&lt;br /&gt; printf("vou setar j\n");&lt;br /&gt; j = 1;&lt;br /&gt;&lt;br /&gt; printf ("i = %d, j = %d\n", i, j);&lt;br /&gt; m = division(i, j);&lt;br /&gt;&lt;br /&gt; printf("m = %d / %d = %d\n", i, j, m);&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int division(int a, int b)&lt;br /&gt;{&lt;br /&gt; return a / b;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;Listing 1 - sample program source code&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;I have two versions of the program: with and without debuging information.&lt;br /&gt;&lt;br /&gt;1 - You compile your program with debug information. In our sample:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;gcc -Wall -g -release release.c &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;2 - You make a copy of your program. In our sample:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;cp  release release.full &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;3 - You strip off debuging information:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;strip -s release &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;As you can see on Figure 1, we have two programs. &lt;span style="font-style: italic;"&gt;released.full&lt;/span&gt; has debuging symbols but &lt;span style="font-style: italic;"&gt;release&lt;/span&gt; doesn't have them.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_f3tH_0i5uB0/R9MS6BmRJZI/AAAAAAAAC5M/mKqsw8e96dg/s1600-h/nosym_metodo1_fig1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_f3tH_0i5uB0/R9MS6BmRJZI/AAAAAAAAC5M/mKqsw8e96dg/s400/nosym_metodo1_fig1.png" alt="" id="BLOGGER_PHOTO_ID_5175501184849487250" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Figure 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;4 - Move file &lt;span style="font-style: italic;"&gt;release&lt;/span&gt; to ~/local/bin/:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;mv release ~/local/bin &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;5 - Move file &lt;span style="font-style: italic;"&gt;released.full&lt;/span&gt; to ~/local/symbols/&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;mv release.full ~/local/symbols &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;6 - Go to directory ~/local/bin&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;cd ~/local/bin &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;7 - Run &lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt;:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;gdb ./release &amp;lt;ENTER&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;8 - Try &lt;span style="font-style: italic;"&gt;list&lt;/span&gt; command to see that &lt;span style="font-style: italic;"&gt;release&lt;/span&gt; executable file &lt;span style="font-weight: bold;"&gt;doesn't&lt;/span&gt; have symbols in it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Note&lt;/span&gt;: if the program was already running you could get its PID then attach &lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt; to it.&lt;br /&gt;&lt;br /&gt;Figure 2 shows us two windows. The first one shows that our executable file has no debug information. In the other window we can see that &lt;span style="font-style: italic;"&gt;release&lt;/span&gt; is not yet loaded.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_f3tH_0i5uB0/R9MwaBmRJaI/AAAAAAAAC5U/1kXxa6_TnuA/s1600-h/nosym_metodo1_fig2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_f3tH_0i5uB0/R9MwaBmRJaI/AAAAAAAAC5U/1kXxa6_TnuA/s400/nosym_metodo1_fig2.png" alt="" id="BLOGGER_PHOTO_ID_5175533620442506658" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;Figure 2 - executable file named release is loaded by GDB but it is not yet running.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;9 - Let &lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt; to load symbols from executable file named &lt;span style="font-style: italic;"&gt;release.full&lt;/span&gt;. This binary version of our program has all symbols that we need to debug.&lt;br /&gt;&lt;br /&gt;Please notice that &lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt; will not replace the &lt;span style="font-style: italic;"&gt;release&lt;/span&gt; executable by &lt;span style="font-style: italic;"&gt;release.full&lt;/span&gt; version of our program. It will &lt;span style="font-style: italic;"&gt;just import&lt;/span&gt; symbols from &lt;span style="font-style: italic;"&gt;release.full&lt;/span&gt; into &lt;span style="font-style: italic;"&gt;release&lt;/span&gt; debugging session.&lt;br /&gt;&lt;br /&gt;But &lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt; needs to know in advance where it must put the symbols it will load. How can you determine the correct memory address?&lt;br /&gt;&lt;br /&gt;It is quite simple. You issue command &lt;span style="font-style: italic;"&gt;maint&lt;/span&gt; inside &lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt;:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;maint info sections&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Then you look for &lt;span style="font-style: italic;"&gt;.text&lt;/span&gt; section. The address that is in the first column is what you want. In our sample, it is 0x08048320. See figure 3.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_f3tH_0i5uB0/R9M0dhmRJbI/AAAAAAAAC5c/LD_Olo9KDME/s1600-h/nosym_metodo1_fig3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_f3tH_0i5uB0/R9M0dhmRJbI/AAAAAAAAC5c/LD_Olo9KDME/s400/nosym_metodo1_fig3.png" alt="" id="BLOGGER_PHOTO_ID_5175538078618559922" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Figure 3 - looking for .text section address&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;10 - The next step is to instruct &lt;a type="amzn" search="gdb" category="books"&gt;GDB&lt;/a&gt; to load debug symbols into &lt;span style="font-style: italic;"&gt;.text section&lt;/span&gt;. To achieve it you do this:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;add-symbol-file ~/local/symbols/release.full &amp;lt;.text section address&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In our sample it means to type:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;add-symbol-file ~/local/symbols/release.full 0x08048320&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;From now on you can debug your program as usual.&lt;br /&gt;&lt;br /&gt;Figure 4 shows us that debuging symbols where imported successfully and that now the &lt;span style="font-style: italic;"&gt;list&lt;/span&gt; command (abbreviated as &lt;span style="font-style: italic;"&gt;l&lt;/span&gt;) shows us the program source code.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_f3tH_0i5uB0/R9M7kBmRJcI/AAAAAAAAC5k/JipYvqM_ACw/s1600-h/nosym_metodo1_fig4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_f3tH_0i5uB0/R9M7kBmRJcI/AAAAAAAAC5k/JipYvqM_ACw/s400/nosym_metodo1_fig4.png" alt="" id="BLOGGER_PHOTO_ID_5175545886869104066" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Figure 4 - now our GDB session has debuging symbols&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;As you can see in figure 5, I set a break point at line 17 and I ran the program that stopped there. Then I printed &lt;span style="font-style: italic;"&gt;i&lt;/span&gt; variable.&lt;br /&gt;&lt;br /&gt;In the other terminal I issued &lt;span style="font-style: italic;"&gt;ps&lt;/span&gt; command. It was done just to show you that the only program running &lt;span&gt;was &lt;/span&gt;&lt;span style="font-style: italic;"&gt;release&lt;/span&gt; executable. There is no instance of &lt;span style="font-style: italic;"&gt;release.full&lt;/span&gt; program.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_f3tH_0i5uB0/R9NBjhmRJdI/AAAAAAAAC5s/FW5cRUjPoe4/s1600-h/nosym_metodo1_fig5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_f3tH_0i5uB0/R9NBjhmRJdI/AAAAAAAAC5s/FW5cRUjPoe4/s400/nosym_metodo1_fig5.png" alt="" id="BLOGGER_PHOTO_ID_5175552475348936146" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Figure 5 - debugging session.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I hope this post will make your life easier. In the next time I will teach you another way to import debuging symbols.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-77737566740962371?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hYpSdJtGoPandAgmeVVhIKVQS5k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hYpSdJtGoPandAgmeVVhIKVQS5k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hYpSdJtGoPandAgmeVVhIKVQS5k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hYpSdJtGoPandAgmeVVhIKVQS5k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/t90YuKFmW0U" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/t90YuKFmW0U/how-to-debug-striped-programs-with-gdb.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://bp2.blogger.com/_f3tH_0i5uB0/R9MS6BmRJZI/AAAAAAAAC5M/mKqsw8e96dg/s72-c/nosym_metodo1_fig1.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2008/03/how-to-debug-striped-programs-with-gdb.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-16507626.post-7223480820151068711</guid><pubDate>Fri, 29 Feb 2008 16:46:00 +0000</pubDate><atom:updated>2009-04-14T12:04:40.841-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mutt</category><category domain="http://www.blogger.com/atom/ns#">gmail</category><category domain="http://www.blogger.com/atom/ns#">english</category><title>Using Mutt with Gmail</title><description>&lt;a type="amzn" search="Gmail" category="books"&gt;Gmail&lt;/a&gt; is the best e-mail service and &lt;a type="amzn" search="firefox" category="books"&gt;Firefox&lt;/a&gt; is the best browser. But if you keep Gmail's page open for a long time then &lt;a type="amzn" search="firefox" category="books"&gt;Firefox&lt;/a&gt; will waste a lot of memory of your computer.&lt;br /&gt;&lt;br /&gt;If you have an old machine like me, you know that each byte is important. So, I decided to come back to my old mail client: &lt;a type="amzn" search="mutt email client" category="books"&gt;Mutt&lt;/a&gt; (&lt;a href="http://www.mutt.org/"&gt;http://www.mutt.org/&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Here I'm showing some steps you need to let &lt;a type="amzn" search="mutt email client" category="books"&gt;mutt&lt;/a&gt; access &lt;a type="amzn" search="Gmail" category="books"&gt;Gmail&lt;/a&gt; with &lt;a type="amzn" search="imap" category="books"&gt;IMAP&lt;/a&gt; protocol.&lt;br /&gt;&lt;br /&gt;I'm using &lt;a type="amzn" search="ubuntu" category="books"&gt;Ubuntu&lt;/a&gt; 7.04 with &lt;a type="amzn" search="mutt email client" category="books"&gt;mutt&lt;/a&gt; 1.5.13, but it should work with other distros.&lt;br /&gt;&lt;br /&gt;You must replace &lt;span style="font-style: italic; font-weight: bold;"&gt;my_mail@gmail.com&lt;/span&gt; and &lt;span style="font-style: italic; font-weight: bold;"&gt;my_password&lt;/span&gt; occurrences with real values.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;First of all you must enable &lt;a type="amzn" search="imap" category="books"&gt;IMAP&lt;/a&gt; access to your &lt;a type="amzn" search="gmail" category="books"&gt;Gmail&lt;/a&gt; account. To enable &lt;a type="amzn" search="imap" category="books"&gt;IMAP&lt;/a&gt; in your &lt;a type="amzn" search="mail" category="books"&gt;Gmail&lt;/a&gt; account:&lt;br /&gt;1.1. Log in to your &lt;a type="amzn" search="gmail" category="books"&gt;Gmail&lt;/a&gt; account.&lt;br /&gt;1.2. Click Settings at the top of any &lt;a type="amzn" search="Gmail" category="books"&gt;Gmail&lt;/a&gt; page.&lt;br /&gt;1.3. Click Forwarding and &lt;a type="amzn" search="pop3" category="books"&gt;POP&lt;/a&gt;/&lt;a type="amzn" search="imap" category="books"&gt;IMAP&lt;/a&gt;.&lt;br /&gt;1.4. Select Enable &lt;a type="amzn" search="imap" category="books"&gt;IMAP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Install &lt;a type="amzn" search="mutt email client" category="books"&gt;mutt&lt;/a&gt;, msmtp and ssl. I won't show you how to do it because it is different for each distro.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create msmtp configuration file (~/.msmtprc) as shown:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;account default&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;host smtp.gmail.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;port 587&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;from &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;my_mail@gmail.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;tls on&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;tls_starttls on&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;auth on&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;user &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;my_mail@gmail.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;password &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;my_password&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;logfile ~/.msmtp.log&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create &lt;a type="amzn" search="mutt email client" category="books"&gt;mutt&lt;/a&gt; configuration file (~/.muttrc) as shown:&lt;br /&gt;&lt;pre class="prettyprint" style="overflow: auto;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set imap_user = "&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;my_mail@gmail.com&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set imap_pass = "&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;my_password&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set from = "&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;my_mail@gmail.com&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set realname = "Your Real Name"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set folder = "imaps://imap.gmail.com:993"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set spoolfile = imaps://imap.gmail.com:993/INBOX&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set record=""&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set postponed="imaps://imap.gmail.com/[Gmail]/Drafts"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set header_cache="~/.mutt/cache/headers"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set message_cachedir="~/.mutt/cache/bodies"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set certificate_file=~/.mutt/certificates&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set move = no&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set imap_check_subscribed="yes"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set imap_list_subscribed="yes"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set mbox="imaps://imap.gmail.com/[Gmail]/All Mail"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# this line instructs mutt to refresh my IMAP mailbox every 60 seconds&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set mail_check=60&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#I'm using &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;^&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; character to instruct mutt to update e-mail list immediately&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bind index "^" imap-fetch-mail&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;And that's all folks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16507626-7223480820151068711?l=marcioandreyoliveira.blogspot.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wK0rVakX_xBG6CB4TXThsEoXNk8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wK0rVakX_xBG6CB4TXThsEoXNk8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wK0rVakX_xBG6CB4TXThsEoXNk8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wK0rVakX_xBG6CB4TXThsEoXNk8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/MarcioAndreyOliveira/~4/L5GgK67jcfg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/MarcioAndreyOliveira/~3/L5GgK67jcfg/gmail-is-best-e-mail-service-and.html</link><author>noreply@blogger.com (Marcio Andrey Oliveira)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://marcioandreyoliveira.blogspot.com/2008/02/gmail-is-best-e-mail-service-and.html</feedburner:origLink></item></channel></rss>
