<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>ip_fix@konoha:~$ make code</title>
	<atom:link href="https://ipfix.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://ipfix.wordpress.com</link>
	<description>Hacking Life &#38; Code</description>
	<lastBuildDate>Thu, 28 Jun 2007 06:59:35 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='ipfix.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://s0.wp.com/i/buttonw-com.png</url>
		<title>ip_fix@konoha:~$ make code</title>
		<link>https://ipfix.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://ipfix.wordpress.com/osd.xml" title="ip_fix@konoha:~$ make code" />
	<atom:link rel='hub' href='https://ipfix.wordpress.com/?pushpress=hub'/>
	<item>
		<title>Pizza sem bola de sorvete = Cubo mágico em menos de 1 minuto.</title>
		<link>https://ipfix.wordpress.com/2007/06/28/pizza-sem-bola-de-sorvete-cubo-magico-em-menos-de-1-minuto/</link>
					<comments>https://ipfix.wordpress.com/2007/06/28/pizza-sem-bola-de-sorvete-cubo-magico-em-menos-de-1-minuto/#comments</comments>
		
		<dc:creator><![CDATA[IP_FIX]]></dc:creator>
		<pubDate>Thu, 28 Jun 2007 06:56:49 +0000</pubDate>
				<category><![CDATA[negócios]]></category>
		<category><![CDATA[pessoal]]></category>
		<category><![CDATA[tecnologia]]></category>
		<guid isPermaLink="false">http://ipfix.wordpress.com/2007/06/28/pizza-sem-bola-de-sorvete-cubo-magico-em-menos-de-1-minuto/</guid>

					<description><![CDATA[Voltando após um tempo sem postar, devido a fatos inéditos (pessoais e profissionais), volto nessa madrugada pra expor alguns pontos de vista (enquanto não esqueço) sobre uma discussão numa pizzaria com 5 pessoas (contando comigo). Há sempre discussões em volta de software livre, open source, software proprietário, empresas privadas, e como consequência os famosos &#8220;xiitas&#8221;. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Voltando após um tempo sem postar, devido a fatos inéditos (pessoais e profissionais), volto nessa madrugada pra expor alguns pontos de vista (enquanto não esqueço) sobre uma discussão numa pizzaria com 5 pessoas (contando comigo).  Há sempre discussões em volta de software livre, open source, software proprietário, empresas privadas, e como consequência os famosos &#8220;xiitas&#8221;. Mas até que ponto ser? E nessa reunião o foco foi <strong>modelo de negócios </strong>para debater diversas soluções corporativas que solucione os problemas dos clientes. Temos alguns casos que consegui analisar hoje entre a pizza de pepperoni e a de quatro queijos: <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><strong>Software Livre:</strong></p>
<blockquote><p>Há sempre uma velha discussão de que o importante é <strong>&#8220;ser livre&#8221;</strong>. Apóio com certeza o <strong>&#8220;movimento&#8221;</strong>, inclusive ainda participo, mas tenho prioridades profissionais que é a <a href="http://www.ibm.com/br/businesscenter/articles_etips/oa6.phtml" target="_blank">satisfação do cliente</a>. Sem dúvidas excelentes softwares são livres e é sempre uma primeira carta na manga na hora de executar algum serviço, principalmente em suporte. Mas não é solução única que faz milagres, ou que temos alguma <strong>obrigação</strong> de contribuir, pois afinal, não recebo <a href="http://pt.wikipedia.org/wiki/Patch" target="_blank"><em>patchs</em></a> de alimentos, nem <em><a href="http://en.wikipedia.org/wiki/Software_release" target="_blank">release candidate</a> </em>de carros, <em><a href="http://en.wikipedia.org/wiki/Software_release" target="_blank">pre-alpha</a> </em>no cinema, <em><a href="http://en.wikipedia.org/wiki/Software_release" target="_blank">beta</a> </em>de celulares, e muito menos <em><a href="http://en.wikipedia.org/wiki/Donation" target="_blank">donations</a> </em>por <a href="http://pt.wikipedia.org/wiki/PayPal" target="_blank"><em>paypal</em></a> para dedicar tempo exclusivo.</p></blockquote>
<p><strong>Software Proprietário:</strong></p>
<blockquote><p>Falando de uma maneira <strong>&#8220;politicamente (in)correta&#8221;</strong>, é visto com péssimos olhos pela grande massa de xiitas causando diversos conflitos de intelectualidade entre profissionais da área, como a de <a href="http://pt.wikipedia.org/wiki/Presta%C3%A7%C3%A3o_de_servi%C3%A7os" target="_blank">prestação de serviços</a>. Mas que resolve tantos problemas quanto outros onde não há uma alternativa mais confiável. Mesmo assim muita gente não enxerga isso como uma <strong>solução</strong>, mas sim como um <strong>problema</strong>, simplesmente por alguma ética ou filosofia. (Ainda bem que não tinha nenhum xiita na mesa).</p></blockquote>
<p><strong>Software Proprietário baseado em Software Livre:</strong></p>
<blockquote><p>São soluções muito visíveis no mercado atualmente. Soluções de <a href="http://pt.wikipedia.org/wiki/Sistema_embarcado" target="_blank">sistemas embarcados</a>, onde a maior parte da base do produto é feita com software livre e o código principal é todo <a href="http://pt.wikipedia.org/wiki/Compilador" target="_blank">compilado</a> ou gerado um <a href="http://pt.wikipedia.org/wiki/Bytecode" target="_blank">bytecode</a>. Assim é possível oferecer um sistema com uma base íntegra, confiável e todo um sistema que atende a necessidade do cliente no qual nenhum outro oferece.</p></blockquote>
<p><strong>Garantia:</strong></p>
<blockquote><p>Uma empresa quer sentir confiança no serviço prestado. Ela quer ficar tranquila de que se algum problema ocorrer, haverá uma solução <strong>imediata</strong>. Mas para isso é necessário todo um comprometimento do serviço prestado. Seja ele em software livre ou software proprietário, deve haver uma garantia de atendimento/suporte em nível de extrema excelência para solucionar qualquer tipo de problema que a empresa possa enfrentar. A empresa quer buscar além tudo, uma continuidade do serviço prestado e nunca fica na mão num problema.</p></blockquote>
<p><strong>Suporte:</strong></p>
<blockquote><p>É onde todos saem ganhando. A empresa que contrata, pois tem a garantia de que eventuais problemas serão resolvidos, e da empresa prestadora de serviços que se mantém vinculado por contrato e, com isso, irá aprimorar ainda mais seus produtos.</p></blockquote>
<p><strong>Divergência:</strong></p>
<blockquote><p>Esse o ponto crítico onde queria chegar. Devido a diversos extremos, pode haver conflitos de filosofias e éticas entre profissionais onde quem sai perdendo é a empresa que contrata o serviço. Para evitar dois pensamentos básicos resolvem:</p>
<p><strong>Imparcialidade:</strong> Primeiro deve-se levar em conta o que o cliente quer. Parece óbvio mas se o cliente quer uma caixa preta, mesmo que tenha sido sugerido uma caixa azul, a caixa terá que ser feita na cor preta e ponto final. Não importa as vantagens e desvantagens apresentadas, tem que ser feito o solicitado.</p>
<p><strong>Interoperabilidade:</strong> É fato. Há cada vez mais ambientes heterogêneos e temos que estar preparado para isso. O cliente pode possuir servidores windows, linux, novel, unix, solaris e também desktops windows, linux, mac, beos, etc&#8230; Onde também há diversas aplicações críticas fortemente amarradas em cada, onde o porte para alguma outra plataforma seria inviável.</p></blockquote>
<p><strong>Senso Crítico Profissional:</strong></p>
<blockquote><p>O profissional deve resolver o problema com a melhor solução viável possível. Seja ela livre, proprietária ou mista é dever de quem presta o serviço garantir a total eficácia da solução do problema, e não trazer um problema a mais por motivos de divergências</p></blockquote>
<p>E encerro essa discussão. Acho que daria um livro maior que do <a href="http://pt.wikipedia.org/wiki/Miyamoto_Musashi" target="_blank"><em>Musashi</em></a> tudo a ser dito, mas como ficamos sem pizza de sorvete deixarei pra uma próxima vez!</p>
<p><a href="http://helpburnart.wordpress.com/2007/05/06/nerds-militontons/" target="_blank">Link</a> para consulta <a href="http://helpburnart.wordpress.com/2007/05/06/nerds-militontons/" target="_blank">militonto-xiita</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ipfix.wordpress.com/2007/06/28/pizza-sem-bola-de-sorvete-cubo-magico-em-menos-de-1-minuto/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/dd616a9ddf436cbcd9b6bd2810f3f72c0fc271fa496f4d34b74f13ec63309107?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">IP_FIX</media:title>
		</media:content>
	</item>
		<item>
		<title>Funções de string em C</title>
		<link>https://ipfix.wordpress.com/2007/05/07/funcoes-de-string-em-c/</link>
					<comments>https://ipfix.wordpress.com/2007/05/07/funcoes-de-string-em-c/#comments</comments>
		
		<dc:creator><![CDATA[IP_FIX]]></dc:creator>
		<pubDate>Mon, 07 May 2007 06:17:03 +0000</pubDate>
				<category><![CDATA[artigos]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[string]]></category>
		<guid isPermaLink="false">http://ipfix.wordpress.com/2007/05/07/funcoes-de-string-em-c/</guid>

					<description><![CDATA[Perdendo meu tempo em canais de IRC (no #motd da freenode pra ser mais exato), numa rara conversa útel com o Narcotic veio a idéia de falar e comentar exemplos de uso de várias funções de manuseio de strings em C (geralmente começado com str). São várias, mas irei comentar 3 funções dessas por post. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Perdendo meu tempo em canais de IRC (no #motd da freenode pra ser mais exato), numa rara conversa útel com o Narcotic veio a idéia de falar e comentar exemplos de uso de várias funções de manuseio de strings em C (geralmente começado com str). São várias, mas irei comentar 3 funções dessas por post. Com isso espero esclarecer as dúvidas de muitas pessoas, principalmente aquelas novatas na linguagem e as esquecidas (como eu! <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ).</p>
<p>Todas as funções são documentadas nas man pages, e as mesmas estou usando como base. As funções dos exemplos tem as mesmas declarações para melhor ser assimilado na consulta. Para ubuntu users: <code><strong>$ sudo apt-get install manpages-dev</strong></code></p>
<p><strong>Função strstr():</strong><br />
<code></p>
<pre style="background-color:#000000;color:#CCCCCC;">
<span style="color:#52FF52;">char</span> *strstr(<span style="color:#52FF52;">const</span> <span style="color:#52FF52;">char</span> *haystack, <span style="color:#52FF52;">const</span> <span style="color:#52FF52;">char</span> *needle);
</pre>
<p></code></p>
<p>A função <strong>strstr()</strong> procura a primeira ocorrência de uma string (<strong>needle</strong>) em outra string determinada (<strong>haystack</strong>). Caso a condição seja satisfeita, um ponteiro com posição da ocorrência será retornado. Caso contrário, <strong>NULL</strong> será  retornado.</p>
<p>(Para melhor visualizar, faça o download do fonte: <a href='https://ipfix.wordpress.com/wp-content/uploads/2007/05/strstr_ex.c' title='strstr_ex.c'>strstr_ex.c</a>)</p>
<p><code></p>
<pre style="background-color:#000000;color:#CCCCCC;">
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;stdio.h&gt;</span>
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;string.h&gt;</span>

<span style="color:#52FF52;">int</span> main(<span style="color:#52FF52;">int</span> argc, <span style="color:#52FF52;">char</span> **argv) {

        <span style="color:#52FF52;">char</span> *haystack = <span style="color:#FF55FF;">&quot;Essa eh uma frase de exemplo para encontrarmos uma string.&quot;</span>;
        <span style="color:#52FF52;">char</span> *needle = *(argv+<span style="color:#FF55FF;">1</span>);
        <span style="color:#52FF52;">char</span> *ret;

        <span style="color:#66FFFF;">/* Ha alguma ocorrencia de needle em haystack? */</span>
        <span style="color:#FFFF52;">if</span> ((ret = strstr(haystack, needle)) != <span style="color:#FF55FF;">NULL</span>) { 
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;needle ENCONTRADO</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
                <span style="color:#66FFFF;">/* O retorno eh o ponteiro para a primeira ocorrencia em diante. */</span>
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;retorno: </span><span style="color:#FFFF52;">%s\\n</span><span style="color:#FF55FF;">&quot;</span>, ret);
        } <span style="color:#FFFF52;">else</span>
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;needle NAO ENCONTRADO</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);

        <span style="color:#FFFF52;">return</span> <span style="color:#FF55FF;">0</span>;
}

</pre>
<p></code></p>
<blockquote><p><code><strong>ip_fix@konoha:~/C$ gcc -Wall -o strstr_ex strstr_ex.c<br />
ip_fix@konoha:~/C$ ./strstr_ex teste<br />
needle NAO ENCONTRADO<br />
ip_fix@konoha:~/C$ ./strstr_ex exemplo<br />
needle ENCONTRADO<br />
retorno: exemplo para encontrarmos uma string.<br />
ip_fix@konoha:~/C$ ./strstr_ex encontrarmos<br />
needle ENCONTRADO<br />
retorno: encontrarmos uma string.<br />
ip_fix@konoha:~/C$<br />
</strong></code></p></blockquote>
<p>Como esperado, quando há uma ocorrência satisfeita o ponteiro é retornado a partir desse resultado.</p>
<p><strong>Função strdup():</strong><br />
<code></p>
<pre style="background-color:#000000;color:#CCCCCC;">
<span style="color:#52FF52;">char</span> *strdup(<span style="color:#52FF52;">const</span> <span style="color:#52FF52;">char</span> *s);
</pre>
<p></code></p>
<p>A função <strong>strdup()</strong> é muito útil em situações onde temos que alocar um espaço na memória para copiar determinada string. Sem utiliza-lá, teríamos que alocar o espaço antes com <strong>malloc()</strong>, para em seguida usar <strong>strncpy()</strong>, por exemplo, para copiar a string. A função retorna um ponteiro com a string já alocada (podendo ser liberado com <strong>free()</strong> depois de seu uso) em caso de sucesso, ou <strong>ENOMEM</strong> como erro caso a memória não tenha sida alocada por insuficiência.</p>
<p>(Para melhor visualizar, faça o download do fonte: <a href='https://ipfix.wordpress.com/wp-content/uploads/2007/05/strdup_ex.c' title='strdup_ex.c'>strdup_ex.c</a>)</p>
<p><code></p>
<pre style="background-color:#000000;color:#CCCCCC;">
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;stdio.h&gt;</span>
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;stdlib.h&gt;</span>
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;string.h&gt;</span>

<span style="color:#52FF52;">int</span> main(<span style="color:#52FF52;">int</span> argc, <span style="color:#52FF52;">char</span> **argv) {

        <span style="color:#52FF52;">char</span> *string;
        <span style="color:#52FF52;">char</span> *s = *(argv+<span style="color:#FF55FF;">1</span>);

        <span style="color:#66FFFF;">/* SEM strdup() */</span>

        <span style="color:#66FFFF;">/* Alocamos a memoria com malloc(). */</span>
        string = (<span style="color:#52FF52;">char</span> *)malloc(strlen(s)); 
        <span style="color:#66FFFF;">/* Copiamos o conteudo de s pra dentro de string. (agora que possui espaco alocado). */</span>
        strncpy(string, s, strlen(s)+<span style="color:#FF55FF;">1</span>); 
        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Sem strdup(): </span><span style="color:#FFFF52;">%s\\n</span><span style="color:#FF55FF;">&quot;</span>, string);
        <span style="color:#66FFFF;">/* Liberamos o espaco alocado. */</span>
        free(string); 

        <span style="color:#66FFFF;">/* COM strdup() */</span>

        <span style="color:#66FFFF;">/* Alocamos a memoria exata e jah copiamos o conteudo s para dentro da string. */</span>
        string = strdup(s);
        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Com strdup(): </span><span style="color:#FFFF52;">%s\\n</span><span style="color:#FF55FF;">&quot;</span>, string);
        <span style="color:#66FFFF;">/* Liberamos o espaco alocado (dessa vez por strdup()). */</span>
        free(string);

        <span style="color:#FFFF52;">return</span> <span style="color:#FF55FF;">0</span>;
}
</pre>
<p></code></p>
<blockquote><p><strong><code>ip_fix@konoha:~/C$ gcc -Wall -o strdup_ex strdup_ex.c<br />
ip_fix@konoha:~/C$ ./strdup_ex "teste de string"<br />
Sem strdup(): teste de string<br />
Com strdup(): teste de string<br />
ip_fix@konoha:~/C$<br />
</code></strong></p></blockquote>
<p>Fica bem claro a facilidade de usar <strong>strdup()</strong> em vista de que não precisamos ficar chamando <strong>malloc()</strong> e <strong>strncpy()</strong> toda vez que precisamos gravar alguma string numa variável já que a função faz todo o serviço. <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><strong>Função strtok():</strong></p>
<p><code></p>
<pre style="background-color:#000000;color:#CCCCCC;">
<span style="color:#52FF52;">char</span> *strtok(<span style="color:#52FF52;">char</span> *s, <span style="color:#52FF52;">const</span> <span style="color:#52FF52;">char</span> *delim);
</pre>
<p></code></p>
<p>A função <strong>strtok()</strong> é muito útil quando precisamos &#8220;quebrar&#8221; nossa string em algum delimitador comum. Ele separa os tokens de tal forma que podemos trabalhar individualmente em cada pedaço. A função retorna um ponteiro para o próximo token ou retorn <strong>NULL</strong> caso tenha chegado ao fim.</p>
<p>(Para melhor visualizar, faça o download do fonte: <a href='https://ipfix.wordpress.com/wp-content/uploads/2007/05/strtok_ex.c' title='strtok_ex.c'>strtok_ex.c</a>)</p>
<p><code></p>
<pre style="background-color:#000000;color:#CCCCCC;">
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;stdio.h&gt;</span>
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;stdlib.h&gt;</span>
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;string.h&gt;</span>

<span style="color:#52FF52;">int</span> main() {

        <span style="color:#66FFFF;">/* Alocamos e copiamos a frase dentro de s. */</span>
        <span style="color:#52FF52;">char</span> *s = strdup(<span style="color:#FF55FF;">&quot;Essa eh uma frase de exemplo.&quot;</span>); 
        <span style="color:#66FFFF;">/* Delimitador. Nesse caso quebraremos a string nos espacos em branco. */</span>
        <span style="color:#52FF52;">char</span> *delim = <span style="color:#FF55FF;">&quot; &quot;</span>; 
        <span style="color:#52FF52;">char</span> *res;

        <span style="color:#66FFFF;">/* Primeira chamada antes do laco. */</span>
        res = strtok(s, delim);

        <span style="color:#FFFF52;">while</span> (res != <span style="color:#FF55FF;">NULL</span>) {
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;</span><span style="color:#FFFF52;">%s\\n</span><span style="color:#FF55FF;">&quot;</span>, res);
                <span style="color:#66FFFF;">/* Repetimos a chamada ate o fim da string. */</span>
                res = strtok(<span style="color:#FF55FF;">NULL</span>, delim);
        }

        <span style="color:#66FFFF;">/* Liberamos o espaco alocado. */</span>
        free(s); 

        <span style="color:#FFFF52;">return</span> <span style="color:#FF55FF;">0</span>;
}

</pre>
<p></code></p>
<blockquote><p><strong><code>ip_fix@konoha:~/C$ gcc -Wall -o strtok_ex strtok_ex.c<br />
ip_fix@konoha:~/C$ ./strtok_ex<br />
Essa<br />
eh<br />
uma<br />
frase<br />
de<br />
exemplo.<br />
ip_fix@konoha:~/C$<br />
</code></strong></p></blockquote>
<p>Assim vemos grande utilidade quando pensamos em &#8220;parsear&#8221; algum tipo de dados que possua algum delimitador em comum. Claro que coisas simples, mas já um ponta pé inicial de implementações mais complexas que podem ser adaptadas.</p>
<p>Encerro por hoje esse post básico mas que tenho certeza que deixa claro para muita gente o uso dessas simples funções que muitas vezes é uma mão na roda em algumas tarefas. Em breve postarei mais funções interessantes com exemplos. Espero ter mais retornos no comentários, adoro dúvidas e sugestões! <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f61b.png" alt="😛" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ipfix.wordpress.com/2007/05/07/funcoes-de-string-em-c/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/dd616a9ddf436cbcd9b6bd2810f3f72c0fc271fa496f4d34b74f13ec63309107?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">IP_FIX</media:title>
		</media:content>
	</item>
		<item>
		<title>Lista encadeada em C</title>
		<link>https://ipfix.wordpress.com/2007/05/03/lista-encadeada-em-c/</link>
					<comments>https://ipfix.wordpress.com/2007/05/03/lista-encadeada-em-c/#comments</comments>
		
		<dc:creator><![CDATA[IP_FIX]]></dc:creator>
		<pubDate>Thu, 03 May 2007 05:55:41 +0000</pubDate>
				<category><![CDATA[artigos]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programacao]]></category>
		<guid isPermaLink="false">http://ipfix.wordpress.com/2007/05/03/lista-encadeada-em-c/</guid>

					<description><![CDATA[Fazia alguns meses que estava parado com a programação em linguagem C e só &#8220;dedicado&#8221; (nunca consigo ficar full time em algo) a linguagem Python. Mas depois de ler o livro A Prática da Programação (obrigado Ruda Moura :)) me fez ter aquele pique novamente de praticar já que sempre fiz algumas coisas profissionais e [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Fazia alguns meses que estava parado com a programação em linguagem C e só &#8220;dedicado&#8221; (nunca consigo ficar full time em algo) a linguagem Python. Mas depois de ler o livro <a href="http://www.temporeal.com.br/produtos.php?id=162960">A Prática da Programação</a> (obrigado Ruda Moura :)) me fez ter aquele pique novamente de praticar já que sempre fiz algumas coisas profissionais e por diversão com a linguagem.</p>
<p>Resolvi falar sobre lista encadeada em C poque alguns contatos no meu MSN sempre me perguntam sobre e também porque é muito utlizado em diversos algoritmos. Apesar de já ter alguns códigos prontos resolvi refazer dando ênfase nas sugestões do livro, que realmente recomendo já que fala sobre <strong>listas</strong>, <strong>árvores</strong>, <strong>hash</strong>, entre outros mais.</p>
<p>Chega de papo, <em><strong>Show me the Code!</strong></em>, o código abaixo implementa um exemplo de uma lista simples encadeada onde os dados não são ordenados e a forma que são armazenados é igual uma pilha, onde o último dado a entrar é o primeiro a sair, conhecido também como <a href="http://pt.wikipedia.org/wiki/LIFO">LIFO</a> (Last In, First Out).</p>
<pre style="background-color:#000000;color:#CCCCCC;">
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;stdio.h&gt;</span>
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;stdlib.h&gt;</span>
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;string.h&gt;</span>
<span style="color:#FFFF52;">#include </span><span style="color:#FF55FF;">&lt;unistd.h&gt;</span>

<span style="color:#FFFF52;">#define BUFFER </span><span style="color:#FF55FF;">64</span>

<span style="color:#66FFFF;">/* Estrutura da lista declarada para armazenar nossos dados. */</span>
<span style="color:#52FF52;">typedef</span> <span style="color:#52FF52;">struct</span> lista {
        <span style="color:#52FF52;">char</span> *nome;
        <span style="color:#52FF52;">int</span> idade;
        <span style="color:#52FF52;">struct</span> lista *proximo;
} Dados;

<span style="color:#66FFFF;">/* Prototipo das funcoes de manuseio dos dados. */</span>
Dados *inicia_dados(<span style="color:#52FF52;">char</span> *nome, <span style="color:#52FF52;">int</span> idade);
Dados *insere_dados(Dados *dados, <span style="color:#52FF52;">char</span> *nome, <span style="color:#52FF52;">int</span> idade);
<span style="color:#52FF52;">void</span> exibe_dados(Dados *dados);
<span style="color:#52FF52;">void</span> busca_dados(Dados *dados, <span style="color:#52FF52;">char</span> *chave);
Dados *deleta_dados(Dados *dados);
<span style="color:#52FF52;">int</span> checa_vazio(Dados *dados);

<span style="color:#66FFFF;">/* Prototipo das funcoes do menu.*/</span>
<span style="color:#52FF52;">void</span> insere(<span style="color:#52FF52;">void</span>);
<span style="color:#52FF52;">void</span> exibe(<span style="color:#52FF52;">void</span>);
<span style="color:#52FF52;">void</span> busca(<span style="color:#52FF52;">void</span>);
<span style="color:#52FF52;">void</span> deleta(<span style="color:#52FF52;">void</span>);

<span style="color:#66FFFF;">/* Inicializa a estrutura de dados principal. */</span>
Dados *principal = <span style="color:#FF55FF;">NULL</span>;

<span style="color:#66FFFF;">/* Cria a nova lista apontando o proximo no para NULL. */</span>
Dados *inicia_dados(<span style="color:#52FF52;">char</span> *nome, <span style="color:#52FF52;">int</span> idade) {

        Dados *novo;

        novo = (Dados *)malloc(<span style="color:#FFFF52;">sizeof</span>(Dados));
        novo-&gt;nome = (<span style="color:#52FF52;">char</span> *)malloc(strlen(nome)+<span style="color:#FF55FF;">1</span>);
        strncpy(novo-&gt;nome, nome, strlen(nome)+<span style="color:#FF55FF;">1</span>);
        novo-&gt;idade = idade;
        novo-&gt;proximo = <span style="color:#FF55FF;">NULL</span>;

        <span style="color:#FFFF52;">return</span> novo;
}

<span style="color:#66FFFF;">/* Como a lista nao esta mais vazia, apontamos o proximo no para lista anterior. */</span>
Dados *insere_dados(Dados *dados, <span style="color:#52FF52;">char</span> *nome, <span style="color:#52FF52;">int</span> idade) {

        Dados *novo;

        novo = (Dados *)malloc(<span style="color:#FFFF52;">sizeof</span>(Dados));
        novo-&gt;nome = (<span style="color:#52FF52;">char</span> *)malloc(strlen(nome)+<span style="color:#FF55FF;">1</span>);
        strncpy(novo-&gt;nome, nome, strlen(nome)+<span style="color:#FF55FF;">1</span>);
        novo-&gt;idade = idade;
        novo-&gt;proximo = dados;

        <span style="color:#FFFF52;">return</span> novo;
}

<span style="color:#66FFFF;">/* Percorre todos os campos da lista e imprime ate o ponteiro proximo chegar em NULL. */</span>
<span style="color:#52FF52;">void</span> exibe_dados(Dados *dados) {

        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Cadastro:</span><span style="color:#FFFF52;">\\n\\n</span><span style="color:#FF55FF;">&quot;</span>);

        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;------------------------</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);

        <span style="color:#FFFF52;">for</span> (; dados != <span style="color:#FF55FF;">NULL</span>; dados = dados-&gt;proximo) {
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Nome: </span><span style="color:#FFFF52;">%s\\n</span><span style="color:#FF55FF;">&quot;</span>, dados-&gt;nome);
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Idade: </span><span style="color:#FFFF52;">%d\\n</span><span style="color:#FF55FF;">&quot;</span>, dados-&gt;idade);
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;------------------------</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
        }

        getchar();
}

<span style="color:#66FFFF;">/* Percorre cada ponta comparando o nome com a chave. */</span>
<span style="color:#52FF52;">void</span> busca_dados(Dados *dados, <span style="color:#52FF52;">char</span> *chave) {

        <span style="color:#52FF52;">int</span> achou = <span style="color:#FF55FF;">0</span>;

        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Cadastro:</span><span style="color:#FFFF52;">\\n\\n</span><span style="color:#FF55FF;">&quot;</span>);
        <span style="color:#FFFF52;">for</span> (; dados != <span style="color:#FF55FF;">NULL</span>; dados = dados-&gt;proximo) {
                <span style="color:#FFFF52;">if</span> (strcmp(chave, dados-&gt;nome) == <span style="color:#FF55FF;">0</span>) {

                        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;------------------------</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
                        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Nome: </span><span style="color:#FFFF52;">%s\\n</span><span style="color:#FF55FF;">&quot;</span>, dados-&gt;nome);
                        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Idade: </span><span style="color:#FFFF52;">%d\\n</span><span style="color:#FF55FF;">&quot;</span>, dados-&gt;idade);
                        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;------------------------</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
                        achou++;
                }
        }

        <span style="color:#FFFF52;">if</span> (achou == <span style="color:#FF55FF;">0</span>)
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Nenhum resultado encontrado.</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
        <span style="color:#FFFF52;">else</span>
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Foram encontrados </span><span style="color:#FFFF52;">%d</span><span style="color:#FF55FF;"> registros.</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>, achou);

        sleep(<span style="color:#FF55FF;">1</span>);
}

<span style="color:#66FFFF;">/* Deleta o ultimo registro inserido. */</span>
Dados *deleta_dados(Dados *dados) {

        Dados *novo;

        novo = dados-&gt;proximo;

        free(dados-&gt;nome);
        free(dados);

        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;O ultimo registro inserido foi deletado com sucesso.</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
        sleep(<span style="color:#FF55FF;">1</span>);

        <span style="color:#FFFF52;">return</span> novo;
}

<span style="color:#66FFFF;">/* Apena checa se a lista e NULL ou nao. */</span>
<span style="color:#52FF52;">int</span> checa_vazio(Dados *dados) {

        <span style="color:#FFFF52;">if</span> (dados == <span style="color:#FF55FF;">NULL</span>) {
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Lista vazia!</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
                sleep(<span style="color:#FF55FF;">1</span>);
                <span style="color:#FFFF52;">return</span> <span style="color:#FF55FF;">1</span>;
        } <span style="color:#FFFF52;">else</span>
                <span style="color:#FFFF52;">return</span> <span style="color:#FF55FF;">0</span>;
}

<span style="color:#66FFFF;">/* Obtem os dados necessarios para chamar as funcoes de manuseio de dados. */</span>
<span style="color:#52FF52;">void</span> insere(<span style="color:#52FF52;">void</span>) {

        <span style="color:#52FF52;">char</span> *nome;
        <span style="color:#52FF52;">int</span> idade;

        nome = (<span style="color:#52FF52;">char</span> *)malloc(BUFFER);

        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;</span><span style="color:#FFFF52;">\\n\\n</span><span style="color:#FF55FF;">Digite o Nome: </span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">----&gt; &quot;</span>);
        scanf(<span style="color:#FF55FF;">&quot;</span><span style="color:#FFFF52;">%s</span><span style="color:#FF55FF;">&quot;</span>, nome);
        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);

        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Digite a Idade: </span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">----&gt; &quot;</span>);
        scanf(<span style="color:#FF55FF;">&quot;</span><span style="color:#FFFF52;">%d</span><span style="color:#FF55FF;">&quot;</span>, &amp;idade);
        fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);

        <span style="color:#FFFF52;">if</span> (principal == <span style="color:#FF55FF;">NULL</span>) 
                principal = inicia_dados(nome, idade);
        <span style="color:#FFFF52;">else</span> 
                principal = insere_dados(principal, nome, idade);
}

<span style="color:#52FF52;">void</span> exibe(<span style="color:#52FF52;">void</span>) {

        <span style="color:#FFFF52;">if</span> (!checa_vazio(principal))
                exibe_dados(principal);
}

<span style="color:#52FF52;">void</span> busca(<span style="color:#52FF52;">void</span>) {

        <span style="color:#52FF52;">char</span> *chave;

        <span style="color:#FFFF52;">if</span> (!checa_vazio(principal)) {

                chave = (<span style="color:#52FF52;">char</span> *)malloc(BUFFER);

                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Digite o nome para buscar: </span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">--&gt; &quot;</span>);
                scanf(<span style="color:#FF55FF;">&quot;</span><span style="color:#FFFF52;">%s</span><span style="color:#FF55FF;">&quot;</span>, chave);

                busca_dados(principal, chave);
        }
}

<span style="color:#52FF52;">void</span> deleta(<span style="color:#52FF52;">void</span>) {

        <span style="color:#FFFF52;">if</span> (!checa_vazio(principal))
                principal = deleta_dados(principal);
}

<span style="color:#52FF52;">int</span> main(<span style="color:#52FF52;">void</span>) {

        <span style="color:#52FF52;">char</span> escolha;

        <span style="color:#FFFF52;">do</span> {
                system(<span style="color:#FF55FF;">&quot;/usr/bin/clear&quot;</span>); <span style="color:#66FFFF;">/* Nao lembro de nada melhor! <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f61b.png" alt="😛" class="wp-smiley" style="height: 1em; max-height: 1em;" /> */</span>
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;</span><span style="color:#FFFF52;">\\n\\t\\t</span><span style="color:#FF55FF;">Cadastro de Pessoas</span><span style="color:#FFFF52;">\\n\\n</span><span style="color:#FF55FF;">&quot;</span>);
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;Escolha uma opcao: </span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;1 - Insere Dados</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;2 - Exibe Dados</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;3 - Busca Dados</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;4 - Deleta Dados</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
                fprintf(<span style="color:#FF55FF;">stdout</span>, <span style="color:#FF55FF;">&quot;5 - Sair</span><span style="color:#FFFF52;">\\n\\n</span><span style="color:#FF55FF;">&quot;</span>);

                scanf(<span style="color:#FF55FF;">&quot;</span><span style="color:#FFFF52;">%c</span><span style="color:#FF55FF;">&quot;</span>, &amp;escolha);

                <span style="color:#FFFF52;">switch</span>(escolha) {
                        <span style="color:#FFFF52;">case</span> <span style="color:#FF55FF;">'1'</span>:
                                insere();
                                <span style="color:#FFFF52;">break</span>;

                        <span style="color:#FFFF52;">case</span> <span style="color:#FF55FF;">'2'</span>:
                                exibe();
                                <span style="color:#FFFF52;">break</span>;

                        <span style="color:#FFFF52;">case</span> <span style="color:#FF55FF;">'3'</span>:
                                busca();
                                <span style="color:#FFFF52;">break</span>;

                        <span style="color:#FFFF52;">case</span> <span style="color:#FF55FF;">'4'</span>:
                                deleta();
                                <span style="color:#FFFF52;">break</span>;

                        <span style="color:#FFFF52;">case</span> <span style="color:#FF55FF;">'5'</span>:
                                exit(<span style="color:#FF55FF;">0</span>);
                                <span style="color:#FFFF52;">break</span>;

                        <span style="color:#FFFF52;">default</span>:
                                fprintf(<span style="color:#FF55FF;">stderr</span>,<span style="color:#FF55FF;">&quot;Digite uma opcao valida!</span><span style="color:#FFFF52;">\\n</span><span style="color:#FF55FF;">&quot;</span>);
                                sleep(<span style="color:#FF55FF;">1</span>);
                                <span style="color:#FFFF52;">break</span>;
                }

                getchar(); <span style="color:#66FFFF;">/* E para impedir sujeira na entrada da escolha. Nao lembro de nada melhor tambem. <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f61b.png" alt="😛" class="wp-smiley" style="height: 1em; max-height: 1em;" /> */</span>
        }

        <span style="color:#FFFF52;">while</span> (escolha &gt; <span style="color:#FF55FF;">0</span>); <span style="color:#66FFFF;">/* Loop Principal. */</span>

        <span style="color:#FFFF52;">return</span> <span style="color:#FF55FF;">0</span>;
}
</pre>
<p>Veja o uso de uma única lista (principal) que no decorrer das chamadas das funções de manuseio de dados, ela vai se alterando com cada ponteiro retornado, tornando mais fácil seu uso.</p>
<p>Não tenho muito que falar porque fiz esse código correndo em umas 2 horas (mas que levou 2 dias por causa de conversas paralelas no MSN, Gmail, entre outros! =P), inclusive nem fiz mais tratamentos devidos mas enfim, a idéia é quem tiver dúvidas, que pergunte nos comentários! Eu AMO responder dúvidas (inteligentes) e acredito que sempre tem alguma visto que a linguagem C em si é um tanto quanto confusa pra maioria (principalmente pra mim!) mas que sempre podem ser sanadas!</p>
<p>Ainda quero postar exemplos melhores na prática, como por exemplo códigos a nível de kernel (LKM &#8211; Loadable Kernel Module) onde temos estruturas interessantes para criarmos block devices, mexer com file operations, hookar funções de rede entre outros! Há uma vasta diversidade para treinarmos mais e melhorar nossos códigos! Espero falar mais em breve. Por enquanto até a próxima! <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f61b.png" alt="😛" class="wp-smiley" style="height: 1em; max-height: 1em;" /> </p>
<p>E quem quiser baixar o fonte direto está aqui: <a href='https://ipfix.wordpress.com/wp-content/uploads/2007/05/lista_simples_encadeada.c' title='lista_simples_encadeada.c'>lista_simples_encadeada.c</a></p>
<p>Aguardo as dúvidas! <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ipfix.wordpress.com/2007/05/03/lista-encadeada-em-c/feed/</wfw:commentRss>
			<slash:comments>34</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/dd616a9ddf436cbcd9b6bd2810f3f72c0fc271fa496f4d34b74f13ec63309107?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">IP_FIX</media:title>
		</media:content>
	</item>
		<item>
		<title>wxPython &#8211; Introdução</title>
		<link>https://ipfix.wordpress.com/2007/04/22/wxpython-introducao/</link>
					<comments>https://ipfix.wordpress.com/2007/04/22/wxpython-introducao/#comments</comments>
		
		<dc:creator><![CDATA[IP_FIX]]></dc:creator>
		<pubDate>Sun, 22 Apr 2007 03:59:59 +0000</pubDate>
				<category><![CDATA[artigos]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[wxpython]]></category>
		<category><![CDATA[wxwidgets]]></category>
		<guid isPermaLink="false">http://ipfix.wordpress.com/2007/04/22/wxpython-introducao/</guid>

					<description><![CDATA[Em 1992, Julian Smart, lançou uma biblioteca escrita em C++: wxWindows, mas que devido pressões da Microsoft, o nome do projeto mudou para wxWidgets. A mesma implementa uma abstração da GUI (Graphical User Interface) para uma linguagem única que execute em diversas plataformas sem a necessidade de reescrita para cada. Essa biblioteca abstrai os elementos [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Em 1992, Julian Smart, lançou uma biblioteca escrita em C++: <strong>wxWindows</strong>, mas que devido pressões da Microsoft, o nome do projeto mudou para <strong>wxWidgets</strong>. A mesma implementa uma abstração da GUI (Graphical User Interface) para uma linguagem única que execute em diversas plataformas sem a necessidade de reescrita para cada. Essa biblioteca abstrai os elementos (widgets) de cada plataforma e o simplifica num única linguagem, sendo que com isso a portabilidade é principal foco.</p>
<p>Em 1998, Robin Dunn, anunciou o binding (porte) para python: <strong>wxPython.</strong></p>
<p>Como a linguagem Python é uma ótima escolha para um desenvolvimento rápido, e wxWidgets uma ótima escolha para o desenvolvimento de uma interface rica de elementos e portabilidade, wxPython é a toolkit que une o útil ao agradável! <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Apesar de ter diversas vantagens e desvantagens, cito apenas as principais:</p>
<p><strong>Vantangens:</strong></p>
<ul>
<li>Portabilidade (Windows, Linux, Mac OS, entre outras)</li>
<li>Velocidade de desenvolvimento (Não chega a ser tão redundante quanto outras bibliotecas gráficas)</li>
<li>Simplicidade, atualizações de bugs &amp; features (Tente outras toolkits em diversas linguagens, wxPython é uma das mais claras e menos burocráticas. E seu desenvolvimento é constante, sempre com novas features e bugs corrigidos)</li>
</ul>
<p><strong>Desvantagens:</strong></p>
<ul>
<li>Péssima documentação (Todas funções são documentadas, mas muito confusas e não claras)</li>
<li>Desempenho inferior (Pelo fato de ser interpretado e tudo ser uma abstração, é claro que não se compara a velocidade de um codificado nativamente)</li>
<li>Falta de Informação (Apesar de um bom wiki, não há muitas iniciativas em prol, muito menos brasileiras. Esse é o principal motivo que me leva a escrever sobre)</li>
</ul>
<p>Agora vamos a prática que interessa. Como ambiente de desenvolvimento estou usando o <strong>Ubuntu Feisty 7.04.</strong><br />
Para preparar nosso ambiente de trabalho, vamos prosseguir:</p>
<blockquote><p><code>ip_fix@konoha:~$ sudo apt-get install libwxbase2.8-0 libwxgtk2.8-0 python-wxversion python-wxgtk2.8 wx2.8-examples wx2.8-doc</code></p></blockquote>
<p>Assim temos todas libs e dependências satisfeitas. Agora vamos testar pra ver se ficou tudo realmente OK.  Para quem quiser baixar e compilar a partir do fonte, deve primeiro baixar o <a href="http://www.wxwidgets.org">wxWidgets</a> e em seguida o próprio <a href="http://www.wxpython.org">wxPython</a></p>
<blockquote><p><code>ip_fix@konoha:~$ python<br />
Python 2.5.1c1 (release25-maint, Apr 12 2007, 21:00:25)<br />
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2<br />
Type "help", "copyright", "credits" or "license" for more information.<br />
&gt;&gt;&gt; import wx<br />
&gt;&gt;&gt; wx.__version__<br />
'2.8.1.1'<br />
&gt;&gt;&gt;<br />
ip_fix@konoha:~$</code></p></blockquote>
<p>Sim! Tudo está OK! O módulo wx foi importado e a versão foi exibida através de seu atributo especial (__version__). Já é o suficiente para prosseguirmos.</p>
<blockquote><p><code>ip_fix@konoha:~$ python<br />
Python 2.5.1c1 (release25-maint, Apr 12 2007, 21:00:25)<br />
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2<br />
Type "help", "copyright", "credits" or "license" for more information.<br />
&gt;&gt;&gt; import wx<br />
&gt;&gt;&gt;<br />
&gt;&gt;&gt; app = wx.PySimpleApp()<br />
&gt;&gt;&gt; frame = wx.Frame(None, -1, "wxPython r0x! =)")<br />
&gt;&gt;&gt; frame.Show()<br />
True<br />
&gt;&gt;&gt; app.MainLoop()<br />
&gt;&gt;&gt;<br />
ip_fix@konoha:~$</code></p></blockquote>
<p>Acompanhe o resultado na figura abaixo:</p>
<p><a href="https://ipfix.wordpress.com/wp-content/uploads/2007/04/wx_1.png" title="wxPython - Introdução"><img src="https://ipfix.wordpress.com/wp-content/uploads/2007/04/wx_1.png?w=550" alt="wxPython - Introdução" /></a></p>
<p>Sim! Com apenas 3 linhas temos uma &#8220;janela&#8221;!</p>
<p>Um objeto foi criado para a aplicação em si; declaramos outro objeto para um frame com seu título definido no atributo; setamos o frame como &#8216;visível&#8217;; e por fim entramos no looping infinito que permanece exibindo a aplicação.</p>
<p>Claro que irei explicar melhor, mas no próximo post, aí temos somente código, vários exemplos e explicações.É isso, quero ver críticas, dúvidas e sugestões! São sempre bem-vindo todas! <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ipfix.wordpress.com/2007/04/22/wxpython-introducao/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/dd616a9ddf436cbcd9b6bd2810f3f72c0fc271fa496f4d34b74f13ec63309107?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">IP_FIX</media:title>
		</media:content>

		<media:content url="https://ipfix.wordpress.com/wp-content/uploads/2007/04/wx_1.png" medium="image">
			<media:title type="html">wxPython - Introdução</media:title>
		</media:content>
	</item>
		<item>
		<title>Optiplex 320 problemático!</title>
		<link>https://ipfix.wordpress.com/2007/04/19/optiplex-320-problematico/</link>
					<comments>https://ipfix.wordpress.com/2007/04/19/optiplex-320-problematico/#comments</comments>
		
		<dc:creator><![CDATA[IP_FIX]]></dc:creator>
		<pubDate>Thu, 19 Apr 2007 22:00:13 +0000</pubDate>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[problemas]]></category>
		<guid isPermaLink="false">http://ipfix.wordpress.com/2007/04/19/optiplex-320-problematico/</guid>

					<description><![CDATA[Slackware, Debian, OpenSuSE, Gentoo e Ubuntu: TODAS congelaram em algum momento, seja no boot, ou na inicialização depois de instalado. Esse problema foi encontrado nas 11 optiplex do local! A única distribuição que consegui, foi o pre-release do Ubuntu Feisty, mas após instalação ele não iniciava com o grub, sempre numa tela preta congelada. Baixei [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Slackware, Debian, OpenSuSE, Gentoo e Ubuntu: TODAS congelaram em algum momento, seja no boot, ou na inicialização depois de instalado. Esse problema foi encontrado nas 11 optiplex do local!</p>
<p>A única distribuição que consegui, foi o pre-release do Ubuntu Feisty, mas após instalação ele não iniciava com o grub, sempre numa tela preta congelada. Baixei o Ubuntu Feisty que foi lançado hoje para testar, e infelizmente o grub continuou congelando! Então resolvi tentar com o LILO e obtive sucesso! Acompanhe os macetes abaixo:</p>
<p>Após dar o boot com o Ubuntu Feisty 7.04, abra o terminal e assuma o root. Em seguida monte a partição previamente instalada:</p>
<blockquote><p><code>ubuntu@ubuntu:~$ sudo su -<br />
root@ubuntu:~# mount /dev/sda3 /mnt</code></p></blockquote>
<p>Precisamos agora espelhar os dispositivos dinâmicos que o udev do kernel 2.6 cria na inicialização no /dev e também o /proc. Com isso podemos tornar o /mnt nossa nova raiz:</p>
<blockquote><p><code>root@ubuntu:~# mount --bind /dev /mnt/dev<br />
root@ubuntu:~# mount -t proc proc /mnt/proc<br />
root@ubuntu:~# chroot /mnt<br />
root@ubuntu:/#</code></p></blockquote>
<p>Agora vamos fazer download dos binários do LILO e extrair na raiz, assim os binários irão ficar em seus devidos lugares. Em seguida o lilo.conf é criado com a configuração abaixo:</p>
<blockquote><p><code>root@ubuntu:/# wget http://home.san.rr.com/johninsd/pub/linux/lilo/lilo-22.8.bin.tar.gz<br />
root@ubuntu:/# tar xf lilo-22.8.bin.tar.gz<br />
root@ubuntu:/etc# cat lilo.conf<br />
boot=/dev/sda<br />
prompt<br />
timeout = 50<br />
vga=791<br />
lba32<br />
image = /boot/vmlinuz-2.6.20-15-386<br />
initrd = /boot/initrd.img-2.6.20-15-386<br />
root = /dev/sda3<br />
label = Ubuntu_Feisty<br />
append="root=/dev/sda3"<br />
read-only<br />
root@ubuntu:~# lilo<br />
Added Ubuntu_Feisty *<br />
root@ubuntu:~#</code></p></blockquote>
<p>Sim, foi necessário o append=&#8221;root=/dev/sda3&#8243;, apesar root acima já especificado.</p>
<p>Agora basta reiniciar o sistema e veja iniciando normalmente! <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ipfix.wordpress.com/2007/04/19/optiplex-320-problematico/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/dd616a9ddf436cbcd9b6bd2810f3f72c0fc271fa496f4d34b74f13ec63309107?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">IP_FIX</media:title>
		</media:content>
	</item>
		<item>
		<title>Python+wxWidgets = wxPython</title>
		<link>https://ipfix.wordpress.com/2007/04/18/pythonwxwidgets-wxpython/</link>
					<comments>https://ipfix.wordpress.com/2007/04/18/pythonwxwidgets-wxpython/#comments</comments>
		
		<dc:creator><![CDATA[IP_FIX]]></dc:creator>
		<pubDate>Thu, 19 Apr 2007 00:40:40 +0000</pubDate>
				<category><![CDATA[python]]></category>
		<category><![CDATA[wxpython]]></category>
		<category><![CDATA[wxwidgets]]></category>
		<guid isPermaLink="false">http://ipfix.wordpress.com/2007/04/18/pythonwxwidgets-wxpython/</guid>

					<description><![CDATA[Estou resolvendo começar o blog com este post, porque é um tema que venho estudado em minhas horas livres (como agora). Muitos já conhecem a linguagem Python, porém poucos sabem do binding que fizeram do wx. Não que não saibam, mas não tenho visto discussões pt_BR. Apesar de uma grande tendência da &#8220;web 2.0&#8221; (esse [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Estou resolvendo começar o blog com este post, porque é um tema que venho estudado em minhas horas livres (como agora).</p>
<p>Muitos já conhecem a linguagem Python, porém poucos sabem do binding que fizeram do wx. Não que não saibam, mas não tenho visto discussões pt_BR.</p>
<p>Apesar de uma grande tendência da &#8220;web 2.0&#8221; (esse pessoal do marquetingui!), onde tudo é on-line (até nosso editor de planilha! wow!), não podemos esquecer de que ainda há a necessidade de aplicações stand-alone em desktops.</p>
<p>Há inúmeras toolkits para esse tipo de desenvolvimento, mas por um desenvolvimento com agilidade e velocidade, optei pelo bind do wxwidgets pra python: <strong>wxPython</strong>.</p>
<p>Como toda escolha é ingrata, onde ganhamos velocidade de desenvolvimento, podemos perder velocidade na execução, da interpretação, apesar do bytecode não ficar tão lento ainda sim há um pequeno aumento de consumo de memória e outros recursos.</p>
<p>No próximo post sobre o tema, irei falar das vantangens e desvantagens sobre o uso dessa toolkit com linguagem python. Espero que desperte o interesse no pessoal! <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ipfix.wordpress.com/2007/04/18/pythonwxwidgets-wxpython/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/dd616a9ddf436cbcd9b6bd2810f3f72c0fc271fa496f4d34b74f13ec63309107?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">IP_FIX</media:title>
		</media:content>
	</item>
	</channel>
</rss>
