<?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:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2550283994748552920</atom:id><lastBuildDate>Mon, 23 Jan 2012 05:00:24 +0000</lastBuildDate><category>Software Livre</category><category>Dicas</category><category>ENEM</category><category>Belo Monte</category><category>Sistemas Operacionais</category><category>Idioma</category><category>Nerdismo</category><category>Brasil</category><category>Trabalho</category><category>Peter Sunde</category><category>C/C++</category><category>Modismo</category><category>War</category><category>Estratégia</category><category>Eleições</category><category>Energias</category><category>Kernel</category><category>The Pirate Bay</category><category>Inutilidades</category><category>Código Eleitoral</category><category>Política</category><category>CabeçaDeTv</category><category>Erros</category><category>Guerra Civil</category><category>ASL</category><category>GCC</category><category>Libertinagem</category><category>Lâmpadas Fluorescentes</category><category>Exageros</category><category>Linux</category><category>Tecnologia</category><category>Desordem</category><category>Reforma Ortográfica</category><category>CGI</category><category>Futuro</category><category>Preconceito Linguístico</category><category>Sustentabilidade</category><category>Liberdade</category><category>Tecnologia a Favor do Brasil</category><title>Brunildz - Tecnologia, Software e Besteiras Gerais</title><description /><link>http://brunildz.blogspot.com/</link><managingEditor>noreply@blogger.com (Bruno Moreira Guedes)</managingEditor><generator>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Brunildz-TecnologiaSoftwareEBesteirasGerais" /><feedburner:info uri="brunildz-tecnologiasoftwareebesteirasgerais" /><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-2550283994748552920.post-882851401184003369</guid><pubDate>Mon, 23 Jan 2012 04:58:00 +0000</pubDate><atom:updated>2012-01-23T02:58:03.013-02:00</atom:updated><title>Feijoeiro - Do grão aos ovos de ouro</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cma54_LBYdiwLygFBeXnzoOBEvM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cma54_LBYdiwLygFBeXnzoOBEvM/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/cma54_LBYdiwLygFBeXnzoOBEvM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cma54_LBYdiwLygFBeXnzoOBEvM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Feijoeiro&lt;br /&gt;&lt;br /&gt;Pessoal, como este é um blog bem mais pessoal do que profissional, e com um público composto principalmente pelos públicos de Tecnologia e Estudantes (descobri que tenho milhares de visitas ao texto de minha redação do ENEM), decidi criar um outro blog para um outro perfil de público. Este blog permanece no ar e eu sigo postando, no mesmo ritmo (devagar quase parando) de antigamente.&lt;br /&gt;&lt;br /&gt;Mesmo assim, vou convidar todos a conhecerem, e seguirem se desejarem meu novo blog, sobre negócios, que trata de assuntos como dinheiro, empreendedorismo, gestão e mercado. Quem quiser conhecer, é só clicar no link abaixo:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://feijoeiro.blogspot.com/2012/01/feijoeiro-do-grao-aos-ovos-de-ouro.html#links"&gt;Feijoeiro - Do grão aos ovos de ouro: Feijoeiro - Do grão aos ovos de ouro&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-882851401184003369?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/TrhRvR0qjVs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/TrhRvR0qjVs/feijoeiro-do-grao-aos-ovos-de-ouro.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2012/01/feijoeiro-do-grao-aos-ovos-de-ouro.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-3423421196629568424</guid><pubDate>Sun, 20 Nov 2011 16:11:00 +0000</pubDate><atom:updated>2011-11-20T14:15:48.023-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Belo Monte</category><category domain="http://www.blogger.com/atom/ns#">Brasil</category><category domain="http://www.blogger.com/atom/ns#">Sustentabilidade</category><category domain="http://www.blogger.com/atom/ns#">Lâmpadas Fluorescentes</category><category domain="http://www.blogger.com/atom/ns#">Energias</category><title>Brasil: Ineficiente e Ineficaz na Gestão das Energias</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/y8LRXY85-KDufmrPkTByRQb_v3w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/y8LRXY85-KDufmrPkTByRQb_v3w/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/y8LRXY85-KDufmrPkTByRQb_v3w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/y8LRXY85-KDufmrPkTByRQb_v3w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Belo Monte, Brasil, Energias, Sustentabilidade, Lâmpadas Fluorescentes&lt;/span&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O título deste artigo poderia muito bem ser 'mais outra crítica a Belo Monte', ou 'uma das cem milhões de melhores críticas ao horário de verão', mas eu sempre prefiro ser mais abrangente no que escrevo. O Brasil tem um grave problema de gestão (que novidade...), e vim apontar neste artigo mais um exemplo deles: a gestão energética. Sei que eu poderia falar muito do ponto de vista da sustentabilidade (para o caso de Belo Monte), ou sobre os danos à saúde (sobre o horário de verão), mas falo hoje do aspecto comum destes dois paradigmas: dinheiro e economia. Claro que os cálculos que apresento aqui são "grosseiros", e não foram estudados fatores que podem intervir neles, até porque não sou nenhum técnico da área.&lt;br /&gt;
&lt;br /&gt;
Vivemos em um país com aproximadamente 60 milhões de domicílios (segundo o IBGE). Tomando como base dados que li em uma pesquisa de &lt;a href="http://www.ppe.ufrj.br/ppe/production/tesis/achao_lopes.pdf"&gt;Carla da Costa Lopes Achão&lt;/a&gt;, em 2007 nossas residências consumiam 90TWh de energia elétrica.&lt;br /&gt;
&lt;br /&gt;
Segundo &lt;a href="http://www.fem.unicamp.br/%7Ejannuzzi/documents/RelatorioFinal-Procel-Coelce.pdf"&gt;esta pesquisa&lt;/a&gt;,&amp;nbsp; a simples troca de lâmpadas incandescentes por fluorescentes nas residências gera uma economia de cerca de 35% no domicílio. Se aplicarmos 35% de metade do consumo residencial, é muito mais que os 5% que economizamos às custas de nossas mudanças de hábitos causadas pelo horário de verão, e é muito mais do que a produção de Belo Monte.&lt;br /&gt;
&lt;br /&gt;
Para quem não sabe, Belo Monte custará aos NOSSOS BOLSOS cerca de R$ 3,5bi para ser construída, e mais R$ 2bi para as linhas de transmissão - e eu estou IGNORANDO o impacto ambiental nestes números. Vamos a uma conta prática: ao preço final (que chega ao consumidor que compra 1 ou 2 unidades), uma lâmpada fluorescente custa cerca de R$ 6,00 - dependendo da potência. Com R$ 5,5bi daria para comprar - a este preço, cerca de 916 milhões de lâmpadas fluorescentes - ou seja, 15 lâmpadas fluorescentes PARA CADA DOMICÍLIO BRASILEIRO.&lt;br /&gt;
&lt;br /&gt;
Mas claro, assim não teríamos empreiteiras trabalhando, licitações, e tantas outras coisas. Mas supondo que não existisse corrupção no Brasil, e que a obra custasse tudo isso de fato, o governo de nosso país está aumentando a produção de energia quando poderia simplesmente reduzir o consumo. E isso é um problema GRAVE, dado o quadro insustentável de consumo em que nosso planeta se encontra.&lt;br /&gt;
&lt;br /&gt;
E já que o governo adora dar assistencialismos, qual o motivo de não criar um "bolsa lâmpada fluorescente" com esse dinheiro?? &lt;br /&gt;
&lt;br /&gt;
Nada mais a declarar.&lt;br /&gt;
&lt;br /&gt;
Classificação do conteúdo: &lt;b&gt;&lt;span style="color: green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
Sobre mim:  &lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/curriculum_2011.pdf"&gt;Curriculum Vitae&lt;/a&gt;  &lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-3423421196629568424?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/HG5Rs-VRdrs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/HG5Rs-VRdrs/brasil-ineficiente-e-ineficaz-na-gestao.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2011/11/brasil-ineficiente-e-ineficaz-na-gestao.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-619540556442980545</guid><pubDate>Sun, 12 Jun 2011 14:15:00 +0000</pubDate><atom:updated>2011-06-12T11:15:37.076-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Reforma Ortográfica</category><category domain="http://www.blogger.com/atom/ns#">Idioma</category><category domain="http://www.blogger.com/atom/ns#">Preconceito Linguístico</category><category domain="http://www.blogger.com/atom/ns#">Erros</category><title>Nossa Língua Portuguesa</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LOOAb73YL9QzWpMiIDKR4g1l4jA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LOOAb73YL9QzWpMiIDKR4g1l4jA/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/LOOAb73YL9QzWpMiIDKR4g1l4jA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LOOAb73YL9QzWpMiIDKR4g1l4jA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Idioma, Erros, Preconceito Linguístico, Reforma Ortográfica&lt;/span&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;OBS: ESTE TEXTO NÃO PASSARÁ PELO CORRETOR ORTOGRÁFICO PROPOSITALMENTE, PARA ASSEGURAR QUE MEUS ERROS APAREÇAM. OBRIGADO PELA COMPREENSÃO. ALÉM DISSO, O MESMO NÃO SEGUE UM FOCO DEFINIDO E NÃO TEM UMA MENSAGEM OBJETIVA A DEIXAR.&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Vivemos um momento caótico em nosso idioma. Comparo o cenário de nosso idioma ao que ocorreu com o latim nos séculos distantes anteriores, quando os plebeus não conseguiam falar e muito menos escrever corretamente, de tão complicado que o idioma era. Claro, a complexidade do latim era muito maior que a do nosso Português, mas vale relacionar.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Estamos na era do "preconceito linguístico", mas temos que achar o sensível equilíbrio entre as coisas. O fato é que sim, nós brasileiros em geral somos preconceituosos. Sim, nós gostamos de criticar os erros dos outros, e não gostamos quando os nossos são criticados, é um defeito típico do principal ser que habita nosso planeta. Agora percebam que a situação é muito mais complexa do que aparenta. Criticamos aqueles que estão em níveis "próximos" ao nosso, e nunca aqueles que estão "acima". E, ainda por cima, alguns brigam pela continuidade dos erros, não identificando a estreita linha entre tolerar o erro e incentivá-lo. E, infelizmente, justo estes estão à frente da educação de nosso país.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Não é a primeira vez que algo vindo do governo incentiva a perda de nosso idioma. "Vem pra caixa você também!". O &lt;i&gt;slogan&lt;/i&gt; de um banco do governo fere nosso idioma há tantos anos, sob a justificativa de que a forma errada "soa melhor", e ninguém nada fala. Agora se teu próximo for um mero mortal e trocar um simples "s" por "z", tenha a certeza de que este será criticado e visto como ignorante.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mas quem pode verdadeiramente falar e apontar os erros dos outros de forma vexatória? Nós, brasileiros, provavelmente não. A população de um país onde 99,9% (dados que não foram obtidos de pesquisa nenhuma) cometem erros como conjugar verbos na forma da terceira pessoa quando falamos à segunda pessoa não tem moral alguma para caçoar dos erros alheios. Ou o leitor nunca ouviu alguém dizendo "Fulano, SEU carro é o máximo" em lugar de "Fulano, TEU carro é o máximo"? Agora, penso que haja também uma diferença grande entre caçoar do erro, e notificar aquele que o cometeu, afinal, este muitas vezes desconhece o equívoco. E como fazê-lo de forma elegante? Muitas vezes somos (estou incluso) rudes ao comunicar este tipo de coisa. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;E não é nada fácil deixar de ser rude neste aspecto, apontar um erro sempre toca na ferida, e cada pessoa reage a isso de uma diferente forma. Porém, se não o fizermos permitiremos que o próximo permaneça na ignorância, o que também é difícil de aceitar. E no fundo é isso que aparentam querer aqueles que dizem que protegerão as pessoas do "preconceito linguístico", ensinando que o errado é certo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;E, como se isso não bastasse, poucos anos atrás vem um "novo acordo ortográfico", sob o pretexto de "unificar o idioma", e trata de desunificá-lo entre os brasileiros. São pessoas que não tem noção do que é fácil e do que é difícil. O Brasil possui 78,58% dos falantes de língua portuguesa. São 190 milhões de pessoas que terão que mudar parte de sua forma de escrever para unificar sua língua com a de 51 milhões de outras pessoas. E o detalhe mais complicado da história, é que estes 190 milhões já não escreviam de forma exatamente padronizada, não conheciam nossa escrita - e os grandes representantes de nosso idioma, que parecem desconhecer esta realidade, ainda propõem mudanças internas?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Não seria muito mais fácil reconhecer que falamos idiomas simplesmente "similares" aos destes outros países, e que são idiomas diferentes?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Afinal, o que quero com este artigo? Defender uma posição em relação a escrever de forma culta ou não? Criticar o acordo ortográfico? Assinalar que todos nós cometemos erros? Muitas perguntas para resposta nenhuma. Escrevo apenas para "mapear" o cenário de nosso idioma, e para que cada leitor conclua o que bem entender. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Aproveito para terminar o texto desta forma, deixando "interrogações" no ar, além de uma sensação de que o texto foi começado com profundidade e finalizado às pressas. Sim, é isso mesmo. Com os filmes de Hollywood funciona e todo mundo gosta...&lt;/div&gt;&lt;br /&gt;
Classificação do conteúdo: &lt;b&gt;&lt;span style="color: green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;
Sobre mim:  &lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/curriculum_2011.pdf"&gt;Curriculum Vitae&lt;/a&gt;  &lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-619540556442980545?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/3-HLykA_RCQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/3-HLykA_RCQ/nossa-lingua-portuguesa.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>1</thr:total><georss:featurename>Chapecó - SC, Brasil</georss:featurename><georss:point>-27.0967814 -52.61860690000003</georss:point><georss:box>-27.2699359 -52.79847940000003 -26.923626900000002 -52.43873440000003</georss:box><feedburner:origLink>http://brunildz.blogspot.com/2011/06/nossa-lingua-portuguesa.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-7170021029905835405</guid><pubDate>Sun, 21 Nov 2010 17:17:00 +0000</pubDate><atom:updated>2010-11-21T15:17:03.762-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Trabalho</category><category domain="http://www.blogger.com/atom/ns#">Tecnologia a Favor do Brasil</category><category domain="http://www.blogger.com/atom/ns#">Futuro</category><category domain="http://www.blogger.com/atom/ns#">ENEM</category><category domain="http://www.blogger.com/atom/ns#">Tecnologia</category><title>O Futuro do Trabalho (minha Redação do ENEM)</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-LZ0iNE8EAScQXSRrrl90ygFY-k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-LZ0iNE8EAScQXSRrrl90ygFY-k/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/-LZ0iNE8EAScQXSRrrl90ygFY-k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-LZ0iNE8EAScQXSRrrl90ygFY-k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Trabalho, ENEM, Tecnologia a Favor do Brasil, Futuro, Tecnologia&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;i&gt;Esta foi minha redação escrita no ENEM deste ano(2010). O tema era O Trabalho na Construção da Dignidade Humana, e na proposta de trabalho eram citados dois trechos de texto, que falavam sobre o trabalho escravo e sobre a forma como a tecnologia tem mudado o trabalho. Este texto reflete opiniões pessoais minhas, e foi adaptado à partir do rascunho, e não é necessariamente idêntico ao texto que foi submetido. A qualidade do texto não é exemplar, uma vez que o tempo era bem limitado, e eu preciso de muitas horas para escrever um texto bem fundamentado e de qualidade. Mesmo assim, aí vai!&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:OfficeDocumentSettings&gt;   &lt;o:AllowPNG/&gt;  &lt;/o:OfficeDocumentSettings&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:TrackMoves/&gt;   &lt;w:TrackFormatting/&gt;   &lt;w:HyphenationZone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:DoNotPromoteQF/&gt;   &lt;w:LidThemeOther&gt;PT-BR&lt;/w:LidThemeOther&gt;   &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;    &lt;w:SplitPgBreakAndParaMark/&gt;    &lt;w:EnableOpenTypeKerning/&gt;    &lt;w:DontFlipMirrorIndents/&gt;    &lt;w:OverrideTableStyleHps/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathPr&gt;    &lt;m:mathFont m:val="Cambria Math"/&gt;    &lt;m:brkBin m:val="before"/&gt;    &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;    &lt;m:smallFrac m:val="off"/&gt;    &lt;m:dispDef/&gt;    &lt;m:lMargin m:val="0"/&gt;    &lt;m:rMargin m:val="0"/&gt;    &lt;m:defJc m:val="centerGroup"/&gt;    &lt;m:wrapIndent m:val="1440"/&gt;    &lt;m:intLim m:val="subSup"/&gt;    &lt;m:naryLim m:val="undOvr"/&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;   &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;   &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;   &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;   &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;   &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;   &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;   &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;   &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;   &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;   &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;   &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;   &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;   &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;   &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;   &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;   &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;   &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;   &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;   &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:"Tabela normal";
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-priority:99;
 mso-style-parent:"";
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin-top:0cm;
 mso-para-margin-right:0cm;
 mso-para-margin-bottom:10.0pt;
 mso-para-margin-left:0cm;
 line-height:115%;
 mso-pagination:widow-orphan;
 font-size:11.0pt;
 font-family:"Calibri","sans-serif";
 mso-ascii-font-family:Calibri;
 mso-ascii-theme-font:minor-latin;
 mso-hansi-font-family:Calibri;
 mso-hansi-theme-font:minor-latin;
 mso-bidi-font-family:"Times New Roman";
 mso-bidi-theme-font:minor-bidi;
 mso-fareast-language:EN-US;}
&lt;/style&gt; &lt;![endif]--&gt;  &lt;br /&gt;
&lt;div class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;A forma como trabalhamos, juntamente com os sistemas produtivos, têm sofrido mudanças cada dia mais drásticas e aceleradas. Infelizmente, a adaptabilidade da sociedade a este novo paradigma ainda não acompanha esta evolução, que ocorre tão rapidamente. A maior prova disso é a frequente constatação de que o abominável trabalho escravo ainda existe. Mas as mudanças na tecnologia e na estrutura social dão a esperança de que haverá, um dia, um alinhamento entre os dois. O trabalho moderno e a alocação do ser humano no trabalho pensante tendem – inclusive – a erradicar de vez a escravidão.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;O ser humano, portador de cérebro inteligente, não é feito para trabalhos braçais ou autômatos. Um ser pensante existe para pensar – para programar, controlar e otimizar as máquinas que tendem a substituí-lo no trabalho mecanizado. Não há mais espaço para a utilização de seres humanos como peças.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;O trabalho à partir de casa – que já é realidade em segmentos como a Tecnologia da Informação – é uma das chaves para a qualidade de vida do trabalhador, bem como uma economia financeira às empresas. É o funcionário no conforto de trabalhar de onde bem entender, as empresas com menor necessidade de espaço físico, e de brinde a menor utilização dos poluentes meios de transporte.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;Para acabar com a escravidão, é preciso – além de conscientizar e punir os exploradores de mão-de-obra – oferecer uma alternativa mais barata: máquinas. E com boa educação para todos, e a ascensão das máquinas, será viável multiplicar e ocupar postos de trabalho pensante.&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"&gt;E o dia do real fim da escravidão chegará somente com o ser humano deixando de ser utilizado como peça. O dia em que o valorizado ser humano fizer algo digno de seu potencial teremos um novo mundo, com dignidade para o trabalhador.&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
Classificação do conteúdo: &lt;b&gt;&lt;span style="color: green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Sobre mim:&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-7170021029905835405?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/FM3OlqpJDEM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/FM3OlqpJDEM/o-futuro-do-trabalho-minha-redacao-do.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>3</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2010/11/o-futuro-do-trabalho-minha-redacao-do.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-8273913550547218150</guid><pubDate>Sun, 21 Nov 2010 16:52:00 +0000</pubDate><atom:updated>2010-11-21T14:52:25.438-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Exageros</category><category domain="http://www.blogger.com/atom/ns#">Política</category><category domain="http://www.blogger.com/atom/ns#">War</category><category domain="http://www.blogger.com/atom/ns#">Guerra Civil</category><category domain="http://www.blogger.com/atom/ns#">Desordem</category><title>War! Geração Ultra-Sensível Às Palavras e a Censura Moderna</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4aTNVmiWy-456YNMx6vvxa7avsE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4aTNVmiWy-456YNMx6vvxa7avsE/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/4aTNVmiWy-456YNMx6vvxa7avsE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4aTNVmiWy-456YNMx6vvxa7avsE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; War, Guerra Civil, Política, Desordem, Exageros&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: black; text-align: center;"&gt;&lt;span style="color: yellow;"&gt;"War! The Republic is crumbling under attacks by the ruthless Sith Lord,  Count Dooku. There are heroes on both sides. Evil is everywhere.&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: black; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="background-color: black; color: yellow; text-align: center;"&gt;In a stunning move, the fiendish droid leader, General Grievous, has  swept into the Republic capital and kidnapped Chancellor Palpatine,  leader of the Galactic Senate.&lt;/div&gt;&lt;div style="background-color: black; color: yellow; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="background-color: black; color: yellow; text-align: center;"&gt;As the Separatist Droid Army attempts to flee the besieged capital with  their valuable hostage, two Jedi Knights lead a desperate mission to  rescue the captive Chancellor...."&lt;/div&gt;&lt;div style="background-color: black; color: yellow; text-align: left;"&gt;(Star Wars Episode III Opening Crawl - Fonte/Propriedade: StarWars.com) &lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Começo este post com esta citação da introdução do episódio III de Star Wars. Não sei por que, mas sempre achei aquele "War!" no começo muito impactante para referenciar conflitos. E é sobre conflitos, justamente, que estou escrevendo neste exato momento. O ano de 2010 foi um trágico período para a civilização, uma vez que senti um clima de "polarização total" do país. E não estou falando apenas de política e certas redes de TV não. Mas, confesso, que a "guerra" em torno das palavras de Luiz Carlos Prates me deu um "empurrão" para começar a escrever este post.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Como se não bastasse a polarização, um novo modelo de ditadura - que está em alta no mundo todo - vem sendo empregado no Brasil. Não é a ditadura da violência e do autoritarismo, onde o governo usa seu poder militar para controlar as pessoas na marra, mas sim a ditadura dos estereótipos sociais. É uma forma de poder imperceptível a olho nu. Já vamos falar sobre isso.&lt;/div&gt;&lt;h1&gt;Histórico&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;Quando eu era pequeno, mas já grandinho o suficiente para entender o futebol, eu fui pressionado pela população de minha também pequena cidade natal a escolher: Sport Club Internacional ou Grêmio Footbal Porto-Alegrense. Parece irrelevante - e até confesso sentir orgulho de ter optado por ser colorado - mas aquilo já foi um sinal de que há uma tendência humana à polarização em certas situações.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Os anos foram passando, e eu crescia, mas sempre observava as pessoas e a sociedade, e já percebia que algumas pessoas manipuladoras tinham uma tendência a criar barreiras à aceitação de ideias opostas. Barreiras estas que eram disfarçadas em palavras cheias de sensatez e conhecimento.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Chegamos aos tempos atuais com uma revolução cultural causada pela Internet e pelas redes sociais. Agora a onda do momento é ser "cult". Ou seja, ser uma pessoa aberta, que ouve as opiniões dos outros e tem o poder de expressar a sua livremente. E todos querem entrar nesta onda. Agora vamos entender melhor o cenário a ser analisado.&lt;/div&gt;&lt;h1&gt;O Cenário&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;O fenômeno é muito simples. O ser humano - cheio de receios, preconceitos(especialmente contra si mesmo), valores futilizados, necessidades sociais, medos bestas e vontade de "se enturmar" a todo custo - prega toda esta filosofia falsa que mencionei no último parágrafo do histórico do quadro. No entanto, alguns grupos um pouco mais espertos, perceberam que com estratégias de manipulação mais inteligentes pode ser possível manipular os formadores de opinião: as pessoas que pensam criticamente, e que apresentavam tendência a opor-se à manipulação no passado.&lt;br /&gt;
&lt;br /&gt;
Afinal, se eu manipular a camada pouco interessada da sociedade, com estes meios de comunicação todos, fica fácil para as pessoas mais críticas expressarem sua oposição e abrir os olhos da maioria. Agora, o que dizer sobre a estratégia de manipular - de forma deliberada e bem planejada - aqueles que têm a opinião respeitada por muitos, que são as pessoas de histórica capacidade e interesse crítico? Afinal, se eles comprarem a ideia, eles farão o trabalho sujo de disseminá-la.&lt;br /&gt;
&lt;br /&gt;
E um dos pontos chave para esta estratégia deliberada de manipulação das massas, foi a Censura Moderna: o ataque covarde ao orgulho do cidadão para evitar a oposição. O mais engraçado é que isso é feito de forma tão subliminar e oculta, que este ato encontra-se disfarçado de prova de sensatez ou até mesmo bondade. É a mais pura obra da engenharia social - utilizada para os mais perversos fins de pessoas de más intenções. Alguns poderão até chamar-me de louco, mas os conceitos de vício e virtude da literatura do fim da idade média estão renascendo.&lt;/div&gt;&lt;h1&gt;Manipulabilidade&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;As pessoas se mostram cada vez mais manipuláveis. O gado, que se comporta conforme o desejo do boiadeiro. Não é uma crítica, apenas um feedback - apesar de sabermos que culturalmente o brasileiro não é aberto a&amp;nbsp; receber feedbacks, pois os considera uma vergonha, ofensa ou crítica.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O segredo da manipulação é muito simples. Uma das técnicas muito utilizadas é chegar com a maior cara de boas intenções, e alertar as pessoas sobre alguém que anda falando falcatruas sobre xyz. "Alguns boatos estão ofendendo a nossa causa/política/filosofia/luta/imagem, dizendo que &lt;opinião oposta=""&gt;. Mas, vocês podem ver que &lt;exibir com="" detalhes="" evidências="" manipuladas="" mas="" mentiras,="" omitidos="" sem=""&gt;".&lt;/exibir&gt;&lt;/opinião&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Outra técnica, daquelas que mais ferem o orgulho do ser humano, é uma evolução daquele velho argumento fraco de "Todo mundo sabe que". É simples: em vez de dizer "Todo mundo sabe que", tente fazer parecer obvio sem usar frases manjadas. O ser humano é orgulhoso demais para manifestar discordância a coisas obvias. E se manifestar, todas as demais pessoas te olharão esquisito e chamarão de louco - afinal, é tão obvio que você está errado.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Já sei: alguém vai me dizer que seria inviável disseminar massivamente a obviedade de uma ideia. Agora eu já penso diferente. Pensando agora como investidor, se eu tiver um bom laranja(pessoa de suposto renome), uma quantidade de 7 casas decimais em reais(para veicular uma reportagem na Veja, por exemplo), e um potencial de ganhar - em um determinado prazo - 8 casas decimais em reais com o não-questionamento disso, será que eu não consigo? Afinal, quem vai questionar algo que saiu na Veja, e que mencionava estudos do Sr. Fulano de Tal, que dizia na reportagem ser Dr. em Prosopopeias Flácidas para Acalentar Bovinos(Conversa mole para boi dormir) pela Universidade da Conxinxínia&lt;algum internacional="" nome="" nunca="" ouviu="" que="" você=""&gt;?&lt;/algum&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ahh, e os cientistas? Claro. O que um cientista publica sempre é lei - a não ser que ele contrarie algo que "todo mundo sabe" e ganhe um Prêmio Ignóbil por isso. Um grupo limitado de "seres acima de nossa capacidade" estuda evidências e sai escrevendo artigos - que podem até, em inúmeras vezes, serem fruto de um estudo sério - como se eles fossem verdades absolutas . E quem for capaz de questionar é um "ignorante", que acha que conhece mais que os cientistas que estudam a coisa há tantos anos. Foi assim que acreditou-se por tantos séculos que Aristóteles estava certo ao afirmar que corpos de pesos diferentes caem em velocidades diferentes, e que o Sol girava em torno da terra.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Este movimento da ridicularização que mencionei, começa por um comportamento em sala de aula nos primeiros anos de estudo, através daquelas falhas que mencionei antes relacionadas ao orgulho do ser humano. "Questionar o que um professor diz é 'mico' demais para eu fazer. Prefiro fingir que concordo e ser burro". E quem não pensa desta forma vira motivo de piada entre os colegas de aula.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;E ai do aluno que disser que não consegue acreditar no evolucionismo. Existem ridicularizações "enlatadas", que já vem prontas para serem usadas através de estereótipos. Um exemplo típico é o caso deste dogma marcante na sociedade ocidental, que criou a ideia de que se você não acredita em evolucionismo, você NECESSARIAMENTE acredita em criacionismo e faz parte do "clero".&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;-Professora, eu não acredito no evolucionismo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;-Tudo bem, se você tem suas crenças religiosas nós não vamos feri-la aqui, respeitamos sua religião blá blá blá...&lt;br /&gt;
&lt;br /&gt;
Agora temos outra força de manipulação: A distorção. Segundo o dicionário, distorcer significa "mudar o sentido(Fonte: &lt;a href="http://www.dicio.com.br/distorcer/"&gt;http://www.dicio.com.br/distorcer/&lt;/a&gt;). Só para esclarecer, uma única palavra, em frases e contextos distintos, pode significar coisas necessariamente diferentes - e nisso eu acho que não escrevi nada além do obvio. Agora imagine uma oração, em textos distintos, de quantas maneiras pode ser compreendida? &lt;br /&gt;
&lt;br /&gt;
Se alguém tem dúvida de que textos e palavras PODEM SER(e de fato são) distorcidos, me envie qualquer texto um pouco maior para ver se eu não distorço. Já até me preparo para os comentários depois da publicação deste texto:&lt;br /&gt;
-Lá vem o Bruno novamente com suas teorias conspiratórias!&lt;br /&gt;
&lt;br /&gt;
Como se o ser humano não tivesse capacidade, habilitação, e participações históricas em sistemáticas sociais para uso a seu próprio favor. As pessoas acham que só porque vivemos em um regime TEÓRICAMENTE democrático(porque para o poder ser de todos, todos precisam participar, e isso NUNCA ACONTECEU), significa que não podem existir complôs de minorias para tirar proveito de situações. Claro, nunca existiram cartéis, esquemas de corrupção, fraudes feitas por quadrilhas, etc. Nunca leremos sobre este tipo de coisa nos noticiários, ninguém faria isso!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Esta máquina de preconceitos sociais do ser humano é uma forte arma usada - por alguém ou por um conjunto de coincidências - para criar este clima de polarização e irracionalidade que tomou conta de nosso país neste ano. Eu não vou falar que estou de fora, não, pelo contrário, eu também faço parte - pelo menos parcialmente - desta situação. Mas é preciso reconhecer o problema para poder agir e solucionar, e estou tentando despertar essa problemática para todos. Digo ainda que muitas pessoas já haviam percebido um, alguns, muitos ou todos estes problemas que mencionei. Mas o fato é que é preciso enxergá-lo como um "superset" de problemas sistematizados e estruturados que geram essa situação social toda.&lt;br /&gt;
&lt;br /&gt;
"Satisfação garantida&lt;br /&gt;
Obsolescência programada&lt;br /&gt;
Eles ganham a corrida antes mesmo da largada &lt;br /&gt;
Eles querem te vender, eles querem te comprar&lt;br /&gt;
Querem te matar de rir, querem te fazer chorar&lt;br /&gt;
Quem são eles?&lt;br /&gt;
Quem eles pensam que são?&lt;br /&gt;
&lt;br /&gt;
Vender, comprar, vendar os olhos&lt;br /&gt;
Jogar a rede... contra a parede&lt;br /&gt;
Querem te deixar com sede&lt;br /&gt;
Não querem te deixar pensar&lt;br /&gt;
Quem são eles?&lt;br /&gt;
Quem eles pensam que são?"&lt;br /&gt;
(Engenheiros do Havaí - 3ª do Plural. Fonte: &lt;a href="http://letras.terra.com.br/engenheiros-do-hawaii/747530/"&gt;http://letras.terra.com.br/engenheiros-do-hawaii/747530/&lt;/a&gt;)&lt;br /&gt;
&lt;/div&gt;&lt;h1&gt;A Guerra&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;Agora quem começou a ler esta introdução deve estar com um "nó" na cabeça: Bruno, porque tu começou falando de guerra e agora apresentou tudo isso? Nós estamos no meio de uma única guerra, que é dinâmica e nos usa ora para um lado, ora para outro. Servimos aos dois, e o pior de tudo é que todos perdemos de um jeito ou de outro.&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos que polarizam o país:&lt;br /&gt;
"Partido T" x "Partido S"&lt;br /&gt;
"Rede de TV G" x "Rede de TV R"&lt;br /&gt;
"Norte/Nordeste" x "Sul/Sudeste" (esta está na moda)&lt;br /&gt;
"Ricos" x "Pobres"&lt;br /&gt;
&lt;br /&gt;
São todos temas polêmicos e cheios de estereótipos por trás. A manipulação através da ideologia está cada vez mais dividindo a sociedade, e fechando sua mente contra as "terceiras opções". Estamos bipolarizando o mundo em nossa volta, de forma manipulada. Comecei este texto falando que o "Caso Prates" me motivou a escrever este texto. Uma vez que um comentário que - tenho que admitir, com palavras um pouco ambíguas e com seu tom "ideologicamente apaixonado" - soou um tanto agressivo(ainda mais para quem não é acostumado a ouvir os comentários dele), precisamos analisar a forma como ele foi manipulado e transformado em "bandeira do preconceito".&lt;br /&gt;
&lt;br /&gt;
E aí? Agora os preconceituosos usam o discurso dele para embasar seus preconceitos, e os "anti-preconceito" radicais distorcem-no(eu disse DISTORCEM, porque recortar e exibir só os trechos que parecem ofensivos é um atentado COVARDE à dignidade de uma pessoa).&lt;br /&gt;
&lt;br /&gt;
Deixando o polêmico caso de lado, já que não é o objetivo, vou mencionar outras coisas. As pessoas estão "ultra-sensíveis" às palavras, especialmente aquelas que enquadram-se em estereótipos e elementos de manipulação utilizados em guerras bipolares. Um exemplo disso é o racismo, cujos processos foram "moda" por muito tempo.&lt;br /&gt;
&lt;br /&gt;
Eu não posso concordar que alguém possa ferir a dignidade de outrem com preconceitos por cor ou qualquer outro tipo de fator social, cultural ou genético. Mas a situação tornou-se complicada, estamos estimulando o ódio racial através da própria lei. Vou dar um exemplo: existem centenas de processos por racismo em situações que não houve má fé ou maldade em algum ato. Agora o vivente mal intencionado distorce as palavras de quem disse algo que possa ser interpretado como racismo, processa-o, e ganha - como a pessoa que foi processada não sustentará um receio contra o negro depois de uma experiência dessas?&lt;br /&gt;
&lt;br /&gt;
Hoje em dia existe um grande vitimismo explorado por pessoas aproveitadoras. Lado hipofavorecido é defendido pela justiça. Acho que a intenção disso é certa, mas a forma como vem sendo aplicado não. Já disse outras vezes, COITADO de quem é BRANCO, HOMEM e HETEROSSEXUAL hoje em dia! Vamos lá, quantos brancos ganham causas processando negros por racismo? Quantas Delegacias do Homem e Leis Mário da Penha existem para proteger os homens? Quantos projetos de lei para garantir direitos aos heterossexuais existem?&lt;br /&gt;
&lt;br /&gt;
Agora vou falar uma coisa muito séria: Todo mundo está preocupado com o heterossexual que discrimina o homossexual falando alguma coisa, mas ninguém preocupa-se com o que alguns(claro, não todos) homossexuais fazem as vezes. Um hetero chamando um homo de "bixinha" não pode, mas um homo chamando um hetero de "gostoso" em público pode? Um homo esbarrando propositalmente em um hetero e dizendo "aii, desculpa" com a única intenção de encostar-se, pode? E enganar um hetero travestindo-se de mulher, sem sequer dar um aviso antes: "olha, eu sou homem também"?&lt;br /&gt;
&lt;br /&gt;
Existem muitas outras coisas para falar sobre a proteção ao hipofavorecido, mas este não é o tema central. O que quero dizer é que sempre aparece alguém para distorcer o que nós falamos. Eu tenho um defeito que considero similar ao do polêmico Luiz Carlos Prates: não tenho papas na língua. Falo o que penso e exerço meu direito à liberdade de expressão. Mas a "tendência ultra EMOtiva" da população está em alta, e sempre aparece alguém pra polemizar e dizer que se sentiu ofendido. Ora bolas, hoje em dia as pessoas ofendem-se por qualquer coisinha. Uma palavrinha infeliz no meio de um texto já é suficiente para a pessoa ignorar o sentido(aquilo que o emissor da palavra tinha a intenção de passar) e levar para o lado pessoal!&lt;br /&gt;
&lt;br /&gt;
Sei que muitos não gostarão do que escrevo, mas o fato é que se nos importarmos tanto assim com o que alguém fala, e continuarmos levando todo tipo de feedback como ofensa, chegará um dia onde só existirá falsidade. Afinal, se um amigo meu tem um defeito e eu não sou macho para dizer isso a ele, o que eu sou? Uma pessoa verdadeira? E se algo está errado e eu me calo para não ofender ninguém? Afinal, a ultra sensibilidade às palavras me impede de emitir uma carga de emoção junto às minhas palavras para evitar o atrito, então mesmo que eu diga o que quero dizer, não estou traduzindo meu sentimento junto às palavras. Isso é cercear a liberdade de expressão. &lt;br /&gt;
&lt;br /&gt;
E nisso estamos impondo uma censura às pessoas. Não me digam que a pessoa tem liberdade para falar e que esta reação é mera consequência do que se fala - com a qual temos que arcar pela liberdade de falar. Porque se me disserem isso, vou responder que na ditadura militar, ser preso, morto e executado também é só uma consequência com a qual temos que arcar pela liberdade de dizer o que quer. Afinal, os militares não colocavam esparadrapos na boca das pessoas para impedi-las de falar; mas sim puniam-no fisicamente DEPOIS delas terem falado. E a punição moral, através da ridicularização da pessoa ou da aplicação de estereótipos como "preconceituoso", "arrogante", entre outros, muitas vezes pode ser ainda pior do que uma punição física.&lt;br /&gt;
&lt;br /&gt;
E agora eu fico mais em dúvida ainda quando reflito: Quem aplica estereótipos nos "preconceituosos", o que é? Afinal, um estereótipo é uma "generalização" de uma pessoa por falta de conhecê-la. Se não a conhece, é pré, e se é generalização é conceito. E o ser humano tem, sim, isso que ele tanto repudia.&lt;br /&gt;
&lt;br /&gt;
Sobre a crítica, ou o feedback como prefiro dizer, as pessoas são incapazes de vê-las de forma positiva. Aplicam novamente o estereótipo: Quem critica é arrogante, quer ver o criticado mal, etc. Participei&amp;nbsp; este ano de um seminário, o EMPRETEC, no qual aprendemos uma valiosa lição com nossos facilitadores: quando recebemos um feedback de alguém, a pessoa que quer crescer só pode agir de uma forma: agradecendo; e filtrando a parte que considera aplicável dele para transformar em ações para melhorar. Foi ofensivo? Você não gostou? Responder algo à pessoa, teimar, argumentar, discutir, ridicularizar... não trará nada de positivo pra ti.&lt;br /&gt;
&lt;br /&gt;
O cenário de sensibilidade à palavra tornou-se tão forte que utilizarmos uma palavra X virou sinônimo de enquadrar-se no estereótipo Y. Se eu falo a palavra "miserável", sou um rico que tem preconceitos contra o pobre. Só posso utilizar a palavra afrodescendente para referir-me a um negro: se falo "negro" sou racista. Afinal, tudo que alguém fala precisa ser levado para o lado da ofensa?&lt;br /&gt;
&lt;br /&gt;
Volto a dizer que cada um procura o que quer e é responsável pelo resultado obtido. Se eu passar a vida toda procurando chifres em cabeça de cavalo, mais cedo ou mais tarde eu vou encontrar, de uma forma ou outra. Se tenho o preconceito contra mim mesmo dentro de mim, é obvio que vou encontrar meu próprio preconceito no que o próximo fala.&lt;br /&gt;
&lt;br /&gt;
E quando fazemos parte de um lado em um conflito bipolar, nossa tendência é de sempre encontrarmos estes preconceitos no lado oposto, e - curiosamente - nunca no nosso. É muito mais fácil ir a um colégio e xingar o professor do meu filho, do que admitir que meu filho é uma peste e que preciso fazê-lo mudar. A pimenta nos olhos dos outros é colírio.&lt;br /&gt;
&lt;br /&gt;
É mais fácil chamar o Prates de babaca, preconceituoso, sem respeito pelos pobres, etc - do que reconhecer que fazemos "porcarias" no trânsito(e eu digo fazemos porque se muitos fazem a culpa é de TODOS). E ele ainda usou palavras-chave que levam ao clichê e ao estereótipo, tornando-se um prato cheio para aqueles que não querem enxergar a verdade - a parte positiva do feedback que é: existe gente demais fazendo "merda" com seus veículos, e precisamos tomar alguma providência enquanto sociedade(desculpem a palavra de baixo-calão). Aliás, ninguém importou-se com a necessidade de RESOLVER O PROBLEMA, só com o fato dele ter utilizado termos que PODEM, subjetivamente, ser interpretados por alguns como "ofensa ao pobre".&lt;br /&gt;
&lt;br /&gt;
A consequência deste movimento todo, que é agravado sempre que temos anos de coisas polêmicas(eleições, por exemplo), é uma humanidade com pessoas cada vez mais isoladas umas das outras, menos unidas e capazes de trabalhar em conjunto. É por isso que todos agem tanto para deixar um mundo melhor para nossos filhos, e quase ninguém age para deixar filhos melhores para o nosso mundo.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;
Classificação do conteúdo: &lt;b&gt;&lt;span style="color: green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Sobre mim:&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-8273913550547218150?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/dLuuo20UCKo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/dLuuo20UCKo/war-geracao-ultra-sensivel-as-palavras.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2010/11/war-geracao-ultra-sensivel-as-palavras.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-2743715358809390255</guid><pubDate>Wed, 29 Sep 2010 16:52:00 +0000</pubDate><atom:updated>2010-09-29T13:52:55.161-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Política</category><category domain="http://www.blogger.com/atom/ns#">Eleições</category><category domain="http://www.blogger.com/atom/ns#">Dicas</category><category domain="http://www.blogger.com/atom/ns#">Estratégia</category><title>Critérios Estratégicos Para Voto</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SasDoa6s3lRFIB92UeMdv8WLmFM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SasDoa6s3lRFIB92UeMdv8WLmFM/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/SasDoa6s3lRFIB92UeMdv8WLmFM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SasDoa6s3lRFIB92UeMdv8WLmFM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Política, Eleições, Dicas, Estratégia&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;As eleições estão chegando, e como sempre neste período, vejo que a maioria das pessoas não tem nem uma definição de critérios para escolher quem vai governá-la por 4(ou 8) anos. Admira ainda mais saber que algumas não tem nem noção da função exercida por cada cargo e de como funciona o processo eleitoral. Bom, se você [e-]leitor for uma destas pessoas, vou falar um pouco sobre estes temas.&lt;/div&gt;&lt;br /&gt;
&lt;h2&gt;O Processo Eleitoral E a Função Exercida - Para Leigos&lt;/h2&gt;&lt;div style="text-align: justify;"&gt;Primeiramente, minha entrada no assunto dos critérios requer um entendimento básico das funções dos cargos e do processo. Não vou detalhar muito o assunto, mas sim explicar resumidamente o suficiente para entender-se o tema. Aos que conhecem o processo, pulem este tópico.&lt;/div&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;b&gt;Cargos Executivos(Presidente e Governador).&lt;/b&gt; São os cargos responsáveis por operacionalizar o governo. Efetuam a gestão OPERACIONAL do governo. Em outras palavras, o Presidente e o Governador vão mais FAZER as coisas do que DECIDIR elas(executor, por isso o termo "executivo"). Ainda assim, possuem funções decisórias no sentido de vetar parcial ou totalmente as decisões do legislativo, bem como criar Medidas Provisórias com efeito de Lei. Ambos os cargos possuem mandato de 4 anos, sendo prorrogáveis por mais 4 através da re-eleição. Também possuem um vice, que assume o cargo em primeira instância no caso de afastamento temporário ou permanente do mesmo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O critério da eleição é a maioria(50%+1) dos votos válidos, sendo que se esta não for obtida, é realizado um segundo turno de votação com apenas dois candidatos(os dois mais votados no primeiro turno), aonde vence o candidato que obtém a maioria dos votos, ou o mais velho assume em caso de empate(minha gente, alguém acha que um dia vai haver empate em um país de 190 milhões de habitantes?).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Deputados(Estadual e Federal).&lt;/b&gt; São cargos legislativos que compõem a Assembléia Legislativa de um estado(Deputado Estadual), e a Câmara dos Deputados(Deputado Federal). Tem por finalidade principal legislar representando &lt;b&gt;SEU PARTIDO&lt;/b&gt;. O período de mandato é de 4 anos, mas o cargo é pertencente ao partido e não ao candidato.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Como a função deste cargo é representar &lt;b&gt;O PARTIDO&lt;/b&gt;, e existem um determinado número de vagas ao cargo para cada estado, é aplicada uma proporcionalidade de vagas a cada partido de acordo com os votos obtidos a este para o referido cargo(através de um cálculo complexo que vocês podem pesquisar sobre no Google, chamado Quociente Eleitoral ou algo assim). Entenda ao menos a idéia do Quociente Eleitoral e evitarás os chamados "votos de protesto"(votar no Tiririca só porque ele é palhaço e você está indignado, por exemplo).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Senadores.&lt;/b&gt; São cargos legislativos que compõem o Senado Federal. A finalidade do senador, diferente da finalidade do deputado(representar o partido), é &lt;b&gt;representar as Unidades da Federação(Estado ou Distrito Federal)&lt;/b&gt; no processo legislativo. Cada estado possue sempre 3 senadores o representando, e o mandato de um senador - ao contrário de todos os demais cargos - dura 8 anos. O Senador possui, também, um primeiro e um segundo suplentes para substituí-lo temporaria ou permanentemente.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;São eleitos os senadores mais votados em cada estado, de acordo com o número de vagas a serem preenchidas no Senado(nestas eleições são 2 senadores por estado). Ao contrário do deputado, o cargo é pertencente à chapa(Senador+2 suplentes), e não ao partido.&lt;/div&gt;&lt;br /&gt;
&lt;h2&gt;Estratégia e Critérios&lt;/h2&gt;&lt;div style="text-align: justify;"&gt;Vou demonstrar meu modelo de estratégia e critérios para as eleições, sem pedir que concordem comigo, uma vez que cada um possui uma visão. Apenas estou demonstrando os meus procedimentos como um exemplo, e implorando a todos para que TENHAM ESTRATÉGIA E CRITÉRIOS, seja qual for o modelo utilizado.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O primeiro passo é definir os seus objetivos como eleitor. Que Brasil eu quero? Em que setores eu quero melhorias? E, é claro, colocar números quando possível para depois avaliar se os objetivos foram atingidos ou se estão caminhando mesmo para este rumo. Afinal, dizer que quer um Brasil com uma saúde melhor é abstrato demais, e você nunca vai se dar por satisfeito se o "melhor" for "mínimamente melhor".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para ilustrar, são estes os meus objetivos para os próximos 4 anos:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1-Redução de 30% da carga tributária para as médias e grandes empresas, e 40% para a micro e pequena empresa.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;2-Redução dos tipos de imposto a apenas 1.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;3-Criação de um indicador padrão da qualidade da educação com acompanhamento anual de cada estudante.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;4-Reduzir em 50% o desmatamento no país.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;5-Reduzir 5% da emissão de poluentes no país.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;6-Proporcionalizar as aposentadorias em "número de salários mínimos" para não defasar a receita dos aposentados&lt;/div&gt;&lt;div style="text-align: justify;"&gt;7-Incluir disciplinas de Direito e Cidadania, Finanças Pessoais e Lógica no curriculum dos ensinos Fundamental e Médio.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;8-Reduzir em 30% o tempo médio dos atendimentos nos hospitais públicos, e em 40% o número de atendimentos(através da prevenção).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;9-Reduzir em 10% as ocorrências policiais em todo o país.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Definidos os objetivos, temos que definir as prioridades. Ordene seus objetivos do mais relevante para o menos relevante. Por que? Simples: quem tenta fazer tudo faz tudo mal feito. E se todos os teus objetivos forem iguais, e um candidato disser que os objetivos dele são fazer tudo que você definiu como objetivo, provavelmente este candidato também não sabe priorizar as coisas e obtê-las na ordem de prioridade - e então tentará abraçar o mundo, acabando por não fazer nada direito.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A minha ordem pessoal de prioridades, de acordo com a numeração acima, é: 8, 9, 4, 6, 7, 1, 2, 5, 3.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Com as prioridades definidas, o próximo passo é definir de acordo com seus princípios quais são as características inaceitáveis dos candidatos para a política e para aquele cargo. Por exemplo, um presidente ou vice com problemas de saúde, por mais competente que seja, será tão inefetivo quanto um senador currupto(sim, inefetivo, atos desonestos dispendem tempo e energia que deveriam ser aplicadas para governar). Novamente, vou usar meus critérios para exemplificar as características gerais que não aceito nos candidatos:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1) Ficha suja ou forte suspeita popular de currupção.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;2) Vivência profissional insuficiente(políticos acadêmicos vivem em um mundo teórico em outra dimensão, não podem governar no nosso mundo que é prático e real).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;3) Desconhecimento das atribuições do cargo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;4) Históricos de ações controversas ao discurso eleitoral ou de falhas ao atingir objetivos propostos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Agora, meus critérios de rejeição dos candidatos à Presidência da República e Governo do Estado são:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1) Conhecidos problemas de saúde ou similares que possam afastar a pessoa do cargo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;2) Sexo e idade que aumentem a probabilidade de licenças para afastamento(licença maternidade, para ser mais específico - nada contra as mulheres que ainda não chegaram na menopausa, mas governar o país e ficar gravida pode causar sérios problemas).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Meus critérios de rejeição dos candidatos à Senador ou Deputado:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1) Difícil acessibilidade(como vou eleger um cara a quem não terei acesso para fiscalizar e cobrar?).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Definidos estes critérios, busque no seu meio preferido candidatos que respeitem integralmente seus critérios, e que estejam o mais alinhados possível com teus objetivos - sempre lembrando de respeitar a ordem de prioridade dos objetivos, uma vez que alguns políticos defendem mais algumas causas do que outras! Por fim, ordene os candidatos localizados de acordo com a proximidade obtida nos teus critérios.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Com os candidatos ordenados, verifique mais a fundo nos mais próximos dos teus critérios se eles realmente estão de acordo com teus critérios de rejeição. Faça testes práticos quando possível. Um exemplo de teste é enviar um e-mail ou ligar para o candidato ou seus acessores para testar a acessibilidade do mesmo, e aproveitar para questionar e se certificar de que entendeu os objetivos do mesmo, e de que este parece confiável/sincero.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para os cargos de Presidente, Governador e Senador, não deixe de fazer todas estas verificações também para os suplentes. Já para os cargos de Deputado Estadual e Deputado Federal, é preciso fazer uma avaliação um pouco mais profunda. É preciso incluir na avaliação o partido, de acordo com minha explanação sobre estes cargos no começo do artigo(O Processo Eleitoral).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ao votar em um deputado, você não só vota nele, mas também vota para o partido dele ter mais vagas. Sendo assim, antes de votar em um deputado, verifique também se os candidatos do partido dele se encaixam nos teus critérios, e procure pesar isto no teu voto - uma vez que um pequeno número de votos a mais para um partido pode fazer com que tal partido tenha uma vaga a mais,que será aberta para alguém deste partido.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bom pessoal, era isso que eu tinha a escrever sobre o tema em um primeiro momento. Desejo boa sorte para nós brasileiros. Não preciso nem comentar que o trabalho de eleitor não é só dia 03 indo votar.&lt;/div&gt;&lt;br /&gt;
Classificação do conteúdo: &lt;b&gt;&lt;span style="color: green;"&gt;SÉRIO - UTILIDADE NACIONAL&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Sobre mim:&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-2743715358809390255?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/EOixJSYLUJI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/EOixJSYLUJI/criterios-estrategicos-para-voto.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2010/09/criterios-estrategicos-para-voto.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-3307218703963832956</guid><pubDate>Mon, 23 Aug 2010 02:23:00 +0000</pubDate><atom:updated>2010-08-23T08:07:32.853-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Política</category><category domain="http://www.blogger.com/atom/ns#">Tecnologia a Favor do Brasil</category><category domain="http://www.blogger.com/atom/ns#">Brasil</category><title>A Reforma Política Segundo Eu Mesmo</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zFYQWHdTX3j9iPBQ01isN7RHWC4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zFYQWHdTX3j9iPBQ01isN7RHWC4/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/zFYQWHdTX3j9iPBQ01isN7RHWC4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zFYQWHdTX3j9iPBQ01isN7RHWC4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Política, Brasil&lt;/span&gt;, Tecnologia a Favor do Brasil&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;Toda hora vemos alguém falando em reforma política. É um tema que "pipoca" muito na cabeça das pessoas, nas propagandas do horário eleitoral, nos butecos de esquina e na casa da sogra. Mas o ponto que ninguém parece perceber, é que este tipo de reforma não deve ser liderada pelos políticos partidários - imparciais e, muitas vezes, sem visão do que o povo precisa - mas sim pelo povo, principal parte interessada na mudança. As idéias que venho defender neste texto são a participação popular nos poderes legislativo e executivo, o governo orientado a planos, e as eleições mais justas de candidatos reconhecidamente capazes.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Penso que o governo deve funcionar de forma similar a uma Sociedade Anônima, aonde todos os sócios podem participar do processo "legislativo" e "executivo". Defendo a criação de um Conselho Popular, do qual qualquer cidadão possa participar quando bem entender, sendo que o processo legislativo precise passar por este conselho. E, para simplificar as coisas, este conselho deveria ter poderes maiores do que o Senado e o Congresso.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mas Bruno, você surtou? Isso seria uma loucura!! Bom, em uma primeira olhada eu até concordo. Mas penso que a maior loucura é eleger uma pessoa, e logo após precisar ficar 4 anos "mudo" aguardando passivamente que o indivíduo faça aquilo que eu acreditava-se que este faria. E isso não é apenas loucura: é passividade. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O referido conselho teria plenos poderes para aprovar leis e emendas constitucionais(com certas medidas de segurança, é claro) sozinhos. E este conselho participaria, em conjunto com as entidades atuais, do poder executivo. Esta participação se daria através da escolha, por votação, dos membros participativos do processo legislativo que tenham interesse em participar de uma "comissão executiva" - com poderes de veto de medidas oriundas do Senado ou da Câmara, ainda que sancionadas pelo Presidente da República.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mas como viabilizar uma coisa dessas? As pessoas que quisessem participar do processo teriam que dirigir-se todos os dias a uma câmara? Não. Desta maneira não funcionaria. Temos que utilizar os avanços tecnológicos a nosso favor. A idéia é criar um mecanismo seguro, aonde as pessoas digitalmente certificadas e com direito a voto poderiam votar nas propostas deste conselho. E, além disso, um sistema de Wiki criaria, participativamente, o texto das leis e emendas a irem para votação. Obviamente, precisaria de um determinado número de interessados para permitir que este texto fosse para aprovação. Mas acredito que com um bom estudo, seja totalmente possível viabilizar isso.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mas o que quero dizer com governo "Orientado a Planos"? Bom, eu acredito sinceramente que eleger apenas os candidatos não serve para nada. Afinal, nós elegemos eles, e eles fazem o que a plena vontade deles permitir. O que proponho aqui é que o país tenha um planejamento - como estes "planos de governo" que as coligações propõem no horário eleitoral, ou como o planejamento estratégico de uma empresa, mas que isso seja devidamente registrado e escolhido.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Deveríamos, antes de eleger o candidato, eleger um plano de governo - que deveria ser proposto por um partido político ou coligação, e assinado por um "Administrador Responsável". Logo após a eleição do plano de governo, os candidatos que considerarem-se capazes de assumir funções dentro deste plano de governo poderiam candidatar-se para os cargos que julgar conveniente. E não pararia por aí: caso o plano de governo não fosse cumprido devidamente, todo o "conjunto governamental" eleito responderia de alguma forma pela falha - tendo que justificar de forma concreta as razões para o plano não ter dado certo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Finalmente, precisamos de eleições da qual somente os interessados devam participar, e que ocorram de forma justa - sem prejudicar ou beneficiar ninguém. Acredito que tudo deva ser orientado ao candidato, e não à coligação ou o partido político. Quem tem um tempo no horário eleitoral é o CANDIDATO. Quem tem o cargo é o CANDIDATO. Afinal, é nele que as pessoas votam - e não no partido dele.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Este candidato precisa ter plena competência para exercer o cargo. É preciso estabelecer, primeiramente, uma formação necessária para exercer cada cargo político. Precisamos que somente candidatos capacitados possam assumir seus postos. Mas muitos vão me falar: "isso é injusto, pois vai privilegiar os que tem condições de formarem-se?". Bom, isso é um problema muito simples de se resolver: basta criar uma capacitação obrigatória a ser oferecida gratuitamente aos candidatos que forem eleitos pelo povo. Algum curso, que não seja tão extenso, e que seja oferecido gratuitamente ao candidato eleito pelas universidades, para que ele só exerça o cargo após a formação.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Acredito que toda esta visão que tentei passar possa parecer futurista, pouco praticável, irrealista ou qualquer coisa que alguns possam dizer. Mas acredito que a viabilização desta seja só uma questão de deixarmos de pensar "não dá", e pensarmos da seguinte forma alternativa: "como fazer isso?". Com a participação da sociedade tenho certeza de que juntos encontraremos uma forma de viabilizar tudo isso. Afinal, precisamos urgentemente de mecanismos para o povo governar.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Eu escrevo este artigo, que prometi em meu artigo anterior concluir até hoje(22-08), para propor uma visão de algo que deve ser comum a todos, indiferente ideologia e/ou posição política defendida por cada um - e gostaria de uma participação de todos que o lerem - pedindo apenas a gentileza de ser o mais "políticamente ecumênico" possível, sem mencionar síglas, candidatos ou qualquer coisa similar. Acredito que muitos concordarão com minha visão, e peço muito o apoio destes para fazer a idéia amadurecer.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Quero ler muitos comentários construtivos, que me ajudem a criar um "esboço de projeto" de como fazermos isso. Obrigado a todos pela atenção: o Brasil precisa de nós.&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Classificação do conteúdo: &lt;b&gt;&lt;span style="color: green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Sobre mim:&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-3307218703963832956?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/TgKk2TtRHdM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/TgKk2TtRHdM/reforma-politica-segundo-eu-mesmo.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>4</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2010/08/reforma-politica-segundo-eu-mesmo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-9220387714567863097</guid><pubDate>Tue, 17 Aug 2010 18:21:00 +0000</pubDate><atom:updated>2010-08-17T15:21:13.057-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Política</category><category domain="http://www.blogger.com/atom/ns#">Eleições</category><category domain="http://www.blogger.com/atom/ns#">Brasil</category><category domain="http://www.blogger.com/atom/ns#">Código Eleitoral</category><title>Código Eleitoral, Eleições e Vigarices</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oBdEnJHn0m4EOIigiLlbeJ5bRXo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oBdEnJHn0m4EOIigiLlbeJ5bRXo/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/oBdEnJHn0m4EOIigiLlbeJ5bRXo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oBdEnJHn0m4EOIigiLlbeJ5bRXo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Política, Eleições, Brasil&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ano de eleições denovo. As eleições vindo, "novos" candidatos, "novas" propostas, agora tudo é novidade. Mas dia 01/11/2011 tudo volta ao normal, as "novidades" são esquecidas e todos concentram-se em justificar o que não acontecerá. É assim desde antes de eu nascer, e creio que continuará assim até bem depois do meu falecimento - ainda que eu viva todo tempo que eu quero viver(me contento com 500 anos). &lt;br /&gt;
&lt;br /&gt;
O problema das eleições é que temos sempre os mesmos candidatos, embora seus nomes sejam outros. Fernando, Tupetudo, Fernandois, Luizinho, agora a briga entre Zezinho e Mariazinha, que defendem a mesma coisa, e por aí vai... Enfim, tenho a sensação de que desde meu nascimento o Brasil foi governado por duas pessoas diferentes - e isso só porque mudanças econômicas ocorreram quando eu era pequeno, pois se não fosse isso eu teria a sensação de que foi uma pessoa só.&lt;br /&gt;
&lt;br /&gt;
Recentemente o TSE &lt;strike&gt;cagou&lt;/strike&gt; entendeu que satirizar um candidato, por exemplo, é prejudicial à democracia(vide &lt;a href="http://www1.folha.uol.com.br/poder/781345-muito-politico-faz-chorar-com-a-mesma-materia-prima-que-o-humor-faz-rir-diz-danilo-gentili.shtml"&gt;nesta matédia do Danilo Gentili&lt;/a&gt;). É bem compreensível: vamos fazer a democracia impedindo a livre manifestação das pessoas - muito similar às democracias da China e de Cuba. Que idéia genial do TSE, afinal, a decisão do povo acontece quando este se cala no conceito desta palavra em nosso país. O mais curioso que notei na referida matéria é a dolorosa verdade de que alguns candidatos possuem um enorme tempo, e outros possuem tempo "bilau de japa".&lt;br /&gt;
&lt;br /&gt;
Isso até não me revoltaria tanto se o tempo fosse bem utilizado, e se houvessem regras RESTRITIVAS de como utilizar o tempo de cada candidato. Afinal, se eles tivessem que usar o tempo somente para CONTEÚDO ELEITORAL DE VERDADE, certamente alguns candidatos não conseguiriam preencher mais do que 2 ou 3 minutos. Mas, graças a esta "liberdade total" para usar o horário eleitoral(financiado pelos nossos bolsos), vemos candidatos contando a história de suas vidas, colocando musicas para agradar o público de determinadas regiões do país(não vamos citar quais), contando das dificuldades da infância, do quanto batalharam na vida - vida esta que é dramatizada como nas novelas, sem falar no lero-lero de apresentar família e outras baboseiras do gênero.&lt;br /&gt;
&lt;br /&gt;
Isso não só é desperdiçar dinheiro público, mas é, também, fazer o eleitor devidamente instruído sentir-se um palhaço por ter que assistir aquilo. E, o que é pior, utilizar de artefatos publicitários exagerados para causar emoção e comoção no povo menos instruído, o que me parece ferir o &lt;a href="http://www.planalto.gov.br/ccivil_03/Leis/L4737.htm"&gt;Art. 242 do código eleitoral&lt;/a&gt; ao meu modesto e leigo entendimento(eu precisaria compreender o que o claríssimo legislador entende por "estado emocional artificial"). E este tipo de coisa, que eu juro que não estou vendo pela primeira vez, é a maior de todas as sujeiras.&lt;br /&gt;
&lt;br /&gt;
A razão de meu repúdio a esta atitude não é só por abusar do lado emocional do eleitor - esta é a parte menos grave. O que acho lamentável é que alguns possam fazer isto e outros não. Afinal, como você vai causar impacto e emoções, e ainda falar algo complementar, com 1 minuto de tempo? Se for para causar falsas emoções/comoções no povo, então que todos possam ter o direito de fazer isso. Eu preferiria que NENHUM pudesse, mas antes TODOS do que APENAS ALGUNS.&lt;br /&gt;
&lt;br /&gt;
Agora vejam a incoerência das coisas. Os cargos de Senador, Deputado Estadual e Deputado Federal - aqueles que realmente legislam, e que possuem um número muito maior de candidatos/opções - possuem alguns segundos para manifestar-se. Os coitados precisariam transformar-se em narradores esportivos para falarem 10% do que provavelmente teriam a dizer. Agora, apesar do pouco tempo e da quase impossibilidade de perceber o potencial destes candidatos no horário gratuito, são das mãos deles que saem todas as decisões que afetam nossas vidas.&lt;br /&gt;
&lt;br /&gt;
E o que acaba acontecendo? Aquele candidato de maior poder econômico consegue o destaque neste momento, com propagandas diferenciadas das dos demais candidatos, além de possuir "recur&lt;b&gt;$$&lt;/b&gt;os" para utilizar de divulgação em outros meios. Nada contra isso também, desde que TODOS TENHAM ACESSO IGUAL a todos os meios - o que de fato não ocorre.&lt;br /&gt;
&lt;br /&gt;
Em contra-partida, o candidato a presidente e a governador, que não é menos importante - uma vez ele executará as decisões que os demais aprovarem, além de vetá-las se necessário - terá um tempo muitas vezes maior do que o de todos os demais cargos somados. Eu considero isso uma tremenda incoerência.&lt;br /&gt;
&lt;br /&gt;
E, finalmente, um item que faz parte da política e eu discordo mais do que tudo neste mundo: a entidade partidária como "balança" da política. Já ocorreram enormes polêmicas no país porque alguns cargos são "do partido". Não tenho muito o que opinar aqui sobre a fidelidade partidária, mas acho que o cargo pertencer ao partido é outra incoerência que entope as veias de nossa sociedade. Algum eleitor aqui, alguma vez na vida, votou no PT ou no PSDB para deputado estadual? Ou então no PSOL para deputado federal? Eu não conheci ninguém, em toda minha vida, que tenha votado em uma sigla - conheço apenas pessoas que votaram em candidatos, e estas eu conheço aos montes. Então que palhaçada é essa de "o mandato é do partido"?&lt;br /&gt;
&lt;br /&gt;
Agora retomando o raciocínio original do texto, eu acho uma palhaçada esta história de que cada partido tenha um tempo, e que as coligações possuem o tempo dos partidos somados. Não. Não pode ser assim de modo algum, isso é um erro absurdo, uma incoerência com a democracia. Minha humilde opinião é a de que o tempo deveria ser por candidato - indiferentemente do cargo(ou seja: candidato a deputado tem o mesmo tempo do candidato a presidente, a única diferença que posso concordar é em relação a abrangência do cargo, entre um cargo federal e um estadual, caso seja realmente justificável por razões de viabilidade). E, é claro, cada candidato só poderia falar sobre sí mesmo e sobre suas idéias, sem CITAR O NOME DE OUTRO CANDIDATO para não gerar qualquer tipo de vínculo.&lt;br /&gt;
&lt;br /&gt;
Bom pessoal, esta é a pura manifestação de minha idéia. Outra hora, com mais tempo, vou escrever um artigo sobre minha idéia de "NOVA ESTRUTURA LEGISLATIVA" para o país. Vou aproveitar que estou escrevendo para lançar o convite a todos para ler no próximo fim de semana(dia 22-08) o artigo que estou preparando sobre o tema. Vou lançar, não tendo a mínima idéia do sucesso ou fracasso disso - e contando com a contribuição de todos os interessados, um abaixo-assinado para a criação de um plebiscito discutindo o tema. Acredito que as entidades da política partidaria sejam "parciais" demais para fazer alguma coisa em relação ao avanço da política no país, e que a responsabilidade seja nossa.&lt;br /&gt;
&lt;br /&gt;
Vamos utilizar agora o que a tecnologia nos oferece para fazer o que foi inviável no passado e melhorar nosso país. Tenho certeza de que todos gostarão de minha proposta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Classificação do conteúdo: &lt;b&gt;&lt;span style="color: green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Sobre mim:&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-9220387714567863097?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/nZRoNkEVS4Y" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/nZRoNkEVS4Y/codigo-eleitoral-eleicoes-e-vigarices.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2010/08/codigo-eleitoral-eleicoes-e-vigarices.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-6446472658890687142</guid><pubDate>Thu, 01 Jul 2010 04:42:00 +0000</pubDate><atom:updated>2010-07-01T01:42:31.931-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Software Livre</category><category domain="http://www.blogger.com/atom/ns#">Liberdade</category><category domain="http://www.blogger.com/atom/ns#">Peter Sunde</category><category domain="http://www.blogger.com/atom/ns#">Libertinagem</category><category domain="http://www.blogger.com/atom/ns#">The Pirate Bay</category><category domain="http://www.blogger.com/atom/ns#">ASL</category><title>Porque não vou mais ao FISL?</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-1Q1vgO_Qy6YLS2deSnvJgBHe-U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-1Q1vgO_Qy6YLS2deSnvJgBHe-U/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/-1Q1vgO_Qy6YLS2deSnvJgBHe-U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-1Q1vgO_Qy6YLS2deSnvJgBHe-U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Software Livre, Liberdade, Libertinagem, The Pirate Bay, Peter Sunde, ASL&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Para variar, hoje vou ser polêmico - e como sempre, tentar sem sucesso não ser ofensivo. O FISL - Fórum Internacional de Software &lt;strike&gt;Livre&lt;/strike&gt; Libertinoso é um evento do qual participei três vezes e achei muito interessante. Até ano passado, quando cheguei até a pagar a inscrição mas não compareci. Me revoltei sériamente.&lt;br /&gt;
&lt;br /&gt;
Sempre me considerei de certa forma um "militante" so software livre. Quem duvida que pergunte aos meus colegas de aula do segundo grau o quanto eu falei a todos sobre o perigo que seria para todos as patentes de software. O problema é que - apesar do nome - o FISL e as pessoas por trás dele deixaram de defender o software livre. Passaram a defender as idéias abusivas e libertinosas. E isso chegou a um extremo inaceitável quando o FISL do ano passado utilizou como principal atração Peter Sunde - um dos fundadores do The Pirate Bay(site que publicava links de torrents piratas).&lt;br /&gt;
&lt;br /&gt;
Não que eu concorde com a maneira como o dito vivente foi injustiçado. Afinal, ele não violou copyright algum até onde eu fiquei sabendo do caso.Ele apenas criou um web-site aonde as pessoas publicavam torrents de conteúdos não necessariamente piratas. E ainda acho, sim, que o julgamento dele não teve nada de justo e que as gravadoras deixaram a ética de lado e certamente cederam algum benefício aos juízes envolvidos na condenação.&lt;br /&gt;
&lt;br /&gt;
Mesmo assim, o tom que isso gerou na comunidade de software livre - especialmente nas pessoas que estavam tendo os primeiros contatos com ela - foi de que defender software livre é defender pirataria e coisas gratuitas para todo mundo. Quando me posicionei a favor do software livre o conceito era outro.Vi a maioria das pessoas "vestindo a camisa" dessa idéia de associar software livre à pirataria.&lt;br /&gt;
&lt;br /&gt;
E o que as pessoas do movimento do software livre - em geral - faziam? Adivinhem? Aproveitavam a situação e a mídia que isso deu ao FISL e ao movimento - ao invés de posicionarem dizendo a toda esta multidão que eles estavam errados, e que a pirataria é nociva à liberdade. Eu achei tudo isso um lance de oportunismo puro - muito nocivo à imagem do movimento.&lt;br /&gt;
&lt;br /&gt;
Agora vou dizer para vocês aonde as pessoas pecam com esta visão. Software proprietário impede o usuário de ser livre com ele. Mas o usuário ainda é livre para escolher optar por um equivalente livre ao invés de utilizar o software proprietário. Ou para desenvolver o seu software e licenciá-lo sob GPL depois. Agora a liberdade do usuário é o que mais conta sempre?&lt;br /&gt;
&lt;br /&gt;
E a liberdade do produtor do software, da música, do livro ou do "seja lá o que for"? Afinal, não foi ele quem tomou litros de energético para fazer a coisa funcionar? Não foi ele quem ralou, pesquisou um monte, abdicou de tempo da vida dele e até de dinheiro as vezes para desenvolver o troço? Então o mínimo que ele tem é o direito de escolher o que fazer com a criação dele.&lt;br /&gt;
&lt;br /&gt;
Eu acho legal a idéia de software livre. Produzi bastante coisa com licença GPL, apesar delas geralmente terem ficado pouco ou nada conhecidas e talvez só terem servido para mim mesmo. Agora meu último projeto que eu iria publicar com licença GPL virou meu ganha-pão, minha fonte de sustento. E com excessão de empresas como a Microsoft, que lucram com a pirataria que dissemina amplamente seus softwares, a maioria das pequenas empresas deixa de ter uma receita que faz falta devido à pirataria.&lt;br /&gt;
&lt;br /&gt;
Acho violar a licença de um software proprietário comparável a violar a própria GPL ou outra licença livre similar. Temos empresas brasileiras que violam a GPL. Tivemos uma grande rede de IRC no Brasil que violava. E se a idéia fosse a de que software livre significa violar licenças, a comunidade de software livre estaria se auto-contradizendo.&lt;br /&gt;
&lt;br /&gt;
Por último, focando novamente no FISL - tema deste post - eu gostaria de saber algo que até hoje ninguém me respondeu: O que diabos Peter Sunde fez pelo software livre que trouxe a ele este status de destaque no FISL? Esta pergunta permanece um mistério - e até que seja dada uma resposta coerente eu me recuso a participar de qualquer coisa relacionada ao movimento de software livre no Brasil. Isso porque é injusto dar todo este destaque a um cara que não fez nada pelo movimento, enquanto tantas pessoas vem fazendo um trabalho sério neste meio e não tem seu devido reconhecimento.&lt;br /&gt;
&lt;br /&gt;
Por hoje é só isso pessoal.&lt;br /&gt;
---&lt;br /&gt;
Classificação do conteúdo: &lt;b&gt;&lt;span style="color: green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Sobre mim:&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-6446472658890687142?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/CnW5zzSjTio" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/CnW5zzSjTio/porque-nao-vou-mais-ao-fisl.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2010/07/porque-nao-vou-mais-ao-fisl.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-70705422088107089</guid><pubDate>Sat, 19 Jun 2010 06:10:00 +0000</pubDate><atom:updated>2010-06-19T03:10:38.634-03:00</atom:updated><title>Ultra-Feminismo Exagerado</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gIU79eiMONtKqHE2knzXe_Tkhbs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gIU79eiMONtKqHE2knzXe_Tkhbs/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/gIU79eiMONtKqHE2knzXe_Tkhbs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gIU79eiMONtKqHE2knzXe_Tkhbs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Ultra-feminismo exagerado, vida moderna, sociedade, mulheres, estereótipos&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
Hoje resolvi criar polêmica. E que ninguém diga que estou fugindo do assunto original do meu blog, uma vez que este assunto pode ser classificado como parte das "Besteiras Gerais" que você vai ler na barra de títulos. Como tudo que escrevo de polêmico, estou falando sério, mas isso não significa que vocês leitores precisem levar tão a sério. E talvez eu escreva em vão, já que mulher nenhuma lê este blog também. &lt;br /&gt;
&lt;br /&gt;
As diferenças entre os sexos são muito complexas de entender, e muitas vezes chatas. Mas ainda bem que existem, porque eu é que não ia querer beijar ou casar com alguém que parecesse comigo ou que tivesse comportamentos masculinos. Mas falando sériamente, alguns e-mails destes que as pessoas mandam para todo mundo e insistem em me mandar(que confesso, nos últimos tempos tenho até lido de tanto insistirem em me mandar) - além de mensagens que vemos em blogs, perfís de orkut, mensagens no twitter ou MSN, ou no que mais você imaginar - que contém mensagens superficiais e pouco reflexivas, revelam ter sido criadas pelo pior tipo de mulher: as hipócritas que não aceitam a realidade que elas mesmas confirmam(olha o estereótipo denovo). É claro que você, minha amiga que eventualmente esteja lendo isto, não faz parte desta realidade, uma vez que procuro manter a distância mínima de 1km de mulheres que percebo fazerem parte deste gênero.&lt;br /&gt;
&lt;br /&gt;
Este é um &lt;a href="http://estripulia.spaceblog.com.br/119356/Procure-um-homem/"&gt;exemplo&lt;/a&gt; do tipo de texto ao qual me refiro(a blogueira-autora que me desculpe, mas é o primeiro resultado-exemplo do Google). Agora eu peço que leiam o texto(é curto). Me digam: pelo texto, ela quer um homem ou um animal de estimação? Um homem que te ligue de volta mesmo quando você desligar na cara dele? Isso é um homem ou é um idiota candidato a corno? A mulher que espera isso de um homem quer realmente um homem? Pois está parecendo que ela quer um satélite girando em órbita dela. Agora vamos ser bem sinceros, ainda que um homem seja babaca o suficiente para disfarçar-se de satélite e orbitar nessa mulher, certamente ela não aguentaria 7 dias. É grude! Um cara não se auto-aguentaria se ele fosse assim.&lt;br /&gt;
&lt;br /&gt;
Outro exemplo comentável é &lt;a href="http://superativa.blogspot.com/2009/03/quem-nao-da-assistencia-abre.html"&gt;essa piada&lt;/a&gt; que é, diga-se de passagem, engraçada, mas que revela outro ato ultra-feminista que tenta fazer a mulher ser "superior" ao homem. Vejam, leitores, que o artigo retrata nós homens como auxiliares de serviço geral. E ainda tenta criar na cabeça do homem um "conformismo", tentando insinuar que se não nos submetermos a esta condição seremos trocados por algum idiota que se submeta. &lt;br /&gt;
&lt;br /&gt;
Agora, pessoal, &lt;a href="http://www.insoonia.com/arnaldo-jabor-quem-nao-da-assistencia-abre-concorrencia/"&gt;este texto&lt;/a&gt; é de um homem que perdeu as características masculinas(e agora femininas) que ele próprio aponta e aparenta admirar nas mulheres. Esta parte do texto é direcionada aos homens que perderam o amor próprio e a auto-estima a ponto de achar que precisam ser "modelados ao gosto das mulheres" para se relacionarem com mulheres legais, como o texto mencionado aponta. Você homem também não precisa ter medo de nada, e nem das "ameaças" que o ultra-feminismo vem &lt;b&gt;colocado em suas cabeças&lt;/b&gt;(entenda como quiser). Sabe porque? Porque se uma mulher não te deu valor, você não é obrigado a continuar com ela. Você com certeza vai achar uma mulher a altura - e enquanto não achar poderá divertir-se com as que são como a tua ex que te colocou as &lt;b&gt;coisas na cabeça&lt;/b&gt;. Agora não ligue para estas histórias de "o mar não está para peixe".&lt;br /&gt;
&lt;br /&gt;
E você, mulher, finja que foi para você também o parágrafo anterior. Ninguém, seja homem ou mulher, deve reprimir seus conceitos e princípios somente pelo medo de ficar sozinho ou de perder alguém. Valorizem-se, seres humanos.&lt;br /&gt;
&lt;br /&gt;
Claro que nestes parágrafos de críticas aos textos falei o essencial da mensagem que quero passar. Não quero dizer que o homem tenha que ser relapso no relacionamento e menos ainda que a mulher tenha que aceitar. Mas sim que, em um relacionamento adulto e maduro, não devemos ficar com medinhos do tipo "ela vai me deixar", "ela vai me chifrar", "ela vai me trocar por outro", etc - e nem que as mulheres devam repassar este tipo de mensagem colocando elas como "as donas da bola", que se o jogo não for com as regras dela ela pega a bola e vai jogar em outro estádio.&lt;br /&gt;
&lt;br /&gt;
Ahh, claro, antes que eu esqueça de falar, também existem também as ultra-feministas princesas. São aquelas que difundem a idéia de que homem não presta, não se acha um homem decente, etc. Aí um cara legal que não tem os defeitos que elas apontam como inaceitáveis se interessa por ela. E aí? Ahh, ele não, ele é legal mas é só amigo porque ele é feio. Aquele ali também é legal, mas é só amigo porque ele é um pobre coitado. Aquele outro também não, porque ele &lt;digite aqui="" atendida="" exigência="" não="" uma=""&gt;. E, por fim, ela vai acabar saindo com os que tem logo os defeitos que elas consideram inaceitáveis, pois como não encontra o "homem perfeito" dela ela prefere se divertir com imperfeitos. E ainda sai repetindo por aí que homem não presta, etc.&lt;/digite&gt;&lt;br /&gt;
&lt;br /&gt;
Bom, primeiramente a "lista de exigências" de mulheres deste gênero é impossível de ser atendida, por mais que elas queiram. Mas, agora vamos analisar a indivídua que quer exigir tudo isso de um homem. Será que ela parou para olhar para o próprio humbigo? Ela tem espelho em casa? Ela não o quer porque ele não é bonito, mas é uma baranga. Ela não o quer porque ele não é um homem "culto e inteligente", mas ela não sabe falar 2 minutos sobre algo que não seja fútil e idiota. Ela não o quer porque ele é pobre, mas além de ser mais pobre ainda ela deve até as calcinhas para comprar as merrecas que tem, além de ser interesseira o suficiente para pensar desta maneira.&lt;br /&gt;
&lt;br /&gt;
E a pior parte desta última espécime de mulher é a síndrome de "eu não sou assim". Este tipo de mulher vai ler este texto, dizer que concorda comigo - e talvez até acreditar que realmente concorde, mas na prática ela é totalmente diferente. Afinal, o mundo tá cheio de mulheres assim, mas nenhuma delas age de tal forma.&lt;br /&gt;
&lt;br /&gt;
Agora, todos os problemas do ultra-feminismo exagerado que mencionei tentam moldar os homens, torná-los o que eles não são e reprimí-los. E isso não está certo, e as principais prejudicadas com isso são as próprias mulheres. Querem saber porque? Bom, você mulher vai pra balada e conhece um gostosão certificado pelo INMETRO como homem perfeito. E você também tenta ser uma mulher perfeita certificada. Então vocês são dois mascarados se beijando.&lt;br /&gt;
&lt;br /&gt;
"Mas Bruno, porque você está falando isso"? Porque 99,9% dos relacionamentos começam de modo análogo. A balada pode ser um evento, uma sala de aula ou qualquer outro lugar. O fato é que estas mascaras podem perdurar muito tempo - e o pior é que perduram. Então elas vão descascando aos poucos, quebrando um pedaço aqui e outro ali da máscara, e então bum. Cinco anos passaram-se e as pessoas não são mais aquelas do começo do relacionamento. "Ele mudou, ele não presta mais, etc". E aí os pretextos são inúmeros. Na TV agora passa o programa da Universal, e segundo eles o que causa isso é um encosto, um espírito maligno. Enfim, cada um deve acreditar no que prefere.&lt;br /&gt;
&lt;br /&gt;
Mas, para mim, o "encosto" é esta tentativa de "padronizar príncipes encantados" que não existem no mundo real. Por isso eu digo pra todo mundo, seja homem ou mulher: seja você mesmo(a). Você não vai ser aceito hoje? Não é o príncipe ou a princesa de ninguém? Ok, uma hora essas pessoas cairão na real e saberão valorizar uma pessoa de verdade e não um estereótipo. Enquanto isso você curte a vida, cresce profissionalmente, estuda, etc. Atividades para dedicar-se não faltam. Bancar o príncipe ou a princesa agora é ser rebaixado a sapo em 12 meses. &lt;br /&gt;
&lt;br /&gt;
Acreditem, dá certo. Eu não sou um príncipe encantado. Sou pobre(claro que isso é temporário), não tenho ensino superior nem carro, sou grosso/estúpido as vezes, estressado quase sempre, e apesar de apresentável não sou nenhum bonitão. E mesmo com tudo isso estou casado. Achei, e nem demorei tanto, uma pessoa que me aceita. E enquanto ela continuar me aceitando, sem exigir nenhum disfarce de mim, meu casamento continuará existindo.&lt;br /&gt;
&lt;br /&gt;
Agora, temos que estabelecer algumas realidades aqui. Não quero generalizar, mas o que vejo é meio generalizado mesmo, e só estou relatando. As mulheres adoram conquistar novos direitos e a dita "igualdade com os homens", mas só no lado interessante. Elas querem trabalhar, mas querem começar e estar sempre em cima pré-maturamente. Querem dirigir, mas não querem conhecer a mecânica do veículo(irresponsabilidade total com elas mesmas). Pensam que os homens devem parar na faixa para elas, mas no entanto eu NUNCA VI UMA MULHER PARANDO NA FAIXA PARA UM PEDESTRE. &lt;br /&gt;
&lt;br /&gt;
Espero ter conseguido fazer as pessoas chegarem a uma reflexão sobre o assunto. Nem vou comentar sobre &lt;a href="http://tudopalhaco.blogspot.com/"&gt;este blog que eu ouvi falar no programa do Jô ontem&lt;/a&gt;, pois acredito que as meninas lá estejam de onda. Porque se estiverem falando sério, elas são as espécimes às quais me referia com "ultra-feminista princesa". E não duvido mesmo que possa ser sério, uma vez que de acordo com elas o homem é que tem que pagar o motel e isso é regra.&lt;br /&gt;
&lt;br /&gt;
Espero que minhas amigas continuem sendo minhas amigas. Respeito muito as mulheres, até porque foi uma que me aguentou na barriga por incríveis nove meses, e como trata-se de mim isso é um record. Só escrevi algumas palavras com conselhos para o próprio bem delas. Afinal, homem pode não prestar ou "ser tudo palhaço", mas se não houvesse um homem para acasalar com as mães delas elas sequer existiriam. &lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
Classificação do conteúdo: &lt;b&gt;&lt;span style="color: green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Sobre mim: &lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt; &lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-70705422088107089?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/b9oUqWuRNNQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/b9oUqWuRNNQ/ultra-feminismo-exagerado.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>5</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2010/06/ultra-feminismo-exagerado.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-8326121703336981880</guid><pubDate>Tue, 25 May 2010 15:00:00 +0000</pubDate><atom:updated>2010-05-25T12:00:43.361-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CabeçaDeTv</category><category domain="http://www.blogger.com/atom/ns#">Modismo</category><category domain="http://www.blogger.com/atom/ns#">Nerdismo</category><title>Dia da Toalha e Orgulho Nerd? O cacete!</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/58ieitRv4xHn3_9Q0k2kTVdE998/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/58ieitRv4xHn3_9Q0k2kTVdE998/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/58ieitRv4xHn3_9Q0k2kTVdE998/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/58ieitRv4xHn3_9Q0k2kTVdE998/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Nerdismo, Modismo, CabeçaDeTv&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Dia do Orgulho Nerd? Dia da Toalha? Para mim, nerd profissional, o Dia da Toalha deve ser um dia para se abraçar as toalhas de rosto ou banho ou outra babaquice assim. Nunca havia ouvido falar do tal "Guia do Mochileiro das Galáxias" antes. Adoraria ser um mochileiro, mas não vejo aonde isso se encaixa com "ser um nerd".&lt;br /&gt;
&lt;br /&gt;
Bom, com os conceitos televisivos de hoje em dia e essa pirralhada EMO crescendo, vi na TV a "Mary Moon" se dizendo Nerd um dia. Pergunto-me o que ela sabe sobre ser nerd.&lt;br /&gt;
&lt;br /&gt;
Para manter acesa a honra do NERD DE VERDADE, e para você testar se você é um NERD MESMO, ou se é apenas um POSER BABACA se dizendo nerd porque está na moda, vou colocar abaixo uma lista de coisas que quase todo nerd teria feito na vida:&lt;br /&gt;
&lt;br /&gt;
1) ABRIR brinquedos durante a infância para ver como funcionam. Esta é clássica. Alguém que nunca tenha feito isso NUNCA será um Nerd.&lt;br /&gt;
&lt;br /&gt;
2) Montar transmissores de rádio, TV, etc. Qualquer tipo de engenhoca bem inventiva ou copiada daquelas revistas de eletrônica ou similares(mecânica, ou qualquer outra coisa, também vale) substitui este item, mas ele é indispensável para um sujeito que se diz nerd.&lt;br /&gt;
&lt;br /&gt;
3) Nerds não aceitam regras. Se você nunca criou métodos engenhosos para burlar alguma regra ou imposição física, psicológica, social ou mental, você NUNCA será um nerd. &lt;br /&gt;
&lt;br /&gt;
4) Nerds de verdade já tentaram, ainda que tenham falhado, inventar objetos de vôo ou navegação automáticos(aviões, helicopteros, barcos ou similares movidos por baterias/pilhas e preferencialmente com controle remoto). Se você nunca tentou e tem mais de 16 anos, é tarde demais para tentar ser um nerd.&lt;br /&gt;
&lt;br /&gt;
5) A maioria dos nerds conhece pelo menos um pouco de assembly. Ou alguma outra linguagem de programação. Mesmo que não sejam programadores. Se você não conhece, dificilmente é um nerd.&lt;br /&gt;
&lt;br /&gt;
6) Se você não sabe porque o 256º dia do ano teria muito mais razões para ser o "Dia do Orgulho Nerd", ao invés do tal "Dia da Toalha" que os posers propagam por aí, você SEM DÚVIDA ALGUMA é um POSER BABACA e não um NERD.&lt;br /&gt;
&lt;br /&gt;
7) Se você não gosta de ficar tentando entender o Universo durante horas e mais horas, ou de ficar filosofando sobre a sociedade - ou ainda pensando por horas e horas em problemas de física complexos(pelo menos para você) por puro prazer e pela vontade de entender o funcionamento das coisas, VOCÊ muito provavelmente NÃO É NERD.&lt;br /&gt;
&lt;br /&gt;
Agora vejam a lista das coisas que muitos nerds gostam, mas que levam os POSERS BABACAS a crerem que são nerds apenas porque também gostam:&lt;br /&gt;
1) Star Wars - fãs do Darth Vader. OBS: Só significa ser nerd os enquadrados neste item que já tentaram fabricar um sabre de luz.&lt;br /&gt;
2) CSI/Cold Case/similares. Muitos nerds curtem seriados sobre investigação criminal. É o perfil do nerd de "tentar entender as coisas".&lt;br /&gt;
3) Computadores e Internet. Esse nem precisamos discutor.&lt;br /&gt;
4) Heavy Metal.&lt;br /&gt;
5) Piadas técnicas sobre sua área profissional ou de estudo.&lt;br /&gt;
6) Piadas complexas que a maioria das pessoas não entende.&lt;br /&gt;
7) Filmes e músicas que te deixam em constante pensamento.&lt;br /&gt;
8) Quebra-cabeças e jogos como o Cubo Mágico, por exemplo.&lt;br /&gt;
9) Xadrez.&lt;br /&gt;
10) Armadilhas para sacanear os amigos.&lt;br /&gt;
&lt;br /&gt;
Então, leiam e tirem suas conclusões. Mas não me venham com modinha!&lt;br /&gt;
&lt;br /&gt;
Classificação do conteúdo: &lt;span style="color: yellow;"&gt;SEMI-&lt;/span&gt;&lt;b style="color: yellow;"&gt;SÉRIO&lt;/b&gt;&lt;br /&gt;
Sobre mim: &lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt; &lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-8326121703336981880?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/4oURVJopQIM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/4oURVJopQIM/dia-da-toalha-e-orgulho-nerd-o-cacete.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>1</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2010/05/dia-da-toalha-e-orgulho-nerd-o-cacete.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-9044257590198178333</guid><pubDate>Thu, 04 Jun 2009 21:56:00 +0000</pubDate><atom:updated>2009-06-11T21:08:35.796-03:00</atom:updated><title>umask, mistérios e lendas</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GiSOUk1xhxiX6r7Zl4qxHcpaaaA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GiSOUk1xhxiX6r7Zl4qxHcpaaaA/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/GiSOUk1xhxiX6r7Zl4qxHcpaaaA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GiSOUk1xhxiX6r7Zl4qxHcpaaaA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; Linux&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pessoal, primeiramente peço perdão a Alah por não ter postado neste blog por muito tempo... Continuarei neste rítmo uma vez que a correria tá braba!!&lt;br /&gt;&lt;br /&gt;Eu tava me preparando pra escrever isso há dias mas não sobrava tempo. O que ocorre é que existe um recurso nem tão freqüentemente utilizado em ambientes UNIX, chamado de umask. O umask nada mais é do que uma "mascara" utilizada para definir as permissões padrões de novos arquivos e diretórios. Mais ao fim eu explico o "espírito" da umask, mas por enquanto vamos contar um pouco da aventura.&lt;br /&gt;&lt;br /&gt;No tempo que eu era um "gurizote", nem tão barrigudo quanto sou hoje, eu aprendi, com repetidores de lendas, que a tal da umask era um "número", que subtraído de 777 nos dava a permissão que ia ser utilizada para novos diretórios, e que subtraído de 666 nos dava a permissão que ia ser utilizada para novos arquivos.&lt;br /&gt;&lt;br /&gt;Quando eu comprei alguns livros para estudo, como o "Certificação Linux", do Uirá Ribeiro(recomendo, propaganda grátis hehehe), que me confirmavam o que eu havia lido(e nunca havia testado tão a fundo). Nos exemplos que sempre são passados por estes repetidores de informação(me incluo neles) temos sempre a típica umask que coincide com o cálculo errôneo, e que é a umask padrão de todos os sistemas: a umask 022.&lt;br /&gt;&lt;br /&gt;Na minha vida prática, só precisei utilizar outra umask, DURANTE MUITOS ANOS, quando trabalhei com SVN sobre SSH. O que acontecia neste caso é que os novos arquivos do repositório SVN precisavam ter permissão de escrita para o grupo também, senão nenhum outro usuário alteraria o conteúdo criado por outro no repositório. Para isso ser possível, alterei de 022 para 002 a umask do sistema. Com esta umask, também havia a dita coincidência com o "lendário cálculo"(os números '0' e '2' são 'mágicos' em certas operações matemáticas binárias).&lt;br /&gt;&lt;br /&gt;Esses dias estava com uma turma de alunos, aonde, como muito ocorre com todo mundo, fui um repetidor de informações no que se refere à umask. Normalmente eu não falava dela em aulas, pois para mim aquilo parecia inútil até o recente episódio do SVN+SSH. Resolvi passar ela para o pessoal, que foi fazer uns testes e achou alguns casos que não batiam. Desde então, fui pesquisar e achei 50% das informações na internet falando da "lenda da subtração de umask". as outras 50% eram outras informações semelhantes que não batiam também. As man pages umask(2), open(2), creat(2) e mkdir(2) também não foram muito úteis na tarefa, pois não pareciam estar escritas de maneira clara.&lt;br /&gt;&lt;br /&gt;Então, lá fui eu ler os fontes do kernel. No diretório 'fs' dos fontes nós encontramos a informação. Lendo os arquivos Procurando pelas funções das system calls(sys_mkdir, sys_open e sys_creat), achei o arquivo namei.c, aonde haviam 2 repetições de um trexo bem interessante do código:&lt;br /&gt;if (!IS_POSIXACL(nd.dentry-&gt;d_inode))&lt;br /&gt;  mode &amp;amp;= ~current-&gt;fs-&gt;umask;&lt;br /&gt;&lt;br /&gt;Então percebi que as man pages, apesar de pouco claras, estavam 100% certas. O cálculo da permissão se dá por uma operação AND(binária, bit a bit) entre o modo passado. Claro que para tudo há um porém.&lt;br /&gt;&lt;br /&gt;Concluí em alguns testes que a umask só é aplicada quando os valores default são passados para as system calls que utilizam a umask(as system calls creat, open, mknod e mkdir, que criam nodos no sistema de arquivos, e os valores default são 777 para diretório e 666 para arquivo). Fica a promessa para mais adiante eu investigar aonde essa condição de verificação da umask é aplicada e mandar para todos a informação completa.&lt;br /&gt;&lt;br /&gt;Como falei lá em cima, entendi o "espírito" da umask, que é basicamente você definir os bits que você quer que NÃO sejam ativados para arquivos e diretórios novos. Simples assim.&lt;br /&gt;&lt;br /&gt;Para quem não é acostumado com matemática binária, segue a referência para entender as operações envolvidas na umask(AND e NOT):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Binary_and"&gt;http://en.wikipedia.org/wiki/Binary_and&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Bitwise_operation#NOT"&gt;http://en.wikipedia.org/wiki/Bitwise_operation#NOT&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Lembro a todos ainda que isso tudo depende muito de como os programas fazem a chamada, uma vez que se o programa requisitado passar na system call o modo diferente do padrão, a umask não será aplicada. Um caso aonde isso ocorre é quando passamos ao mkdir a flag '-m' indicando um modo diferente.&lt;br /&gt;&lt;br /&gt;Fico devendo ainda uma explicação melhor sobre essa excessão, pois ainda não localizei aonde esse tratamento é feito. Estou analisando a libc também para encontrar o "caminho completo". Se alguém tiver uma sugestão ou resposta antes, comenta aí!!&lt;br /&gt;&lt;br /&gt;OBS: Saindo em breve do forno um artigo sobre uso de NAT no user-space através das libs do netfilter. Esperem e verão!&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;b&gt;&lt;span style="color:green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-9044257590198178333?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/xwKr5j2U6WM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/xwKr5j2U6WM/umask-misterios-e-lendas.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>1</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2009/06/umask-misterios-e-lendas.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-8229432535884077483</guid><pubDate>Mon, 10 Nov 2008 16:21:00 +0000</pubDate><atom:updated>2008-11-10T17:02:24.634-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><title>PuTTY: Utilizando Chaves RSA e DSA no SSH</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QwsZHbcSgoh8MnAcaI9wTS-_Its/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QwsZHbcSgoh8MnAcaI9wTS-_Its/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/QwsZHbcSgoh8MnAcaI9wTS-_Its/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QwsZHbcSgoh8MnAcaI9wTS-_Its/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Palavras-Chave:&lt;/span&gt; SSH, PuTTY&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Primeiramente peço desculpa aos inúmeros leitores(cerca de 2 ou 3 incluindo eu mesmo) deste blog por ficar alguns dias sem postar. As coisas andam um tanto corridas ultimamente.&lt;br /&gt;&lt;br /&gt;Mas deixando o blá-blá-blá sobre o blog, agora vamos ao blá-blá-blá sobre o que vou escrever. Mas antes, para os apressados, informo que podem procurar pelo subtítulo "Finalmente..." logo abaixo para "meterem a mão na massa" logo. Muita gente, mas muita gente mesmo, durante minha vida profissional me fez essa bendita pergunta: eu uso Windows. Como posso acessar um servidor Linux via SSH estando no Windows??&lt;br /&gt;&lt;br /&gt;Para esta pergunta, de início eu recomendava a utilização do OpenSSH para Windows(minha predileta, apesar de eu não utilizar o sistema do tiu Bill quase nunca). Os problemas que tiram a aceitação de muita gente à minha recomendação normalmente são algo como resolução ruim do prompt de comando do Windows(a Microsoft podia caprichar mais no cmd, não podia?), problemas com configuração de tipo de terminal, usuários que não querem iniciar o programa em linha de comando, entre muitos e muitos outros.&lt;br /&gt;&lt;br /&gt;Tive mais sucesso quando passei a recomendar a eles o uso do PuTTY, que é mais "win-user friendly", gera menos transtornos para configuração de tipo de terminal/mapa de teclas, etc. Nosso amigo PuTTY só tem um pequeno problema: Incompatibilidade com chaves SSH2-RSA e SSH2-DSA geradas pelo utilitário &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;ssh-keygen&lt;/span&gt;&lt;/span&gt;, do OpenSSH.&lt;br /&gt;&lt;br /&gt;Estive fazendo algumas revisões de políticas de segurança em um cliente. Durante o processo, foi definida a adoção de chaves RSA para acesso via SSH. O problema logo apareceu: algumas pessoas acessam o servidor via PuTTY.&lt;br /&gt;&lt;br /&gt;Sendo assim, vi que este velho problema precisava ser eliminado. Googlei por algum tempo e achei &lt;a href="http://linux-sxs.org/networking/openssh.putty.html"&gt;este link aqui&lt;/a&gt;(em inglês), que explica como proceder nesta situação. Abaixo estarei explicando em Português o procedimento e a idéia.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Finalmente...&lt;/h2&gt;Agora que já expliquei o contexto aonde utilizei, vamos para a parte que todos gostam. Eu prezumo que todos tenham conhecimento de como configurar o SSH no servidor e adicionar a chave na lista das chaves autorizadas para os usuários, então não vou entrar neste detalhe(fica para outro artigo).&lt;br /&gt;&lt;br /&gt;Primeiramente, precisaremos de um software que pode ser obtido no site do PuTTY: o &lt;a href="http://www.chiark.greenend.org.uk/%7Esgtatham/putty/download.html"&gt;puttygen&lt;/a&gt;&lt;a href="http://tartarus.org/%7Esimon/putty-snapshots/x86/puttygen.exe"&gt;.exe&lt;/a&gt;. Este é o software que trabalha com as chaves em um formato próprio do PuTTY, diferente do formato SSH2.&lt;br /&gt;&lt;h3&gt;O Primeiro Caminho&lt;/h3&gt;O primeiro modo para fazermos o PuTTY utilizar as chaves, é o mais simples: gerar a chave no próprio PuTTY. Para isso, abra o puttygen(faça o download apartir do link que eu coloquei acima).&lt;br /&gt;&lt;br /&gt;Abaixo, selecione(em Parameters) a opção "SSH-2 RSA" ou "SSH-2 DSA", dependendo do algoritmo desejado. Não recomendo a opção "SSH-1", pois ela é para o protocolo versão 1 do SSH, que hoje está praticamente em desuso.&lt;br /&gt;&lt;br /&gt;No campo de texto com rótuno "Number of bits in a generated key", você pode manter o valor 1024, ou aumentar(normalmente 1024bits é mais que o suficiente) para 2048 por exemplo(se o servidor contiver, por exemplo, fotos de uma bebedeira sua, tornando muito válido perder um pouco o desempenho para incrementar a este ponto a segurança).&lt;br /&gt;&lt;br /&gt;Agora que está tudo parametrizado, clique em Generate. Segundo a mensagem da interface, a randomização da chave é de acordo com o movimento do mouse(que coisa não?)... Sendo assim, procure executar movimentos bem estranhos com o mouse nesta hora(é o que o software diz, não li os fontes para conferir).&lt;br /&gt;&lt;br /&gt;Pronto... Após uma espera de cerca de 30 segundos, sua chave está "na mão", bastam algumas informações de como será salva a chave. Você pode definir um comentário(que sempre será visto no momento que o PuTTY envia a chave). E, você pode(e deve) definir um passphrase para a chave.&lt;br /&gt;&lt;br /&gt;No campo "Key Passphrase", xingue sua sogra. No campo "Passphrase Confirm", xingue-a novamente(da mesma maneira). Ali valem espaços e caracteres especiais, então pode xingar a vontade.&lt;br /&gt;&lt;br /&gt;Pronto, sua chave está gerada. Abaixo da barra de menus aparece um campo somente leitura, com a chave pública pronta para você adicionar no seu &lt;span style="font-style: italic;"&gt;~/.ssh/authorized_keys&lt;/span&gt; (ou outro arquivo de chaves autorizadas que esteja definido no &lt;span style="font-style: italic;"&gt;/etc/ssh/sshd_config&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Você PODE salvar sua chave pública clicando no botão "Salve public key", e DEVE salvar sua chave privada através do botão "Save private key".&lt;br /&gt;&lt;h3&gt;O Segundo Caminho&lt;/h3&gt;Este é para aqueles que já tem uma chave gerada no OpenSSH, e precisam utilizá-la no PuTTY. Somente para ilustrar, o procedimento básico para gerar uma chave no OpenSSH é a execução do comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;$&lt;/span&gt; ssh-keygen -f nome-do-arquivo -t rsa -b 1024&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No exemplo foi usado RSA, de 1024bits, e o arquivo "nome-do-arquivo", mas estes parâmetros podem ser trocados. O comando de exemplo gera um arquivo chamado "nome-do-arquivo", contendo nossa chave privada, e outro chamado "nome-do-arquivo.pub", contendo a chave pública.  A Passphrase será perguntada em um prompt.&lt;br /&gt;&lt;br /&gt;Agora vamos importá-la para uso no PuTTY. Abra o PuTTYGen novamente, e clique no botão "Load". Selecione o arquivo, digite a senha(se houver). Se necessário, redefina o comentário e/ou o passphrase.&lt;br /&gt;&lt;br /&gt;E, finalmente, salve sua chave. Agora na hora de usar o PuTTY, quando aparecer a tela de configurações dele, expanda na esquerda o item "Connection", e logo após o subitem "SSH". Clique no subitem "Auth".&lt;br /&gt;&lt;br /&gt;Aparecerá um campo com o label "Private key file for authentication", com um botão "Browse..." ao lado. Clique no botão, procure a chave, e ela estará pronta para ser usada.&lt;br /&gt;&lt;br /&gt;Espero que o artigo tenha sido útil!!&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;b&gt;&lt;span style="color:green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-8229432535884077483?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/okEOHJQdNSQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/okEOHJQdNSQ/putty-utilizando-chaves-rsa-e-dsa-no.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>2</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/11/putty-utilizando-chaves-rsa-e-dsa-no.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-2374560975144563863</guid><pubDate>Wed, 05 Nov 2008 12:55:00 +0000</pubDate><atom:updated>2008-11-05T11:03:27.464-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Inutilidades</category><title>OBhrama vence eleições, mas AAntartica ainda é a preferida</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Pfd-VQz0Eo6vVa4X9XhoiyjnRBc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Pfd-VQz0Eo6vVa4X9XhoiyjnRBc/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/Pfd-VQz0Eo6vVa4X9XhoiyjnRBc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Pfd-VQz0Eo6vVa4X9XhoiyjnRBc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;O candidado à presidência da república dos Estados Unidos da Almôndega, Barata OBhrama, se elege Presidente. No seu discurso após eleito, ele diz que irá mudar a américa.&lt;br /&gt;&lt;br /&gt;O presidente tem diversos poderes capazes de mover as placas tectônicas, planejando utilizar estratégias de guerra melhores que as do antigo presidente, Jorge War Bucha. Ele diz que o primeiro lugar a ser invadido será a Russia, devido à proximidade e a tendência geografica. Devido a isso, anunciou que a américa irá mudar-se para acima da Azia, o que foi chamado de "movimento sal de frutas" pelos defensores de OBhrama.&lt;br /&gt;&lt;br /&gt;Informou Bruno.&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;b style="color: rgb(255, 0, 0);"&gt;&lt;S&gt;DES&lt;/S&gt;CONFIAVEL&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-2374560975144563863?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/VCXrgZRP0SA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/VCXrgZRP0SA/obhrama-vence-eleies-mas-aantartica.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/11/obhrama-vence-eleies-mas-aantartica.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-6962088555689122338</guid><pubDate>Tue, 28 Oct 2008 13:20:00 +0000</pubDate><atom:updated>2008-10-30T16:35:09.591-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Kernel</category><category domain="http://www.blogger.com/atom/ns#">C/C++</category><category domain="http://www.blogger.com/atom/ns#">Sistemas Operacionais</category><title>Desenvolvimento de Módulos Para o Kernel do Linux II</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WmgDaNEKYujr6_0bCCl6-ByGydA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WmgDaNEKYujr6_0bCCl6-ByGydA/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/WmgDaNEKYujr6_0bCCl6-ByGydA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WmgDaNEKYujr6_0bCCl6-ByGydA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;Palavras-chave: &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Linux, C, Kernel&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://www.manager.com.br/afiliados/click_afiliado.php?origem=manageronline_afiliados_4958_full_afiliados_06.gif" target="_blank"&gt;&lt;img src="http://images.manager.com.br/new_afiliados/banner/full/full_afiliados_06.gif" alt="Empregos Manager Online" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Após o "incrível sucesso" do primeiro artigo, decidi transformá-lo em uma "série" de artigos, e este será o nosso segundo. Primeiramente gostaria de agradecer ao pessoal que me incentivou. Eu imaginava ter uns 100 acessos, mas o primeiro artigo teve aproximadamente 900 visualizações, fora o pessoal que comentou me incentivando.&lt;br /&gt;&lt;br /&gt;Só prestando um esclarecimento, eu nem imaginava que este tema seria de tanto agrado do publico. Imaginei que isso fosse alvo de interesse apenas dos meus amigos mais nerds :-) Mas vou aproveitar que me interesso bastante pelo tema e vou procurar escrever com freqüência(ou nem tanta assim) sobre o tema, tudo dependerá de como andam as coisas para mim(fim da semana passada e esta agora estão corridinhas!!).&lt;br /&gt;&lt;br /&gt;Agora chega de lero-lero e vamos ao que interessa: eu deixei muita coisa "em aberto" no &lt;a href="http://brunildz.blogspot.com/2008/10/desenvolvimento-de-mdulos-para-o-kernel.html"&gt;primeiro artigo&lt;/a&gt;. Uma pessoa deixou(anonimamente) o comentário dizendo que faltava comentar o código. Bom, quando eu enviei aquele post eu estava com um pouco de pressa(como agora hehehe), mas agora vamos explicá-lo melhor!!&lt;br /&gt;&lt;br /&gt;Primeiramente, um pouco do "geral" sobre as bibliotecas do kernel. Obviamente, um sistema operacional requer "rotinas diversas" para uso interno do próprio kernel. São rotinas básicas que usamos em diversos diferentes locais. Um destes exemplos é o &lt;span style="font-weight: bold;"&gt;printk()&lt;/span&gt;, que é um "analogo" ao &lt;span style="font-weight: bold;"&gt;printf()&lt;/span&gt; da libc.&lt;br /&gt;&lt;br /&gt;Antes de mais nada, alguns podem ter a dúvida: e porque não utilizar as funções da libc mesmo, que são padronizadas com a linguagem, mais completas e de utilização mais fácil?? Bom, a resposta é simples: o kernel não faz a mínima idéia de que exista uma libc. Quando você está no kernel space só existe o kernel. Bibliotecas, para o ver do kernel, são meros arquivos em formato ELF, referenciados por outros meros arquivos também em formato ELF. A única coisa que o kernel sabe é executar system calls[1] nestes arquivos.&lt;br /&gt;&lt;br /&gt;Estas bibliotecas são documentadas naquela API do kernel, cujo link coloquei no &lt;a href="http://brunildz.blogspot.com/2008/10/desenvolvimento-de-mdulos-para-o-kernel.html"&gt;outro artigo&lt;/a&gt;. Retomando o foco do assunto, no post anterior eu não havia escrito muitos detalhes do código. Revirando meus links, encontrei o link do &lt;a href="http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html"&gt;'The Linux Kernel Module Programming Guide'&lt;/a&gt;, que eu não me recordava, mas havia sido minha inspiração na escrita daquele código de exemplo. Todos os detalhes que menciono aqui são semelhantes aos do guia, que é uma das fontes deste artigo, juntamente com os fontes do &lt;a href="http://www.kernel.org/"&gt;kernel&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Primeiramente, na estrutura do código, temos nossos dois arquivos: errcon.h e errcon.c. Prezumo que todos que estejam lendo este arquivo conheçam razoavelmente os padrões que comumente são adotados para a divisão de códigos entre arquivos de cabeçalho(.h, com declarações) e arquivos de implementação(os .c ou .cpp no caso de C++). Caso não conheçam, recomendo "googlar" sobre o assunto&lt;br /&gt;&lt;br /&gt;Em nosso header, primeiro incluimos alguns headers com declarações de símbolos que utilizaremos. Logo após, definimos algumas "macros úteis". São apenas para concentrar o valor de algumas coisas ali ao começo. Nesta época eu não era tão "avesso" ao uso de macros.&lt;br /&gt;&lt;br /&gt;Depois temos nossaas variáveis globais e funções. Quero que atentem bastante às funções 'ec_dev*' e à estrutura 'opers', do tipo &lt;span style="font-weight: bold;"&gt;file_operations&lt;/span&gt;. Elas são as responsáveis pelo funcionamento da parte do arquivo de dispositivo(a entrada no /dev) que nosso módulo nos disponibiliza.&lt;br /&gt;&lt;br /&gt;Como vocês podem notar, registramos em uma estrutura file_operations todas as operações relacionadas a arquivo que nosso módulo realiza. Mas neste módulo não utilizamos todas as possibilidades. Mesmo assim, quero que vocês conheçam a declaração da estrutura para verificar as operações disponíveis para manipulação:&lt;br /&gt;&lt;pre&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file_operations {&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; module *owner;&lt;br /&gt; loff_t (*llseek) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, loff_t, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; ssize_t (*read) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; __user *, size_t, loff_t *);&lt;br /&gt; ssize_t (*write) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; __user *, size_t, loff_t *);&lt;br /&gt; ssize_t (*aio_read) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; kiocb *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; iovec *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt;, loff_t);&lt;br /&gt; ssize_t (*aio_write) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; kiocb *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; iovec *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt;, loff_t);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*readdir) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; *, filldir_t);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*poll) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; poll_table_struct *);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*ioctl) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; inode *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt; (*unlocked_ioctl) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt; (*compat_ioctl) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*mmap) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; vm_area_struct *);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*open) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; inode *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*flush) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, fl_owner_t id);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*release) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; inode *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*fsync) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; dentry *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; datasync);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*aio_fsync) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; kiocb *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; datasync);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*fasync) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*lock) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file_lock *);&lt;br /&gt; ssize_t (*sendfile) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, loff_t *, size_t, read_actor_t, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; *);&lt;br /&gt; ssize_t (*sendpage) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; page *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;, size_t, loff_t *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt; (*get_unmapped_area)(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*check_flags)(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*dir_notify)(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *filp, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt; arg);&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; (*flock) (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file_lock *);&lt;br /&gt; ssize_t (*splice_write)(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; pipe_inode_info *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, loff_t *, size_t, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; ssize_t (*splice_read)(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *, loff_t *, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; pipe_inode_info *, size_t, &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;Então, basicamente, registramos as funções que iriamos utilizar(&lt;span style="font-weight: bold;"&gt;ec_devopen&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;ec_devclose&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;ec_devread&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;ec_devwrite&lt;/span&gt;) nos ponteiros de função(&lt;span style="font-weight: bold;"&gt;open&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;close&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;read&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;write&lt;/span&gt;) da estrutura.&lt;br /&gt;&lt;br /&gt;Agora, reparem também, ainda no noso arquivo de cabeçalho, que temos um ponteiro para uma declaração do tipo &lt;span style="font-weight: bold;"&gt;proc_dir_entry&lt;/span&gt;. Ela é uma "análoga", se é que podemos dizer isso, da estrutura &lt;span style="font-weight: bold;"&gt;file_operations&lt;/span&gt;. Mais adiante compreenderemos porque ela é declarada na forma de um ponteiro aqui em cima. Por enquanto, adianto apenas que as funções &lt;span style="font-weight: bold;"&gt;ec_procread&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;ec_procwrite&lt;/span&gt; serão associadas a ela, juntamente com algumas outras informações. Veja declaração da estrutura:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; proc_dir_entry {&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; low_ino;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;short&lt;/span&gt;&lt;/b&gt; namelen;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *name;&lt;br /&gt; mode_t mode;&lt;br /&gt; nlink_t nlink;&lt;br /&gt; uid_t uid;&lt;br /&gt; gid_t gid;&lt;br /&gt; loff_t size;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; inode_operations *proc_iops;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file_operations *proc_fops;&lt;br /&gt; get_info_t *get_info;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; module *owner;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; proc_dir_entry *next, *parent, *subdir;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; *data;&lt;br /&gt; read_proc_t *read_proc;&lt;br /&gt; write_proc_t *write_proc;&lt;br /&gt; atomic_t count;  &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* use count */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; deleted;  &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* delete flag */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; *set;&lt;br /&gt;};&lt;/pre&gt;Repare que nesta estrutura temos diversos elementos além de ponteiros de funções, diferentemente da &lt;span style="font-weight: bold;"&gt;file_operations&lt;/span&gt; que tinha apenas ponteiros de função(exceto pelo &lt;span style="font-weight: bold;"&gt;owner&lt;/span&gt;, ponteiro que nem utilizamos manualmente).&lt;br /&gt;&lt;br /&gt;Agora vamos finalmente ao nosso arquivo de implementação(errcon.c). A primeira coisa que vemos(após a inclusão do cabeçalho errcon.h) é implementação da função &lt;span style="font-weight: bold;"&gt;ec_devwrite&lt;/span&gt;. O que ela faz, basicamente, é implementar a operação &lt;span style="font-weight: bold;"&gt;write&lt;/span&gt; no dispositivo. Simplesmente lê o buffer de leitura(localizado no user-space, por isso lido com &lt;span style="font-weight: bold;"&gt;get_user&lt;/span&gt; e não diretamente) e o salva em nossa lista dos ultimos 4 erros.&lt;br /&gt;&lt;br /&gt;Quanto ao local para onde os ponteiros de nosso array de ponteiro apontam, entenderemos mais tarde. De momento saiba apenas que é para um buffer de dados.  Repare que como este módulo é apenas um teste, &lt;span style="font-weight: bold;"&gt;NENHUM TIPO DE PREVENÇÃO CONTRA BUFFER OVERFLOW FOI TOMADO&lt;/span&gt;. Para ocorrer um buffer overflow, basta escrevermos um número de bytes maior do que o tamanho do buffer. E, para este buffer overflow ser mais grave, basta que isso ocorra no ultimo dos 4 buffers, ou então que seja grande o suficiente para passar do fim do ultimo buffer no caso dos outros 3 buffers. Isso tudo se deve a grande preguiça que o autor tem de implementar um contador de caracteres(int i=buf_limit e buf_limit-- dentro do loop :-) hehehe).&lt;br /&gt;&lt;br /&gt;Agora prosseguindo, temos nossa função &lt;span style="font-weight: bold;"&gt;ec_procread&lt;/span&gt;, que responde à operação &lt;span style="font-weight: bold;"&gt;read&lt;/span&gt; do arquivo de dispositivo. Ela basicamente escreve os dados do buffer do módulo(com a mensagem do ultimo erro recebido pelo módulo) no buffer do user-space(lá aonde o processo está fazendo a leitura. A "idéia" do &lt;span style="font-weight: bold;"&gt;put_user&lt;/span&gt; é a mesma do &lt;span style="font-weight: bold;"&gt;get_user&lt;/span&gt;, com diferença apenas operacional(um coloca no usuário e o outro pega do usuário, :-) entenda este comentário como quiser).&lt;br /&gt;&lt;br /&gt;Agora vamos para a &lt;span style="font-weight: bold;"&gt;ec_open&lt;/span&gt;. Ela é responsável pela abertura do arquivo (citação de Dr. Obvio). Para evitar multiplos processos efetuando I/O no módulo, fazemos um "controle de abertura". No mais, a função também reseta o buffer de leitura. Como vocês viram, na &lt;span style="font-weight: bold;"&gt;ec_read&lt;/span&gt; nós apenas liamos apartir do buffer. Mas aí ficava no ar a pergunta: daonde vinha a posição correta do buffer?&lt;br /&gt;&lt;br /&gt;É simples. Imagine que o processo não leia todos os dados de uma vez só. Suponhamos que nós tenhamos uma string de erro "hahehihohu". O tamanho de buffer utilizado pelo processo que lê o dispositivo é 2. Acompanhe a seqüência:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Processo efetua &lt;span style="font-weight: bold;"&gt;open()&lt;/span&gt; no dispositivo;&lt;/li&gt;&lt;li&gt;Processo lê 2 bytes;&lt;/li&gt;&lt;li&gt;Processo "trabalha" os 2 bytes lidos;&lt;/li&gt;&lt;li&gt;Processo lê mais 2 bytes;&lt;/li&gt;&lt;li&gt;Processo "trabalha" mais 2 bytes lidos;&lt;/li&gt;&lt;li&gt;Processo lê mais 2 bytes;&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;A posição do buffer deve ser trabalhada na função da operação &lt;span style="font-weight: bold;"&gt;read&lt;/span&gt;, incrementando os bytes que são enviados para o user-space. Também devemos apontar, na primeira chamada à &lt;span style="font-weight: bold;"&gt;read&lt;/span&gt;, para o início do buffer. Mas como vamos saber quando é a primeira chamada?? Simples: na chamada da operação &lt;span style="font-weight: bold;"&gt;open&lt;/span&gt; realizada no arquivo, nós setamos o ponteiro para NULL, e verificamos se ele é nulo no momento da operação &lt;span style="font-weight: bold;"&gt;read&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Só para constar, vejamos a linha aonde fazemos a chamada:&lt;br /&gt;&lt;pre style="font-weight: bold;"&gt;try_module_get(THIS_MODULE);&lt;/pre&gt;Nesta chamada simplesmente incrementamos o contador de uso do módulo, gerenciado pelo kernel. Não confunda com nosso contador interno(ec_openc), que é para uso dentro do módulo. Ao executarmos um comando &lt;span style="font-weight: bold;"&gt;lsmod&lt;/span&gt; no shell, veremos uma tela similar a esta:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;bruno&lt;/span&gt;@&lt;span style="font-weight: bold;"&gt;bw1&lt;/span&gt;:~$ &lt;span style="font-weight: bold;"&gt;lsmod&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Module                  Size     Used by&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;parport_pc&lt;/span&gt;         27812   0&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;parport&lt;/span&gt;                 34760  1 parport_pc&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;yenta_socket&lt;/span&gt;     27148   1&lt;br /&gt;&lt;br /&gt;Repare no terceiro campo(Used By), aonde vemos um número, algumas vezes seguido de uma lista de módulos. Este número é o contador de usos. Os módulos listados são outros módulos que utilizam recurso do listado. Isso significa que o &lt;span style="font-weight: bold;"&gt;try_module_get&lt;/span&gt; não serve apenas para indicar quantas vezes o arquivo de dispositivo foi aberto, mas para n outras coisas.&lt;br /&gt;&lt;br /&gt;A função &lt;span style="font-weight: bold;"&gt;ec_devclose&lt;/span&gt; dispensa comentários. Apenas esclareço que o &lt;span style="font-weight: bold;"&gt;try_module_put&lt;/span&gt; decrementa o contador de uso do módulo. Na função &lt;span style="font-weight: bold;"&gt;ec_procread&lt;/span&gt;, simplesmente escrevemos no buffer uma mensagem formatada, dizendo o número de erros e o ultimo erro que foram registrados. Na &lt;span style="font-weight: bold;"&gt;ec_procwrite&lt;/span&gt;, utilizamos a função &lt;span style="font-weight: bold;"&gt;copy_from_user&lt;/span&gt; para ler 1 caractere do buffer recebido. Caso este caractere lido seja 'c', é efetuado um loop percorrendo o buffer de mensagens de erro e apagando seus dados.&lt;br /&gt;&lt;br /&gt;Bom, agora que todos já entenderam "cada pedaço" da coisa, vamos ao "ponto de junção", aonde a gente "junta toda essa cosia e faz virar uma só". É o nosso "main 1", o &lt;span style="font-weight: bold;"&gt;init_module&lt;/span&gt;. Como eu já havia citado anteriormente, este "cara" é o responsável por disponibilizar aquilo que o módulo fornece, e inicializar o "serviço" do módulo.&lt;br /&gt;&lt;br /&gt;A primeira coisa que ele faz é preparar os nossos buffers. Como você pode ver no código, de acordo com minha &lt;a href="http://brunildz.blogspot.com/2008/10/desmistificando-os-ponteiros-em-cc.html"&gt;explicação sobre ponteiros&lt;/a&gt;, criamos um array global, de 16386 bytes(de acordo com a macro EC_PROCFILE_BUFF_SIZE) apontado por &lt;span style="font-weight: bold;"&gt;ec_errors&lt;/span&gt;, ainda no nosso header(errcon.h). Agora nós dividimos a área apontada por &lt;span style="font-weight: bold;"&gt;ec_errors&lt;/span&gt; em 4 partes, cada uma com seu início apontado por um dos ponteiros do array de ponteiros apontado por &lt;span style="font-weight: bold;"&gt;ec_error&lt;/span&gt;(esta frase é meio confusa, mas tente reler umas 2 vezes, ou se tiver raciocínio visual e precisar, não tenha vergonha de desenhar num papel ao longo da leitura para entender a frase - e se ainda não entender, recomendo ler novamente a &lt;a href="http://brunildz.blogspot.com/2008/10/desmistificando-os-ponteiros-em-cc.html"&gt;explicação sobre ponteiros&lt;/a&gt;). Observe que temos 2 poréms nesta história: o primeiro é que ao longo do programa não utilizamos nenhuma mensagem além da ultima. Isso foi uma falha minha, pois na época eu não tinha noção alguma do que significava "requisito de software".&lt;br /&gt;&lt;br /&gt;O segundo porém, é um pequeno errinho meu. Se vocês acompanharem o loop aonde é feita essa divisão da área, vocês vão ver que todos os 4 ponteiros apontam para a mesma área, que seria "a segunda posição" das 4 na qual dividimos. Apartir de agora, quando vocês olharem o código ele estará atualizado, e o valor:&lt;br /&gt;&lt;pre&gt;(EC_PROCFILE_BUF_SIZE / 4)&lt;br /&gt;&lt;/pre&gt;será multiplicado por &lt;span style="font-style: italic;"&gt;i&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Após dividirmos o nosso array em 4 buffers "distintos", criamos nossa entrada no sistema de arquivos proc. Fazemos um tratamento de erro, e caso ocorra realmente algo errado, nós efetuamos a tentativa de remoção da entrada recém criada(ou não criada, não temos como ter certeza, removemos para evitar uma entrada desagradável e permanente no /proc).&lt;br /&gt;&lt;br /&gt;Logo depois, criamos nossa entrada no /dev. Só para constar, caso o retorno do &lt;span style="font-weight: bold;"&gt;register_chrdev&lt;/span&gt; seja negativo(erro) em vez do major, temos certeza de que o device não foi criado(diferentemente da entrada no /proc). E, então, removemos a entrada.&lt;br /&gt;&lt;br /&gt;Em ambos os tratamentos de erro, retornamos negativo. Ou seja: indicamos pro kernel que ocorreram erros e ele deve cancelar o carregamento do módulo. O kernel, por sua vez, informa o modutils disso, e este por sua vez joga uma mensagem de erro para o usuário. É vital fazermos isso para evitar problemas!&lt;br /&gt;&lt;br /&gt;Observem a diferença entre as abordagens da criação do arquivo de dispositivo e da criação da entrada no /proc. No primeiro caso, criamos a estrutura com as informações das operações de arquivo, e depois chamamos a função responsável "registrando" esta estrutura. No segundo, criamos apenas um ponteiro e utilizamos uma função que retorna a área da estrutura. Nesta função, passamos apenas o nome do arquivo a ser criado.&lt;br /&gt;&lt;br /&gt;Uma vez registradas, estas estruturas podem ser modificadas a qualquer momento. É o que fazemos com a estrutura do nosso arquivo no /proc. Ao remover, passamos como parâmetro o endereço de &lt;span style="font-weight: bold;"&gt;proc_root&lt;/span&gt;. A entrada &lt;span style="font-weight: bold;"&gt;proc_root&lt;/span&gt; nada mais é do que outra estrutura &lt;span style="font-weight: bold;"&gt;proc_dir_entry&lt;/span&gt;, que representa a raiz do /proc.&lt;br /&gt;&lt;br /&gt;Veja que depois nós modificamos nossa entrada no /proc acessando diretamente a estrutura. Logo após isso, o restante do código é apenas complementar: imprimimos com &lt;span style="font-weight: bold;"&gt;printk&lt;/span&gt; as mensagens informando alguns detalhes do módulo.&lt;br /&gt;&lt;br /&gt;Retornamos 0(o valor de SUCCESS) para indicar sucesso na operação. Valores negativos indicam erro e cancelam o carregamento do módulo.&lt;br /&gt;&lt;br /&gt;Quase no fim, temos nosso &lt;span style="font-weight: bold;"&gt;cleanup_module&lt;/span&gt;. Basicamente, ele desregistra nosso dispositivo de caractere, e remove nossa entrada do /proc.&lt;br /&gt;&lt;br /&gt;Ao fim do código, utilizamos algumas macros para registrar algumas informações sobre o módulo: sua licensa, seu autor, o nome de seu dispositivo, e sua descrição. Você pode visualizar suas informações com o comando:&lt;br /&gt;&lt;br /&gt;$ &lt;span style="font-style: italic;"&gt;modinfo errcon.ko&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finalmente, peço desculpas pela demora a postar algo novo. É que esta semana está corrida!! Espero que gostem, em breve mais conteúdo sobre o kernel!!&lt;br /&gt;&lt;br /&gt;OBS: se alguém quiser que eu escreva sobre algum tema específico, e estiver ao meu alcance, é só dizer que se tiver no meu domínio e se encaixar no meu "time" eu escrevo.&lt;br /&gt;&lt;br /&gt;Agradeço a atenção de todos os meus leitores. Caso não saibam, tem &lt;a href="http://images.google.com.br/images?um=1&amp;amp;hl=pt-BR&amp;amp;q=milho+grande&amp;amp;btnG=Pesquisar+imagens"&gt;um milhão&lt;/a&gt; lendo agora esse blog. E em seguida esse &lt;a href="http://images.google.com.br/images?um=1&amp;amp;hl=pt-BR&amp;amp;q=milho+grande&amp;amp;btnG=Pesquisar+imagens"&gt;milhão&lt;/a&gt; vai ser cozido :P&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;[1] System Calls, ou chamadas de sistema, são "funções" disponibilizadas pelo sistema operacional aos aplicativos. Geralmente bem básicas. Vide &lt;a href="http://linux.die.net/man/2/syscalls"&gt;man page for syscalls(2)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;b&gt;&lt;span style="color:green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-6962088555689122338?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/3P1BvZcjJ7M" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/3P1BvZcjJ7M/desenvolvimento-de-mdulos-para-o-kernel_28.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/desenvolvimento-de-mdulos-para-o-kernel_28.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-3834747890343759194</guid><pubDate>Sat, 25 Oct 2008 12:01:00 +0000</pubDate><atom:updated>2008-10-25T13:47:11.545-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GCC</category><category domain="http://www.blogger.com/atom/ns#">Dicas</category><title>DICA: Eliminando Warnings de Seus Programas</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/b7tzDCWYi9V809b_KVDEPgUw4EA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b7tzDCWYi9V809b_KVDEPgUw4EA/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/b7tzDCWYi9V809b_KVDEPgUw4EA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b7tzDCWYi9V809b_KVDEPgUw4EA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Palavras-chave: &lt;span style="font-weight: bold;"&gt;C/C++, GCC, Dicas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Constatei vendo meus diversos amigos(colegas e ex-colegas de trabalho, colegas de faculdade, conhecidos diversos) programando: a esmagadora maioria dos programadores IGNORA os warnings do compilador.&lt;br /&gt;&lt;br /&gt;As razões disso parecem ter duas origens. A primeira delas é a 'omissão', aquela idéia de "ahh, compilou, não dá nada". Neste caso, o indivíduo deveria se auto considerar desleixado, e dependendo do que ele estiver desenvolvendo, irresponsável. Quando falamos de C ou C++, aonde lidamos com mais elementos de "não tão alto nível assim" - como ponteiros e assembly inline, essa omissão se torna mais grave ainda.&lt;br /&gt;&lt;br /&gt;Agora todos que leram até aqui, se ainda não eram concientes agora são(eu espero). Sendo assim, vamos para a segunda causa. Você está na correria. Seu programa gerou alguns warnings. Apenas por mal costume(e todos nós temos), você 'deixa para depois' corrigir aquele warning. Aí o dia que você vai corrigir os warnins deixados para depois, você se surpreende: apenas 800 warnings para corrigir. Nada que 3 meses de trabalho não resolvam, pouquinha coisa!!&lt;br /&gt;&lt;br /&gt;E lá vai o dito programador corrigindo warning por warning, e contando eles novamente... 800... 799... 798... ... ... 0. Terminou, warnings zerados. Aí você pensa: agora eu não deixo mais para depois. Aí o primeiro momento de "correria com prazos" você deixa 1 pra depois. E ainda diz para sí mesmo: é só 1, os outros não vou deixar.&lt;br /&gt;&lt;br /&gt;Nós, seres humanos, insistimos nessas coisas. Mas é fato, não adianta você dizer para sí mesmo que vai deixar só aquele para depois. Sempre aparecem outras excessões.&lt;br /&gt;&lt;br /&gt;Sendo assim, aqui vai uma dica para quem utiliza o GCC. Se não funciona por nossa própria consciência, então o compilador que nos obrigue!! Existem diversos parâmetros do compilador relacionados a Warnings, mas eu só vou falar de dois.&lt;br /&gt;&lt;br /&gt;O primeiro é o -Wall, que manda o compilador registrar e exibir todos os warnings. O segundo é o -Werror, que faz com que warnings sejam tratados como erros. Com esses dois parâmetros juntos você não tem escapatória: terá que corrigir seu warning, ou o programa não compila. Veja a linha de comando de exemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-family: courier new;"&gt;$ gcc -Wall -Werror -o binario source.cpp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pronto. Assim seu código é mais confiável, e você não paga nada a mais por isso. Espero que todos gostem deste artigo!!&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;b&gt;&lt;span style="color:green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-3834747890343759194?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/Z0e6qUSdE34" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/Z0e6qUSdE34/dica-eliminando-warnings-de-seus.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>2</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/dica-eliminando-warnings-de-seus.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-658180085447577045</guid><pubDate>Fri, 24 Oct 2008 11:41:00 +0000</pubDate><atom:updated>2008-10-24T09:43:54.686-02:00</atom:updated><title>Teste Nerd</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2x329U219QTGT2q0-YounK5lkKk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2x329U219QTGT2q0-YounK5lkKk/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/2x329U219QTGT2q0-YounK5lkKk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2x329U219QTGT2q0-YounK5lkKk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Olá povo!!&lt;br /&gt;&lt;br /&gt;Raras pessoas já disseram me achar nerd durante toda a minha vida... Mesmo assim, aí vai a prova de que eu não sou nerd:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nerdtests.com/ft_nq.php"&gt;&lt;br /&gt;&lt;img src="http://www.nerdtests.com/images/badge/291ccc128a27ee48.gif" alt="I am nerdier than 0% of all people. Are you a nerd? Click here to find out!" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Agora desafio meus amigos a fazerem(em especial o &lt;a href="'http://samuca.wordpress.com'"&gt;Samuca&lt;/a&gt;, que eu sei que terá 100% de score)&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;b style="color: rgb(255, 102, 0);"&gt;INÚTIL&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-658180085447577045?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/ThrZ7sQ3T9s" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/ThrZ7sQ3T9s/teste-nerd.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>2</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/teste-nerd.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-1732528035965794175</guid><pubDate>Thu, 23 Oct 2008 18:56:00 +0000</pubDate><atom:updated>2008-10-23T20:01:00.016-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">CGI</category><title>DICA: Instalando Programas Em Servidores Web Sem Ter Senha de Root</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0nASy_-wVcP2s4XX9EySo3jtOOc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0nASy_-wVcP2s4XX9EySo3jtOOc/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/0nASy_-wVcP2s4XX9EySo3jtOOc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0nASy_-wVcP2s4XX9EySo3jtOOc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;Palavras-chave: &lt;span style="font-weight: bold;"&gt;Linux, CGI, Edição de Binários&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fica a dica para quem tiver alguma necessidade parecida...&lt;br /&gt;&lt;br /&gt;Comecei a escrever um CGI, bem simplesinho, em Bash[1]. Ele é muito simples(outra hora eu posto ele pra vocês), e rodava, entre outras coisas, o executável do enscript. Só tinha um pequeno porém: eu precisava saber se o servidor web do meu webhost tinha o enscript. E lá vou eu, com o seguinte teste:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;echo -e "Content-type: text/html\r\n"&lt;br /&gt;&lt;br /&gt;if [ ! -f sample.cpp ]; then&lt;br /&gt; echo "&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;  cout &amp;lt;&amp;lt; \"Ola Mundo\" &amp;lt;&amp;lt; endl;&lt;br /&gt;  exit(0);&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;" &gt; sample.cpp&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ ! -f sample.cpp.htm ]; then&lt;br /&gt; echo "Enscript..."&lt;br /&gt;enscript --color --language=html -Ecpp -o sample.cpp.htm sample.cpp&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;cat sample.cpp.htm&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Enfim... Descobri que não tinha o dito cara instalado!! E agora?? Bom, vamos usar um pouco do nosso "censo de improviso"!! O sistema do servidor tem tudo para ser um RH Enterprise ou semelhante(eu supus). Infelizmente eu não tenho acesso ao shell via SSH.&lt;br /&gt;&lt;br /&gt;Utilizei uma máquina com o CentOS e peguei o binário. Executei um ldd nele, e só tinha a libc linkada. Aí muito feliz, joguei ele no diretório cgi-bin do meu servidor web. Mudei o script, para executar "./enscript" em vez de "enscript"(executar do diretório local). Tentei rodar meu CGI e nada.&lt;br /&gt;&lt;br /&gt;Estava 1 x 0 para meu servidor web, mas eu não me entrego. Coloquei no meu CGI uma mensagem com a saída de erros(adicionei um 2&gt;&amp;amp;1 no final da linha de comando). E lá estava a mensagem: "/usr/share/enscript/enscript.cfg: no such file or directory". E então eu me lembrei: bah, lembrei do binário mas não lembrei dos arquivos de configuração e outros que ele possa ler!&lt;br /&gt;&lt;br /&gt;Eis então o cenário: eu não tenho permissão de escrita no /usr/share. O binário do enscript depende desse diretório 'enscript' que está lá. Logo, eu não poderei rodar o enscript lá!&lt;br /&gt;&lt;br /&gt;Mentira!! Como eu não me entrego nunca, acessei minha máquina virtual com o CentOS novamente. Análisei o binário com o comando 'strings'. Ele tem uma string com o diretório e uma com o nome do arquivo. Então, meu diretório no servidor é '/home/bruno', e o diretório daonde ele lê atualmente é '/usr/share/enscript'. Então lá vou eu:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;font-size:85%;"  &gt;$ cat /usr/bin/enscript | sed 's/\/usr\/share\/enscript/\/home\/bruno\/nscript/g' &gt; enscript.new&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Então tinhamos um 'novo enscript'. Antes que perguntem porque mudei o caminho para '/home/bruno/nscript' e não para '/home/bruno/enscript', eu já aviso: conte os caracteres e entenderás!!&lt;br /&gt;&lt;br /&gt;Ok, as coisas estavam se encaminhando. Antes de criar o diretório 'nscript' no meu diretório home, eu resolvi fazer um teste. Ainda na máquina com o Centos, criei o diretório no meu home dali, e rodei um strace:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="font-weight: bold;font-family:courier new;font-size:85%;"  &gt;chmod 755 enscript.new&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;font-size:85%;"  &gt;strace ./enscript.new --color --language=html -Ecpp -o sample.cpp.htm sample.cpp 2&gt;strace.out&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;font-size:85%;"  &gt;grep 'open(' strace.out&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;E então a surpresa: ele ainda estava executando 'opens' no diretório /usr/share/enscript. E mais, ele na verdade lia o enscript.cfg do /etc, e não do /usr/share/enscript. E agora?? 2 x 0 pro servidor web!!&lt;br /&gt;&lt;br /&gt;Mas eu não desisto. Supus que ele tivesse uma lista de caminhos para procurar o enscript.cfg. Removi ele experimentalmente do /etc e confirmei minha suspeita: ele deu a mesma mensagem que no servidor web. Então foi simples, criei ele em '/home/bruno/nscript'. 2 x 1 pro webserver, nessa eu fui melhor. Mas ainda havia o outro problema que tinhamos detectado: ele lia alguns arquivos do antigo caminho. E agora?? Havia um fantasma do binário antigo nele??&lt;br /&gt;&lt;br /&gt;Dando uma "fuçada" percebi que era do arquivo de configuração que ele tirava aquele caminho. Finalmente, coloquei no servidor web os arquivos de configuração com o caminho novo, e executei denovo o CGI: mais problemas!! Agora ele não achava um executável chamado 'states'.&lt;br /&gt;&lt;br /&gt;Primeiro rodei um 'strings' denovo no 'enscript', e filtrei 'states' na saída. Nada foi encontrado. Mas como assim?? Suspeitei direto do arquivo de configuração, e "BINGO!!". Estava definido lá o caminho do states. Aí, para minha sorte, o 'states' só dependia da libc também. Lá vamos nós, rodando um strace, agora com -f, no enscript. O -f segue forks, fazendo o trace dos processos filho também, e não apenas do processo principal.&lt;br /&gt;&lt;br /&gt;Ao confirmar que ele não lia arquivo algum, postei na hora o executável, atualizei o parâmetro do caminho dele no arquivo de configuração do enscript, e fui lá testar. Funcionou.&lt;br /&gt;&lt;br /&gt;Quem nunca fez uma gambiarra?? Chuck Norris deve estar morrendo de inveja de mim agora!!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;[1] Para os que não são do "mundo Unix", Bash é um shell. Eu escrevi um Shell Script, semelhante aos '.bat' do DOS, porém com muito mais flexibilidade e utilidade. Sim, Shell Script também pode ser usado como CGI!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Classificação do conteúdo: &lt;b&gt;&lt;span style="color:green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-1732528035965794175?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/v-IEga3quJg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/v-IEga3quJg/dica-instalando-programas-em-servidores.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>4</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/dica-instalando-programas-em-servidores.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-8425849425791792038</guid><pubDate>Thu, 23 Oct 2008 12:30:00 +0000</pubDate><atom:updated>2008-11-06T09:10:57.022-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Kernel</category><category domain="http://www.blogger.com/atom/ns#">C/C++</category><title>Desenvolvimento de Módulos Para o Kernel do Linux</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TQ7rtfKgw2dEvgjyp8GxiQaZwwY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TQ7rtfKgw2dEvgjyp8GxiQaZwwY/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/TQ7rtfKgw2dEvgjyp8GxiQaZwwY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TQ7rtfKgw2dEvgjyp8GxiQaZwwY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;Palavras-chave: &lt;span style="font-weight: bold;"&gt;Linux, C, Kernel&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href='http://www.manager.com.br/afiliados/click_afiliado.php?origem=manageronline_afiliados_4958_full_afiliados_01.gif' target='_blank'&gt;&lt;img src='http://images.manager.com.br/new_afiliados/banner/full/full_afiliados_01.gif' alt='Empregos Manager Online' border='0'&gt;&lt;/a&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt; Introdução &lt;/h2&gt;A pedido de muitos fãs e leitores deste blog(muitos fãs e leitores = 2 pessoas, o Havacci e o &lt;a href='http://filipelinux.wordpress.com/'&gt;Filipe&lt;/a&gt;), vou escrever um pouco sobre desenvolvimento de módulos para o Kernel do Linux aqui.&lt;br /&gt;&lt;br /&gt;Neste primeiro artigo(se eu for escrever tudo num artigo só eu morro escrevendo) eu vou apenas começar a introduzir o assunto. Pretendo mostrar pro pessoal que não tem segredo nem macumba nisso, e o caminho para o pessoal começar esta "jornada ao centro do Linux". Futuramente colocarei diversos outros conteúdos.&lt;br /&gt;&lt;br /&gt;Primeiramente vou responder a pergunta que certamente alguns farão: o que é possível desenvolver como módulo do kernel?? Pra que servem eles?? Vejamos uma lista das principais respostas a essas perguntas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Device Drivers(o primeiro que vem na mente de todos);&lt;/li&gt;&lt;li&gt;Extensões aos diversos frameworks e subsystemas do kernel;&lt;/li&gt;&lt;li&gt;Desenvolvimento de novos modelos de segurança;&lt;/li&gt;&lt;/ul&gt;Falando de maneira introdutória, o Linux é um sistema operacional com um &lt;a href="http://pt.wikipedia.org/wiki/Kernel_monol%C3%ADtico"&gt;Kernel Monolítico&lt;/a&gt;, totalmente modularizado[1]. Um ambiente com Linux pode ser dividido em duas partes isoladas, ligadas por meio de alguns artifícios: o espaço do kernel(kernel space) e o espaço do usuário(user space).&lt;br /&gt;&lt;br /&gt;A ligação entre as duas partes ocorre principalmente através de system calls. Outros instrumentos que fazem esta ligação são o sistema de arquivos virtual &lt;span style="font-weight: bold;"&gt;/proc&lt;/span&gt;, o sistema de arquivos virtual &lt;span style="font-weight: bold;"&gt;/sys&lt;/span&gt;, e os arquivos de devices(no &lt;span style="font-weight: bold;"&gt;/dev&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Não vou entrar em detalhes sobre os utilitários de módulo do kernel, ou mais conceitos de módulo. Para maiores informações &lt;a href="http://web.mit.edu/rhel-doc/3/rhel-sag-pt_br-3/ch-kernel-modules.html"&gt;leia neste link sobre o conceito de módulo e como utilizá-los&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Agora, a próxima sessão vai falar um pouco mais dos módulos mesmo, além de começar a comprovar que módulos para o kernel são códigos triviais como quaisquer outros, e não há nada que necessite ser um gênio da computação para que possa ser desenvolvido.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt; Estrutura Básica de Um Módulo &lt;/h2&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--&lt;br /&gt;google_ad_client = "pub-9031078133205190";&lt;br /&gt;/* anuncios_post_kernel */&lt;br /&gt;google_ad_slot = "5413795970";&lt;br /&gt;google_ad_width = 728;&lt;br /&gt;google_ad_height = 15;&lt;br /&gt;//--&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&lt;br /&gt;src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Quando carregamos um módulo com insmod(ou modprobe), ele é inserido numa região de memória reservada para o kernel space. Logo quando descarregado, com rmmod, as referências a esta região de memória e seus conteúdos são retiradas. Mas isso você provavelmente já viu ou pode ver em mais detalhes no &lt;a href="http://web.mit.edu/rhel-doc/3/rhel-sag-pt_br-3/ch-kernel-modules.html"&gt;link que eu coloquei ali em cima&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Podemos dizer de maneira simples que um módulo é apenas um "programa"(não como os do user-space, mas computacionalmente falando não deixa de ser um programa, ou seja, um conjunto de instruções do processador) que possui um código a ser executado quando este é carregado, e outro a ser executado quando este é descarregado. De maneira bem "grosseira", para quem é acostumado com o user-space, podemos dizer que o módulo tem "dois mains": o de inicialização e o de finalização.&lt;br /&gt;&lt;br /&gt;Normalmente, a idéia é que o primeiro deles, o init_module(), seja responsável pelo carregamento das estruturas de dados do módulo, bem como o registro de suas funcionalidades perante o kernel. Em outras palavras, você carrega o modulo e ele informa ao kernel o que ele faz e quando ele faz, para que o kernel passe a ele "a parte dele do serviço".&lt;br /&gt;&lt;br /&gt;O "segundo main", cleanup_modules(), é a parte do modulo responsável pela sua descarga. Ela simplesmente "desfaz" o que o init_module() fez, desregistrando suas estruturas e desalocando eventuais regiões alocadas de memória.&lt;br /&gt;&lt;h2&gt; Finalmente o Desenvolvimento dos Módulos &lt;/h2&gt;Primeiramente é importante saber algumas coisas antes da "aventura" começar. A mais obvia dela é que durante os testes com os módulos que você estiver escrevendo, caso haja algo de errado nos módulos, sua máquina pode ficar instável ou até travar(experimente criar um módulo que tenha um loop infinito dentro dele pra você ver o que acontece com o sistema).&lt;br /&gt;&lt;br /&gt;Ao contrário de programas convencionais, o módulo do kernel não está e nem pode estar linkado a biblioteca nenhuma, de forma que você não poderá fazer uso nem mesmo da libc. As suas únicas bibliotecas são os frameworks do kernel.&lt;br /&gt;&lt;br /&gt;Todo módulo do kernel deve ser desenvolvido em C. Até é possível desenvolver módulos em C++, Objective-C, Assembly, ou, inclusive, outras linguagens. Mas, infelizmente, a estrutura do kernel não foi feita para isso. Além de dar muito mais trabalho, pois desde a compilação e a linkedição, você já terá que criar suas próprias rotinas de compilação, ao invés de simplesmente reutilizar as existentes. Além do mais, os recursos do C++, por exemplo, são todos na sua maioria recursos de biblioteca. Você perderia já de cara a STL e o tratamento de excessões. Além disso, você teria que lidar com programação estruturada, pois as estruturas do kernel são estruturas estruturadas. E lá se vão as vantagens de se programar em C++ para o kernel, só restando o trabalho árduo para insistir nisso.&lt;br /&gt;&lt;br /&gt;O uso da API do kernel é o único recurso com o qual trabalhamos nos módulos. Sendo assim, &lt;a href="http://www.fsl.cs.sunysb.edu/kernel-api/index.html"&gt;este link aponta para uma página contendo documentação de parte da API do kernel&lt;/a&gt;. Recomendo dar uma atenção aos capítulos 1 e 3 inicialmente. Lá temos, respectivamente, funções básicas do kernel e algumas funções de interface igual ou semelhante às principais da libc. Já o capítulo 2 fala de algumas estruturas de dados que são implementadas pelo kernel para serem utilizadas por módulos. Elas podem ser importantes em determinadas situações, de acordo com a necessidade do desenvolvedor(atualmente esta frase estaria no singular, pois só temos listas duplamente encadeadas lá).&lt;br /&gt;&lt;br /&gt;No capítulo 5, temos a descrição dos recursos de gerenciamento de memória. Lembre-se, o gerenciamento de memória não serve apenas para a alocação dinâmica(kmalloc e kfree), mas também para acesso a buffers de memória do user-space, que se fazem necessários para trocar dados com este. Nos capítulos 9, 10 e 11, temos a manipulação dos principais sistemas de arquivos virtuais do kernel(procfs, sysfs e debugfs respectivamente).&lt;br /&gt;&lt;br /&gt;Nos capítulos 23 e 24, temos respectivamente a parte de utilização de dispositivos de bloco e de caractere.&lt;br /&gt;&lt;br /&gt;Eu espero ter explicado pelo menos por cima o que era o que, e o que serve pra que. Recomendo a quem não está familiarizado com o que eu falei, &lt;a href="http://br.kernelnewbies.org/docs/howto/kernel-new/t1.html"&gt;ler este artigo que fala um pouco sobre configuração e compilação do kernel&lt;/a&gt;. Ele está um tanto até desatualizado, mas serve como ponto de partida.&lt;br /&gt;&lt;br /&gt;Como defendo muito a idéia do "aprenda com exemplos", não teria nada melhor do que um exemplo para mim colocar aqui. E como exemplo, utilizarei um código que eu mesmo desenvolvi para testes, como uma espécie de "brincadeira". Falando bem a verdade, não tenho vergonha de dizer que meu conhecimento acerca do desenvolvimento do kernel não passa de conhecimento teórico. Ainda não cheguei a precisar utilizar este conhecimento na minha vida profissional. Mas, mesmo assim, acho que ele é um complemento que faria falta para meu conhecimento de como o sistema operacional funciona.&lt;br /&gt;&lt;br /&gt;O meu "brinquedo" é apenas uma espécie de "console de erros". Daí seu nome, 'errcon'. Ele simplesmente cria um dispositivo de caractere de major 254 e minor 0, no qual seriam escritas mensagens de erro. Na leitura do arquivo, ele mostra o ultimo erro. Sendo assim, vamos aos arquivos do meu "brinquedo".&lt;br /&gt;&lt;br /&gt;errcon.h - o header:&lt;br /&gt;&lt;!-- FILE: errcon.h --&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/********************************************************************&lt;br /&gt;* Parte responsavel pela leitura do erro...                         *  &lt;br /&gt;* Autor: Bruno Moreira Guedes &amp;lt;bruno@bruno.inf.br&amp;gt;                  *&lt;br /&gt;* Aproveitando o momento para atualizar o e-mail..                  *&lt;br /&gt;* Atualizado em 2007-07-06, Criado em algum dia qualquer de 2006... *&lt;br /&gt;*********************************************************************/&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;linux/kernel.h&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;linux/module.h&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;linux/fs.h&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;linux/proc_fs.h&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;asm/uaccess.h&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;define&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;EC_PROCFILE_BUF_SIZE&lt;/span&gt; 16386&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;define&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;EC_PROCFILE_NAME&lt;/span&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"errorconsole"&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;define&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;EC_MODULE_AUTHOR&lt;/span&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Bruno Moreira Guedes &amp;lt;bruno@bruno.inf.br"&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;define&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;EC_MODULE_LICENSE&lt;/span&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"GPL"&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;define&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;EC_MODULE_VERSION&lt;/span&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"0.1.0"&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;define&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;EC_DEVICE_NAME&lt;/span&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"error"&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;define&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;SUCCESS&lt;/span&gt; 0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; ec_lf = &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;'\n'&lt;/span&gt;&lt;/b&gt;; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* Line-feed necessario para limitar   *&lt;br /&gt;          *  a mensagem de erro a uma linha...  */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *perr;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; **p;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; ec_error_ct = 0; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/*Contagem de erros registrados... */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; ec_openc = 0; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* Processos lendo device(nunca passara de 1)... */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; ec_errors[EC_PROCFILE_BUF_SIZE];  &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* Ponteiro para a sequencia de&lt;br /&gt;    * ponteiros&lt;br /&gt;                                      * para strings aonde os erros estão&lt;br /&gt;                                      * armazenados...*/&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *ec_error[4];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; proc_dir_entry *ec_procfile;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; ssize_t &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_devwrite&lt;/span&gt;&lt;/b&gt; (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *f,&lt;br /&gt;      &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; __user *buf,&lt;br /&gt;      size_t len,&lt;br /&gt;      loff_t *offset);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; ssize_t &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_devread&lt;/span&gt;&lt;/b&gt; (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *f,&lt;br /&gt;     &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; __user *buf,&lt;br /&gt;     size_t len,&lt;br /&gt;     loff_t *offset);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_devopen&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; inode *i,&lt;br /&gt;       &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *f);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_devclose&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; inode *i,&lt;br /&gt;        &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *f);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file_operations opers = {&lt;br /&gt;.read = ec_devread,&lt;br /&gt;.write = ec_devwrite,&lt;br /&gt;.release = ec_devclose,&lt;br /&gt;.open = ec_devopen&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; ec_major;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_procread&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *buf,&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; **where_buf,&lt;br /&gt; off_t offset,&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; buflen,&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; *eof,&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; *dt);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_procwrite&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *f,&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *buf,&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt; cnt,&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; *dt);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;init_module&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;cleanup_module&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--FIM DO ARQUIVO--&gt;&lt;br /&gt;&lt;br /&gt;errcon.c: a implementação&lt;br /&gt;&lt;!--FILE: errcon.c --&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/********************************************************************&lt;br /&gt;* Parte responsavel pela leitura do erro...                         *  &lt;br /&gt;* Autor: Bruno Moreira Guedes &amp;lt;bruno@bruno.inf.br&amp;gt;                  *&lt;br /&gt;* Atualizado em 2008-10-22, Criado em algum dia qualquer de 2005... *&lt;br /&gt;* Agora tambem disponivel no blog http://brunildz.blogspot.com      *&lt;br /&gt;*                                                                   *&lt;br /&gt;* CHANGELOG:                                                        *&lt;br /&gt;* 2008-10-22 Bruno Moreira Guedes:                                  *&lt;br /&gt;*  -Correcao de violacao de const                                   *&lt;br /&gt;*  -Dado um aspecto "decente" para a sintaxe                        *&lt;br /&gt;*********************************************************************/&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"errcon.h"&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; ssize_t &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_devwrite&lt;/span&gt;&lt;/b&gt; (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *f,&lt;br /&gt;      &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; __user *buf,&lt;br /&gt;      size_t len,&lt;br /&gt;      loff_t *offset)&lt;br /&gt;{&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *ps = NULL; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;//Ponteiro para string&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;        &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *pb = NULL; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;//Ponteiro para o buffer...&lt;br /&gt;&lt;/span&gt;&lt;/i&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; i;&lt;br /&gt;&lt;br /&gt;ps = ec_error[ec_error_ct % 4];&lt;br /&gt;pb = buf;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;for&lt;/span&gt;&lt;/b&gt; (i = 0; i &amp;lt; len &amp;amp;&amp;amp; i &amp;lt; (EC_PROCFILE_BUF_SIZE / 4) -1; i++) {&lt;br /&gt; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* Percorre os buffers copiando um para o outro,&lt;br /&gt;  * obtendo os buffer de origem do user space&lt;br /&gt;  */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt; get_user(*ps, pb++);&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (*ps == 0 || *ps++ == ec_lf) {&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;break&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;  }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;*ps = 0; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;//Adiciona fim da string...&lt;br /&gt;&lt;/span&gt;&lt;/i&gt; ec_error_ct++;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; i+1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; ssize_t &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_devread&lt;/span&gt;&lt;/b&gt; (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *f,&lt;br /&gt;     &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; __user *buf,&lt;br /&gt;     size_t len,&lt;br /&gt;     loff_t *offset)&lt;br /&gt;{&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; read = 0;&lt;br /&gt;      &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *tm_buf = buf;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (!p) {&lt;br /&gt; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* Se a leitura nao tiver iniciado previamente... */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt; p = ec_error;&lt;br /&gt; perr = *p;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (!*perr) {&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; 0; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* Indica o EOF quando terminar de mostrar os *&lt;br /&gt;            * buffers...                                 */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;while&lt;/span&gt;&lt;/b&gt;(p - ec_error &amp;lt; 4 &amp;amp;&amp;amp; len &amp;amp;&amp;amp; *perr) {&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;while&lt;/span&gt;&lt;/b&gt; (*perr &amp;amp;&amp;amp; len) {&lt;br /&gt;  put_user(*perr++, tm_buf++);&lt;br /&gt;  len--;&lt;br /&gt;  read++;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; p++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; read;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_devopen&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; inode *i,&lt;br /&gt;       &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *f)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (ec_openc) {&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; -EBUSY; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/*Evita que device seja escrito por dois&lt;br /&gt;   *processos ao mesmo tempo. Isto terá que&lt;br /&gt;   *ser futuramente aperfeicoado, de modo que&lt;br /&gt;   *somente retorne o erro quando o device for&lt;br /&gt;   *aberto para escrita.*/&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;ec_openc++;&lt;br /&gt;p = NULL; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;//Reseta os ponteiros...&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;try_module_get(THIS_MODULE);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; SUCCESS;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_devclose&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; inode *i,&lt;br /&gt;        &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *f)&lt;br /&gt;{&lt;br /&gt;ec_openc--; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;//Pronto, o dispositivo ja pode ser usado...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt; module_put(THIS_MODULE); &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;//E o modulo descarregado!&lt;br /&gt;&lt;/span&gt;&lt;/i&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; SUCCESS;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_procread&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *buf,&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; **where_buf,&lt;br /&gt; off_t offset,&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; buflen,&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; *eof,&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; *dt)&lt;br /&gt;{&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; sprintf(buf, &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Registered Errors: %llu\nLast Error: %s\n"&lt;/span&gt;&lt;/b&gt;,&lt;br /&gt;        ec_error_ct, ec_error[(ec_error_ct - 1) % 4]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ec_procwrite&lt;/span&gt;&lt;/b&gt; (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;struct&lt;/span&gt;&lt;/b&gt; file *f,&lt;br /&gt;   &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;const&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *buf,&lt;br /&gt;   &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;long&lt;/span&gt;&lt;/b&gt; cnt,&lt;br /&gt;   &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; *dt)&lt;br /&gt;{&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; opt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;char&lt;/span&gt;&lt;/b&gt; *pe = NULL;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (copy_from_user(&amp;amp;opt, buf, 1)) {&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; -EFAULT;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (opt == &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;'c'&lt;/span&gt;&lt;/b&gt;) {&lt;br /&gt; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* escrevendo 'c' no arquivo proc apagamos os erros*/&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt; pe = ec_errors;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;while&lt;/span&gt;&lt;/b&gt; (pe - ec_errors &amp;lt; EC_PROCFILE_BUF_SIZE) {&lt;br /&gt;  *pe++ = 0;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; ec_error_ct = 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;init_module&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; i;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;for&lt;/span&gt;&lt;/b&gt; (i = 0; i &amp;lt; 4; i++) {&lt;br /&gt; ec_error[i] = ec_errors + (EC_PROCFILE_BUF_SIZE / 4);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;ec_procfile = create_proc_entry(EC_PROCFILE_NAME, 0644, NULL);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (ec_procfile == NULL){&lt;br /&gt; &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* Algo deu errado, arquivo nao criado... */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt; remove_proc_entry(EC_PROCFILE_NAME, &amp;amp;proc_root); &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* Remove */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt; printk(KERN_ALERT &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"FATAL: Error creating /proc/errorconsole\n"&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; -ENOMEM;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;ec_major = register_chrdev(0, EC_DEVICE_NAME, &amp;amp;opers);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (ec_major &amp;lt; 0) {&lt;br /&gt; printk(KERN_ALERT &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"FATAL: Registering device failed\n"&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; remove_proc_entry(EC_PROCFILE_NAME, &amp;amp;proc_root); &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* Remove... */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; ec_major;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;ec_procfile-&amp;gt;read_proc = ec_procread;&lt;br /&gt;ec_procfile-&amp;gt;owner = THIS_MODULE;&lt;br /&gt;ec_procfile-&amp;gt;mode = S_IFREG | S_IRUGO;&lt;br /&gt;ec_procfile-&amp;gt;uid = 0;&lt;br /&gt;ec_procfile-&amp;gt;gid = 0;&lt;br /&gt;&lt;br /&gt;printk(KERN_ALERT &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"errcon: Starting Error Console\n"&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;printk(KERN_ALERT &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"errcon: Device Major: %d\n"&lt;/span&gt;&lt;/b&gt;,ec_major);&lt;br /&gt;printk(KERN_ALERT &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"errcon: Device Minor: 0\n"&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;printk(KERN_ALERT &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"errcon: Proc File: %s\n"&lt;/span&gt;&lt;/b&gt;, EC_PROCFILE_NAME);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; SUCCESS;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;cleanup_module&lt;/span&gt;&lt;/b&gt; (&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt;) {&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; ret = unregister_chrdev(ec_major, EC_DEVICE_NAME);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (ret &amp;lt; 0) {&lt;br /&gt; printk(KERN_ALERT &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"FATAL: Error unregistering device\n"&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;remove_proc_entry(EC_PROCFILE_NAME, &amp;amp;proc_root);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;MODULE_LICENSE&lt;/span&gt;&lt;/b&gt;(EC_MODULE_LICENSE);&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;MODULE_AUTHOR&lt;/span&gt;&lt;/b&gt;(EC_MODULE_AUTHOR);&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;MODULE_SUPPORTED_DEVICE&lt;/span&gt;&lt;/b&gt;(EC_DEVICE_NAME);&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;MODULE_DESCRIPTION&lt;/span&gt;&lt;/b&gt;(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Error Console Device and Statistics"&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--FIM DO ARQUIVO--&gt;&lt;br /&gt;&lt;br /&gt;Makefile - rotinas de compilação&lt;br /&gt;&lt;!--FILE: Makefile--&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;###############################################################################&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;# Criado: Na epoca do errcon.c                                                #&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;# Autor:  Bruno Moreira Guedes                                                #&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;# Changelog:                                                                  #&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;#                                                                             #&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;# 2008-10-22 Bruno Moreira Guedes:                                            #&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;#  -Adicao de targeta htmlcode, para gerar HTML dos arquivos                  #&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;###############################################################################&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;obj-m += errcon.o&lt;br /&gt;&lt;br /&gt;ENSCRIPT = /usr/bin/enscript&lt;br /&gt;ENSCRIPT_FLAGS = -i 3 --color --language=html&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;all:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;make -C /lib/modules/$(&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;shell uname -r&lt;/span&gt;&lt;/b&gt;)/build M=$(&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;PWD&lt;/span&gt;&lt;/b&gt;) modules&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;clean:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;make -C /lib/modules/$(&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;shell uname -r&lt;/span&gt;&lt;/b&gt;)/build M=$(&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;PWD&lt;/span&gt;&lt;/b&gt;) clean&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;htmlcode:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;$(&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;ENSCRIPT&lt;/span&gt;&lt;/b&gt;) $(&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;ENSCRIPT_FLAGS&lt;/span&gt;&lt;/b&gt;) -Ec -o errcon.h.html errcon.h&lt;br /&gt;$(&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;ENSCRIPT&lt;/span&gt;&lt;/b&gt;) $(&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;ENSCRIPT_FLAGS&lt;/span&gt;&lt;/b&gt;) -Ec -o errcon.c.html errcon.c&lt;br /&gt;$(&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;ENSCRIPT&lt;/span&gt;&lt;/b&gt;) $(&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;ENSCRIPT_FLAGS&lt;/span&gt;&lt;/b&gt;) -Emakefile -o Makefile.html Makefile&lt;br /&gt;&lt;/pre&gt;Bom, agora acho que todos já tem diversão por um bom tempo!! Qualquer dúvida postem aí... É um assunto complexo, não sei se expliquei bem... Mas não se acanhem gente!!&lt;br /&gt;&lt;!--FIM DO ARQUIVO--&gt;&lt;br /&gt;Confiram também o &lt;a href='http://brunildz.blogspot.com/2008/10/desenvolvimento-de-mdulos-para-o-kernel_28.html'&gt;Próximo Artigo da Série&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[1] Modularizado ou não, você também pode compilar ele sem suporte a modulos,    mas isso normalmente acontece apenas em sistemas embarcados, pois costuma ser desvantajoso em grande parte dos casos&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;b&gt;&lt;span style="color:green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-8425849425791792038?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/Js6_ymoMjDk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/Js6_ymoMjDk/desenvolvimento-de-mdulos-para-o-kernel.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>11</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/desenvolvimento-de-mdulos-para-o-kernel.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-2258279844016568874</guid><pubDate>Wed, 22 Oct 2008 22:44:00 +0000</pubDate><atom:updated>2008-10-22T20:51:58.376-02:00</atom:updated><title>Google Abre os Fontes do Android</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HGAyFrZNpcwCSEvsFBOrjo7uIEw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HGAyFrZNpcwCSEvsFBOrjo7uIEw/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/HGAyFrZNpcwCSEvsFBOrjo7uIEw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HGAyFrZNpcwCSEvsFBOrjo7uIEw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;Palavras-chave: &lt;span style="font-weight: bold;"&gt;sdk, ferramentas de desenvolvimento, open source&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eu não tenho muito o objetivo de focar em notícias aqui no meu blog, mas algumas das notícias que mais causam impacto no "mundo virtual" não podem ficar sempre de fora.&lt;br /&gt;&lt;br /&gt;Para os que não conhecem, o Androide é um SDK(Software Development Kit) de desenvolvimento para celulares, criada pelo Google. A novidade é que o Google &lt;s&gt;finalmente&lt;/s&gt; abriu o jogo: liberou os fontes do SDK para a comunidade.&lt;br /&gt;&lt;br /&gt;Os fontes já estão disponíveis no repositório git do Google. Veja a notícia original: &lt;a href="http://www.osnews.com/story/20419/Google_Open_Sources_Android"&gt;Google Open Sources Android&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[]'s&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;b&gt;&lt;span style="color:green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-2258279844016568874?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/Xn3szdAUDPI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/Xn3szdAUDPI/google-abre-os-fontes-do-android.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/google-abre-os-fontes-do-android.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-506723410280914150</guid><pubDate>Tue, 21 Oct 2008 06:07:00 +0000</pubDate><atom:updated>2008-10-28T19:47:47.258-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Sistemas Operacionais</category><title>Prioridade de Processos</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vw5moZNBP1Iy7mlC_eUm51tjX18/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vw5moZNBP1Iy7mlC_eUm51tjX18/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/vw5moZNBP1Iy7mlC_eUm51tjX18/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vw5moZNBP1Iy7mlC_eUm51tjX18/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;Palavras-chave:  &lt;span style="font-weight: bold;"&gt;Linux, UNIX, Sistemas Operacionais, Processos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href='http://www.manager.com.br/afiliados/click_afiliado.php?origem=manageronline_afiliados_4958_full_afiliados_01.gif' target='_blank'&gt;&lt;img src='http://images.manager.com.br/new_afiliados/banner/full/full_afiliados_01.gif' alt='Empregos Manager Online' border='0'&gt;&lt;/a&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Escalonamento de processos é um assunto que muitas pessoas desconhecem. Um administrador de sistemas normalmente não precisa ser um "expert" no assunto. Porém, existe uma parte deste assunto que todos precisam conhecer: o tratamento de prioridades.&lt;br /&gt;&lt;br /&gt;Este é mais um modelo computacional que segue alguma coisa aplicada pela humanidade em outras áreas. O conceito, não computacionalmente falando, é extremamente simples: algumas coisas são necessárias agora, outras podem ser deixadas para depois.&lt;br /&gt;&lt;br /&gt;Um exemplo, é que algumas pessoas dão prioridade para comprar a casa em vez de comprar um carro. Algumas dão prioridade para o trabalho e não para a família. Na computação o mesmo ocorre: temos um número fixo de processadores no hardware, e possuimos um número de processos rodando bem maior que este número de processadores.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!--&lt;br /&gt;google_ad_client = "pub-9031078133205190";&lt;br /&gt;/* anuncio_artigos_linux */&lt;br /&gt;google_ad_slot = "9868071313";&lt;br /&gt;google_ad_width = 728;&lt;br /&gt;google_ad_height = 15;&lt;br /&gt;//--&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&lt;br /&gt;src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Os sistemas operacionais, em especial o Linux, possuem um &lt;span style="font-style: italic;"&gt;scheduler&lt;/span&gt; responsável por gerenciar uma fila de processos e definir quem está na vez. O &lt;span style="font-style: italic;"&gt;scheduler&lt;/span&gt; é extremamente complexo e utiliza uma série de fatores para definir "quem está na vez" entre os processos em execução no sistema. Mas a parte que nos interessa mesmo é a parte que está ao nosso alcance controlar: o &lt;span style="font-style: italic;"&gt;nice&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Basicamente, um processo possui uma escala de &lt;span style="font-style: italic;"&gt;nice&lt;/span&gt; de -20 até 19 atribuida a ele, indicando o quão "legal"(&lt;span style="font-style: italic;"&gt;nice)&lt;/span&gt; ele é. Neste post, utilizaremos o termo "gentil" para falar disso. Podemos dizer que os processos com &lt;span style="font-style: italic;"&gt;nice&lt;/span&gt; de 19 são caras extremamente "gentís".  Já os processos de &lt;span style="font-style: italic;"&gt;nice &lt;/span&gt;0 não são "gentís". Os de &lt;span style="font-style: italic;"&gt;nice &lt;/span&gt;negativo, por sua vez, acho que nem precisa entrar em detalhes: são os processos do tipo "sai da frente".&lt;br /&gt;&lt;br /&gt;O funcionamento basicamente é que quanto mais gentil o processo for, mais ele espera os outros "passarem" pelo processador antes dele. Fazendo uma analogia ao trânsito, por exemplo, imagine que tenhamos basicamente 3 tipos de motorista: os normais, os apressados e os lerdos. Se em uma rotatória um motorista normal cruzar com um apressado, o apressado irá tentar "burlar a vez" do normal. O normal, por sua vez, vai pensar "vixi, que cara apressado, tá bom, passa logo".&lt;br /&gt;&lt;br /&gt;Agora, se o normal cruzar com o lerdo, o lerdo irá deixar o normal passar. Quando dois normais se cruzam, eles simplesmente seguem a regra, que no caso do trânsito: quem veio primeiro passa. O mesmo acontece com dois lerdos e com dois apressados(a não ser que eles se choquem).&lt;br /&gt;&lt;br /&gt;Mas claro, não pense que o motorista lerdo é "bobo", por exemplo. Chegará um momento que ele não cederá a vez, pois senão ele ficaria 2 anos na rotatória caso ela fosse movimentada.&lt;br /&gt;&lt;br /&gt;Computacionalmente, o conceito é o mesmo. A única mudança é que não temos apenas 3 níveis de processos, mas sim uma grande escala de -20 até 19. As regras seguidas quando dois processos concorrentes possuem nível igual de gentileza são um tanto mais complexas do que simplesmente "quem veio primeiro passa", mas em condições normais elas são irrelevantes(e mesmo que não fossem, não temos como interferir nelas).&lt;br /&gt;&lt;br /&gt;Ao iniciar, todo processo recebe por padrão, se não especificado, o &lt;span style="font-style: italic;"&gt;nice&lt;/span&gt; 0(normal, nem gentil nem apressado). Este valor pode ser definido na hora de iniciar o processo e/ou &lt;/span&gt;&lt;span style="font-size:100%;"&gt;alterado &lt;/span&gt;&lt;span style="font-size:100%;"&gt;durante a execução. Usuários normais podem definir valores entre 0 e 19, sendo que valores negativos são exclusivos para o &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;root&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Agora que você já está familiarizado com o conceito, vamos ver como isso funciona na prática. Em um derivado UNIX, como o Linux, temos dois comandos que ajustam o nice dos processos: &lt;span style="font-style: italic;"&gt;nice &lt;/span&gt;e &lt;span style="font-style: italic;"&gt;renice&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Veja seus usos básicos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ nice -n &lt;span style="font-style: italic;"&gt;ajuste&lt;/span&gt; &lt;span style="font-style: italic;"&gt;comando&lt;/span&gt;&lt;br /&gt;$ renice &lt;span style="font-style: italic;"&gt;ajuste&lt;/span&gt; -p &lt;span style="font-style: italic;"&gt;lista-de-pids&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Basicamente,  o comando &lt;span style="font-style: italic;"&gt;nice&lt;/span&gt; inicia um segundo comando(passado por parâmetro na linha de comando) com prioridade definida pela opção -n. O comando &lt;span style="font-style: italic;"&gt;renice&lt;/span&gt;, por sua vez&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;, redefine a prioridade de processos já existentes listados após a opção -p.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Executando um &lt;span style="font-weight: bold;"&gt;ls&lt;/span&gt; com &lt;span style="font-style: italic;"&gt;nice &lt;/span&gt;10:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ nice -n 10 ls&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Mudando para 15 o &lt;span style="font-style: italic;"&gt;nice&lt;/span&gt; de um processo já iniciado de PID 12333:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ renice 15 -p 12333&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bom pessoal, acho que dá pra ter uma boa compreensão do assunto. Lembrem-se de que uma definição boa de prioridades pode otimizar o sistema. E lembrem-se também que, apesar de não ser bom que o sistema chegue a esse ponto, em casos de instabilidade grande e grande consumo de processamento por algum processo, vale redefinir sua prioridade como uma "gambiarra provisória" para "aliviar" a máquina até que ela possa ser parada e substituida por uma que dê conta do recado.&lt;br /&gt;&lt;br /&gt;Só complementando, me empenharei futuramente em escrever sobre o &lt;span style="font-style: italic;"&gt;and&lt;/span&gt;(auto nice daemon), um serviço que monitora processos e define automaticamente os níveis de nice. É uma coisa que muitos procuram mas não sabem como fazer.&lt;br /&gt;&lt;br /&gt;OBS: deixo o espaço aberto para quem quiser sugerir novos temas/assuntos/questões para mim escrever sobre. Mande como comentário ou me procure ;)&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;b&gt;&lt;span style="color:green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-506723410280914150?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/0nIYKuqvy6g" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/0nIYKuqvy6g/prioridade-de-processos.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>5</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/prioridade-de-processos.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-2496298070427543929</guid><pubDate>Tue, 21 Oct 2008 03:24:00 +0000</pubDate><atom:updated>2008-10-21T02:17:11.278-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Inutilidades</category><title>Diagramas UML Genéricos Para Qualquer Sistema</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tgvvD7rilpPiFGq34GTaxowgkkQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tgvvD7rilpPiFGq34GTaxowgkkQ/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/tgvvD7rilpPiFGq34GTaxowgkkQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tgvvD7rilpPiFGq34GTaxowgkkQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;Palavras-chave: UML, diagrama de classe, diagrama de seqüência, diagrama de caso de uso, inutilidades, besteiras, porcarias&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Está cansado de desenvolver diagramas de sistemas levando horas para fazer isso?? Está cansado de ficar arrastando &lt;a href="http://desciclo.pedia.ws/wiki/Boneco_palito"&gt;Bonecos Palito&lt;/a&gt; pra lá e pra cá??&lt;br /&gt;&lt;br /&gt;Então você PRECISA é dos novos diagramas genéricos para &lt;span style="font-weight: bold;"&gt;QUALQUER SISTEMA&lt;/span&gt; da &lt;span style="font-weight: bold;"&gt;POG Corporation&lt;/span&gt;!!&lt;br /&gt;&lt;br /&gt;Confira!! Estão disponíveis AQUI, para qualquer &lt;s&gt;idiota&lt;/s&gt; indivíduo que queira utilizá-los, sem nenhum custo e totalmente de grátis!!&lt;br /&gt;&lt;div align='center'&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.bruno.inf.br/inutilidade/imagens/class%20diagram.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; float: none;" src="http://www.bruno.inf.br/inutilidade/imagens/class%20diagram.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.bruno.inf.br/inutilidade/imagens/sequence%20diagram.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: none; cursor: pointer;" src="http://www.bruno.inf.br/inutilidade/imagens/sequence%20diagram.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.bruno.inf.br/inutilidade/imagens/use%20case%20diagram.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: none; cursor: pointer;" src="http://www.bruno.inf.br/inutilidade/imagens/use%20case%20diagram.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;span style="color: rgb(255, 0, 0); font-weight: bold; font-style: italic;"&gt;IN&lt;/span&gt;&lt;b style="color: rgb(255, 0, 0);"&gt;UTILIDADES&lt;/b&gt;(não leve a sério conteúdos com esta classificação)&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-2496298070427543929?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/8ij5QI_65Pg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/8ij5QI_65Pg/diagramas-uml-genricos-para-qualquer.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/diagramas-uml-genricos-para-qualquer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-8852437415909056716</guid><pubDate>Mon, 20 Oct 2008 00:30:00 +0000</pubDate><atom:updated>2008-10-21T02:16:02.696-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C/C++</category><title>Desmistificando os Ponteiros em C/C++</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xaU3348wIxJMtg6_HhJSRcA6zj8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xaU3348wIxJMtg6_HhJSRcA6zj8/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/xaU3348wIxJMtg6_HhJSRcA6zj8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xaU3348wIxJMtg6_HhJSRcA6zj8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Tags: ponteiros, processadores, C, C++&lt;br /&gt;&lt;br /&gt;Programadores C/C++ iniciantes, professores de faculdade, alunos de faculdade, programadores de outras linguagens... Muitas pessoas destas "categorias" tem uma coisa em comum: a "síndrome de pânico de ponteiros".&lt;br /&gt;&lt;br /&gt;Os programadores iniciantes pela pouca familiaridade com a arquitetura de computadores em geral; os alunos de faculdade da área técnológica porque geralmente começam a dar os primeiros passos na programação antes de conhecer razoavelmente a arquitetura de um processador; os professores, por sua vez, morrem de medo de ter que explicar algo complexo para quem talvez não esteja ainda preparado para compreender o assunto; os programadores de outras linguagens por acharem que estão livres deles.&lt;br /&gt;&lt;br /&gt;Escrevi este artigo para explicar como utilizar ponteiros, quais são seus possíveis problemas, e em que situações seu uso pode ser interessante.&lt;br /&gt;&lt;br /&gt;O destaque é dos programas feitos em C/C++ por serem as linguagens de alto nível que mais utilizam estes recursos(por isso alguns autores as chamam de linguagens de "médio nível", mas não vamos entrar nesta discussão).&lt;br /&gt;&lt;br /&gt;Como meu amigo David, que me sugeriu este post, havia me pedido para mostrar as utilidades dos ponteiros, então vou começar com uma lista de situações(a nível de programação em C/C++) aonde os ponteiros são &lt;span style="font-weight: bold;"&gt;FUNDAMENTAIS&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;O trivial: na alocação dinâmica&lt;/li&gt;&lt;li&gt;Em seqüencias de dados alocados&lt;/li&gt;&lt;li&gt;Quando precisamos passar ou retornar a referência a um objeto de memória(em C, pois o C++ possui a passagem de referência)&lt;/li&gt;&lt;/ul&gt;Agora vamos falar sobre outras situações aonde temos os tais dos "ponteiros". Além dos relógios, medidores de combustível, velocímetros, e outros aparelhos analógicos, alguns aparelhos - que por sinal não possuem nada de analógico - também tem ponteiros. É o caso dos computadores: diversos registradores de um processador são apenas ponteiros. Por exemplo, BASE POINTER, STACK POINTER, INSTRUCTION POINTER, etc. A computação é baseada em ponteiros.&lt;br /&gt;&lt;br /&gt;Precisamos conceituar um ponteiro. Tanto no relógio da cozinha, quanto no marcador de gasolina, e até nos ponteiros do processador, um ponteiro é algo que APONTA para alguma coisa. Podemos fazer uma analogia do relógio a um "ponteiro para endereços de tempo". É isso mesmo, quando definimos a forma como o nosso tempo "anda" organizando-a em Horas, Minutos e Segundos, criamos um sistema para endereçamento das fatias de tempo.&lt;br /&gt;&lt;br /&gt;Da mesma forma funcionam os ponteiros dos processadores: a única diferença é que estes apontam para endereços de memória. Mas como assim "endereço de memória"?? Para que isso serve?? Bom, explicando para o pessoal de nível técnico menor, a memória do computador é muito grande. Para organizar tudo isso, ela é dividida em "blocos". Imagine a memória como uma parede de tijolos a vista. Cada tijolo é um bloco, ou segmento de memória. Cada um destes tijolos, é dividido em muitos bytes, além de ter o seu "número de identificação".&lt;br /&gt;&lt;br /&gt;Agora, imaginem que criamos em nosso programa uma variável chamada 'a', do tipo inteiro(em uma arquitetura de 32bits normal e com SO que a utiliza devidamente, 4bytes). Como o nosso programa acha o local da memória aonde o valor de 'a' está armazenado?? Quando nosso programa inicia, o SO reserva segmentos de memória para ele. Apartir daí, o programa possui um endereço de seu "tijolo inicial", armazenado em um registrador. Mas ainda não é suficiente para acharmos 'a'. Precisamos saber em qual byte de um destes tijolos 'a' está.&lt;br /&gt;&lt;br /&gt;Em linguagens de baixo nível, aonde trabalhamos com paginação de memória(especialmente em ambientes DOS, por exemplo, aonde temos acesso a manipular a memória diretamente), normalmente trabalhamos com 2 ponteiros: o ponteiro que indica o segmento de memória que estamos trabalhando, e o ponteiro que indica o offset dentro deste segmento(o número do byte procurado dentro daquele segmento).&lt;br /&gt;&lt;br /&gt;Mas como esse post foca em C/C++, mais especificamente para sistemas operacionais completos, vamos deixar os detalhes de baixo nível "de lado", pois o compilador e o SO são nossos amigos e trata de fazer este trabalho para nós. Mas aí como fica?? Bom, imagine que todos esses blocos estão "mapeados"(entre aspas mas é isso mesmo, quem quiser entender melhor leia sobre a system call mmap dos sistemas POSIX). Para nosso programa tudo é um bloco único de memória, só precisamos indicar o byte aonde o objeto de memória se encontra.&lt;br /&gt;&lt;br /&gt;Agora vamos para a parte prática. Quando trabalhamos com strings em C, qual é a melhor maneira para armazená-las?? Simples: PONTEIROS. "Mas como assim?? Eu armazendo elas em arrays(vetores) de caracteres!!"&lt;br /&gt;&lt;br /&gt;Quando temos um array(vide exemplo abaixo), não temos nada mais que um &lt;span style="font-weight: bold;"&gt;ponteiro&lt;/span&gt;. É isso mesmo, apesar de muita gente imaginar que são duas coisas bem distintas. Quando declaramos um array, uma área de memória é definida na imagem do executável do programa para aquela variável(carregada na STACK, um segmento estático de memória, quando o programa inicia). O símbolo(variável) declarado como array é apenas um ponteiro para esta região de memória. Por outro lado, quando declaramos um ponteiro simples, nenhuma região de memória é pré-atribuida a ele.&lt;br /&gt;&lt;br /&gt;Em C/C++  os ponteiros são tipados, e quando os acessamos, ele fará a leitura do número de bytes do tipo de dado ao qual ele pertence. Existem duas maneiras de acessar uma área de memória guardada por um ponteiro. A primeira é a derreferência normal, que ocorre quando utilizamos um '*' antes da variável do ponteiro. A segunda é a derreferência por índice, aonde colocamos um offset de deslocamento entre colchetes após o nome da variável.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;int *ponteiro = funcao_que_retorna_um_ponteiro_de_int();&lt;br /&gt;printf("%d\n", &lt;b&gt;*&lt;/b&gt;ponteiro); //derreferência simples&lt;br /&gt;printf("%d\n", ponteiro&lt;b&gt;[0]&lt;/b&gt;); //derreferência por índice&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Graças a tipagem dos ponteiros que a linguagem nos trás, podemos trabalhar com &lt;span style="font-weight: bold;"&gt;aritmética de ponteiros&lt;/span&gt;. Apesar de limitada, permitindo apenas adições e subtrações, ela nos ajuda em muitas situações. Seu uso normalmente é através da incrementação ou da decrementação de ponteiros. Vejamos o exemplo de derreferência por indexação abaixo:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;int *ponteiro = funcao_que_retorna_um_ponteiro_para_um_array_de_int();&lt;br /&gt;for (int i = 0; ponteiro[i] != 10; i++) {&lt;br /&gt;    /*Percorre um array até encontrar um número 10 nele*/&lt;br /&gt;    ...&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O código acima percorre um array de inteiros até aonde tiver um número '10'. Agora veja como isto poderia ser feito utilizando a aritmética de ponteiros:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;int *ponteiro = funcao_que_retorna_um_ponteiro_para_um_array_de_int();&lt;br /&gt;while(*ponteiro++ != 10) {&lt;br /&gt;   ...&lt;br /&gt;   }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Quando somamos 1 a um ponteiro, ele soma, na verdade, o número de bytes do tipo de dado do ponteiro. Por exemplo, em um ponteiro de int, ao somarmos com "ponteiro++", estamos somando sizeof(int) ao ponteiro. O mesmo vale para a subtração. Por este motivo a tipagem de ponteiros é extremamente importante. Com a fraca tipagem do C temos que ter este tipo de cuidado sempre!!&lt;br /&gt;&lt;br /&gt;Muitos iniciantes, porém, de certa forma se 'iludem' ao fazer isso. É preciso ter um certo cuidado ao escolher entre as duas opções. Neste caso, por exemplo, temos um convite para um &lt;b&gt;memory leak&lt;/b&gt;("vazamento" de memória, quando temos uma área de memória dinamicamente alocada e não possuimos uma referência a ela para efetuar a sua liberação) caso o array retornado pela função seja dinamicamente alocado. Quando a área retornada pelo array for estáticamente alocada(e isso podemos nem ter como saber), ainda temos um possível problema: o o conteúdo retornado poder ser local da função chamada. Por isso, nunca retorne um array local em uma função.&lt;br /&gt;&lt;br /&gt;Observe agora o exemplo abaixo:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;int ponteiro[10]; //array alocado estaticamente&lt;br /&gt;... /* algum código preenchendo valores no array */&lt;br /&gt;while(*ponteiro++ != 10) {&lt;br /&gt;   ... /*a nossa "busca" do exemplo anterior*/&lt;br /&gt;   }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Neste exemplo, corremos o risco de perder a referência à área estaticamente alocada. Isto pode causar uma série de confusões e dores de cabeça. Imagine por exemplo, que algo depois deste loop utilize o acesso por índice ao ponteiro. As chances de não sabermos se o offset acessado está dentro do array original é muito alta, a menos que façamos um controle rígido de quantas posições o ponteiro foi incrementado. Porém, neste tipo de situação o esforço para usar a aritmética de ponteiros de forma segura é grande demais, não compensando o trabalho e fazendo ser mais válido utilizar o acesso por índice em um ponteiro fixo.&lt;br /&gt;&lt;br /&gt;Normalmente, o uso de ponteiros com derreferência simples combinado à aritmética de ponteiros se dá mais em funções, ou quando o ponteiro é uma "cópia", ou seja, um ponteiro igualado a um já existente. Veja o programa de exemplo abaixo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;#&lt;B&gt;&lt;FONT COLOR="#5F9EA0"&gt;include&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;lt;stdio.h&amp;gt;&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;&lt;B&gt;&lt;FONT COLOR="#228B22"&gt;int&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#0000FF"&gt;tamanho_string&lt;/FONT&gt;&lt;/B&gt;(&lt;B&gt;&lt;FONT COLOR="#228B22"&gt;const&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#228B22"&gt;char&lt;/FONT&gt;&lt;/B&gt; *string);&lt;br /&gt;&lt;br /&gt;&lt;B&gt;&lt;FONT COLOR="#228B22"&gt;int&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#0000FF"&gt;main&lt;/FONT&gt;&lt;/B&gt;() {&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#228B22"&gt;int&lt;/FONT&gt;&lt;/B&gt; ponteiro1[10]; &lt;I&gt;&lt;FONT COLOR="#B22222"&gt;/* ponteiro p/ area estatica,&lt;br /&gt;         aritmetica nao recomendada */&lt;/FONT&gt;&lt;/I&gt;&lt;br /&gt;&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#228B22"&gt;int&lt;/FONT&gt;&lt;/B&gt; *ponteiro2; &lt;I&gt;&lt;FONT COLOR="#B22222"&gt;/* ponteiro nao inicializado, recomendavel&lt;br /&gt;      para aritmetica */&lt;/FONT&gt;&lt;/I&gt;&lt;br /&gt; ponteiro2 = ponteiro1;&lt;br /&gt; printf(&lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;%d %d\n&amp;quot;&lt;/FONT&gt;&lt;/B&gt;, *ponteiro2++, *ponteiro2);&lt;br /&gt; &lt;I&gt;&lt;FONT COLOR="#B22222"&gt;/* Exibe os 2 primeiros itens do array, usando a aritmetica&lt;br /&gt;    de ponteiros */&lt;/FONT&gt;&lt;/I&gt;&lt;br /&gt; printf(&lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;%d %d\n&amp;quot;&lt;/FONT&gt;&lt;/B&gt;, ponteiro1[0], *(ponteiro1+1));&lt;br /&gt; &lt;I&gt;&lt;FONT COLOR="#B22222"&gt;/* Mesma coisa, porem usa a aritmetica de ponteiros de uma&lt;br /&gt;    maneira que eh segura mesmo com o ponteiro1 */&lt;/FONT&gt;&lt;/I&gt;&lt;br /&gt;&lt;br /&gt; ponteiro1++; &lt;I&gt;&lt;FONT COLOR="#B22222"&gt;/* Acabamos de perder a referencia para&lt;br /&gt;                 o primeiro item do array!!! */&lt;/FONT&gt;&lt;/I&gt;&lt;br /&gt; ponteiro1[0] = tamanho_string(&lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;Ola Mundo&amp;quot;&lt;/FONT&gt;&lt;/B&gt;);&lt;br /&gt; &lt;I&gt;&lt;FONT COLOR="#B22222"&gt;/* Estamos definindo este valor para o segundo item do array,&lt;br /&gt;    pois o ponteiro aponta para o segundo apos seu incremento!! */&lt;/FONT&gt;&lt;/I&gt;&lt;br /&gt; printf(&lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;%p: %d\n&amp;quot;&lt;/FONT&gt;&lt;/B&gt;, ponteiro1, *ponteiro1);&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;return&lt;/FONT&gt;&lt;/B&gt; *ponteiro1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;B&gt;&lt;FONT COLOR="#228B22"&gt;int&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#0000FF"&gt;tamanho_string&lt;/FONT&gt;&lt;/B&gt;(&lt;B&gt;&lt;FONT COLOR="#228B22"&gt;const&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#228B22"&gt;char&lt;/FONT&gt;&lt;/B&gt; *string) {&lt;br /&gt; &lt;I&gt;&lt;FONT COLOR="#B22222"&gt;/* Exemplo de uso de aritmetica de ponteiros em funcoes */&lt;/FONT&gt;&lt;/I&gt;&lt;br /&gt; &lt;I&gt;&lt;FONT COLOR="#B22222"&gt;/* Eh importante manter a referencia inicial, pois podemos&lt;br /&gt;  * precisar dela ao longo da funcao. Porem, perder a referencia &lt;br /&gt;  * somente dentro do escopo local de uma funcao que nao eh a&lt;br /&gt;  * criadora da area de memoria nao eh tao prejudicial.*/&lt;/FONT&gt;&lt;/I&gt;&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#228B22"&gt;char&lt;/FONT&gt;&lt;/B&gt; *s = string;&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;while&lt;/FONT&gt;&lt;/B&gt; (*s++);&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;return&lt;/FONT&gt;&lt;/B&gt; (s - string) - 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;No exemplo acima temos um mini-programa de teste, mostrando algumas situações comentadas anteriormente. Recomendo ao leitor interessado compilar o programa, rodar, e logo após editar o código inicializando as variáveis, adicionando alguns "printf"s, e fazendo experiências em geral. Isso vai facilitar muito a compreensão do assunto!!&lt;br /&gt;&lt;br /&gt;Observe que a função para contar caracteres de uma string utiliza um elemento não comentado da aritmética de ponteiros, que é a subtração. A lógica é simples: incrementa o ponteiro enquanto o caractere apontado por ele não for nulo. Logo após, a subtração indicará o deslocamentoÉ assim que a função strlen da libc trabalha.&lt;br /&gt;&lt;br /&gt;Agora vamos à alocação dinâmica, que é o uso mais comum dos ponteiros. Não vou falar muito em detalhes sobre ela, apenas explicarei sua utilidade e exemplificarei. Quem quiser saber mais sobre o assunto, veja os links que achei no Google e considerei satisfatórios: &lt;a href='http://www.ime.usp.br/~pf/algoritmos/aulas/aloca.html'&gt;Alocação Dinâmica em C&lt;/a&gt; e &lt;a href='http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Aloca%C3%A7%C3%A3o_din%C3%A2mica_de_mem%C3%B3ria#Operador_new'&gt;Alocação Dinâmica em C++&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A utilidade da alocação dinâmica é simplesmente alocar quantidades de memória variáveis. Estas quantidades podem variar de acordo com o fluxo do programa. Um exemplo prático seria, por exemplo, se desenvolvermos uma agenda que grave os dados em um arquivo de texto e carregue-os na memória, além de permitir novos cadastros pelo usuário. Saiba que neste caso não sabemos quantos registros possuimos na agenda, e nem quantos o usuário vai inserir. Você utilizaria uma agenda com limite de cadastros, que se você cadastrasse além do limite causaria um estouro de memória?? Certamente NÃO!! Para seu usuário não sofrer com este tipo de limitação, é necessário dominar a alocação dinâmica de memória.&lt;br /&gt;&lt;br /&gt;Vejamos um exemplo de alocação dinâmica em C e um em C++ respectivamente abaixo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;#&lt;B&gt;&lt;FONT COLOR="#5F9EA0"&gt;include&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;lt;stdio.h&amp;gt;&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;#&lt;B&gt;&lt;FONT COLOR="#5F9EA0"&gt;include&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;#&lt;B&gt;&lt;FONT COLOR="#5F9EA0"&gt;include&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;lt;string.h&amp;gt;&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;&lt;B&gt;&lt;FONT COLOR="#228B22"&gt;int&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#0000FF"&gt;main&lt;/FONT&gt;&lt;/B&gt;() {&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#228B22"&gt;int&lt;/FONT&gt;&lt;/B&gt; tamanho, cur_chr;&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#228B22"&gt;char&lt;/FONT&gt;&lt;/B&gt; *str_ptr = NULL, *p = NULL;&lt;br /&gt; &lt;br /&gt; scanf(&lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;%d&amp;quot;&lt;/FONT&gt;&lt;/B&gt;, &amp;amp;tamanho);&lt;br /&gt; str_ptr = malloc(tamanho+1); &lt;I&gt;&lt;FONT COLOR="#B22222"&gt;// Aloca a memoria...&lt;br /&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;/I&gt; &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;if&lt;/FONT&gt;&lt;/B&gt; (!str_ptr) {&lt;br /&gt;  printf(&lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;Erro de alocacao\n&amp;quot;&lt;/FONT&gt;&lt;/B&gt;);&lt;br /&gt;  exit(1);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; memset(str_ptr, 0, tamanho+1);&lt;br /&gt;&lt;br /&gt; p = str_ptr;&lt;br /&gt;&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;while&lt;/FONT&gt;&lt;/B&gt;(tamanho--) {&lt;br /&gt;  cur_chr = getchar();&lt;br /&gt;  &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;if&lt;/FONT&gt;&lt;/B&gt; (cur_chr != EOF) {&lt;br /&gt;   *p++ = (&lt;B&gt;&lt;FONT COLOR="#228B22"&gt;char&lt;/FONT&gt;&lt;/B&gt;) cur_chr;&lt;br /&gt;  }&lt;br /&gt;  &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;else&lt;/FONT&gt;&lt;/B&gt; {&lt;br /&gt;   printf(&lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;ALERTA: String nao ocupou todo espaco\n&amp;quot;&lt;/FONT&gt;&lt;/B&gt;);&lt;br /&gt;   &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;break&lt;/FONT&gt;&lt;/B&gt;;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; printf(&lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;Fim da leitura da string!\n&amp;quot;&lt;/FONT&gt;&lt;/B&gt;);&lt;br /&gt; printf(&lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;String lida: %s\n&amp;quot;&lt;/FONT&gt;&lt;/B&gt;, str_ptr);&lt;br /&gt;        free(str_ptr);&lt;br /&gt;        return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;#&lt;B&gt;&lt;FONT COLOR="#5F9EA0"&gt;include&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;lt;iostream&amp;gt;&lt;/FONT&gt;&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;&lt;B&gt;&lt;FONT COLOR="#228B22"&gt;int&lt;/FONT&gt;&lt;/B&gt; &lt;B&gt;&lt;FONT COLOR="#0000FF"&gt;main&lt;/FONT&gt;&lt;/B&gt;() {&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#228B22"&gt;int&lt;/FONT&gt;&lt;/B&gt; tamanho;&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#228B22"&gt;char&lt;/FONT&gt;&lt;/B&gt; *str_ptr = NULL, *ptr = NULL;&lt;br /&gt;&lt;br /&gt; cin &amp;gt;&amp;gt; tamanho;&lt;br /&gt; try {&lt;br /&gt;  str_ptr = new &lt;B&gt;&lt;FONT COLOR="#228B22"&gt;char&lt;/FONT&gt;&lt;/B&gt;[tamanho + 1];&lt;br /&gt; }&lt;br /&gt; catch(bad_alloc &amp;amp;e) {&lt;br /&gt;  cout &amp;lt;&amp;lt; &lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;Erro alocando memoria&amp;quot;&lt;/FONT&gt;&lt;/B&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; memset(str_ptr, 0, tamanho + 1);&lt;br /&gt; ptr = str_ptr;&lt;br /&gt;&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;while&lt;/FONT&gt;&lt;/B&gt;(tamanho-- &amp;amp;&amp;amp; cin &amp;gt;&amp;gt; *ptr++);&lt;br /&gt;&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;if&lt;/FONT&gt;&lt;/B&gt; (tamanho) {&lt;br /&gt;  cout &amp;lt;&amp;lt; &lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;ALERTA: String nao ocupou todo espaco&amp;quot;&lt;/FONT&gt;&lt;/B&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;  }&lt;br /&gt; cout &amp;lt;&amp;lt; &lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;Fim da leitura da string!&amp;quot;&lt;/FONT&gt;&lt;/B&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt; cout &amp;lt;&amp;lt; &lt;B&gt;&lt;FONT COLOR="#BC8F8F"&gt;&amp;quot;String lida: &amp;quot;&lt;/FONT&gt;&lt;/B&gt; &amp;lt;&amp;lt; str_ptr &amp;lt;&amp;lt; endl;&lt;br /&gt; delete[] str_ptr;&lt;br /&gt;&lt;br /&gt; &lt;B&gt;&lt;FONT COLOR="#A020F0"&gt;return&lt;/FONT&gt;&lt;/B&gt; 0;&lt;br /&gt;}&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Bom pessoal, acho que já deu pra ter uma boa noção, não é??&lt;br /&gt;&lt;br /&gt;[]'s &lt;br /&gt;Postem a vontade sugestões, pedidos ou idéias!!&lt;br /&gt;&lt;br /&gt;Classificação do conteúdo: &lt;b&gt;&lt;span style="color:green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Sobre mim:&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-8852437415909056716?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/QKdWU54bTCo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/QKdWU54bTCo/desmistificando-os-ponteiros-em-cc.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>3</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/desmistificando-os-ponteiros-em-cc.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-518883887413258640</guid><pubDate>Thu, 16 Oct 2008 20:21:00 +0000</pubDate><atom:updated>2008-11-11T15:23:42.705-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">C/C++</category><title>Carregando bibliotecas dinâmicas em C++ com a dlopen API</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qtz9Prv_99-8g74h7hD4GeTNkls/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qtz9Prv_99-8g74h7hD4GeTNkls/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/qtz9Prv_99-8g74h7hD4GeTNkls/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qtz9Prv_99-8g74h7hD4GeTNkls/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Palavras-chave: plugins, C++, dlopen, bibliotecas dinâmicas&lt;br /&gt;&lt;br /&gt;Bom, este é meu primeiro post com conteúdo mesmo. Quero demonstrar uma solução para uma dificuldade comum que alguns programadores C++ podem ter em determinadas situações.  As bibliotecas dinâmicas são extremamente úteis, principalmente em sistemas de plugins. Desta maneira podemos desenvolver aplicativos mais dinâmicos, e deixar que outros usuários criem novas funcionalidades para eles. E não é só isso, tenha a necessidade e verás!!&lt;br /&gt;&lt;br /&gt;A primeira vez que tive a necessidade de fazer isso, um tempo atrás, achei poucas referências sobre o assunto, nenhuma em Português. Destaque para o &lt;a href="http://tldp.org/HOWTO/C++-dlopen/"&gt;"C++ dlopen mini-HOWTO"&lt;/a&gt;. Me surpreendi em saber que ninguém havia feito uma tradução dele, ou escrito algo sobre isso em língua portuguesa até hoje, e por isso escrevo este post.&lt;br /&gt;&lt;br /&gt;Ele explica como carregar bibliotecas dinâmicas em ambientes Unix(especialmente GNU, que como o nome diz não é Unix :-).  Quando precisamos carregar na linguagem C uma biblioteca, especialmente nos ambientes citados acima, é muito fácil. Simplesmente utilizamos a dlopen() API da maneira que ela foi projetada para funcionar. Esta API é composta das seguintes funções básicas:  &lt;ul&gt;&lt;li&gt;void *dlopen(const char *path, int flags) - carrega a biblioteca dinâmica e retorna um handler&lt;br /&gt;&lt;/li&gt;&lt;li&gt;void *dlsym(void *handler, const char *symbol) - Retorna um ponteiro para o símbolo desejado(uma função ou uma variável/estrutura da biblioteca)&lt;/li&gt;&lt;li&gt;int dlclose(void *handler) - descarrega a biblioteca dinâmica e retorna um status&lt;/li&gt;&lt;li&gt;char *dlerror(void) - retorna descrição do ultimo erro ocorrido na API&lt;/li&gt;&lt;/ul&gt;Até aí, aparentemente nada impede o uso delas em C++, apesar de ficar a pergunta: "e se eu quero carregar uma classe, por exemplo?". Mas indo mais a fundo, ou para programadores C++ mais experiêntes, o problema torna-se visível: "name-mangling".&lt;br /&gt;&lt;br /&gt;Não vou falar muito neste post sobre este cara de nome esquisito. Mas basicamente, os linkers adicionam ao arquivo uma função em C com um nome. Este nome é o nome da própria função. Mas agora imaginem a situação: C++ trabalha com sobrecarga. E se eu tiver duas funções com o mesmo nome e parâmetros diferentes?? Para isso, o compilador C++ modifica o nome das funções antes de gerar o arquivo-objeto. Esta modificação segue um padrão de notação de nomes, que depende da implementação do compilador(apesar de existirem 2 padrões bastante seguidos). "Isso" recebe o nome esquisito de 'name-mangling'.&lt;br /&gt;&lt;br /&gt;Quando chamamos a função dlsym(), ela não consegue "adivinhar" que o name-mangling do C++ 'hackeou' o nome da função, pois ele foi escrito em C e "nem sabia" que o tal de "C++" existia. E agora?? Bom, o C++ possui um recurso para manter compatibilidade de nomes com o C. Este recurso é a declaração 'extern "C"'. Veja um exemplo de como utilizá-la:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;extern&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"C"&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; funcao(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; parametro); &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;//declaraÃ§Ã£o unica a nÃ£o ser "mangleada"&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;extern&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"C"&lt;/span&gt;&lt;/b&gt; {&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* várias declarações a não serem "mangleadas" */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; funcao2(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; funcao3(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; pqp);&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; var1;&lt;br /&gt;}&lt;/pre&gt;Agora, temos alguns cuidados quando nossos programas forem códigos que possam ser compilados com um compilador C. O problema é que o compilador C não sabe que existe o 'extern "C"', pois a linguagem C não possui esse recurso(por razões obvias). E agora jacaré? Meu código será exclusivamente C++, mesmo que seja uma porção estruturada do código que fiz para poder reaproveitar em um programa escrito em C??&lt;br /&gt;&lt;br /&gt;Calma, veja o exemplo de como o pré-processador de macros nos salvará:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;ifdef&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;__cplusplus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;extern&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"C"&lt;/span&gt;&lt;/b&gt; {&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;/* bla bla bla */&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;}&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;endif&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Isso normalmente é útil para bibliotecas :-) Mas e aí, qual é a minha falando disso se estou falando de bibliotecas dinâmicas em C++?? Vamos lá! Funções C++ realmente terão perdas nessa história, pois perderemos a sobrecarga. Mas classes e métodos(o que realmente mais interessa no C++) ganham maior dinamismo. Como assim??&lt;br /&gt;&lt;br /&gt;É simples. Podemos ter diferentes classes carregadas dinamicamente, sem o programa sequer "saber que ela existe" em tempo de compilação. A única restrição é que ela precisa herdar uma classe virtual(aka abstrata) que nós já declaramos(por motivos óbvios).&lt;br /&gt;&lt;br /&gt;Ok, vamos colocar a mão na massa então?? Ok. É hora de definir requisitos do nosso aplicativo de teste:&lt;br /&gt;-Exibir 'Hello, Brunildz is a beautiful man, world' na tela;&lt;br /&gt;-Perguntar ao usuário o nome do arquivo de plugin a ser carregado;&lt;br /&gt;-Carregar o plugin;&lt;br /&gt;-Fazer as chamadas aos métodos GetFoo() e GetBar() das classes dos plugins;&lt;br /&gt;-Retornar ao prompt solicitando o plugin novamente;&lt;br /&gt;-Quando o valor de resposta do usuário for '0', sair;&lt;br /&gt;&lt;br /&gt;Requisitos dos plugins Foo e Bar;&lt;br /&gt;-Exibir a mensagem 'Foo'(para o plugin Foo) ou 'Bar'(para o plugin Bar) quando for carregado;&lt;br /&gt;-Implementar classe imprimindo o nome de cada método chamado quando eles forem chamados;&lt;br /&gt;-Classe deve seguir a interface do aplicativo;&lt;br /&gt;&lt;br /&gt;Para isso, "precisamos" criar uma classe abstrata 'BrunildzPluginInterface', além de uma definição de tipo para um ponteiro para função retornando um objeto de nossa classe, em um arquivo que poderiamos chamar de BrunildzPluginInterface.hpp:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;ifndef&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;__BRUNILDZPLUGININTERFACE_HPP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;define&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;__BRUNILDZPLUGININTERFACE_HPP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;class&lt;/span&gt;&lt;/b&gt; BrunildzPluginInterface {&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;public&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;BrunildzPluginInterface() { }&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;virtual&lt;/span&gt;&lt;/b&gt; ~BrunildzPluginInterface() { };&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;virtual&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; GetFoo() = 0;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;virtual&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; GetBar() = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;extern&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"C"&lt;/span&gt;&lt;/b&gt; {&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;typedef&lt;/span&gt;&lt;/b&gt; BrunildzPluginInterface *BPI_load_t();&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;typedef&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; BPI_unload_t(BrunildzPluginInterface *);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;endif//__BRUNILDZPLUGININTERFACE_HPP&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Agora podemos criar o nosso primeiro plugin, chamado Foo. Para isso, precisamos de uma classe, uma função carregadora, e uma função descarregadora, que podemos criar no arquivo Foo.cpp(eu sei, ficaria mais limpo e reaproveitável dividir em Foo.h e Foo.cpp, mas é só um exemplo, aqui no blog fica mais bonito assim):&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;BrunildzPluginInterface.hpp&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;class&lt;/span&gt;&lt;/b&gt; Foo : &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;public&lt;/span&gt;&lt;/b&gt; BrunildzPluginInterface {&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;public&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;Foo() {&lt;br /&gt;   cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Plugin Foo: Foo();"&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;   }&lt;br /&gt;~Foo() {&lt;br /&gt;   cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Plugin Foo: ~Foo();"&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;   }&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; GetFoo() {&lt;br /&gt;   cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Plugin Foo: GetFoo();"&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;   }&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; GetBar() {&lt;br /&gt;   cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Plugin Foo: GetBar();"&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;   }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;extern&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"C"&lt;/span&gt;&lt;/b&gt; {&lt;br /&gt;BrunildzPluginInterface *load_plugin(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt;) {&lt;br /&gt;   &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;new&lt;/span&gt;&lt;/b&gt; Foo;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; unload_plugin(BrunildzPluginInterface *bpi) {&lt;br /&gt;   &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;delete&lt;/span&gt;&lt;/b&gt; bpi;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Agora faremos o nosso plugin Bar, seguindo exatamente a mesma lógica:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;BrunildzPluginInterface.hpp&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;class&lt;/span&gt;&lt;/b&gt; Bar : &lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;public&lt;/span&gt;&lt;/b&gt; BrunildzPluginInterface {&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;public&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;Bar() {&lt;br /&gt;   cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Plugin Bar: Bar();"&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;   }&lt;br /&gt;~Bar() {&lt;br /&gt;   cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Plugin Bar: ~Bar();"&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;   }&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; GetFoo() {&lt;br /&gt;   cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Plugin Bar: GetFoo();"&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;   }&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; GetBar() {&lt;br /&gt;   cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Plugin Bar: GetBar();"&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;   }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;extern&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"C"&lt;/span&gt;&lt;/b&gt; {&lt;br /&gt;BrunildzPluginInterface *load_plugin(&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt;) {&lt;br /&gt;      &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;new&lt;/span&gt;&lt;/b&gt; Bar;&lt;br /&gt;   }&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; unload_plugin(BrunildzPluginInterface *bpi) {&lt;br /&gt;      &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;delete&lt;/span&gt;&lt;/b&gt; bpi;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Ok, nossos plugins estão criados. E agora?? Basta fazermos o "trabalho sujo", ou seja, nossa aplicação. Vamos chamá-la de ldplugin.cpp:&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;dlfcn.h&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;#&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;include&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;&amp;lt;BrunildzPluginInterface.hpp&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;int&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;main&lt;/span&gt;&lt;/b&gt;() {&lt;br /&gt;string plugin, swp;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(34, 139, 34);"&gt;void&lt;/span&gt;&lt;/b&gt; *plugin_h = NULL;&lt;br /&gt;BPI_load_t *loader = NULL;&lt;br /&gt;BPI_unload_t *unloader = NULL;&lt;br /&gt;BrunildzPluginInterface *instancia = NULL;&lt;br /&gt;&lt;br /&gt;cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Hello, Brunildz is a beautiful man, world"&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;while&lt;/span&gt;&lt;/b&gt; (1) {&lt;br /&gt;   cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Digite o nome do plugin(0 para sair): "&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;   cin &amp;gt;&amp;gt; plugin;&lt;br /&gt;&lt;br /&gt;   &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (plugin == &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"0"&lt;/span&gt;&lt;/b&gt;) &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;break&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;&lt;br /&gt;   swp = &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"./"&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;   swp += plugin;&lt;br /&gt;   plugin = swp;&lt;br /&gt;&lt;br /&gt;      plugin += &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;".so"&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;      plugin_h = dlopen(plugin.c_str(), RTLD_LAZY);&lt;br /&gt;   &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (!plugin_h) {&lt;br /&gt;      cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Erro: "&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; dlerror() &amp;lt;&amp;lt; endl;&lt;br /&gt;      &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; 1;&lt;br /&gt;      }&lt;br /&gt;   loader = reinterpret_cast&amp;lt;BPI_load_t*&amp;gt;(dlsym(plugin_h,&lt;br /&gt;                             &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"load_plugin"&lt;/span&gt;&lt;/b&gt;));&lt;br /&gt;   unloader = reinterpret_cast&amp;lt;BPI_unload_t*&amp;gt;(dlsym(plugin_h,&lt;br /&gt;                             &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"unload_plugin"&lt;/span&gt;&lt;/b&gt;));&lt;br /&gt;   &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;if&lt;/span&gt;&lt;/b&gt; (!loader || !unloader) {&lt;br /&gt;      cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Erro: "&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; dlerror() &amp;lt;&amp;lt; endl;&lt;br /&gt;      &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; 1;&lt;br /&gt;      }&lt;br /&gt;   instancia = loader();&lt;br /&gt;   instancia-&amp;gt;GetFoo();&lt;br /&gt;   instancia-&amp;gt;GetBar();&lt;br /&gt;   unloader(instancia);&lt;br /&gt;   cout &amp;lt;&amp;lt; &lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"Proximo simbolo..."&lt;/span&gt;&lt;/b&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;   }&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;return&lt;/span&gt;&lt;/b&gt; 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Agora, para compilar é só executar os seguintes comandos(supondo que todos os arquivos acima estejam no diretório atual):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;$&lt;/span&gt; g++ -I. -fPIC -shared -g -o Bar.so Bar.cpp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;$&lt;/span&gt; g++ -I. -fPIC -shared -g -o Foo.so Foo.cpp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$&lt;/span&gt; g++ -I. -ldl -rdynamic -o ldplugin ldplugin.cpp&lt;span style="font-family:courier new;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Palavras-chave de busca que mais trouxeram a este artigo:&lt;br /&gt;-dlsym class loading&lt;br /&gt;-implementar biblioteca dinamica em C++&lt;br /&gt;-biblioteca cout (!!!)&lt;br /&gt;---&lt;br /&gt;Classificação do conteúdo: &lt;b&gt;&lt;span style="color:green;"&gt;SÉRIO&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sobre mim:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Curriculum Vitae&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Site Pessoal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-518883887413258640?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/FJlbvUF7dRo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/FJlbvUF7dRo/carregando-bibliotecas-dinmicas-em-c.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>3</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/carregando-bibliotecas-dinmicas-em-c.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2550283994748552920.post-7190921510565698904</guid><pubDate>Wed, 15 Oct 2008 18:53:00 +0000</pubDate><atom:updated>2008-10-16T16:44:14.034-03:00</atom:updated><title>Brunildz</title><description>&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xdATC4zFG6uwaXMp8B1Ha2FiZzw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xdATC4zFG6uwaXMp8B1Ha2FiZzw/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/xdATC4zFG6uwaXMp8B1Ha2FiZzw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xdATC4zFG6uwaXMp8B1Ha2FiZzw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Olá a todos,&lt;br /&gt;&lt;br /&gt;Informo que está no ar o "Brunildz 0.1 beta". Vou dedicar um pouco do meu tempo a disponibilizar tudo aquilo que um 'Geek' de plantão gosta de encontrar na web: informações sobre Técnologia, Software e... Besteiras em geral para descontrair(essas são de grande importância).&lt;br /&gt;&lt;br /&gt;Bom pessoal, como meu blog terá muito conteúdo bem humorado, prometo distinguir(ao final de cada post) se o artigo é sério com informações válidas, ou se ele é algo para fazer pessoas rirem.&lt;br /&gt;&lt;br /&gt;Antes de seguir qualquer instrução ou dica mencionada em algum post, por favor verifique se ele é confiável ao final!!&lt;br /&gt;&lt;br /&gt;Espero que todos gostem!!&lt;br /&gt;&lt;br /&gt;-----------------------------------&lt;br /&gt;Classificação deste post: &lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;SÉRIO&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Sobre Mim:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.bruno.inf.br/"&gt;Meu Site Pessoal&lt;/a&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;Meu Curriculum (provavelmente atualizado)&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.bruno.inf.br/curriculum.pdf"&gt;&lt;/a&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 255, 51);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 255, 51); font-weight: bold;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;/!\ Técnologia, Software e Besteiras diversas /!\&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2550283994748552920-7190921510565698904?l=brunildz.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~4/DVIMqvxiuJQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/Brunildz-TecnologiaSoftwareEBesteirasGerais/~3/DVIMqvxiuJQ/brunildz.html</link><author>noreply@blogger.com (Bruno Moreira Guedes)</author><thr:total>0</thr:total><feedburner:origLink>http://brunildz.blogspot.com/2008/10/brunildz.html</feedburner:origLink></item></channel></rss>

