<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gustavo Roberto &#187; Computação</title>
	<atom:link href="http://www.gustavoroberto.blog.br/category/computacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gustavoroberto.blog.br</link>
	<description>http://www.gustavoroberto.blog.br</description>
	<lastBuildDate>Sat, 04 Feb 2012 18:39:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Impressora USB como LPT1</title>
		<link>http://www.gustavoroberto.blog.br/2011/07/01/impressora-usb-como-lpt1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=impressora-usb-como-lpt1</link>
		<comments>http://www.gustavoroberto.blog.br/2011/07/01/impressora-usb-como-lpt1/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 01:58:06 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Blogs]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[impressora]]></category>
		<category><![CDATA[impressora usb lpt1]]></category>
		<category><![CDATA[lpt1]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/?p=2211</guid>
		<description><![CDATA[Olá Pessoal, Para você que tem uma impressora USB, e precisa que ela se comporte como LPT1, aí vai um dica bastante simples e funcional, que vai fazer você deixar de gastar muitos reais com programas milagrosos. Para ele funcionar como LPT1 faça o seguinte : - Vá em compartilhar impressoras e compartilhe - Coloque [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Para você que tem uma impressora USB, e precisa que ela se comporte como LPT1, aí vai um dica bastante simples e funcional, que vai fazer você deixar de gastar muitos reais com programas milagrosos.</p>
<p>Para ele funcionar como LPT1 faça o seguinte :</p>
<p>- Vá em compartilhar impressoras e compartilhe<br />
- Coloque um nome nela, por exemplo lx300<br />
- Vá ao iniciar > executar e digite lá cmd<br />
- Digite hostname e anote o resultado, vamo supor que apareça PC1</p>
<p>Então faça a seguinte mágica.</p>
<p>Ainda no cmd digite :</p>
<p>net use lpt1 \\pc1\lx300 /persistent:yes</p>
<p>Onde, </p>
<p>pc1 = nome do seu pc<br />
lx300 = nome de compartilhamento da sua impressora<br />
/persistent:yes = é para impressora permanecer como LPT1 assim que seu pc for reiniciado.</p>
<p>Bem, com isso, você poderá imprimir normalmente  &#8220;usando LPT1&#8243;</p>
<p>Viu como foi fácil !</p>
<p>Espero que tenham gostado ! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2011/07/01/impressora-usb-como-lpt1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Traffic Shaping da GVT em Vitória no E.S, será ?</title>
		<link>http://www.gustavoroberto.blog.br/2010/05/01/traffic-shaping-da-gvt-em-vitoria-no-e-s-sera/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=traffic-shaping-da-gvt-em-vitoria-no-e-s-sera</link>
		<comments>http://www.gustavoroberto.blog.br/2010/05/01/traffic-shaping-da-gvt-em-vitoria-no-e-s-sera/#comments</comments>
		<pubDate>Sat, 01 May 2010 13:25:39 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[traffic shaping]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/?p=1892</guid>
		<description><![CDATA[Tirem suas próprias conclusões]]></description>
			<content:encoded><![CDATA[<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/UposHnnTkGI&#038;hl=pt_BR&#038;fs=1&#038;color1=0x006699&#038;color2=0x54abd6"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/UposHnnTkGI&#038;hl=pt_BR&#038;fs=1&#038;color1=0x006699&#038;color2=0x54abd6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<p>Tirem suas próprias conclusões <img src='http://www.gustavoroberto.blog.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2010/05/01/traffic-shaping-da-gvt-em-vitoria-no-e-s-sera/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows 3.1 online</title>
		<link>http://www.gustavoroberto.blog.br/2010/02/23/windows-3-1-online/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=windows-3-1-online</link>
		<comments>http://www.gustavoroberto.blog.br/2010/02/23/windows-3-1-online/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 11:55:43 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/?p=1824</guid>
		<description><![CDATA[Quem aí lembra do Windows 3.1 ? E seus infinitos 8 disquetes de instalação ? Pois é, um amigo meu me enviou uma página muito interessante. A página lembra muito o Windows 3.1, deu até para matar a saudade. Vejam no link abaixo: Página que emula o Windows 3.1 Interessante demais, vale a pena conferir.]]></description>
			<content:encoded><![CDATA[<p>Quem aí lembra do Windows 3.1 ? E seus infinitos 8 disquetes de instalação ?</p>
<p>Pois é, um amigo meu me enviou uma página muito interessante. A página lembra muito o Windows 3.1, deu até para matar a saudade.</p>
<p>Vejam no link abaixo:</p>
<p><a href="http://www.michaelv.org/">Página que emula o Windows 3.1</a></p>
<p>Interessante demais, vale a pena conferir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2010/02/23/windows-3-1-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mudar ordem do sistema operacional grub2</title>
		<link>http://www.gustavoroberto.blog.br/2010/02/23/mudar-ordem-do-sistema-operacional-grub2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mudar-ordem-do-sistema-operacional-grub2</link>
		<comments>http://www.gustavoroberto.blog.br/2010/02/23/mudar-ordem-do-sistema-operacional-grub2/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 11:34:46 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software Livre]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/?p=1822</guid>
		<description><![CDATA[Olá Pessoal Essa é uma dica rápida. Se você está precisando trocar a ordem de seus sistema operacional no Grub2 e não tem muita experiência com o Grub2, recomendo a vocês o StartupManager, para baixá-lo basta proceder da seguinte forma no Ubuntu # aptitude install startupmanager Depois de instalado, vá para seu ambiente gráfico, abra [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal</p>
<p>Essa é uma dica rápida.</p>
<p>Se você está precisando trocar a ordem de seus sistema operacional no Grub2 e não tem muita experiência com o Grub2, recomendo a vocês o StartupManager, para baixá-lo basta proceder da seguinte forma no Ubuntu</p>
<p># aptitude install startupmanager</p>
<p>Depois de instalado, vá para seu ambiente gráfico, abra um terminal, e como root digite :</p>
<p># sudo startupmanager</p>
<p>ou </p>
<p># startupmanager</p>
<p>Uma tela vai se abrir, escolha o sistema operacional que você deseja colocar em primeiro e feche a tela. No próximo boot a ordem já deverá ter mudado.</p>
<p>Espero que tenham gostado.</p>
<p>Abraços !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2010/02/23/mudar-ordem-do-sistema-operacional-grub2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Filmes 3D sem óculos especiais</title>
		<link>http://www.gustavoroberto.blog.br/2010/02/20/filmes-3d-sem-oculos-especiais/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=filmes-3d-sem-oculos-especiais</link>
		<comments>http://www.gustavoroberto.blog.br/2010/02/20/filmes-3d-sem-oculos-especiais/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 16:48:27 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[3D]]></category>
		<category><![CDATA[Ciência]]></category>
		<category><![CDATA[Computação]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/?p=1813</guid>
		<description><![CDATA[Olá Pessoal O que motivou a escrever esse post, foi a minha visita ao Youtube canal 3D. E também a nova moda do cinema: Os filmes 3D Vejam um exemplo de filme 3D no Youtube: Não faz muito sentido você entrar num canal 3D sem ter um óculos especial para isso, não é ?! NÃO [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal</p>
<p>O que motivou a escrever esse post, foi a minha visita ao <a href="http://www.youtube.com/3d">Youtube canal 3D</a>. E também a nova moda do cinema: Os filmes 3D</p>
<p>Vejam um exemplo de filme 3D no Youtube:<br />
<object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/P3u5FDnQgkk&#038;hl=pt_BR&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/P3u5FDnQgkk&#038;hl=pt_BR&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></p>
<p>Não faz muito sentido você entrar num canal 3D sem ter um óculos especial para isso, não é ?! </p>
<p>NÃO ! </p>
<p>Não se você conhecer a técnica de assistir filmes 3D, sem óculos especiais <img src='http://www.gustavoroberto.blog.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Voltemos um pouco no tempo, e paremos na era do livro &#8220;Olho Mágico&#8221;. Lembraram ? Se você leitor, não gostava muito de frequentar livrarias e bibliotecas, talvez não conheça, então vou lhes apresentar:</p>
<p>Te parece familiar ?!<br />
<a href="http://www.gustavoroberto.blog.br/wp-content/uploads/2010/02/olho_magico.jpg"><img src="http://www.gustavoroberto.blog.br/wp-content/uploads/2010/02/olho_magico-300x300.jpg" alt="" title="olho_magico" width="300" height="300" class="aligncenter size-medium wp-image-1814" /></a></p>
<p>Pois bem, a visualização da imagem 3D escondinda dentro da figura é possível da seguinte forma, fixe os olhos na imagem, e tentem olhar através dela. Com algum tempo, a imagem vai começar a se destorcer, e como num passe de mágica, uma imagem tridimensional, surgirá diante de seus olhos.</p>
<p>No ínicio leva-se um certo tempo até acostumar a ver essas figuras, mas depois fica bem fácil.</p>
<p>Agora a parte científica.</p>
<p>Essa técnica de inserir imagens 3D em figuras, chama-se : <strong>Estereograma.</strong> Buscando o verbete na Wikipédia encontrei : </p>
<blockquote><p>
Um estereograma é uma técnica de ilusão de óptica, onde a partir de duas imagens bidimensionais complementares, é possível visualizar uma imagem tridimensional. Basicamente deve-se ver cada uma das duas imagens bidimensionais com um dos olhos, gerando-se a ilusão da tridimensionalidade.</p>
<p>Há anos, os estereogramas têm sido feitos sobrepondo-se fotografias com tomadas de ângulos ligeiramente distintos. Atualmente voltaram à fama, graças aos RDS (Random Dot Stereogram), criados com softwares específicos.</p>
<p>Para conseguir enxergar um estereograma, o principal é conhecer o resultado esperado. A idéia é desfocar a vista da imagem, de maneira que ambas as perspectivas sejam captadas. Alguns recomendam olhar o infinito, ou seja, fitar a vista num objeto distante e, sem desfocar, voltar a olhar a imagem. Outros preferem fitar a visão em um dedo sobre a imagem e lentamente retirá-lo, ou observar o reflexo da imagem num vidro, ou olhar a imagem bem de perto e, mantendo o foco, ir afastando a cabeça, de forma que o foco saia do papel até encontrar o ponto ideal. Depende de cada pessoa e sua condição visual. Alguns estereogramas já trazem um auxílio, como dois pontos, onde você foca a sua visão de forma que os 2 pontos se transformem em 3, então a imagem pretendida aparecerá.</p></blockquote>
<p>Então ?! Viram como é fácil ver filmes em 3D sem precisar dos óculos especiais ? Basta treinar os olhos um pouco e vocês nunca mais precisaram de óculos 3D</p>
<p>Bem, espero que tenham gostado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2010/02/20/filmes-3d-sem-oculos-especiais/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Os perdedores e os vencedores.</title>
		<link>http://www.gustavoroberto.blog.br/2008/10/08/os-perdedores-e-os-vencedores/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=os-perdedores-e-os-vencedores</link>
		<comments>http://www.gustavoroberto.blog.br/2008/10/08/os-perdedores-e-os-vencedores/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 14:14:50 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Blogs]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[Derrotas]]></category>
		<category><![CDATA[Vitórias]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/?p=553</guid>
		<description><![CDATA[Os perdedores paralisam-se diante das perdas e dos fracassos. Os vencedores começam tudo de novo.]]></description>
			<content:encoded><![CDATA[<p>Os perdedores paralisam-se diante das perdas e dos fracassos. Os vencedores começam tudo de novo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2008/10/08/os-perdedores-e-os-vencedores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando o Oracle XE no Ubuntu 8.04, Debian e outros</title>
		<link>http://www.gustavoroberto.blog.br/2008/10/03/instalando-o-oracle-xe-no-ubuntu-804-debian-e-outros/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=instalando-o-oracle-xe-no-ubuntu-804-debian-e-outros</link>
		<comments>http://www.gustavoroberto.blog.br/2008/10/03/instalando-o-oracle-xe-no-ubuntu-804-debian-e-outros/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 16:26:40 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Oracle XE]]></category>
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/?p=545</guid>
		<description><![CDATA[Boa Tarde Amigos, Esse é mais um post relâmpago. Para aqueles que gostariam de instalar o Oracle XE no Ubuntu, ou em outro sistema Debian-Like, basta executar os procedimentos abaixo : Adicione essa linha ao seu repositório, que ficam em : /etc/apt/sources.list deb http://oss.oracle.com/debian unstable main non-free Importe a chave com o seguinte comando : [...]]]></description>
			<content:encoded><![CDATA[<p>Boa Tarde Amigos, </p>
<p>Esse é mais um post relâmpago.</p>
<p>Para aqueles que gostariam de instalar o Oracle XE no Ubuntu, ou em outro sistema Debian-Like, basta executar os procedimentos abaixo :</p>
<p>Adicione essa linha ao seu repositório, que ficam em : /etc/apt/sources.list</p>
<blockquote><p>deb http://oss.oracle.com/debian unstable main non-free</p></blockquote>
<p>Importe a chave com o seguinte comando :</p>
<blockquote><p># wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle  -O- | sudo apt-key add &#8211; </p></blockquote>
<p>Faça o update :</p>
<blockquote><p># apt-get update</p></blockquote>
<p>Instale o Oracle XE :</p>
<blockquote><p># apt-get install oracle-xe</p></blockquote>
<p>Depois, basta chamar dessa forma :</p>
<blockquote><p>/etc/init.d/oracle-xe configure</p></blockquote>
<p>Na primeira vez que você fizer isso, responda às perguntas.</p>
<p>Se por acaso precisar de saber quais os comandos mais usados basta fazer :</p>
<blockquote><p>/etc/init.d/oracle-xe TAB TAB</p></blockquote>
<p>Espero que tenham gostado, e desculpem a correria <img src='http://www.gustavoroberto.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2008/10/03/instalando-o-oracle-xe-no-ubuntu-804-debian-e-outros/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sincronizando o Palm Z22 com o Ubuntu 8.04</title>
		<link>http://www.gustavoroberto.blog.br/2008/10/01/sincronizando-o-palm-z22-com-o-ubuntu-804/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sincronizando-o-palm-z22-com-o-ubuntu-804</link>
		<comments>http://www.gustavoroberto.blog.br/2008/10/01/sincronizando-o-palm-z22-com-o-ubuntu-804/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 21:01:28 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Palm Z22]]></category>
		<category><![CDATA[Sincronismo]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Z22]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/?p=536</guid>
		<description><![CDATA[Olá Pessoal, Esse é um pequeno artigo, sobre como sincronizar o Palm Z22 com o Ubuntu Linux 8.04. Nesse artigo vou direto ao assunto, por que estou meio sem tempo, mas vamos lá. O primeiro passo é o seguinte, como root, faça : # modprobe visor Caso você não faça isso, o HotSync não funcionará. [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Esse é um pequeno artigo, sobre como sincronizar o Palm Z22 com o Ubuntu Linux 8.04.</p>
<p>Nesse artigo vou direto ao assunto, por que estou meio sem tempo, mas vamos lá.</p>
<p>O primeiro passo é o seguinte, como root, faça :</p>
<blockquote><p># modprobe visor</p></blockquote>
<p>Caso você não faça isso, o HotSync não funcionará.</p>
<p>Se você for usar o Palm Z22 direto, aconselho você adicionar esse módulo em /etc/modules. Então você poderá fazer o seguinte :</p>
<blockquote><p># echo &#8220;visor&#8221; >>/etc/modules</p></blockquote>
<p>Se você tiver a curiosidade de ver como o seu dispositivo é reconhecido faça :</p>
<blockquote><p># tail -f /var/log/messages</p></blockquote>
<p>E conecte o seu dipositivo, você deverá perceber algo parecido com isso :</p>
<blockquote><p>usb 1-3: Handspring Visor / Palm OS converter now attached to ttyUSB0<br />
usb 1-3: Handspring Visor / Palm OS converter now attached to ttyUSB1</p></blockquote>
<p>Depois de todas essas operações, vá na aba de Sistema > Dispositivos PalmOS e na parte de  Dispositivos, clique em Adiciona.</p>
<p>- Em Nome, coloque o nome que você gostaria que seu dispositivo tivesse;<br />
- Em Tipo coloque USB, pelos menos no meu caso foi assim <img src='http://www.gustavoroberto.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ;<br />
- Em tempo de expiração deixe 2 mesmo ;<br />
- Em Dispositivo coloque /dev/pilot<br />
- Por fim,a velocidade de 115200</p>
<p>Vocês podem conferir a telinha na figura abaixo :<br />
<a href="http://www.gustavoroberto.blog.br/wp-content/uploads/2008/10/palm_z22_linux.png"><img class="aligncenter size-medium wp-image-535" title="palm_z22_linux" src="http://www.gustavoroberto.blog.br/wp-content/uploads/2008/10/palm_z22_linux-300x187.png" alt="" width="300" height="187" /></a></p>
<p>Ainda nessa tela, em Canais, você poderá escolher o que sincronizar, depois disso, basta apertar o botão de HotSync do seu Palm, para que as aplicações sejam sincronizadas.</p>
<p>Bem, não entrarei em detalhes ( já que esse artigo trata somente de sincronismo ) para não estragar o resto da brincadeira.</p>
<p>Abraços, e espero que tenham gostado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2008/10/01/sincronizando-o-palm-z22-com-o-ubuntu-804/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Nmap no Windows Vista</title>
		<link>http://www.gustavoroberto.blog.br/2008/09/10/nmap-no-windows-vista/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nmap-no-windows-vista</link>
		<comments>http://www.gustavoroberto.blog.br/2008/09/10/nmap-no-windows-vista/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 19:18:34 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/?p=365</guid>
		<description><![CDATA[Boa Tarde pessoal, Para aqueles que estão tentando executar o Nmap no Windows Vista, e estão se deparando com a seguinte mensagem : dnet: Failed to open device eth4 Seus problemas acabaram Basta executar o programa no modo Administrador, clicando com o botão direito sobre o ícone, e selecionando : Executar como Administrador. É isso [...]]]></description>
			<content:encoded><![CDATA[<p>Boa Tarde pessoal,</p>
<p>Para aqueles que estão tentando executar o Nmap no Windows Vista, e estão se deparando com a seguinte mensagem :</p>
<blockquote><p>dnet: Failed to open device eth4</p></blockquote>
<p>Seus problemas acabaram <img src='http://www.gustavoroberto.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Basta executar o programa no modo Administrador, clicando com o botão direito sobre o ícone, e selecionando :</p>
<blockquote><p>Executar como Administrador.</p></blockquote>
<p>É isso aí <img src='http://www.gustavoroberto.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Logo voltaremos com mais notícias do tenebroso mundo do Windows Vista.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2008/09/10/nmap-no-windows-vista/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Telnet no Windows Vista.</title>
		<link>http://www.gustavoroberto.blog.br/2008/08/03/telnet-no-windows-vista/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=telnet-no-windows-vista</link>
		<comments>http://www.gustavoroberto.blog.br/2008/08/03/telnet-no-windows-vista/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 21:30:24 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>
		<category><![CDATA[Telnet]]></category>
		<category><![CDATA[Windows Vista]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/?p=312</guid>
		<description><![CDATA[Olá Pessoal, Começando a série de artigos, Gustavo é Vendido, e agora usa Windows Vista, segue uma diquinha. Para aqueles desesperados, que não sabem onde Bill Gates enfiou a porra do Telnet no Windows Vista, digite no Executar o seguinte comando : optionalfeatures Adicione o Client Telnet, e seja feliz. Abraços !]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Começando a série de artigos, Gustavo é Vendido, e agora usa Windows Vista, segue uma diquinha.</p>
<p>Para aqueles desesperados, que não sabem onde Bill Gates enfiou a porra do Telnet no Windows Vista, digite no Executar o seguinte comando :</p>
<blockquote><p>optionalfeatures</p></blockquote>
<p>Adicione o Client Telnet, e seja feliz.<br />
 Abraços !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2008/08/03/telnet-no-windows-vista/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Quebrar senha de planilha no excel.</title>
		<link>http://www.gustavoroberto.blog.br/2007/06/29/quebrar-senha-de-planilha-no-excel-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=quebrar-senha-de-planilha-no-excel-2</link>
		<comments>http://www.gustavoroberto.blog.br/2007/06/29/quebrar-senha-de-planilha-no-excel-2/#comments</comments>
		<pubDate>Fri, 29 Jun 2007 13:01:23 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/2007/06/29/quebrar-senha-de-planilha-no-excel-2/</guid>
		<description><![CDATA[Esse artigo agora está hospedado em outra página, acessem :  http://www.gustavoroberto.blog.br/?p=25 O motivo é a falta de espaço Abraços e deêm uma passadinha por lá]]></description>
			<content:encoded><![CDATA[<p>Esse artigo agora está hospedado em outra página, acessem :  <a href="http://www.gustavoroberto.blog.br/?p=25">http://www.gustavoroberto.blog.br/?p=25</a></p>
<p>O motivo é a falta de espaço <img src='http://www.gustavoroberto.blog.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Abraços e deêm uma passadinha por lá <img src='http://www.gustavoroberto.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2007/06/29/quebrar-senha-de-planilha-no-excel-2/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Curso de Perl &#8211; Como programar em Perl parte II</title>
		<link>http://www.gustavoroberto.blog.br/2007/03/26/curso-de-perl-como-programar-em-perl-parte-ii/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=curso-de-perl-como-programar-em-perl-parte-ii</link>
		<comments>http://www.gustavoroberto.blog.br/2007/03/26/curso-de-perl-como-programar-em-perl-parte-ii/#comments</comments>
		<pubDate>Mon, 26 Mar 2007 11:19:16 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/2007/03/26/curso-de-perl-como-programar-em-perl-parte-ii/</guid>
		<description><![CDATA[LEMBRETE O curso também pode ser acessado em http://www.linuxchix.org.br/?q=node/99 E também um link para a lista: http://listas.linuxchix.org.br/mailman/listinfo/cursos Dessa ve, estarei colocando o código na forma original : Perl best practices: escrevendo códigos legíveis; Perl modules: instalação, uso, módulos comumente usados. ATENÇÃO: Esta aula faz parte do curso Perl Tutorial e é continuacao do curso Perl [...]]]></description>
			<content:encoded><![CDATA[<p>LEMBRETE</p>
<p>O curso também pode ser acessado em</p>
<p><a href="http://www.linuxchix.org.br/?q=node/99" rel="nofollow">http://www.linuxchix.org.br/?q=node/99</a></p>
<p>E também um link para a lista:</p>
<p><a href="http://listas.linuxchix.org.br/mailman/listinfo/cursos" rel="nofollow">http://listas.linuxchix.org.br/mailman/listinfo/cursos</a></p>
<p>Dessa ve, estarei colocando o código na forma original :</p>
<p>Perl best practices: escrevendo códigos legíveis; Perl modules: instalação,<br />
uso, módulos comumente usados.</p>
<p>ATENÇÃO:<br />
Esta aula faz parte do curso Perl Tutorial e é continuacao do curso Perl<br />
Intro, também disponibilizado no LinuxChix.org.br. Esta aula de forma alguma<br />
cobre todas as informações disponíveis sobre Perl best practices ou Perl<br />
modules.</p>
<p>*** Transformando um código mal formatado/identado em um código mais<br />
legível.</p>
<p>Formatar o código de maneira legível é parte das &#8220;boas praticas&#8221;<br />
recomendadas para programadores em qualquer linguagem de programação. O fato<br />
é que cada programador tem uma preferência diferente na hora de formatar um<br />
código, o que pode dificultar (e porque não dizer, irritar) a vida de quem<br />
precisa ler/alterar o código que outra pessoa escreveu.</p>
<p>Por exemplo, vejá o mesmo programa formatado de maneiras diferentes:</p>
<p># FORMATACAO 1:</p>
<p>my $código= &#8220;XYZ456475&#8243;;<br />
my $data = &#8220;2006/04/23&#8243; ;</p>
<p>my $resposta_do_teste =testar_formato_dos_dados ($código,$data );</p>
<p>print &#8220;$resposta_do_teste\n&#8221; ;</p>
<p>sub testar_formato_dos_dados<br />
{<br />
my($código,$data)=@_;</p>
<p>if ( $data   =~ m{\d{4}/\d{2}/\d{2}}<br />
and $código =~ m{[A-Z]{3}\d+}){<br />
print &#8220;qualquer texto \n&#8221;;<br />
return &#8220;Os dados estao no formato correto&#8221;;<br />
}<br />
else{        return &#8220;Os dados não estao no formato correto&#8221; ;<br />
}<br />
}</p>
<p># FORMATACAO 2:</p>
<p>my $código = &#8220;XYZ456475&#8243;;<br />
my $data = &#8220;2006/04/23&#8243;;<br />
my $resposta_do_teste = testar_formato_dos_dados($código, $data);<br />
print &#8220;$resposta_do_teste\n&#8221;;</p>
<p>sub testar_formato_dos_dados {<br />
my ($código, $data) = @_;</p>
<p>if ( $data =~ m{\d{4}/\d{2}/\d{2}} and $código =~ m{[A-Z]{3}\d+} ) {<br />
print &#8220;qualquer texto \n&#8221;;<br />
return &#8220;Os dados estao no formato correto&#8221;;<br />
} else {<br />
return &#8220;Os dados não estao no formato correto&#8221;;<br />
}<br />
}</p>
<p># FORMATACAO 3:</p>
<p>my $código = &#8220;XYZ456475&#8243;;<br />
my $data   = &#8220;2006/04/23&#8243;;</p>
<p>my $resposta_do_teste = testar_formato_dos_dados($código, $data);</p>
<p>print &#8220;$resposta_do_teste\n&#8221;;</p>
<p>sub testar_formato_dos_dados {<br />
my ($código, $data) = @_;</p>
<p>if ( $data =~ m{\d{4}/\d{2}/\d{2}} and $código =~ m{[A-Z]{3}\d+} ) {<br />
print &#8220;qualquer texto \n&#8221;;<br />
return &#8220;Os dados estao no formato correto&#8221;;<br />
} else {<br />
return &#8220;Os dados não estao no formato correto&#8221;;<br />
}<br />
}</p>
<p>&#8212; Alguns programadores, por exemplo, poderiam achar horrivel de ler um<br />
código usando a FORMATACAO 1 porque esse exemplo não segue um estilo na<br />
formatação.</p>
<p>Num mundo ideal, os programadores de um determinado projeto e/ou equipe<br />
teriam padrões de programacao a serem seguidos. No mundo real &#8211; onde a<br />
teoria é por muitas vezes diferente da prática &#8211; existe o Perltidy para<br />
facilitar a vida dos Perl programmers:</p>
<p>http://search.cpan.org/~shancock/Perl-Tidy-20060719/bin/perltidy</p>
<p>&#8212; PELRTIDY: uma ferramenta muito util para identar e reformatar um código.<br />
Ele lê um script em Perl e reformata/identa o script. Um exemplo bem simples<br />
de uso:</p>
<p>$ perltidy o_seu_script.pl</p>
<p>- Nesse caso, o perltidy lê o conteúdo do o_seu_script.pl e cria um arquivo<br />
chamado o_seu_script.pl.tdy que contém o código original reformatado. O<br />
conteúdo do arquivo o_seu_script.pl permanece inalterado.</p>
<p>Há inumeras opcoes que podem ser passadas para o perltidy para que ele<br />
funcione de acordo com a sua preferencia. Alguns outros exemplos são:</p>
<p>$ pertidy -b o_seu_script.pl</p>
<p>- Nesse caso, o perltidy altera o arquivo o_seu_script.pl e faz um backup do<br />
conteúdo original em o_seu_script.pl.bak.</p>
<p>$ perltidy -gnu o_seu_script.pl</p>
<p>- Nesse caso, o o_seu_script.pl é reformatado num estilo aproximado ao do<br />
GNU Coding Standards para programas em C.</p>
<p># MAIS informações<br />
Mais informações sobre o perltidy podem se encontradas no CPAN.org (link<br />
citado acima) e nos seguintes links:</p>
<p>http://perltidy.sourceforge.net/stylekey.html</p>
<p>http://perltidy.sourceforge.net/tutorial.html</p>
<p>*** Perl modules: instalações, uso, módulos comumente usados.</p>
<p>### O QUE é?<br />
Falando de uma forma bem simples, um módulo pode ser definido como um<br />
arquivo que contem uma ou mais funcoes. Um módulo pode ou não ser orientado<br />
a objeto &#8211; mas antes de falar sobre orientacao a objeto é necessario que se<br />
tenha um bom entendimento sobre módulos. O assunto orientacao a objeto será<br />
abordado laaaaa nas próximas aulas.</p>
<p>OBS.: Se voce não se lembra o que é ou como criar/usar funcoes em Perl, de<br />
uma olhada na aula 4 do curso de introducao ao Perl. E, se continuar em<br />
duvida, mande uma mensagem para o grupo.</p>
<p>### PARA QUE SERVE?<br />
módulos são usados como uma forma de reaproveitamento de código. Assim, se<br />
voce tem várioss programas que utilizam o mesmo conjunto de funcoes, voce<br />
pode colocar esse conjunto de funcoes dentro de um módulo e fazer com que os<br />
seus programas usem esse módulo.</p>
<p>OBS.: O assunto &#8220;criando módulos em Perl&#8221; será abordado laaaa nas próximas<br />
aulas. Muita calma nessa hora. Por enquanto so será abordado como instalar e<br />
usar módulos que já estao prontos e disponiveis.</p>
<p>Diversos programadores disponibilizam os seus módulos através do CPAN.org.<br />
Alguns módulos já são disponibilizados na propria distribuição do Perl.<br />
várioss outros podem ser baixados no site CPAN.org.</p>
<p>Sendo assim, evite reinventar a roda. Se já existe um módulo que faz o que<br />
voce precisa, não hesite, utilize-o-o-o. Por exemplo, se voce precisa de um<br />
módulo que envie email, antes de escrever o seu código, acesse o<br />
search.cpan.org e procure por mail. Há grandes chances de que já exista um<br />
módulo que faz exatamente o que voce quer, disponível, bem documentado e<br />
testado. não tenha medo de usa-lo.</p>
<p>E ha os tipos de módulos que servem para alterar a forma como o Perl<br />
funciona.</p>
<p>### COMO USAR?<br />
Depende do módulo. Cada módulo vem com uma documentacao explicando suas<br />
funcionalidades e exemplos de como usa-las.</p>
<p>A documentacao pode ser acessada digitando na linha de comando:</p>
<p>$ perldoc NOME_DO_módulo</p>
<p>Por exemplo:</p>
<p>$ perldoc Net::FTP</p>
<p>De forma geral, antes de usar qualquer funcao de um módulo é necessario<br />
declara-lo. Isto é, é necessario &#8220;avisar&#8221; o seu programa que ele utiliza<br />
funcoes que não estao localizadas dentro do proprio programa, mas sim dentro<br />
de um outro arquivo. Assim como tudo em Perl, ha mais de uma forma de se<br />
fazer isso. Uma delas é usar o operador &#8220;use&#8221;.</p>
<p>OBS: Se voce não se lembra do operador use, de uma olhada na primeira aula<br />
do curso de Introducao ao Perl. Desde o comeco do curso a orientacao era<br />
para que todos os programas criados comecassem com as linhas citadas abaixo.<br />
Naquela aula eu não dei muitos detalhes do porque e falei que o assunto<br />
seria abordado nas aulas seguintes. A hora chegou.</p>
<p>use strict;<br />
use warnings;</p>
<p>Essas linhas servem para carregar os módulos strict e warnings do Perl.<br />
Ambos são módulos que servem para alterar a forma como o Perl funciona.</p>
<p>O módulo strict obriga a declaracao do escopo das variaveis. Sim, o seu<br />
código vai funcionar mesmo que essa linha sejá omitida. Mas o uso do módulo<br />
strict faz parte do Perl best practices. Usar o strict faz com que o seu<br />
código sejá menos sujeito a erros.</p>
<p>O módulo warnings ativa a emissão de&#8230; warnings. Permite que o Perl emita<br />
warnings quando o código tem um erro, mesmo que esse erro não sejá fatal.</p>
<p>Por exemplo:</p>
<p>use strict;<br />
use warnings;</p>
<p>my $numero = 10;<br />
$numero += &#8216;t&#8217;;<br />
print $numero . &#8220;\n&#8221;;</p>
<p>Esse código contem um erro, mas como esse erro não é fatal, o Perl vai<br />
rodar normalmente. Porem esse código não vai conseguir fazer a conta &#8221; t +<br />
10 &#8221; e vai emitir um warning.</p>
<p>### COMO INSTALAR?</p>
<p>Primeiro verifique se o módulo já não esta instalado na sua maquina. De<br />
novo, ha mais de uma forma de se fazer isso, uma delas é rodar na linha de<br />
comando:</p>
<p>$ perl -MNome_do_módulo -e 1</p>
<p>Por exemplo, se voce não tem certeza se os módulos Net::FTP ou DBD::Oracle<br />
já estao instalados, rode na linha de comando:</p>
<p>$ perl -MNet::FTP -e 1<br />
$ perl -MDBD::Oracle -e 1</p>
<p>Se o módulo não estiver instalado, uma mensagem de erro será mostrada. Se<br />
não aparecer nenhum erro, significa que o módulo já esta instalado.</p>
<p>Ola, todo mundo.</p>
<p>Esta aberta a segunda temporada do curso de Perl: Perl Tutorial.<br />
Nessa fase do curso, serao abordados os assuntos referencias, modulos,<br />
orientacao a objeto, best practices, perl style, entre outros.</p>
<p>A primeira temporada &#8211; Perl Intro &#8211; esta nos arquivos da lista e podem ser<br />
acessados nos seguintes links:</p>
<p>Aula 1:</p>
<p>http://listas.linuxchix.org.br/pipermail/cursos/2006-March/000002.html</p>
<p>Aula 2:</p>
<p>http://listas.linuxchix.org.br/pipermail/cursos/2006-April/000004.html</p>
<p>Aula 3:</p>
<p>http://listas.linuxchix.org.br/pipermail/cursos/2006-April/000039.html</p>
<p>Aula 4: http://listas.linuxchix.org.br/pipermail/cursos/2006-May/000048.html<br />
Aula 5: http://listas.linuxchix.org.br/pipermail/cursos/2006-May/000050.html</p>
<p>Uma breve apresentacao, para quem nao me conhece: meu nome eh Lucia e eu<br />
moro em Toronto, no Canada. Eu sou Analista de Sistemas e trabalho como<br />
consultora em analise e desenvolvimento de sistemas para empresas de<br />
telecomunicacoes tanto aqui do Canada como dos Estados Unidos.</p>
<p>Para quem ainda nao eh familiar com a apresentacao do curso: as aulas sao<br />
enviadas aproximadamente 1 vez por semana. Quaisquer duvidas a respeito das<br />
aulas devem ser enviadas para o grupo, atraves do e-mail<br />
cursos em linuxchix.org.br.</p>
<p>Qualquer assunto relacionado a programacao, mas nao relacionado ao curso<br />
atualmente ministrado, deve ser enviado para o programacao em linuxchix.org.br.</p>
<p>Eh isso. Fim do bla bla bla.<br />
A primeira aula dessa segunda parte do curso vira na proximo email.</p>
<p>Cheers!<br />
Lucia<br />
&#8212;&#8212;&#8212;&#8212;&#8211; Próxima Parte &#8212;&#8212;&#8212;-<br />
Um anexo em HTML foi limpo&#8230;<br />
URL: http://listas.linuxchix.org.br/pipermail/cursos/attachments/20070205/bb6576b8/attachment.html</p>
<p>## Perl Tutorial &#8211; Parte 1 ###</p>
<p>Perl best practices: escrevendo codigos legiveis; Perl modules: instalacao,<br />
uso, modulos comumente usados.</p>
<p>ATENCAO:<br />
Esta aula faz parte do curso Perl Tutorial e eh continuacao do curso Perl<br />
Intro, tambem disponibilizado no LinuxChix.org.br. Esta aula de forma alguma<br />
cobre todas as informacoes disponiveis sobre Perl best practices ou Perl<br />
modules.</p>
<p>*** Transformando um codigo mal formatado/identado em um codigo mais<br />
legivel.</p>
<p>Formatar o codigo de maneira legivel eh parte das &#8220;boas praticas&#8221;<br />
recomendadas para programadores em qualquer linguagem de programacao. O fato<br />
eh que cada programador tem uma preferencia diferente na hora de formatar um<br />
codigo, o que pode dificultar (e porque nao dizer, irritar) a vida de quem<br />
precisa ler/alterar o codigo que outra pessoa escreveu.</p>
<p>Por exemplo, veja o mesmo programa formatado de maneiras diferentes:</p>
<p># FORMATACAO 1:</p>
<p>my $codigo= &#8220;XYZ456475&#8243;;<br />
my $data = &#8220;2006/04/23&#8243; ;</p>
<p>my $resposta_do_teste =testar_formato_dos_dados ($codigo,$data );</p>
<p>print &#8220;$resposta_do_teste\n&#8221; ;</p>
<p>sub testar_formato_dos_dados<br />
{<br />
my($codigo,$data)=@_;</p>
<p>if ( $data   =~ m{\d{4}/\d{2}/\d{2}}<br />
and $codigo =~ m{[A-Z]{3}\d+}){<br />
print &#8220;qualquer texto \n&#8221;;<br />
return &#8220;Os dados estao no formato correto&#8221;;<br />
}<br />
else{        return &#8220;Os dados NAO estao no formato correto&#8221; ;<br />
}<br />
}</p>
<p># FORMATACAO 2:</p>
<p>my $codigo = &#8220;XYZ456475&#8243;;<br />
my $data = &#8220;2006/04/23&#8243;;<br />
my $resposta_do_teste = testar_formato_dos_dados($codigo, $data);<br />
print &#8220;$resposta_do_teste\n&#8221;;</p>
<p>sub testar_formato_dos_dados {<br />
my ($codigo, $data) = @_;</p>
<p>if ( $data =~ m{\d{4}/\d{2}/\d{2}} and $codigo =~ m{[A-Z]{3}\d+} ) {<br />
print &#8220;qualquer texto \n&#8221;;<br />
return &#8220;Os dados estao no formato correto&#8221;;<br />
} else {<br />
return &#8220;Os dados NAO estao no formato correto&#8221;;<br />
}<br />
}</p>
<p># FORMATACAO 3:</p>
<p>my $codigo = &#8220;XYZ456475&#8243;;<br />
my $data   = &#8220;2006/04/23&#8243;;</p>
<p>my $resposta_do_teste = testar_formato_dos_dados($codigo, $data);</p>
<p>print &#8220;$resposta_do_teste\n&#8221;;</p>
<p>sub testar_formato_dos_dados {<br />
my ($codigo, $data) = @_;</p>
<p>if ( $data =~ m{\d{4}/\d{2}/\d{2}} and $codigo =~ m{[A-Z]{3}\d+} ) {<br />
print &#8220;qualquer texto \n&#8221;;<br />
return &#8220;Os dados estao no formato correto&#8221;;<br />
} else {<br />
return &#8220;Os dados NAO estao no formato correto&#8221;;<br />
}<br />
}</p>
<p>&#8212; Alguns programadores, por exemplo, poderiam achar horrivel de ler um<br />
codigo usando a FORMATACAO 1 porque esse exemplo nao segue um estilo na<br />
formatacao.</p>
<p>Num mundo ideal, os programadores de um determinado projeto e/ou equipe<br />
teriam padroes de programacao a serem seguidos. No mundo real &#8211; onde a<br />
teoria eh por muitas vezes diferente da pratica &#8211; existe o Perltidy para<br />
facilitar a vida dos Perl programmers:</p>
<p>http://search.cpan.org/~shancock/Perl-Tidy-20060719/bin/perltidy</p>
<p>&#8212; PELRTIDY: uma ferramenta muito util para identar e reformatar um codigo.<br />
Ele le um script em Perl e reformata/identa o script. Um exemplo bem simples<br />
de uso:</p>
<p>$ perltidy o_seu_script.pl</p>
<p>- Nesse caso, o perltidy le o conteudo do o_seu_script.pl e cria um arquivo<br />
chamado o_seu_script.pl.tdy que contem o codigo original reformatado. O<br />
conteudo do arquivo o_seu_script.pl permanece inalterado.</p>
<p>Ha inumeras opcoes que podem ser passadas para o perltidy para que ele<br />
funcione de acordo com a sua preferencia. Alguns outros exemplos sao:</p>
<p>$ pertidy -b o_seu_script.pl</p>
<p>- Nesse caso, o perltidy altera o arquivo o_seu_script.pl e faz um backup do<br />
conteudo original em o_seu_script.pl.bak.</p>
<p>$ perltidy -gnu o_seu_script.pl</p>
<p>- Nesse caso, o o_seu_script.pl eh reformatado num estilo aproximado ao do<br />
GNU Coding Standards para programas em C.</p>
<p># MAIS INFORMACOES<br />
Mais informacoes sobre o perltidy podem se encontradas no CPAN.org (link<br />
citado acima) e nos seguintes links:</p>
<p>http://perltidy.sourceforge.net/stylekey.html</p>
<p>http://perltidy.sourceforge.net/tutorial.html</p>
<p>*** Perl modules: instalacao, uso, modulos comumente usados.</p>
<p>### O QUE EH?<br />
Falando de uma forma bem simples, um modulo pode ser definido como um<br />
arquivo que contem uma ou mais funcoes. Um modulo pode ou nao ser orientado<br />
a objeto &#8211; mas antes de falar sobre orientacao a objeto eh necessario que se<br />
tenha um bom entendimento sobre modulos. O assunto orientacao a objeto sera<br />
abordado laaaaa nas proximas aulas.</p>
<p>OBS.: Se voce nao se lembra o que eh ou como criar/usar funcoes em Perl, de<br />
uma olhada na aula 4 do curso de introducao ao Perl. E, se continuar em<br />
duvida, mande uma mensagem para o grupo.</p>
<p>### PARA QUE SERVE?<br />
Modulos sao usados como uma forma de reaproveitamento de codigo. Assim, se<br />
voce tem varios programas que utilizam o mesmo conjunto de funcoes, voce<br />
pode colocar esse conjunto de funcoes dentro de um modulo e fazer com que os<br />
seus programas usem esse modulo.</p>
<p>OBS.: O assunto &#8220;criando modulos em Perl&#8221; sera abordado laaaa nas proximas<br />
aulas. Muita calma nessa hora. Por enquanto so sera abordado como instalar e<br />
usar modulos que ja estao prontos e disponiveis.</p>
<p>Diversos programadores disponibilizam os seus modulos atraves do CPAN.org.<br />
Alguns modulos ja sao disponibilizados na propria distribuicao do Perl.<br />
Varios outros podem ser baixados no site CPAN.org.</p>
<p>Sendo assim, evite reinventar a roda. Se ja existe um modulo que faz o que<br />
voce precisa, nao hesite, utilize-o-o-o. Por exemplo, se voce precisa de um<br />
modulo que envie email, antes de escrever o seu codigo, acesse o<br />
search.cpan.org e procure por mail. Ha grandes chances de que ja exista um<br />
modulo que faz exatamente o que voce quer, disponivel, bem documentado e<br />
testado. Nao tenha medo de usa-lo.</p>
<p>E ha os tipos de modulos que servem para alterar a forma como o Perl<br />
funciona.</p>
<p>### COMO USAR?<br />
Depende do modulo. Cada modulo vem com uma documentacao explicando suas<br />
funcionalidades e exemplos de como usa-las.</p>
<p>A documentacao pode ser acessada digitando na linha de comando:</p>
<p>$ perldoc NOME_DO_MODULO</p>
<p>Por exemplo:</p>
<p>$ perldoc Net::FTP</p>
<p>De forma geral, antes de usar qualquer funcao de um modulo eh necessario<br />
declara-lo. Isto eh, eh necessario &#8220;avisar&#8221; o seu programa que ele utiliza<br />
funcoes que nao estao localizadas dentro do proprio programa, mas sim dentro<br />
de um outro arquivo. Assim como tudo em Perl, ha mais de uma forma de se<br />
fazer isso. Uma delas eh usar o operador &#8220;use&#8221;.</p>
<p>OBS: Se voce nao se lembra do operador use, de uma olhada na primeira aula<br />
do curso de Introducao ao Perl. Desde o comeco do curso a orientacao era<br />
para que todos os programas criados comecassem com as linhas citadas abaixo.<br />
Naquela aula eu nao dei muitos detalhes do porque e falei que o assunto<br />
seria abordado nas aulas seguintes. A hora chegou.</p>
<p>use strict;<br />
use warnings;</p>
<p>Essas linhas servem para carregar os modulos strict e warnings do Perl.<br />
Ambos sao modulos que servem para alterar a forma como o Perl funciona.</p>
<p>O modulo strict obriga a declaracao do escopo das variaveis. Sim, o seu<br />
codigo vai funcionar mesmo que essa linha seja omitida. Mas o uso do modulo<br />
strict faz parte do Perl best practices. Usar o strict faz com que o seu<br />
codigo seja menos sujeito a erros.</p>
<p>O modulo warnings ativa a emissao de&#8230; warnings. Permite que o Perl emita<br />
warnings quando o codigo tem um erro, mesmo que esse erro nao seja fatal.</p>
<p>Por exemplo:</p>
<p>use strict;<br />
use warnings;</p>
<p>my $numero = 10;<br />
$numero += &#8216;t&#8217;;<br />
print $numero . &#8220;\n&#8221;;</p>
<p>Esse codigo contem um erro, mas como esse erro nao eh fatal, o Perl vai<br />
rodar normalmente. Porem esse codigo nao vai conseguir fazer a conta &#8221; t +<br />
10 &#8221; e vai emitir um warning.</p>
<p>### COMO INSTALAR?</p>
<p>Primeiro verifique se o modulo ja nao esta instalado na sua maquina. De<br />
novo, ha mais de uma forma de se fazer isso, uma delas eh rodar na linha de<br />
comando:</p>
<p>$ perl -MNome_do_modulo -e 1</p>
<p>Por exemplo, se voce nao tem certeza se os modulos Net::FTP ou DBD::Oracle<br />
ja estao instalados, rode na linha de comando:</p>
<p>$ perl -MNet::FTP -e 1<br />
$ perl -MDBD::Oracle -e 1</p>
<p>Se o modulo nao estiver instalado, uma mensagem de erro sera mostrada. Se<br />
nao aparecer nenhum erro, significa que o modulo ja esta instalado.</p>
<p>Para os casos que voce precisa de um modulo que nao esta instalado na<br />
maquina, acesse o site do CPAN e faca o download do modulo. Cada modulo tem<br />
instrucoes especificas de instalacao. De um modo geral, sera algo como:</p>
<p>tar xfvz module.tar.gz<br />
cd module<br />
perl Makefile.PL<br />
make<br />
make test<br />
make install</p>
<p>ATENCAO: As instrucoes acima sao apenas um exemplo e nao substituem a<br />
leitura do arquivo README (com instrucoes especificas para a instalacao) que<br />
vem junto com cada modulo.</p>
<p># MAIS INFORMACOES:</p>
<p>Para acessar a documentacao de um modulo, digite na linha de comando:</p>
<p>$ perldoc NOME_DO_MODULO</p>
<p>Por exemplo:</p>
<p>$ perldoc strict</p>
<p>$ perldoc Net::FTP</p>
<p>*** Exercicios</p>
<p>a) Reveja os codigos desenvolvidos na primeira fase do curso e analise a<br />
formatacao usada.</p>
<p>b) Dos 3 exemplos de formatacao dados acima, qual voce acha mais dificil e<br />
qual voce acha mais facil de ler. Porque.</p>
<p>c) Instale o perltidy. Procure codigos perl (no historico do curso, no<br />
google, etc) e rode perltidy neles experimentado as varias opcoes do<br />
perltidy que estao disponiveis. Descubra qual a melhor configuracao do<br />
perltidy para voce.</p>
<p>d) Verifique se a sua maquina tem um modulo chamado CPAN. Se nao tiver,<br />
acesse o search.cpan.org, procure por esse modulo e instale-o. Acesse a<br />
documentacao do modulo (que estara disponivel na sua maquina uma vez o<br />
modulo esteja instalado) e entenda para que ele serve.</p>
<p>#PROXIMAS AULAS:<br />
Perl functions<br />
Validando/testando codigos<br />
Uso de referencias em Perl<br />
Perl style<br />
&#8212;&#8212;&#8212;&#8212;&#8211; next part &#8212;&#8212;&#8212;&#8212;&#8211;<br />
An HTML attachment was scrubbed&#8230;<br />
URL: http://listas.linuxchix.org.br/pipermail/cursos/attachments/20070205/49e7b8d0/attachment.html<br />
## Perl Tutorial &#8211; Parte 2 ###</p>
<p>Perl functions: Algumas das builtin functions do Perl explicadas atraves de<br />
exemplos</p>
<p>ATENCAO:<br />
Esta aula faz parte do curso Perl Tutorial e eh continuacao do curso Perl<br />
Intro, tambem disponibilizado no LinuxChix.org.br. Esta aula nao cobre todas<br />
as Perl functions, para obter uma lista completa das mesmas, acesse a<br />
documentacao do Perl.</p>
<p>*** Lembretes</p>
<p>&#8212; 1. Documentacao especifica:</p>
<p>- Digite na linha de comando:</p>
<p>$ man perlfunc</p>
<p>- ou para acessar direto o man de uma determinada funcao:</p>
<p>$ perldoc -f nome_da_funcao</p>
<p>&#8212; 2. Executando os exemplos dados:</p>
<p>- SEMPRE comece os seus programas com as seguintes linhas:</p>
<p>#!/usr/bin/perl<br />
use strict;<br />
use warnings;</p>
<p>- Copie e cole os trechos de programas de exemplo logo abaixo dessas 3<br />
linhas e salve o arquivo.<br />
- Execute o programa na linha de comando.</p>
<p>&#8212; 3. Tirando duvidas</p>
<p>- consulte as aulas anteriores<br />
- envie email para a lista</p>
<p>*** Funcoes para tratamento de strings</p>
<p>&#8212; Funcoes: uc, lc, lcfirst e ucfirst</p>
<p>- Exemplo de uso:</p>
<p>my $string = &#8216;TeM GeNtE QuE EsCrEvE AsSiM.&#8217;;<br />
print uc $string .&#8221;\n&#8221;;<br />
print lc $string .&#8221;\n&#8221;;</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>TEM GENTE QUE ESCREVE ASSIM.<br />
tem gente que escreve assim.</p>
<p>- Notas:</p>
<p>uc &#8211; retorna a versao em letras maiusculas (uppercase) de uma string<br />
lc &#8211; retorna a versao em letras minusculas (lowercase) de uma string<br />
Use a funcao lcfirst para transformar em minuscula apenas a primeira letra<br />
da string<br />
Use a funcao ucfirst para transformar em maiuscula apenas a primeira letra<br />
da string</p>
<p>&#8212; Funcao: length</p>
<p>- Exemplo de uso:</p>
<p>my $string = &#8216;inconstitucionalissimamente&#8217;;<br />
print length($string) . &#8220;\n&#8221;;</p>
<p>- a funcao length retorna o tamanho em caracteres de uma string</p>
<p>- Exercicio:<br />
Execute o exemplo acima; edite o programa e retire os parenteses em torno da<br />
variavel $string e execute o programa novamente; compare os resultados e<br />
entenda o porque de os parenteses serem necessarios nesse caso.</p>
<p>*** Funcoes para tratamento de listas</p>
<p>&#8212; Funcao: shift</p>
<p>- Exemplo de uso:</p>
<p>my @os = (&#8220;Fedora&#8221;, &#8220;CentOS&#8221;, &#8220;Windows&#8221;, &#8220;HP-UX&#8221;, &#8220;AIX&#8221;, &#8220;Solaris&#8221;);<br />
print &#8220;@os\n&#8221;;<br />
shift @os;<br />
print &#8220;@os\n\n&#8221;;</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>Fedora CentOS Windows HP-UX AIX Solaris<br />
CentOS Windows HP-UX AIX Solaris</p>
<p>- Notas:</p>
<p>shift &#8211; remove e retorna o primeiro elemento de um array</p>
<p># Na aula 4 do PerlIntro ha outros exemplos do uso do shift.</p>
<p>&#8212; Funcao: push</p>
<p>- Exemplo de uso:</p>
<p>my @os = (&#8220;Fedora&#8221;, &#8220;CentOS&#8221;, &#8220;Windows&#8221;, &#8220;HP-UX&#8221;, &#8220;AIX&#8221;, &#8220;Solaris&#8221;);<br />
print &#8220;@os\n&#8221;;<br />
push (@os, &#8220;Ubuntu&#8221;);<br />
print &#8220;@os\n&#8221;;</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>Fedora CentOS Windows HP-UX AIX Solaris<br />
Fedora CentOS Windows HP-UX AIX Solaris Ubuntu</p>
<p>- Notas:</p>
<p>push &#8211; usado para acrescentar um ou mais elementos ao final de um array</p>
<p>&#8212; Funcao: qw</p>
<p>- Exemplo de uso:</p>
<p>my @os = qw(Fedora CentOS Windows HP-UX AIX Solaris);<br />
print &#8220;@os\n&#8221;;</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>Fedora CentOS Windows HP-UX AIX Solaris</p>
<p>- Notas:</p>
<p>o qw() &#8211; faz com que cada elemento dentro do &#8220;()&#8221; separado por um espaco<br />
seja um elemento de um array</p>
<p>Usar:<br />
my @os = qw/Fedora CentOS Windows HP-UX AIX Solaris/;</p>
<p>eh a mesma coisa que usar:<br />
my @os = (&#8220;Fedora&#8221;, &#8220;CentOS&#8221;, &#8220;Windows&#8221;, &#8220;HP-UX&#8221;, &#8220;AIX&#8221;, &#8220;Solaris&#8221;);</p>
<p>Note que o qw separa um elemento do outro baseado em espacos, entao o qw nao<br />
funciona para elementos compostos por duas ou mais palavras, como por<br />
exemplo:</p>
<p>my @os = (&#8220;Fedora Core&#8221;, &#8220;Sun Solaris&#8221;); # indica um array de 2 elementos.</p>
<p>my @os = qw/Fedora Core Sun Solaris/; # indica um array de 4 elementos.</p>
<p>&#8212; Funcao: reverse</p>
<p>- Exemplo de uso:</p>
<p>my @os = qw/Fedora CentOS Windows HP-UX AIX Solaris/;<br />
print &#8220;@os\n&#8221;;<br />
my @os_invertido = reverse @os;<br />
print &#8220;Array invertido: @os_invertido\n&#8221;;</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>Fedora CentOS Windows HP-UX AIX Solaris<br />
Array invertido: Solaris AIX HP-UX Windows CentOS Fedora</p>
<p>- Notas:</p>
<p>reverse &#8211; num contexto de lista, retorna a lista com os elmentos em ordem<br />
inversa</p>
<p>- Exercicios:</p>
<p>1. Crie um programa parecido com o exemplo acima, mas usando a funcao<br />
reverse num contexto de string, nao de lista. Compare os resultados e<br />
entenda a diferenca de comportamento da funcao reverse quando usada no<br />
contexto de scalar e contexto de lista.</p>
<p>2. Execute o exemplo acima, trocando a funcao reverse pela funcao sort.<br />
Descubra para que serve a funcao sort.</p>
<p>*** Funcoes para tratamento de listas/strings</p>
<p>&#8212; Funcao: join</p>
<p>- Exemplo de uso:</p>
<p>my @os_array = qw/usuario senha email homepage/;<br />
my $os_string = join(&#8216;:&#8217;, @os_array);<br />
print &#8220;$os_string\n\n&#8221;;</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>usuario:senha:email:homepage</p>
<p>&#8212; Funcao: split</p>
<p>- Exemplo de uso:</p>
<p>my $string = &#8216;usuario:::senha:::email:::homepage&#8217;;<br />
my ($usuario, $senha, $email, $homepage) = split(/:::/, $string);</p>
<p>print &#8220;User: $usuario\n&#8221;;<br />
print &#8220;Passwd: $senha\n&#8221;;<br />
print &#8220;E-mail: $email\n&#8221;;<br />
print &#8220;Home Page: $homepage\n\n&#8221;;</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>User: usuario<br />
Passwd: senha<br />
E-mail: email<br />
Home Page: homepage</p>
<p>- Notas:</p>
<p>join &#8211; agrupa os elementos de uma lista em uma string, separados pelo<br />
pattern passado como parametro.<br />
split &#8211; quebra/separa uma string, usando como separador o pattern passado<br />
como parametro</p>
<p>O join espera como parametros um delimitador e uma lista. No caso do exemplo<br />
acima, o delimitador usado eh o &#8220;:&#8221; (dois pontos). Uma serie de outros<br />
delimitadores podem ser usados tambem.</p>
<p>*** Funcoes para tratamento de diretorios:</p>
<p>&#8212; Funcoes: opendir, closedir, readdir</p>
<p>- Exemplo de uso</p>
<p>my $dir = &#8216;/etc&#8217;;<br />
my $dir_handle;</p>
<p>opendir ($dir_handle, &#8220;&lt;&#8221;, $dir) || die &#8220;Erro ao abrir diretorio $dir: $!&#8221;;</p>
<p>foreach my $file ( readdir($dir_handle) ) {<br />
print &#8220;$file \n\n&#8221;;<br />
}</p>
<p>closedir ($dir_handle);</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>Uma lista dos arquivos que estao no /etc do seu computador.</p>
<p>- Notas:</p>
<p>opendir &#8211; abre um diretorio para processamento<br />
closedir &#8211; fecha um diretorio<br />
readdir &#8211; retorna o conteudo do diretorio</p>
<p>*** Funcoes para controle de loops</p>
<p>&#8212; Funcoes: next, last</p>
<p>- Exemplo de uso</p>
<p>my $dir = &#8216;/etc&#8217;;<br />
my $dir_handle;</p>
<p>opendir ($dir_handle, $dir) || die &#8220;Erro ao abrir diretorio $dir: $!&#8221;;</p>
<p>foreach my $file ( readdir($dir_handle) ) {<br />
next if ($file =~ /^\./);<br />
print &#8220;$file \n\n&#8221;;<br />
}</p>
<p>closedir ($dir_handle);</p>
<p>- Resultado ao executar o exemplo acima:</p>
<p>Uma lista dos arquivos que estao no /etc do seu computador. Porem, os hidden<br />
files (os que comecam com &#8216;.&#8217;) nao serao printed por causa dessa linha de<br />
codigo que eh ate bem auto explicativa:</p>
<p>next if ($file =~ /^\./);</p>
<p>Se um arquivo comeca com &#8220;.&#8221;, a funcao next eh chamada. E essa funcao faz<br />
com que as linhas de codigo a seguir ate o fim do loop ao qual a funcao<br />
pertence sejam ignoradas e comeca a proxima iteracao do loop.</p>
<p>- Notas:</p>
<p>A funcao last eh usada no mesmo contexto que a funcao next, porem a funcao<br />
last forca uma saida do loop em definitivo. Um exmplo de uso:</p>
<p>last if ($file =~ /^a/);</p>
<p>nesse caso, assim que o loop encontrar um arquivo que comeca com a letra a,<br />
a saida do loop sera forcada.</p>
<p>O comando next eh similar ao continue da linguagem C e o comando last eh<br />
similar ao break do C.</p>
<p>*** Aplicacao pratica de algumas das funcoes citadas</p>
<p>&#8212; Programa que le o arquivo /etc/passwd, e imprime os nomes dos usuarios<br />
em ordem alfabetica. Usuarios cujo ID seja igual ou menor que 15 sao<br />
ignorados.</p>
<p>- Um exemplo de como implementar:</p>
<p>my $file = &#8216;/etc/passwd&#8217;;<br />
my $fh;<br />
my @users;</p>
<p># abre arquivo /etc/passwd<br />
open( $fh, &#8220;&lt;&#8221;, $file ) || die &#8220;Erro ao abrir arquivo $file: $!&#8221;;</p>
<p>while (&lt;$fh&gt;) {<br />
my %user;</p>
<p># le cada linha do arquivo<br />
# separa o conteudo usando : como delimitador<br />
# guarda o resultado em um hash<br />
@user{qw( login passwd uid gid gcos home shell )} = split( /:/, $_ );</p>
<p># ignora alguns usuarios baseado num criterio<br />
next if ( $user{uid} &lt;= 15 );</p>
<p># guarda os usuarios em um array<br />
push( @users, $user{login} );<br />
}</p>
<p># separa o conteudo do array por um \n<br />
# ordena o array<br />
print join(&#8220;\n&#8221;, sort @users);</p>
<p>close($fh);</p>
<p>*** Exercicios</p>
<p>a) Execute os codigos de exemplo desta aula.</p>
<p>b) Crie um programa que le os arquivos /etc/passwd e /etc/group e imprime o<br />
nome do usuario seguido do nome do grupo ao qual ele pertence.</p>
<p>- Informacoes adicionais:</p>
<p>Para quem nao conhece, o formato do arquivo /etc/passwd eh, por exemplo:</p>
<p>root:x:0:0:root:/root:/bin/bash</p>
<p>As informacoes: login, senha, id do usuario, id do grupo, info sobre o<br />
usuario, home directory, shell sao separadas por &#8220;:&#8221;.</p>
<p>O formato do /etc/group eh, por exemplo:<br />
root:x:0:root</p>
<p>ou</p>
<p>vfat:x:333:fulana,beltrana</p>
<p>As informacoes: nome do grupo, senha, id do grupo, lista de usuarios que<br />
pertencem ao grupo sao separadas por &#8220;:&#8221;.</p>
<p>Para mais informacoes sobre o /etc/passwd ou /etc/group, acesse o manual,<br />
por exemplo, digitando na linha de comando:</p>
<p>$ man 5 passwd<br />
$ man group</p>
<p>## Perl Tutorial &#8211; Parte 3 ###</p>
<p>Data Structure: references, debugging</p>
<p>ATENCAO:<br />
Esta aula faz parte do curso Perl Tutorial e eh continuacao do curso Perl<br />
Intro, tambem disponibilizado no LinuxChix.org.br. Esta aula nao cobre todas<br />
as informacoes disponiveis sobre estrutura de dados, referencias e code<br />
debugging em Perl; para obter informacoes completas, acesse a documentacao<br />
do Perl.</p>
<p>*** Documentacao especifica:</p>
<p>- Digite na linha de comando:</p>
<p>$ man perlreftut<br />
$ man perldsc</p>
<p>*** Perl references</p>
<p>&#8212; O que eh:<br />
Eh uma importante feature do Perl que possibilita o uso de estruturas de<br />
dados mais complexas do que simples arrays ou hashes.<br />
Eh similar a ponteiros na linguagem C.</p>
<p>&#8212; Para o que serve:<br />
Entre outras coisas, serve para lidar com estruturas de dados mais<br />
complexas.</p>
<p>Fato eh que um array em Perl so pode conter valores do tipo scalar; o mesmo<br />
vale para os valores das keys de um hash. As referencias sao um tipo de<br />
workaround para esse fato.</p>
<p>Vejamos a lista abaixo, de paises e cidades, como exemplo de como o uso de<br />
referencias torna mais facil a organizacao da mesma em um programa.</p>
<p>Brasil: Sao Paulo<br />
Argentina: Buenos Aires<br />
Brasil: Rio de Janeiro<br />
Canada: Toronto<br />
USA: Boston<br />
Canada: Ottawa<br />
Canada: Montreal<br />
USA: New York<br />
Canada: Windsor</p>
<p>Se voce estava pensando em algo como:</p>
<p>#CODIGO1:</p>
<p>my %paises = (<br />
&#8220;Brasil&#8221; =&gt; &#8220;Sao Paulo&#8221;, &#8220;Rio de Janeiro&#8221;,<br />
&#8220;Canada&#8221; =&gt; &#8220;Toronto&#8221;, &#8220;Ottawa&#8221;, &#8220;Montreal&#8221;, &#8220;Windsor&#8221;,<br />
# etc<br />
);</p>
<p>Think again! <img src='http://www.gustavoroberto.blog.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O trecho de codigo acima nao e&#8217; valido, pois ele esta &#8220;armazenando&#8221; uma<br />
lista em cada key do hash paises, e isso nao eh possivel em Perl.</p>
<p>Uma forma correta de lidar com a estrutura acima, armazenando mais de um<br />
valor em cada key do hash eh atraves do uso de referencias:</p>
<p>#CODIGO2:</p>
<p>my %paises = (<br />
&#8220;Brasil&#8221; =&gt; [ "Sao Paulo", "Rio de Janeiro", ],<br />
&#8220;Canada&#8221; =&gt; [ "Toronto", "Ottawa", "Montreal", "Windsor", ],<br />
# etc<br />
);</p>
<p>### Observe que a sintaxe mudou de um codigo para o outro.<br />
### Observe os &#8220;[]&#8221;</p>
<p>O simbolo &#8220;[]&#8221; em torno da lista faz toda a diferenca aqui. Ele retorna uma<br />
referencia para a lista e nao a lista em si. E como toda referencia eh do<br />
tipo scalar, e o valor da key de um hash so pode ser um scalar, o CODIGO2<br />
funciona perfeitamente.</p>
<p>&#8212; Sintaxe:</p>
<p>Para usar referencias em Perl eh necessario se familiarizar com uma serie de<br />
sintaxes. Entenda-a-a-as. Estude-a-a-as. Decore-a-a-as. Na duvida, consulte<br />
o man. Lembre-se de que voce nao estara sozinha(o) nesse momento dificil.</p>
<p>- Para criar um arrayref, use [ ]</p>
<p>Ex.:</p>
<p>my $idades = [ 15, 31, 22, 12 ];</p>
<p>- Para criar um hashref, use { }</p>
<p>Ex.:</p>
<p>my $capitais = {<br />
Brasil =&gt; &#8220;Brasilia&#8221;,<br />
Canada =&gt; &#8220;Ottawa&#8221;,<br />
Alemanha =&gt; &#8220;Berlin&#8221;,<br />
};</p>
<p>- Para criar uma referencia de uma variavel ja existente, use \ na frente<br />
dessa variavel:</p>
<p>Ex.:</p>
<p>my @idades = ( 15, 31, 22, 12 );<br />
my $idades_ref = \@idades;</p>
<p>my %capitais = (<br />
Brasil =&gt; &#8220;Brasilia&#8221;,<br />
Canada =&gt; &#8220;Ottawa&#8221;,<br />
Alemanha =&gt; &#8220;Berlin&#8221;,<br />
);<br />
my $capitas_ref = \%capitais;</p>
<p>- Para acessar os valores dentro de uma referencia</p>
<p>Ex. de leitura:</p>
<p>print &#8220;O elemento 2 do array idades eh $idades_ref-&gt;[2]\n&#8221;;<br />
print &#8220;A capital da Alemanha eh $capitais_ref-&gt;{Alemanha}\n&#8221;;</p>
<p>Ex. de gravacao:</p>
<p>$idades_ref-&gt;[1] = 54;<br />
$idades_ref-&gt;[5] = 30;<br />
$capitais_ref-&gt;{Dinamarca} = &#8220;Copenhagen&#8221;;             # criando uma nova<br />
key no hash<br />
$capitais_ref-&gt;{Brasil} = &#8220;Brasilia, DF&#8221;;             # alterando uma key<br />
existente</p>
<p>&#8212; Outras formas de usar referencias (Perl references e as perl functions<br />
push e keys)</p>
<p>- Exemplo sem o uso de referencias (como ja visto nas aulas anteriores):</p>
<p>push( @idades, 77 );</p>
<p>foreach my $pais ( keys %capitais ) {<br />
print &#8220;Pais: $pais\n&#8221;;<br />
}</p>
<p>- Exemplo com o uso de referencias:</p>
<p>push ( @$idades_ref, 77 );</p>
<p>foreach my $pais ( keys %$capitais_ref ) {<br />
print &#8220;Pais: $pais\n&#8221;;<br />
}</p>
<p>### MUITA atencao com os simbolos!!!<br />
### Observe que voce precisa saber que tipo de referencia eh a variavel para<br />
saber qual simbolo usar:</p>
<p>Se for array, use @:<br />
@$array_ref</p>
<p>Se for hash, use %:<br />
%$hash_ref</p>
<p>&#8212; Usando como exemplo de estrutura de dados, a estrutura do arquivo<br />
/etc/passwd (vista na aula passada):</p>
<p>login:senha:uid:gid:gcos:home:shell</p>
<p>- Exemplo de conteudo do /etc/passwd:</p>
<p>root:x:0:0:root:/root:/bin/bash<br />
bin:x:1:1:bin:/bin:/sbin/nologin<br />
daemon:x:2:2:daemon:/sbin:/sbin/nologin<br />
adm:x:3:4:adm:/var/adm:/sbin/nologin<br />
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin</p>
<p>- Cada linha do /etc/passwd eh um registro e cada registro tem varios<br />
campos. Organizando esses registros em uma lista, temos como exemplo a<br />
estrutura:</p>
<p>my @passwd = (<br />
{<br />
&#8216;login&#8217; =&gt; &#8216;root&#8217;<br />
&#8216;passwd&#8217; =&gt; &#8216;x&#8217;,<br />
&#8216;uid&#8217; =&gt; &#8217;0&#8242;,<br />
&#8216;shell&#8217; =&gt; &#8216;/bin/bash&#8217;,<br />
&#8216;home&#8217; =&gt; &#8216;/root&#8217;,<br />
&#8216;gcos&#8217; =&gt; &#8216;root&#8217;,<br />
&#8216;gid&#8217; =&gt; &#8217;0&#8242;,<br />
},<br />
{<br />
&#8216;login&#8217; =&gt; &#8216;bin&#8217;<br />
&#8216;passwd&#8217; =&gt; &#8216;x&#8217;,<br />
&#8216;uid&#8217; =&gt; &#8217;1&#8242;,<br />
&#8216;shell&#8217; =&gt; &#8216;/sbin/nologin&#8217;,<br />
&#8216;home&#8217; =&gt; &#8216;/bin&#8217;,<br />
&#8216;gcos&#8217; =&gt; &#8216;bin&#8217;,<br />
&#8216;gid&#8217; =&gt; &#8217;1&#8242;,<br />
},<br />
{<br />
&#8216;login&#8217; =&gt; &#8216;daemon&#8217;<br />
&#8216;passwd&#8217; =&gt; &#8216;x&#8217;,<br />
&#8216;uid&#8217; =&gt; &#8217;2&#8242;,<br />
&#8216;shell&#8217; =&gt; &#8216;/sbin/nologin&#8217;,<br />
&#8216;home&#8217; =&gt; &#8216;/sbin&#8217;,<br />
&#8216;gcos&#8217; =&gt; &#8216;daemon&#8217;,<br />
&#8216;gid&#8217; =&gt; &#8217;2&#8242;,<br />
},<br />
);</p>
<p>- O codigo necessario para chegar nessa estrutura:</p>
<p>###</p>
<p>exemplo();</p>
<p>sub exemplo {<br />
my $users_ref = ler_passwd();<br />
exibir_usuarios($users_ref);<br />
}</p>
<p>sub ler_passwd {<br />
my $file = &#8216;/etc/passwd&#8217;;<br />
my $fh;<br />
my @users;</p>
<p># abre arquivo /etc/passwd<br />
open( $fh, &#8220;&lt;&#8221;, $file ) || die &#8220;Erro ao abrir arquivo $file: $!&#8221;;</p>
<p>while (&lt;$fh&gt;) {</p>
<p>chomp;<br />
my %user;<br />
@user{qw( login passwd uid gid gcos home shell )} = split( /:/, $_<br />
);</p>
<p>push( @users, \%user );<br />
}</p>
<p>close($fh);<br />
return \@users;<br />
}</p>
<p>sub exibir_usuarios {<br />
my ($users_ref) = @_;</p>
<p>foreach my $user (@$users_ref) {<br />
print &#8220;O usuario de ID $user-&gt;{uid} e&#8217; o $user-&gt;{login} e tem home<br />
em $user-&gt;{home}\n&#8221;;<br />
}<br />
}</p>
<p>###</p>
<p>&#8212; Debugging referencias</p>
<p>- Usando o exemplo anterior, carregue o modulo Data::Dumper e faca a<br />
seguinte alteracao:</p>
<p>sub exemplo {<br />
my $users_ref = ler_passwd();<br />
#exibir_usuarios($users_ref);<br />
print Dumper $users_ref;<br />
}</p>
<p>Rode o programa e veja o resultado.</p>
<p>### O modulo Data::Dumper serve para exibir a estrutura completa de uma<br />
variavel, inclusive referencias.</p>
<p>*** Exercicios:</p>
<p>- Dada a estrutura de dados:</p>
<p>my $pessoas = [<br />
{<br />
nome      =&gt; "Fulano de Tal",<br />
endereco  =&gt; "Avenida Rua Bairro, 1234",<br />
cidade    =&gt; "Sao Paulo",<br />
idade     =&gt; 37,<br />
telefones =&gt; {<br />
celular  =&gt; "907-123-4567",<br />
trabalho =&gt; "907-444-3241",<br />
casa     =&gt; "416-555-9999",<br />
},<br />
filhos =&gt; [<br />
{<br />
nome  =&gt; "Fulaninho Jr.",<br />
idade =&gt; 4,<br />
},<br />
{<br />
nome  =&gt; "Fulaninha",<br />
idade =&gt; 9,<br />
},<br />
],<br />
},<br />
{<br />
nome      =&gt; &#8220;Beltrano de Tal&#8221;,<br />
endereco  =&gt; &#8220;Avenida Rua Bairro, 87654&#8243;,<br />
cidade    =&gt; &#8220;Guarulhos&#8221;,<br />
idade     =&gt; 24,<br />
telefones =&gt; {<br />
trabalho =&gt; &#8220;416-888-3245&#8243;,<br />
casa     =&gt; &#8220;416-567-6767&#8243;,<br />
},<br />
filhos =&gt; [<br />
{<br />
nome  =&gt; "Beltraninha Baby",<br />
idade =&gt; 2,<br />
},<br />
],<br />
},<br />
{<br />
nome      =&gt; &#8220;Ciclano&#8221;,<br />
endereco  =&gt; &#8220;Avenida Rua Bairro, 78678&#8243;,<br />
cidade    =&gt; &#8220;Sao Paulo&#8221;,<br />
idade     =&gt; 27,<br />
telefones =&gt; { celular =&gt; &#8220;907-787-9595&#8243;, },<br />
},<br />
];</p>
<p>Eh possivel fazer, por exemplo, um programa que consulta esses dados e gera<br />
uma lista baseada em certos pre requisitos.</p>
<p>&#8212; EXEMPLO1: lista pessoas com idade maior que x</p>
<p>###</p>
<p>sub procurar_pessoas_com_mais_de_x_anos {<br />
my ( $pessoas, $idade ) = @_;</p>
<p>my @pessoas_encontradas;<br />
foreach my $pessoa (@$pessoas) {</p>
<p>if ( $pessoa-&gt;{idade} &gt; $idade ) {<br />
push @pessoas_encontradas, $pessoa;<br />
}<br />
}<br />
exibir_pessoas( &#8220;Pessoas com mais de $idade anos&#8221;, \@pessoas_encontradas<br />
);<br />
# nao se preocupe com esta funcao ainda, apenas entenda que ela vai<br />
exibir pessoas<br />
}</p>
<p>###</p>
<p>&#8212; EXEMPLO2: lista pessoas com filhos cuja idade eh menor que x</p>
<p>###</p>
<p>sub procurar_pessoas_com_filhos_com_menos_de_x_anos {<br />
my ( $pessoas, $idade ) = @_;</p>
<p>my @pessoas_encontradas;<br />
foreach my $pessoa (@$pessoas) {</p>
<p>if ( exists $pessoa-&gt;{filhos} ) {<br />
foreach my $filho ( @{ $pessoa-&gt;{filhos} } ) {<br />
if ( $filho-&gt;{idade} &lt; $idade ) {<br />
push @pessoas_encontradas, $pessoa;<br />
last;<br />
}<br />
}<br />
}<br />
}</p>
<p>exibir_pessoas( &#8220;Pessoas com filhos com menos de $idade anos&#8221;,<br />
\@pessoas_encontradas );<br />
}</p>
<p>###</p>
<p>&#8212; O codigo completo desse exemplo:</p>
<p>###</p>
<p>#!/usr/bin/perl</p>
<p>use strict;<br />
use warnings;</p>
<p>exemplo();</p>
<p>sub exemplo {</p>
<p>my $pessoas = [<br />
{<br />
nome      =&gt; "Fulano de Tal",<br />
endereco  =&gt; "Avenida Rua Bairro, 1234",<br />
cidade    =&gt; "Sao Paulo",<br />
idade     =&gt; 37,<br />
telefones =&gt; {<br />
celular  =&gt; "907-123-4567",<br />
trabalho =&gt; "907-444-3241",<br />
casa     =&gt; "416-555-9999",<br />
},<br />
filhos =&gt; [<br />
{<br />
nome  =&gt; "Fulaninho Jr.",<br />
idade =&gt; 4,<br />
},<br />
{<br />
nome  =&gt; "Fulaninha",<br />
idade =&gt; 9,<br />
},<br />
],<br />
},<br />
{<br />
nome      =&gt; &#8220;Beltrano de Tal&#8221;,<br />
endereco  =&gt; &#8220;Avenida Rua Bairro, 87654&#8243;,<br />
cidade    =&gt; &#8220;Guarulhos&#8221;,<br />
idade     =&gt; 24,<br />
telefones =&gt; {<br />
trabalho =&gt; &#8220;416-888-3245&#8243;,<br />
casa     =&gt; &#8220;416-567-6767&#8243;,<br />
},<br />
filhos =&gt; [<br />
{<br />
nome  =&gt; "Beltraninha Baby",<br />
idade =&gt; 2,<br />
},<br />
],<br />
},<br />
{<br />
nome      =&gt; &#8220;Ciclano&#8221;,<br />
endereco  =&gt; &#8220;Avenida Rua Bairro, 78678&#8243;,<br />
cidade    =&gt; &#8220;Sao Paulo&#8221;,<br />
idade     =&gt; 27,<br />
telefones =&gt; { celular =&gt; &#8220;907-787-9595&#8243;, },<br />
},<br />
];</p>
<p>procurar_pessoas_com_mais_de_x_anos( $pessoas, 25 );</p>
<p>procurar_pessoas_com_filhos_com_menos_de_x_anos( $pessoas, 5 );</p>
<p>} ### sub exemplo</p>
<p>sub procurar_pessoas_com_mais_de_x_anos {<br />
my ( $pessoas, $idade ) = @_;</p>
<p>my @pessoas_encontradas;<br />
foreach my $pessoa (@$pessoas) {</p>
<p>if ( $pessoa-&gt;{idade} &gt; $idade ) {<br />
push @pessoas_encontradas, $pessoa;<br />
}<br />
}</p>
<p>exibir_pessoas( &#8220;Pessoas com mais de $idade anos&#8221;, \@pessoas_encontradas<br />
);<br />
}</p>
<p>sub procurar_pessoas_com_filhos_com_menos_de_x_anos {<br />
my ( $pessoas, $idade ) = @_;</p>
<p>my @pessoas_encontradas;<br />
foreach my $pessoa (@$pessoas) {</p>
<p>if ( exists $pessoa-&gt;{filhos} ) {<br />
foreach my $filho ( @{ $pessoa-&gt;{filhos} } ) {<br />
if ( $filho-&gt;{idade} &lt; $idade ) {<br />
push @pessoas_encontradas, $pessoa;<br />
last;<br />
}<br />
}<br />
}<br />
}</p>
<p>exibir_pessoas( &#8220;Pessoas com filhos com menos de $idade anos&#8221;,<br />
\@pessoas_encontradas );<br />
}</p>
<p>sub exibir_pessoas {<br />
my ( $titulo, $pessoas ) = @_;</p>
<p>print &#8220;\n### $titulo\n&#8221;;</p>
<p>foreach my $pessoa (@$pessoas) {<br />
print &#8220;$pessoa-&gt;{nome} mora em $pessoa-&gt;{cidade} e tem<br />
$pessoa-&gt;{idade} anos&#8221;;<br />
if ( exists $pessoa-&gt;{filhos} ) {<br />
print &#8221; e tem &#8221; . scalar( @{ $pessoa-&gt;{filhos} } ) . &#8221;<br />
filho(s)&#8221;;<br />
}<br />
print &#8220;\n&#8221;;<br />
}<br />
}</p>
<p>###</p>
<p>- Exercicio 1: execute o programa de exemplo acima.<br />
- Exercicio 2: use o Data::Dumper para imprimir o conteudo da referencia<br />
$pessoas<br />
- Exercicio 3: crie funcoes de busca para listar:</p>
<p>a) Listar pessoas com endereco cujo numero da rua termina em 4<br />
b) Listar pessoas que possuem telefone celular<br />
c) Listar pessoas cujo prefixo do telefone residencial seja 416</p>
<p>- Exercicio 4: Edite o codigo de exemplo e adicione comentarios ao lado de<br />
cada variavel da estrutura $pessoas, identificando de que tipo elas sao.</p>
<p>Ex.:</p>
<p>my $pessoas = [   # array ref<br />
{<br />
nome      =&gt; "Fulano de Tal",  # scalar<br />
endereco  =&gt; "Avenida Rua Bairro, 1234", # scalar<br />
cidade    =&gt; "Sao Paulo",<br />
idade     =&gt; 37,<br />
telefones =&gt; { # hashref<br />
celular  =&gt; "907-123-4567", # scalar<br />
trabalho =&gt; "907-444-3241",<br />
casa     =&gt; "416-555-9999",<br />
},<br />
filhos =&gt; [<br />
{<br />
nome  =&gt; "Fulaninho Jr.",<br />
idade =&gt; 4,<br />
},<br />
{<br />
nome  =&gt; "Fulaninha",<br />
idade =&gt; 9,<br />
},<br />
],<br />
},</p>
<p>## Perl Tutorial &#8211; Parte 4 ###</p>
<p>Perl style; modules, functions e regexps uteis para tarefas de administracao<br />
de sistemas</p>
<p>ATENCAO:<br />
Esta aula faz parte do curso Perl Tutorial e eh continuacao do curso Perl<br />
Intro, tambem disponibilizado no LinuxChix.org.br. Esta aula nao cobre todas<br />
as informacoes sobre Perl functions, style ou modules. Para obter<br />
informacoes detalhadas e completas sempre acesse a documentacao do Perl.</p>
<p>*** Documentacao especifica:</p>
<p>- Digite na linha de comando:</p>
<p>$ man perlstyle<br />
$ man perlfunc<br />
$ man perlretut<br />
$ man perlvar<br />
$ man perlipc</p>
<p>*** TMTOWTDI &#8211; There&#8217;s More Than One Way To Do It.</p>
<p>Cada programador tem a sua preferencia na hora de escrever um codigo. Porem<br />
ha algumas recomendacoes gerais que farao com que o seu programa seja mais<br />
facil de ler/entender/debugar/manter. E tao importante quanto saber escrever<br />
um bom codigo eh saber como debugar um codigo.</p>
<p>Recomendacoes gerais:</p>
<p>- o uso dos modulos strict e warnings     # como ja foi stressed varias<br />
vezes durante o curso<br />
- uso do modulo diagnostics                  # para uma explicacao mais<br />
detalhada de um warning, se necessario<br />
- identacao                                          # para a legibilidade<br />
do codigo<br />
- uso do pertidy                                   # para reformatar um<br />
codigo de acordo com a sua preferencia</p>
<p>E lembrem-se, criancas, nao eh porque voce PODE escrever algo em Perl de uma<br />
determinada forma, que voce DEVE escreve-lo dessa forma. O Perl permite<br />
varias formas de se escrever um codigo para uma mesma funcionalidade.<br />
Considere escolher a forma que eh melhor legivel.</p>
<p>*** Perl para sysadmins</p>
<p>&#8212; Antes, algumas consideracoes&#8230;</p>
<p>- Muita gente (sim, inclusive profissionais de IT) confundem administrador<br />
de sistemas com administrador de redes. Embora o nome ja seja bem auto<br />
explicativo, vale a pena reforcar que administrador de redes, administra<br />
redes (switches, routers, etc); e administrador de sistemas administra<br />
sistemas (Linux, Sun Solaris, MS-Windows, etc). Funcoes completamente<br />
diferentes que exigem conhecimentos diferentes.</p>
<p>- O Perl eh uma ferramenta muito util tanto para adm de redes quanto de<br />
sistemas, mas nessa aula o foco eh o uso do Perl para adm de sistemas.</p>
<p>- Sim, considere usar Perl na hora de criar um programa para automatizar uma<br />
tarefa em vez de usar shell script.</p>
<p>&#8212; E alguns exercicios:</p>
<p>A) Escreva um programa que le a saida do &#8220;netstat -na&#8221; e mostra quantas<br />
conexoes estao estabelecidas (ESTABLISHED) e listening (LISTEN).</p>
<p>B) Faca um programa que coleta informacoes de performance da maquina a cada<br />
10 segundos e salva o resultado num arquivo CSV, no seguinte formato:</p>
<p>unixtime,hostname,loadavg 1min,memtotal,memfree,buffers+cached,swapused</p>
<p>## dica: use como fonte de dados os arquivos:</p>
<p>/proc/loadvg<br />
/proc/meminfo</p>
<p>C) Faca um programa que acessa uma pagina via HTTP e mostra o tempo em<br />
milisegundos que levou para ser acessada. A URL deve ser passada via linha<br />
de comando. Dica: use os modulos Socket, IO::Handle, IO::Socket e<br />
Time::HiRes.</p>
<p>D) Altere o programa anterior e crie um loop onde o programa pergunta a URL<br />
a ser testada ao inves de receber via linha de comando. Quando o usuario<br />
digitar &#8220;quit&#8221;, saia do loop.</p>
<p>## dica: como falar HTTP:</p>
<p>Exemplo: acessando http://www.exemplo.com/pagina.html<br />
apos se conectar num servidor HTTP, o client deve enviar:</p>
<p>GET /pagina.html HTTP/1.0<br />
Host: www.exemplo.com<br />
(seguido de duas linhas em branco)</p>
<p>Voce pode testar isso usando o comando &#8220;telnet www.exemplo.com 80&#8243;.</p>
<p>&#8212; Nota: as informacoes necessarias para escrever os codigos dos exercicios<br />
estao nesta aula e nas aulas anteriores.</p>
<p>***  Variaveis especiais</p>
<p>As boas e velhas variaveis especiais do Perl.</p>
<p>%ENV<br />
O hash %ENV contem as variaveis de ambiente do seu shell.</p>
<p>- Exemplo:</p>
<p>print $ENV{HOME};<br />
print $ENV{PATH};</p>
<p>- Testando:</p>
<p>Crie um programa que imprime o conteudo do hash %ENV.</p>
<p>@ARGV<br />
O array @ARGV contem os argumentos passados via linha de comando para o<br />
script que esta sendo rodado.</p>
<p>- Exemplo:</p>
<p>Se voce rodar na linha de comando algo como:</p>
<p>./programa.pl argumento1 argumento2</p>
<p>O conteudo de $ARGV[0] sera argumento1 e o conteudo de $ARGV[1] sera<br />
argumento2.</p>
<p>Note que o array @ARGV contem apenas os argumentos, ou seja, aquilo que vem<br />
depois do nome do programa. A variavel especial que contem o nome do<br />
programa em si eh $0.</p>
<p>- Testando:</p>
<p>Crie um programa em perl que imprime o conteudo do array @ARGV. Rode o<br />
programa na linha de comando passando varios argumentos diferentes.<br />
Experimente tbm com parametros como:</p>
<p>./programa.pl argumento1 &#8220;argumento2 argumento3&#8243; foo\ bar</p>
<p>*** Lendo dados digitados pelo usuario</p>
<p>STDIN &#8211; entrada padrao</p>
<p>- Exemplo</p>
<p># blah.pl:<br />
print &#8220;\n digite algo: \n&#8221;;<br />
my $info = &lt;STDIN&gt;;<br />
print &#8220;\n Voce digitou: \n $info\n\n&#8221;</p>
<p>- Testando:</p>
<p>Rode o blah.pl. Depois rode novamente das seguintes formas:</p>
<p>date | ./blah.pl<br />
uptime | ./blah.pl</p>
<p>*** Executando commandos do sistema</p>
<p>&#8212; Funcao: system</p>
<p>&#8212; Sintaxe: system COMANDO</p>
<p>&#8212; Exemplo:</p>
<p>system &#8220;gzip arquivo.txt&#8221;</p>
<p>&#8212; Notes:</p>
<p>- A funcao system faz um fork antes de executar o comando passado como<br />
parametro e o processo pai espera ate que o processo filho seja finalizado.</p>
<p>- Tenha em mente que o Perl esta a merce do OS no qual ele esta rodando.<br />
Para usar a funcao system, lembre-se de levar em consideracao em qual<br />
sistema o seu programa ira rodar para definir qual o comando a ser passado<br />
como parametro.</p>
<p>- Use o system somente quando necessario. Tenha em mente que o perl tem<br />
varias builtin functions para tratamento de files, como por exemplo:</p>
<p>mkdir<br />
rmdir<br />
chmod<br />
rename<br />
chdir<br />
umask<br />
utime</p>
<p>entre outras&#8230;</p>
<p>- Antes de usar a funcao system, consulte o man do perl para verificar se<br />
nao ha uma buitin function do Perl que faz exatamente o que voce quer:</p>
<p>$ man perlfunc</p>
<p>- Para consultar o man de uma funcao especifica:</p>
<p>$ perldoc -f nome_da_funcao</p>
<p>&#8212; Funcao: open</p>
<p>&#8212; Sintaxe: open $fh, &#8220;COMANDO|&#8221;</p>
<p>&#8212; Exemplo:</p>
<p>open my $fh, &#8220;ps uxaw|&#8221; or die &#8220;Erro ao executar comando: $!\n&#8221;;<br />
while (&lt;$fh&gt;) {<br />
print &#8220;saida do ps: $_&#8221;;<br />
}<br />
close $fh;</p>
<p>&#8212; Notes:</p>
<p>Note que a sintaxe do open usada neste exemplo eh um pouco diferente das<br />
sintaxes usadas nas aulas anteriores. O | pipe no final do comando faz com<br />
que ele rode o comando e capture a saida padrao dele.</p>
<p>*** Conectando numa porta TCP</p>
<p>&#8212; Funcoes:</p>
<p>socket<br />
connect</p>
<p>&#8212; sintaxe:</p>
<p>socket SOCKET,DOMAIN,TYPE,PROTOCOL<br />
connect SOCKET,NAME</p>
<p>&#8212; Exemplo:</p>
<p>#socket_exemplo.pl</p>
<p>use Socket;<br />
use IO::Handle;</p>
<p>my $host = shift;            # le o parametro passado na linha de comando<br />
my $port = 80;</p>
<p>my $ip_addr = inet_aton($host) or die &#8220;host unknown: $host&#8221;;<br />
my $paddr = sockaddr_in( $port, $ip_addr );<br />
my $proto = getprotobyname(&#8216;tcp&#8217;);<br />
socket( my $socket, PF_INET, SOCK_STREAM, $proto ) or die &#8220;socket: $!&#8221;;<br />
connect( $socket, $paddr ) or die &#8220;connect: $!&#8221;;</p>
<p>autoflush $socket;</p>
<p>print $socket &#8220;GET / HTTP/1.0\r\nHost: $host\r\n\r\n&#8221; or die &#8220;print: $!&#8221;;</p>
<p>while ( my $line = &lt;$socket&gt; ) {<br />
print &#8220;got $line&#8221;;<br />
}</p>
<p>close $socket;</p>
<p>&#8212; Testando:</p>
<p>./socket_exemplo.pl exemplo.com</p>
<p>*** Expressoes Regulares</p>
<p>&#8212; Exemplo para ler e tratar a saida do comando netstat -na</p>
<p>my %count_of;</p>
<p>open my $fh, &#8220;netstat -na|&#8221; or die &#8220;Erro ao executar netstat -na: $!&#8221;;<br />
while (&lt;$fh&gt;) {<br />
next if ! /^tcp /;<br />
if ( /\s+(LISTEN|ESTABLISHED)/ ) {<br />
my $qual = $1;<br />
$count_of{$qual}++;<br />
}</p>
<p>}</p>
<p>print &#8221; LISTEN: $count_of{LISTEN}\n&#8221;;<br />
print &#8221; ESTABLISHED: $count_of{ESTABLISHED}\n&#8221;;</p>
<p>&#8212; Notes:</p>
<p>/(LISTEN|ESTABLISHED)/;    # da match em LISTEN ou ESTABLISHED</p>
<p>## Perl Tutorial &#8211; Parte 5 ###</p>
<p>Fim da 2a parte do Curso de Perl &#8211; Overview das ultimas aulas e informacoes<br />
adicionais para referencia; como criar modulos</p>
<p>ATENCAO:<br />
Esta aula faz parte do curso Perl Tutorial e eh continuacao do curso Perl<br />
Intro, tambem disponibilizado no LinuxChix.org.br. Esta aula eh um overview<br />
do que ja foi ensinado nessa fase do curso e de forma alguma cobre todas as<br />
informacoes disponiveis sobre Perl.</p>
<p>*** O que foi abordado nessa fase do curso:</p>
<p>&#8212; Perl best practices</p>
<p>- Uso dos modulos strict e warnings<br />
- Formatacao de codigo (definicao de padroes; uso do perltidy)<br />
- Perl style<br />
- Como acessar a documentacao especifica</p>
<p>&#8212; Perl modules</p>
<p>- O que eh<br />
- Como instalar (manualmente e usando o modulo CPAN)<br />
- Como usar<br />
- Como acessar a documentacao especifica</p>
<p>&#8212; Code debugging</p>
<p>- Uso do modulo diagnostics<br />
- Uso do modulo Data::Dumper</p>
<p>&#8212; Perl builtin functions</p>
<p>- Funcoes para tratamento de strings<br />
- Funcoes para tratamento de listas<br />
- Funcoes para manipulacao de arquivos e diretorios<br />
- Funcoes para controle de loops<br />
- Como acessar a documentacao especifica</p>
<p>&#8212; Referencias em Perl</p>
<p>- O que eh<br />
- Sintaxe<br />
- Como usa-las para lidar com estruturas de dados mais complexas<br />
- Como acessar a documentacao especifica</p>
<p>&#8212; Perl para sysadmins</p>
<p>- Uso do Perl para automatizar tarefas de administracao de sistemas<br />
- Variaveis especiais<br />
- Como receber dados via linha de comando<br />
- Como executar comandos do sistemas usando Perl<br />
- Funcoes uteis para manipulacao de files<br />
- Como se conectar numa porta TCP<br />
- Modulos uteis<br />
- Como acessar a documentacao relacionada</p>
<p>*** Infomacoes adicionais:</p>
<p>&#8212; Variaveis especiais</p>
<p>$_        variavel default<br />
@_        argumentos passados para uma subrotina/funcao<br />
$0        nome do programa sendo rodado<br />
@ARGV     argumentos passados na linha de comando<br />
%ENV      variaveis de ambiente (environment)<br />
@INC      path usado pelo Perl para procurar os modulos<br />
$$        ID do processo<br />
$!        msg de erro da ultima funcao executada<br />
$|        autoflush</p>
<p>$ man perlvar</p>
<p>&#8212; Referencias</p>
<p>my $scalar_ref = \$scalar;    # retorna a referencia do scalar $scalar<br />
my $array_ref = \@array;    # retorna a referencia do array @array<br />
my $hash_ref = \%hash;        # retorna a referencia do hash %hash<br />
$$scalar_ref;            # dereference um scalar<br />
@$arrayref;                # dereference um array<br />
%$hashref;                # dereference um hash<br />
my $array_ref = [ ... , ... , ... ];    # cria um arrayref<br />
my $hash_ref = { key =&gt; value, &#8230; };    # cria um hashref</p>
<p>$ man perlreftut</p>
<p>&#8212; Modulos uteis</p>
<p>strict<br />
warnings<br />
diagnostics<br />
Data::Dumper<br />
IO::Handle<br />
IO::Socket<br />
Socket<br />
Exporter<br />
Time:HiRes<br />
DBIx::Class<br />
Storable<br />
LWP::UserAgent<br />
File::Path<br />
HTML::Parser</p>
<p>&#8212; Sempre faca:</p>
<p>use strict;<br />
use warnings;<br />
my $variavel;            # sempre declare variaveis<br />
open(&#8230;) or die $!;        # teste o retorno de todas funcoes</p>
<p>- use Perl modules (consulte o CPAN)<br />
- teste o retorno de um comando/funcao<br />
- use variaveis com nome intuitivos<br />
- evite criar variaveis globais<br />
- use perltidy</p>
<p>*** Exercicio: criando um modulo</p>
<p>Entao. Digamos que voce precisa de um modulo com determinadas funcoes e<br />
procurou no CPAN, mas nao encontrou: voce precisara escrever o seu proprio<br />
modulo. Veja abaixo um exemplo de como colocar suas funcoes dentro de um<br />
modulo e como reusa-lo em varios programas.</p>
<p>&#8212; Crie o modulo Blah.pm, e escreva algumas funcoes no modulo, seguindo o<br />
modelo abaixo:</p>
<p>package Blah;    # nome deste modulo<br />
use strict;<br />
use warnings;<br />
use Exporter;    # modulo Perl que facilita a exportacao de funcoes<br />
use base &#8220;Exporter&#8221;; # conforme a documentacao do Exporter</p>
<p># liste as funcoes que voce quer exportar<br />
our @EXPORT_OK = qw(<br />
funcao1<br />
funcao2<br />
funcao3<br />
);</p>
<p>sub funcao1 {<br />
my ( $foo, $bar ) = @_;</p>
<p>return $foo * $bar;<br />
}</p>
<p>sub funcao2 {<br />
my ($blah) = @_;<br />
return ucfirst lc $blah;<br />
}</p>
<p>sub funcao3 {<br />
my ($bleh) = @_;<br />
return length $bleh;<br />
}</p>
<p>1;    # Perl modules tem que terminar retornando true</p>
<p>&#8212; Crie um programa programa.pl que use funcoes do modulo Blah.pm, seguindo<br />
o modelo abaixo:</p>
<p>use Blah qw( funcao1 funcao2 );    # Importe apenas as funcoes que serao<br />
usadas nesse codigo</p>
<p>my $var1 = funcao1( 3, 5 );</p>
<p>print &#8220;var1 = $var1\n&#8221;;</p>
<p>my $var2 = funcao2(&#8220;blAHHHhhhhHHHhhhH!&#8221;);</p>
<p>print &#8220;Resultado: $var2\n&#8221;;</p>
<p>&#8212; Rode o programa.pl</p>
<p>####</p>
<p>Fim da 2a parte do curso de Perl.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2007/03/26/curso-de-perl-como-programar-em-perl-parte-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Curso de Perl &#8211; Como programar em Perl</title>
		<link>http://www.gustavoroberto.blog.br/2007/03/22/curso-de-perl-como-programar-em-perl/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=curso-de-perl-como-programar-em-perl</link>
		<comments>http://www.gustavoroberto.blog.br/2007/03/22/curso-de-perl-como-programar-em-perl/#comments</comments>
		<pubDate>Thu, 22 Mar 2007 13:04:22 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/2007/03/22/curso-de-perl-como-programar-em-perl/</guid>
		<description><![CDATA[Olá Pessoal, Para aqueles que sempre tiveram vontade de aprender a programar em Perl, para os mais variados motivos, eis aqui um mini-curso, que dá uma pequena noção sobre como fazê-lo. O Curso foi originalmente escrito pela &#8220;lucix at linuxchix org br ( Lucia )&#8221;. Vamos ao trabalho, e espero que gostem. ATUALIZAÇÃO : Cometi [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Para aqueles que sempre tiveram vontade de aprender a programar em Perl, para os mais variados motivos, eis aqui um mini-curso, que dá uma pequena noção sobre como fazê-lo. O Curso foi originalmente escrito pela &#8220;lucix at linuxchix org br ( Lucia )&#8221;. Vamos ao trabalho, e espero que gostem.</p>
<p><strong>ATUALIZAÇÃO :</strong></p>
<p>Cometi o sacrilégio de esquecer as fontes de consulta, Obrigado Lucia e Sulamita.</p>
<p>O curso também pode ser acessado em</p>
<p><a href="http://www.linuxchix.org.br/?q=node/99" rel="nofollow">http://www.linuxchix.org.br/?q=node/99</a></p>
<p>E também um link para a lista:</p>
<p><a href="http://listas.linuxchix.org.br/mailman/listinfo/cursos" rel="nofollow">http://listas.linuxchix.org.br/mailman/listinfo/cursos</a></p>
<p>Nota, se você não tem acesso a um UNIX para fazer os exercícios ( Ou windows + cygwin ), baixe o programa Perl Active State em http://activestate.com</p>
<p><strong>Introdução</strong></p>
<p>É uma linguagem de programação usada com vários propósitos: Administração de sistemas, desenvolvimento Web, administração de redes, manipulação de dados, textos, e assim por diante.</p>
<p><strong>Documentação</strong></p>
<p>Na linha de comando:</p>
<blockquote><p>$ man perl</p></blockquote>
<blockquote><p>$perldoc -f nome_da_funcao</p></blockquote>
<p>Na Web :</p>
<p><a href="http://perldoc.perl.org">http://perldoc.perl.org<br />
</a><a href="http://www.google.com.br"><br />
http://www.google.com.br</a> ( O google sempre ajuda, é só perguntar a ele ).</p>
<p><strong>Rodando programas escritos em Perl na linha de comando.</strong></p>
<p>Obs : Ao escrever um programa em Perl, é interessante que coloquemos a extensão .pl, mas só por enquanto, para podermos lembrar.</p>
<p>Para rodar o programa é simples, basta digitar o nome do interpretador, seguido do nome do programa , exemplo:</p>
<blockquote><p>$ perl programa1.pl</p></blockquote>
<p><strong>Sintaxe</strong></p>
<p>Todos os statements terminam com um &#8220;;&#8221;</p>
<p>Exemplo:</p>
<blockquote><p>print &#8220;Blah, blah, blah&#8221;;</p></blockquote>
<p>Para comentar uma linha, use &#8220;#&#8221;</p>
<p>Exemplo:</p>
<blockquote><p># Isso é um comentario</p>
<p>print &#8220;Blah, blah, blah&#8221;; # isso também é um comentário</p></blockquote>
<p><strong>Variáveis</strong></p>
<p>Em perl, existe basicamente 3 tipos de variáveis: scalar, array e hash.</p>
<p>Importante: Você não precisa especificar o tipo de dado que você está guardando dentro de uma variável. Você pode, por exemplo guardar um número e depois guardar um texto que o Perl vai saber como lidar com isso.</p>
<p><strong>scalar</strong> : É representado pelo símbolo &#8220;$&#8221; e é usado para guardar valores simples, como por exemplo: uma palavra, um texto ou números, uma data, etc.</p>
<blockquote><p>my $fruta = &#8220;laranja&#8221;;<br />
print &#8220;$fruta\n&#8221;;</p>
<p>my $total = 24;<br />
my $resultado = $total / 2;<br />
print &#8220;$resultado\n&#8221;;</p></blockquote>
<p><strong>array</strong> : É representado pelo símbolo &#8220;@&#8221; e é usado para guardar uma lista de valores.</p>
<blockquote><p> my @frutas = (&#8220;laranja&#8221;, &#8220;manga&#8221;, &#8220;banana&#8221;);<br />
my @numeros = (10, 45, 20, -78, 99.9, 14);<br />
my @tudo = (&#8220;laranja&#8221;, 100, 24, &#8220;manga&#8221;, 5);</p>
<p>my @numeros;<br />
$numero[0] = 10;<br />
$numero[1] = 45;<br />
$numero[2] = 20;<br />
$numero[3] = -78;</p></blockquote>
<p>Para acessar os elementos de um array, são usados os índices:</p>
<blockquote><p>print $frutas[0]; # vai imprimir laranja<br />
print $frutas[1]; # vai imprimir manga</p></blockquote>
<p>Para acessar o último elemento de um array, use $#array_name:</p>
<blockquote><p>print $frutas[$#frutas]; # vai imprimir banana, que eh o ultimo elemento do<br />
array</p></blockquote>
<p><strong>hash</strong>: É representado pelo simbolo &#8220;%&#8221; e é usado para guardar uma lista<br />
de valores, assim como o array. O diferencial é que o indice de um array<br />
tem que ser um número. E o indice do hash pode ser um número ou um texto.</p>
<p><strong>Exemplo:</strong></p>
<blockquote><p>my %idades = ();</p>
<p>$idades{Fulano} = 21;<br />
$idades{Beltrano} = 59;<br />
print &#8220;O Fulano tem $idades{Fulano} anos, mas o Beltrano tem<br />
$idades{Beltrano}\n&#8221;;</p></blockquote>
<p>Agora o famoso programa Hello World ! Escrito em Perl:</p>
<blockquote><p>#!/usr/bin/perl<br />
use strict;<br />
use warnings;</p>
<p>my $texto = &#8220;Hello, World!&#8221;;<br />
print $texto,&#8221;\n&#8221;;  # imprime Hello, World!</p></blockquote>
<p><strong>Notas:</strong></p>
<p>1. Tente rodar o programa hello world descrito acima.</p>
<p>2. Sempre começe seu programa em Perl com as seguintes três linhas:</p>
<blockquote><p>#!/usr/bin/perl<br />
use strict;<br />
use warnings;</p></blockquote>
<p>Sempre declare as variáveis usando o &#8220;my&#8221; antes de usa-las ou na primeira<br />
vez que usa-las, exemplo:</p>
<blockquote><p>my $variavel;<br />
$variavel = &#8220;123 testando&#8221;;<br />
print &#8220;$variavel\n&#8221;;</p></blockquote>
<p>ou então:</p>
<blockquote><p>my $variavel = &#8220;123 testando&#8221;;<br />
print &#8220;$variavel\n&#8221;;</p></blockquote>
<p>NÃO declare a variável mais de uma vez, como por exemplo:</p>
<blockquote><p>my $variavel;<br />
my $variavel = &#8220;123 testando&#8221;;</p></blockquote>
<p>3. Exercícios:</p>
<p>Crie programas simples de declaração e impressão de variáveis, como por<br />
exemplo:</p>
<p>a) crie um array de 5 elementos e imprima o primeiro e o último elemento;<br />
b) crie um hash cujos indices sejam países e os valores sejam as suas<br />
respectivas capitais. Imprima alguns dos valores;</p>
<p><strong>Operadores, condições e estruturas de repetição &#8211; Introdução</strong></p>
<p><strong>Operadores</strong></p>
<p>O Perl tem inúmeros operadores. Os mais comumente usados são:</p>
<p><strong>Matemática:</strong></p>
<p>+ adição<br />
- subtração<br />
* multiplicação<br />
/ divisão<br />
% resto da divisão</p>
<p><strong>Exemplos:</strong></p>
<blockquote><p>my $x = 5;<br />
my $y = 1.9;<br />
my $z = $y / 2;<br />
my $soma = $x + $y * 3 / $z;<br />
print &#8220;Soma: $soma\n&#8221;;</p></blockquote>
<blockquote><p>my $x = 22;<br />
my $y = 5;<br />
my $resto = 22 % 5;<br />
print &#8220;Resto: $resto\n&#8221;;</p></blockquote>
<p><strong>Operadores para comparação numérica:</strong></p>
<p>== igual<br />
!= diferente<br />
maior que<br />
= maior ou igual a</p>
<p><strong>Sintaxe:</strong></p>
<blockquote><p>if ($numero1 == $numero2) {<br />
&#8230;<br />
}</p></blockquote>
<p><strong>Operadores para comparação de texto:</strong></p>
<p>eq equivalente<br />
ne diferente</p>
<p><strong>Sintaxe:</strong></p>
<blockquote><p>if ($texto1 eq $texto2) {<br />
&#8230;<br />
}</p></blockquote>
<p><strong>Operadores para comparação lógica:</strong></p>
<p>&amp;&amp; e<br />
|| ou<br />
! negação</p>
<p>Exemplo:</p>
<blockquote><p>if ( ($numero1 == $numero1) &amp;&amp; ($texto1 eq $texto2) ) {<br />
&#8230;<br />
}</p></blockquote>
<blockquote><p>if ( !($numero1 == $numero2) ) {<br />
&#8230;<br />
}</p></blockquote>
<p><strong>Condições</strong></p>
<p><strong>IF ELSIF ELSE</strong></p>
<blockquote><p>if (condicao) {</p>
<p>&#8230;</p>
<p>} elsif (outra condicao) {</p>
<p>&#8230;<br />
} else {</p>
<p>&#8230;<br />
}</p></blockquote>
<p>OU</p>
<blockquote><p>&#8230; if condicao;</p></blockquote>
<p><strong>Exemplo:</strong></p>
<blockquote><p>my $sisop = &#8216;linux&#8217;;</p>
<p>if ($sisop eq &#8220;solaris&#8221;) {</p>
<p>print &#8220;Solaris\n&#8221;;</p>
<p>} elsif ($sisop eq &#8220;linux&#8221;) {</p>
<p>print &#8220;Linux\n&#8221;;</p>
<p>} else {</p>
<p>print &#8220;Outro sistema operacional\n&#8221;;<br />
}</p></blockquote>
<p>OU</p>
<blockquote><p>my $valor = 30;<br />
print $valor if ($valor = 30); #imprime valor SE o valor for igual a 30</p></blockquote>
<p><strong>UNLESS &#8211; eh a negativa do IF.</strong></p>
<p><strong>Sintaxe:</strong></p>
<blockquote><p>&#8230; unless (condicao);</p></blockquote>
<p><strong>Exemplo:</strong></p>
<blockquote><p>my $valor = 30;<br />
print $valor unless ($valor = 30); #imprime valor A NÃO SER QUE valor seja<br />
igual a 30</p></blockquote>
<p><strong>Estruturas de repetição</strong></p>
<p><strong>WHILE:</strong> a repeticao continua enquanto &#8220;condicao&#8221; não for verdade.</p>
<p><strong>Sintaxe:</strong></p>
<blockquote><p> while (condicao) {<br />
&#8230;<br />
}</p></blockquote>
<p>OU</p>
<blockquote><p>&#8230; while condicao;</p></blockquote>
<p><strong>Exemplo:</strong></p>
<blockquote><p> my $contador = 0;<br />
while ($contador  10) {<br />
print &#8220;Contando ate 10 com until&#8230; $contador\n&#8221;;<br />
$contador++;    #incrementa contador<br />
}</p></blockquote>
<p><strong>FOR:</strong> é exatamente como na linguagem C. Geralmente nao é muito usado em<br />
Perl, já que o Perl tem uma outra estrutura &#8211; o FOREACH &#8211; que é muito mais<br />
pratica que o FOR.</p>
<blockquote><p> for (inicia contador; condicao; incrementa contador) {<br />
&#8230;<br />
}</p></blockquote>
<p><strong>Exemplo:</strong></p>
<blockquote><p>my $fim = 10;<br />
for ( my $contador=0; $contador  &#8220;MySQL&#8221;,<br />
linguagem =&gt; &#8220;Perl&#8221;,<br />
webserver =&gt; &#8220;Apache&#8221;,<br />
);<br />
foreach my $ferramenta (keys %desenvolvimento) {<br />
print &#8220;O Conteudo de $ferramenta eh<br />
$desenvolvimento{$ferramenta}\n&#8221;;<br />
}</p></blockquote>
<p><strong>Exercícios</strong></p>
<p>Para se familiarizar com as estruturas e sintaxes do Perl, crie programas<br />
simples com loops, condições e comparações como por exemplo:</p>
<p>a) crie um array com vários elementos numéricos e imprima somente os números<br />
maiores que 10;</p>
<p>b) crie um array com vários elementos numéricos e imprima somente os números<br />
pares e maiores que 10;</p>
<p>c) crie um array com varios elementos do tipo texto e use foreach para<br />
imprimi-los.</p>
<p>d) crie um programa que contenha as seguintes linhas:</p>
<blockquote><p>my $resultado = &#8220;linux &#8221; x 5;<br />
print &#8220;O resultado de linux x 5 eh igual a $resultado\n&#8221;;</p></blockquote>
<p>e veja como funciona a multiplicação de texto.</p>
<p><strong>Tratamento de arquivos e expressões regulares:</strong></p>
<p><strong>ATENÇÃO:</strong> Esta aula de forma alguma cobre todas as informações disponíveis<br />
sobre os assuntos: &#8220;tratamento de arquivos&#8221; e &#8220;expressões regulares&#8221;. Esses<br />
assuntos serão abordados por várias outras aulas no decorrer do curso. Quem<br />
precisa desesperadamente de mais informações e não pode esperar até que eles<br />
sejam abordados, pode acessar os manuais do Perl, conforme descrito na<br />
primeira aula.</p>
<p><strong>Tratamento de arquivos:</strong></p>
<p>Basicamente o tratamento de arquivos segue a estrutura:</p>
<p>- abre arquivo para escrita e/ou leitura E testa se o arquivo foi aberto<br />
- escreve e/ou le o arquivo<br />
- fecha arquivo</p>
<p>A função open() é utilizada para abrir arquivos, tanto para leitura como<br />
para escrita. E a função close() é usada para fechar os arquivos que foram<br />
previamente abertos.</p>
<p><strong>ABRINDO ARQUIVOS:</strong></p>
<p><strong>Para abrir um arquivo para leitura, pode-se usar algo como:</strong></p>
<blockquote><p>open(my $arquivo,  &#8220;/path/do/arquivo.txt&#8221;)</p></blockquote>
<p><strong>NOTA:</strong> O símbolo &#8220;&gt;&#8221; indica que o arquivo está sendo aberto para escrita, e<br />
que o programa vai escrever por cima do que já estiver escrito dentro do<br />
arquivo.</p>
<p><strong>Para abrir um arquivo para escrita (concatenando no final), pode-se usar<br />
algo como:</strong></p>
<blockquote><p>open(my $arquivo, &#8220;&gt;&gt;/path/do/arquivo.txt&#8221;)</p></blockquote>
<p>NOTA: O símbolo &#8220;&gt;&gt;&#8221; indica que o arquivo está sendo aberto para escrita, e<br />
que o programa vai escrever concatenando o texto no final no arquivo.</p>
<p><strong>TESTANDO SE O ARQUIVO FOI ABERTO:</strong></p>
<p>Para testar se o arquivo foi aberto, pode-se usar algo como:</p>
<blockquote><p>open(my $arquivo,  &#8220;) {    # le cada linha do arquivo e grava o<br />
conteudo na variavel $linha<br />
print $linha;            # imprime o conteudo de $linha<br />
}</p></blockquote>
<p>Ou então:</p>
<blockquote><p>while () {    # faz um loop lendo uma linha do arquivo de cada vez<br />
e gravando na variavel especial $_<br />
print;        # o &#8220;print&#8221; sozinho eh a mesma coisa que &#8220;print $_&#8221;<br />
}</p></blockquote>
<p>Não é magica. Quando nenhuma variavel eh especificada, o Perl usa a<br />
variável especial $_</p>
<p>Sendo assim, na linha do while esta implícito, mas o Perl está gravando cada<br />
linha linha na variável $_ e na linha do print, também está implícito, o Perl<br />
está dando um print na variável $_</p>
<p><strong>ESCREVENDO EM UM ARQUIVO:</strong></p>
<p>Quando um arquivo eh aberto para escrita, como nos exemplos:</p>
<blockquote><p>open(my $arquivo,  &#8220;&gt;/path/do/arquivo.txt&#8221;);</p></blockquote>
<p>ou:</p>
<blockquote><p>open(my $arquivo,  &#8220;&gt;&gt;/path/do/arquivo.txt&#8221;);</p></blockquote>
<p>Para escrever algo nesse arquivo, pode-se usar algo como:</p>
<blockquote><p>print $arquivo &#8220;1 \n&#8221;;<br />
print $arquivo &#8220;2 \n&#8221;;<br />
print $arquivo &#8220;3 \n&#8221;;<br />
print $arquivo &#8220;4 \n&#8221;;</p></blockquote>
<p>Ou, melhor:</p>
<blockquote><p>foreach my $numero (1..4) {<br />
print $arquivo &#8220;$numero\n&#8221;;<br />
}</p></blockquote>
<p><strong>FECHANDO UM ARQUIVO:</strong></p>
<p>&#8212; A função close() é usada para fechar o arquivo que foi aberto tanto<br />
para leitura, como para escrita.</p>
<p>close $arquivo;</p>
<p>Exemplo 1: Lendo o conteúdo de um arquivo:</p>
<p>- Crie um arquivo chamado paises.txt, com o seguinte conteúdo (um país em<br />
cada linha):</p>
<p>Alemanha<br />
Brasil<br />
Dinamarca<br />
Estados Unidos<br />
Inglaterra</p>
<p>- Crie no mesmo diretório onde está o arquivo paises.txt, um programa<br />
chamado paises.pl e copie o seguinte código dentro dele:</p>
<blockquote><p> #!/usr/bin/perl</p>
<p>use warnings;<br />
use strict;</p>
<p>open (my $arquivo, &#8220;) {<br />
print &#8220;Nome do pais: $_\n&#8221;;<br />
}<br />
close $arquivo;</p></blockquote>
<p>- Rode o programa na linha de comando:</p>
<p>perl paises.pl</p>
<p>- O programa irá gerar o seguinte output:</p>
<p>Nome do país: Alemanha</p>
<p>Nome do país: Brasil</p>
<p>Nome do país: Dinamarca</p>
<p>Nome do país: Estados Unidos</p>
<p>Nome do país: Inglaterra</p>
<p>Exemplo 2: Escrevendo em um arquivo:</p>
<p>- Para escrever em um arquivo, crie um programa chamado esportes.pl, com o<br />
seguinte conteúdo:</p>
<blockquote><p> #!/usr/bin/perl</p>
<p>use warnings;<br />
use strict;</p>
<p>open (my $arquivo, &#8220;&gt;esportes.txt&#8221;) or die &#8220;Nao consegui abrir esportes.txt:<br />
$!&#8221;;<br />
my @esportes = (&#8220;hockey&#8221;, &#8220;futebol&#8221;, &#8220;tennis&#8221;, &#8220;levantamento de peso&#8221;,<br />
&#8220;baseball&#8221;);<br />
print $arquivo &#8220;Criando um arquivo em Perl&#8230; \n&#8221;;<br />
foreach my $esporte (@esportes) {<br />
print $arquivo &#8220;Nome do esporte: $esporte\n&#8221;;<br />
}<br />
print $arquivo &#8220;Fim do arquivo&#8230; \n\n&#8221;;<br />
close $arquivo;</p></blockquote>
<p>- Rode o programa na linha de comando:</p>
<p>perl paises.pl</p>
<p>Confira o conteúdo de esportes.txt, que será algo como:</p>
<p>Criando um arquivo em Perl&#8230;<br />
Nome do esporte: hockey<br />
Nome do esporte: futebol<br />
Nome do esporte: tennis<br />
Nome do esporte: levantamento de peso<br />
Nome do esporte: baseball<br />
Fim do arquivo&#8230;</p>
<p><strong>Expressões Regulares &#8211; ou simplesmente &#8220;regexp&#8221;:</strong></p>
<p>Muita calma nessa hora: Regexps tem fama de serem difíceis e muito<br />
complicadas. Mas a partir do momento que você entende a idéia geral e as<br />
coisas básicas sobre regexps, fica bem mais fácil ir acrescentando<br />
informações e conseguir fazer regexps mais elaboradas.</p>
<p><strong>O que eh uma regexp?</strong></p>
<p>Regexp é um texto que descreve um padrão, um modelo. Por exemplo, é comum<br />
usarmos na linha de comando do linux, algo como: &#8220;ls *.pdf&#8221;, o que vai<br />
retornar todos os arquivos com extensão &#8220;.pdf&#8221;. Em Perl existem as chamadas<br />
expressões regulares, que servem para (entre outras coisas que serão<br />
abordadas nas próximas aulas) procurar um determinado padrão dentro de um<br />
texto.</p>
<p>Vejamos através de exemplos:</p>
<p>Vamos pegar o primeiro dos programas de exemplo citado acima:</p>
<blockquote><p> #!/usr/bin/perl</p>
<p>use warnings;<br />
use strict;</p>
<p>open (my $arquivo, &#8220;) {<br />
print &#8220;Nome do pais: $_\n&#8221;;<br />
}<br />
close $arquivo;</p></blockquote>
<p>Imagine que você não sabe qual é o conteúdo do arquivo paises.txt, e você quer<br />
imprimir apenas os países cujo nome contem a letra &#8220;m&#8221;. Para isso,<br />
poderíamos transformar o programa acima em algo como:</p>
<blockquote><p>#!/usr/bin/perl<br />
use warnings;<br />
use strict;</p>
<p>open (my $arquivo, &#8220;) {<br />
if ($_ =~ /m/) {        # verifica se o nome do pais contem a letra<br />
m<br />
print &#8220;Pais que contem a letra m: $_ \n&#8221;;<br />
} else {<br />
print &#8220;Pais que NAO contem a letra m: $_ \n\n&#8221;;<br />
}<br />
}<br />
close $arquivo;</p></blockquote>
<p>Analisando o programa de exemplo:</p>
<p>if ($_ =~ /m/) {</p>
<p>O $_ ja foi descrito no começo dessa aula: é uma variável especial do Perl,<br />
muito útil e bastante usada. No caso do programa acima, o conteúdo de $_ é<br />
a linha do arquivo previamente lida durante o statement &#8220;while<br />
()&#8221;.</p>
<p>=~ é o operador usado para comparar o conteúdo da variavel com a regexp</p>
<p>m eh a regexp (nesse caso, a regex é um texto simples, mas uma regexp pode<br />
ser muito mais complicada do que isso)</p>
<p>Os // no começo e no fim da regexp indica que a letra m será procurada no<br />
conteúdo da variável $_</p>
<p>Em outras palavras o que o programa faz é: verificar se a variável $_<br />
contem a palavra &#8220;m&#8221;.</p>
<p>Outros exemplos:</p>
<blockquote><p>my $texto = &#8220;Ola Mundo&#8221;;<br />
$texto =~ /mundo/;        # nao vai dar match pq regexps sao case sensitive.<br />
$texto =~ /a M/;        # vai dar match pq espacos sao tratados como qq<br />
outro caractere.<br />
$texto =~ /aM/;        # nao vai dar match pq esta faltando o espaco<br />
$texto =~ /Mundo /;    # nao vai dar match por causa do espaco no final</p></blockquote>
<p><strong>Exercicios:</strong></p>
<p>a) Utilizando o programa de exemplo 2: troque a linha:</p>
<blockquote><p>open (my $arquivo, &#8220;&gt;esportes.txt&#8221;) or die &#8220;Nao consegui abrir esportes.txt:<br />
$!&#8221;;</p></blockquote>
<p>por:</p>
<blockquote><p>open (my $arquivo, &#8220;&gt;&gt;esportes.txt&#8221;) or die &#8220;Nao consegui abrir esportes.txt:<br />
$!&#8221;;</p></blockquote>
<p>Rode o programa várias vezes. Veja o que acontece com o conteúdo do arquivo<br />
esportes.txt.</p>
<p>b) Exercício terapeutico: Seguindo o programa de exemplo 1 como modelo, crie<br />
um arquivo chamado chatos.txt e coloque nesse arquivo o nome de vários<br />
chatos, um por linha. Faça um programa (chatos.pl) que imprima os nomes dos<br />
chatos.</p>
<p>c) Em Perl, em alguns casos, é possível se imaginar para que serve uma<br />
função baseado no nome da função. Por exemplo: função die &#8211; mata o programa;<br />
função use &#8211; carrega um módulo, avisa o Perl para &#8220;usar&#8221; um determinado<br />
módulo. Existe uma função muito útil para ser usada, entre outras coisas,<br />
quando se lê um dado de um arquivo: chomp. Utilizando o programa de chatos<br />
que vc acabou de criar, tente descobrir para que serve o chomp. Tente, por<br />
exemplo:</p>
<p>troque as linhas:</p>
<blockquote><p>while () {<br />
print &#8220;Esse fulano eh um chato: $_ \n&#8221;;</p></blockquote>
<p>por:</p>
<blockquote><p>while () {<br />
chomp;<br />
print &#8220;Esse fulano eh um chato: $_ \n&#8221;;</p></blockquote>
<p><strong>NOTA:</strong> Obviamente, só faça esse exercício se você não sabe para que serve o<br />
chomp. Para quem quiser mais informações sobre o chomp: digite na linha de<br />
comando: perldoc -f chomp</p>
<p>d) Ainda utilizando o seu programa de chatos, faça testes com ele: imprima<br />
somente os nomes dos chatos que contém um espaço, que contem a letra m<br />
(maiúscula, depois minúscula), etc.</p>
<p>e) Tente abrir para leitura ( ou &gt;&gt;) um arquivo que não existe. Use o<br />
programa de esportes, por exemplo: apague o arquivo esportes.txt e tente<br />
rodar o programa esportes.pl. Veja o que acontece.</p>
<p><strong>Tratamento de Arquivos, Expressões Regulares e Subrotinas/Funções</strong></p>
<p><strong>ATENÇÃO:</strong> Esta aula de forma alguma cobre todas as informações disponíveis<br />
sobre os assuntos: &#8220;tratamento de arquivos&#8221;, &#8220;expressões regulares&#8221; e<br />
&#8220;subrotinas/funções&#8221;. Esses assuntos serão abordados também em outras aulas<br />
no decorrer do curso. Quem precisa desesperadamente de mais informações,<br />
pode acessar os manuais do Perl, conforme descrito na primeira aula.</p>
<p><strong>Ainda sobre o tratamento de arquivos.</strong></p>
<p>Na última aula foi descrito como manipular arquivos para leitura e escrita.<br />
Foram descritas algumas funções nativas do Perl que podem ser usadas para o<br />
tratamento de arquivos, como as funções open e close.</p>
<p><strong>RELEMBRANDO:</strong></p>
<p>- O símbolo  é usado para abrir o arquivo para escrita, sobrescrevendo o<br />
conteúdo do arquivo</p>
<p>- O simbolo &gt;&gt; é usado para abrir o arquivo para escrita, acresentando ao<br />
final do arquivo.</p>
<p><strong>ACRESCENTANDO MAIS ALGUMAS INFORMAÇÕES:</strong></p>
<p>- Se o simbolo é omitido, o Perl interpreta que o arquivo está sendo aberto<br />
para leitura.</p>
<p>Exemplo:</p>
<blockquote><p>open(my $arquivo, &#8220;/path/do/arquivo.txt&#8221;)</p></blockquote>
<p>O trecho de código acima, abre o arquivo arquivo.txt para leitura, ou seja,<br />
é a mesma coisa que:</p>
<blockquote><p>open(my $arquivo, &#8221;<br />
=</p></blockquote>
<p><strong>Os operadores para comparacao de strings:</strong></p>
<p>eq<br />
ne</p>
<p><strong>Os operadores para comparação lógica:</strong></p>
<p>&amp;&amp;<br />
||<br />
!</p>
<p><strong>As estruturas de condição:</strong></p>
<p>if<br />
elsif<br />
else<br />
unless</p>
<p><strong>As estruturas de repetição:</strong></p>
<p>while<br />
until<br />
for<br />
foreach</p>
<p><strong>Tratamento de arquivos:</strong></p>
<p>- como abrir e ler o conteudo de um arquivo<br />
- como criar/abrir e escrever em um arquivo<br />
- como alterar o conteudo de um arquivo<br />
- como testar se o arquivo foi aberto<br />
- como fechar o arquivo</p>
<p><strong>Expressões regulares:</strong></p>
<p>- como procurar por um padrao em um texto<br />
- como substituir um padrao em um texto</p>
<p><strong>Subrotinas/funções:</strong></p>
<p>- como criar funcoes<br />
- como executar funcoes</p>
<p>NOTA: Quem acompanhou o curso até aqui, supostamente já conhece pelo menos o<br />
básico do que foi descrito acima. Caso você não se lembre de alguma coisa,<br />
revise o conteúdo das aulas anteriores.</p>
<p><strong>Mais informacões sobre expressões regulares:</strong></p>
<p><strong>Back Reference</strong></p>
<p>Back references sao usadas para pegar informacoes especificas de um texto.</p>
<p>Exemplo 1:</p>
<p>Digamos que um programa recebe a seguinte informação:<br />
&#8220;hora=10:20,data=25/12/2005&#8243; e que precisamos isolar o dia o mês e o ano em<br />
variáveis diferentes. Podemos usar algo como:</p>
<blockquote><p>my $info = &#8220;horario=10:20,data=25/12/2005&#8243;;<br />
my ($dia, $mes, $ano);</p>
<p>if ( $info =~ m|^.*data=(\d{2})/(\d{2})/(\d{4})| ) {</p>
<p>$dia = $1;<br />
$mes = $2;<br />
$ano = $3;<br />
print &#8220;Dia = $dia\n&#8221;;<br />
print &#8220;Mes = $mes\n&#8221;;<br />
print &#8220;Ano = $ano\n&#8221;;<br />
}</p></blockquote>
<p>Ou então:</p>
<p>my $info = &#8220;horario=10:20,data=25/12/2005&#8243;;<br />
my ($dia, $mes, $ano);</p>
<p>if ( $info =~ m|^.*data=(\d{2})/(\d{2})/(\d{4})| ) {</p>
<p>print &#8220;Dia = $1\n&#8221;;<br />
print &#8220;Mes = $2\n&#8221;;<br />
print &#8220;Ano = $3\n&#8221;;<br />
}</p>
<p>Ou ainda:</p>
<blockquote><p>my $info = &#8220;horario=10:20,data=25/12/2005&#8243;;</p>
<p>if ( my($dia, $mes, $ano) = $info =~ m|^.*data=(\d{2})/(\d{2})/(\d{4})| ) {</p>
<p>print &#8220;Dia = $dia\n&#8221;;<br />
print &#8220;Mes = $mes\n&#8221;;<br />
print &#8220;Ano = $ano\n&#8221;;<br />
}</p></blockquote>
<p><strong>Analisando trechos do programa:</strong></p>
<blockquote><p>if ( $info =~ m|^.*data=(\d{2})/(\d{2})/(\d{4})| ) {</p></blockquote>
<p>Esse trecho de código verifica se o conteúdo da variável $info eh um match<br />
para a regexp dada, e guarda os valores entre parentêses nas back<br />
references. Ou seja, o conteúdo da variável $info que da match nas regexps<br />
entre parentêses, são gravadas nas variáveis especiais $1, $2 e $3<br />
respectivamente.</p>
<p>if ( my($dia, $mes, $ano) = $info =~ m|^.*data=(\d{2})/(\d{2})/(\d{4})| ) {</p>
<p>Esse trecho de código verifica se o conteúdo da variável $info eh um match<br />
para a regexp dada, e atribui os valores referentes as regexps entre<br />
parentêses para as variáveis $dia, $mes, $ano respectivamente.</p>
<p>Escopo das variáveis: observe que o &#8220;my&#8221; foi usado dentro de um &#8220;if&#8221;. Nesse<br />
caso, as variáveis $dia, $mes e $ano, só existem dentro daquele &#8220;if&#8221;.</p>
<p><strong>Traduzindo a regexp:</strong></p>
<p>m|^.*data=(\d{2})/(\d{2})/(\d{4})|</p>
<p>m|| é o delimitador da regexp, ou seja, indica começo e fim.</p>
<p>^ indica que é o começo da string.</p>
<p>.* &#8220;ponto&#8221; eh qualquer caractere; &#8220;asterisco&#8221; indica nenhuma ou mais<br />
ocorrências do caractere anterior. Ou seja, nessa regexp de exemplo, .*<br />
significa: nenhuma ou mais ocorrências de qualquer caractere.</p>
<p>data= neste exemplo, é literalmente o texto &#8220;data=&#8221;</p>
<p>\d{2} significa a ocorrência de 2 números.</p>
<p>(\d{2}) colocar \d{2} (ou qualquer outro trecho da regexp) entre parentêses,<br />
significa que o conteúdo de variável que der match nesse trecho, estará<br />
acessivel através das back references: $1, $2, $3, $4. etc.</p>
<p>Em outras palavras, essa regexp verifica se:</p>
<p>A string começa com nenhum ou mais quaisquer caracteres seguida de: &#8220;data=&#8221;,<br />
2 números, uma barra, 2 números, uma barra, 4 números.</p>
<p><strong>Exemplo 2:</strong></p>
<p>Digamos que um programa recebe a seguinte informação: &#8220;email=<br />
cursos at linuxchix.org.br&#8221; e que precisamos isolar o usuário e o dominio.<br />
Podemos usar algo como:</p>
<blockquote><p> my $info = &#8216;email=cursos at linuxchix.org.br&#8217;;</p>
<p>if ( $info =~ m|^e-?mail=(.+)@(.+)| ) {</p>
<p>print &#8220;Usuario = $1\n&#8221;;<br />
print &#8220;Dominio = $2\n&#8221;;<br />
}</p></blockquote>
<p><strong>Analisando trechos do programa:</strong></p>
<blockquote><p>my $info = &#8216;email=cursos at linuxchix.org.br&#8217;;</p></blockquote>
<p>Note que aqui foi usado &#8216; (aspas simples) ao invés de &#8221; (aspas). Isso<br />
porque, em Perl, quando usamos &#8220;, significa que o Perl vai interpretar tudo<br />
o que esta dentro de &#8221; (aspas), inclusive variáveis. Então, no exemplo<br />
acima, se fizermos algo como:</p>
<blockquote><p>my $info = &#8220;email=cursos at linuxchix.org.br&#8221;;</p></blockquote>
<p>O Perl vai interpretar o @linuxchix como se isso fosse um array e nao como<br />
se isso fosse um texto qualquer.</p>
<p>Quando usamos &#8216; o Perl não tenta interpretar o conteudo entre &#8216; (aspas<br />
simples), então podemos usar o sinal @ sem problemas.</p>
<p><strong>Traduzindo a regexp:</strong></p>
<p>m|^e-?mail=(.+)@(.+)|</p>
<p>m|| é o delimitador da regexp, ou seja, indica começo e fim.</p>
<p>^ indica que é o começo da string.</p>
<p>e- neste exemplo, é literalmente a string &#8220;e-&#8221;</p>
<p>? indica zero ou uma ocorrência do caractere anterior, no caso do exemplo<br />
dado, indica 0 ou uma ocorrência do &#8220;-&#8221;. Ou seja, vai dar match se a string<br />
começar com &#8220;email&#8221; ou &#8220;e-mail&#8221;.</p>
<p>. É qualquer caractere;<br />
+ indica uma ou mais ocorrências do caractere anterior;</p>
<p>Logo:<br />
.+ siginifica: ocorrência de uma ou mais vezes de qualquer caracter</p>
<p>Em outras palavras, essa regexp verifica se:</p>
<p>A string começa com o caractere &#8220;e&#8221; seguida ou não de um &#8220;-&#8221;, seguida do<br />
texto &#8220;mail=&#8221;, seguida de: ocorrência de 1 ou mais quaisquer caracteres, uma<br />
arroba, ocorrência de 1 ou mais quaisquer caracteres.</p>
<p>NOTA: Os exemplos dados são apenas para explicar de forma simples o que é e<br />
como usar back references. Na vida real, para tratamento de datas, emails e<br />
outros tipos de informação padrão, a melhor opção é usar os módulos criados<br />
especificamente para esses fins e disponíveis no CPAN: cpan.perl.org. Não<br />
tente &#8220;reinventar a roda&#8221;, a não ser, é claro, com o objetivo de aprender.</p>
<p><strong>Exercícios</strong></p>
<p>Antes de começar: se você não sabe do que se trata o arquivo /etc/services,<br />
leia o conteúdo dele e tente entender que tipo de informações são aquelas.</p>
<p>a) Faça um programa que lê o conteúdo do arquivo /etc/services, guarde<br />
somente os nomes dos serviços dentro de um array, somente os números das<br />
portas em outro array e somente o protocolo em um terceiro array. Imprima o<br />
conteúdo dos arrays de forma que a saída do programa seja algo como:</p>
<p>Serviço: telnet &#8211; Porta: 23 &#8211; Protocolo: TCP<br />
Serviço: http &#8211; Porta: 80 &#8211; Protocolo: TCP</p>
<p>b) Altere o programa do exercício &#8220;a&#8221; para que ele imprima a informação<br />
apenas se o protocolo for TCP. Depois altere para que ele só imprima<br />
informação se a porta que o serviço usa for um número par.</p>
<p>c) Faça um programa que lê o conteúdo do arquivo /etc/services. Guarde as<br />
informações de serviços e portas em um hash onde o servico será a key do<br />
hash e a porta que o servico usa sera o value. Imprima o conteúdo do hash no<br />
formato:</p>
<p>Serviço: telnet &#8211; Porta: 23<br />
Serviço: http &#8211; Porta: 80</p>
<p>d)Altere o programa do exercicio &#8220;c&#8221; para que ele imprima informação somente<br />
se o nome do serviço não começa com a letra &#8220;t&#8221; ou &#8220;h&#8221;.</p>
<p>e) Altere novamente o programa do exercício &#8220;c&#8221; para que ele imprima<br />
informação somente se a porta na qual o servico escuta seja maior do que<br />
500.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2007/03/22/curso-de-perl-como-programar-em-perl/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Notificação de Windows Falso.</title>
		<link>http://www.gustavoroberto.blog.br/2006/12/08/notificacao-de-windows-falso/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=notificacao-de-windows-falso</link>
		<comments>http://www.gustavoroberto.blog.br/2006/12/08/notificacao-de-windows-falso/#comments</comments>
		<pubDate>Fri, 08 Dec 2006 12:04:02 +0000</pubDate>
		<dc:creator>Gustavo Roberto Rodrigues Gonçalves</dc:creator>
				<category><![CDATA[Computação]]></category>

		<guid isPermaLink="false">http://www.gustavoroberto.blog.br/2006/12/08/notificacao-de-windows-falso/</guid>
		<description><![CDATA[Boa Tarde pessoal, Sei que apesar de ser um problema velho, ela ainda vem atormentando muita gente. Se você recebeu uma mensagem que seu Windows XP é falso, não se desespere, existe uma forma para combater isso, na verdade 2, por que a segunda seria comprar uma versão original do seu Windows XP. É bastante [...]]]></description>
			<content:encoded><![CDATA[<p>Boa Tarde pessoal,</p>
<p>Sei que apesar de ser um problema velho, ela ainda vem atormentando muita gente.</p>
<p>Se você recebeu uma mensagem que seu Windows XP é falso, não se desespere, existe uma forma para combater isso, na verdade 2, por que a segunda seria comprar uma versão original do seu Windows XP.</p>
<p>É bastante simples, basta você clicar <a href="http://www.gustavoroberto.com.br/downloads/RemoveWGA.exe">aqui</a> e baixar o programa para remover.</p>
<p>São apenas 10 k aproximadamente.</p>
<p>Você deverá baixar o arquivo para sua máquina, e depois executá-lo de qualquer lugar. Feito isso, reinicie a máquina.</p>
<p>Pronto, agora o problema deve ter sumido, e você pode continuar usando o seu Windows XP .</p>
<p>Espero que tenha ajudado, um abraço !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gustavoroberto.blog.br/2006/12/08/notificacao-de-windows-falso/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

